diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml index 0bf29f3fbd8..7c772054b02 100644 --- a/.github/workflows/codespell.yml +++ b/.github/workflows/codespell.yml @@ -24,7 +24,7 @@ jobs: check_filenames: true check_hidden: true # Add comma separated list of words that occur multiple times that should be ignored (sorted alphabetically, case sensitive) - ignore_words_list: adin,ameba,aNULL,brunch,carryIn,chainG,ciph,cLen,cliKs,dout,haveA,inCreated,inOut,inout,larg,LEAPYEAR,Merget,optionA,parm,parms,repid,rIn,userA,ser,siz,te,Te,HSI,failT,toLen, + ignore_words_list: adin,ameba,aNULL,brunch,carryIn,chainG,ciph,cLen,cliKs,dout,haveA,inCreated,inOut,inout,larg,LEAPYEAR,Merget,optionA,parm,parms,repid,rIn,userA,ser,siz,te,Te,HSI,failT,toLen,vor, # The exclude_file contains lines of code that should be ignored. This is useful for individual lines which have non-words that can safely be ignored. exclude_file: '.codespellexcludelines' # To skip files entirely from being processed, add it to the following list: diff --git a/.wolfssl_known_macro_extras b/.wolfssl_known_macro_extras index eabd1f217e9..fcb773f143e 100644 --- a/.wolfssl_known_macro_extras +++ b/.wolfssl_known_macro_extras @@ -968,6 +968,7 @@ WOLFSSL_RENESAS_RZN2L WOLFSSL_RENESAS_TLS WOLFSSL_RENESAS_TSIP_IAREWRX WOLFSSL_REQUIRE_TCA +WOLFSSL_RISCV_ASM_INLINE WOLFSSL_RISCV_ASM_NO_UNALIGNED WOLFSSL_RNG_USE_FULL_SEED WOLFSSL_RSA_CHECK_D_ON_DECRYPT diff --git a/configure.ac b/configure.ac index 3535570b1f1..537a51ff99c 100644 --- a/configure.ac +++ b/configure.ac @@ -1560,16 +1560,9 @@ then esac fi -# RISC-V asm doesn't yet support WOLFSSL_AESGCM_STREAM. Disable -# implicit activation, and error on explicit activation. -if test "$enable_riscv_asm" = "yes" -then - if test "$enable_aesgcm_stream" = "yes" - then - AC_MSG_ERROR([RISC-V asm doesn't yet support WOLFSSL_AESGCM_STREAM.]) - fi - enable_aesgcm_stream=no -fi +# RISC-V asm now supports WOLFSSL_AESGCM_STREAM: all tiers (base/scalar/vector) +# have dedicated streaming assembly (AES_GCM_*_RISCV64). (Previously disabled +# here.) # All wolfCrypt features: AC_ARG_ENABLE([all-crypto], @@ -4035,6 +4028,11 @@ do ENABLED_RISCV_ASM=yes AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_BASE_BIT_MANIPULATION" ;; + zba) + # SH2ADD - fused shift-add for table index calculation + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_BASE_ADDRESS" + ;; zbc|zbkc) # CLMUL, CLMULH ENABLED_RISCV_ASM=yes @@ -4080,7 +4078,7 @@ do AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_VECTOR_CRYPTO_ASM" ;; *) - AC_MSG_ERROR([Invalid RISC-V option [yes,zbkb,zbb,zbc,zbkc,zkn,zkned,zv,zvkg,zvbc,zvbb,zvkb,zvkned]: $ENABLED_RISCV_ASM.]) + AC_MSG_ERROR([Invalid RISC-V option [yes,zba,zbkb,zbb,zbc,zbkc,zkned,zv,zvkg,zvbc,zvbb,zvkb,zvkned]: $ENABLED_RISCV_ASM.]) break ;; esac @@ -12143,9 +12141,6 @@ then if test "$ENABLED_AESGCM" = "no" then AC_MSG_ERROR([AES-GCM streaming is enabled but AES-GCM is disabled.]) - elif test "$ENABLED_RISCV_ASM" = "yes" - then - AC_MSG_ERROR([RISC-V asm doesn't yet support WOLFSSL_AESGCM_STREAM.]) else AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AESGCM_STREAM" AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_AESGCM_STREAM" diff --git a/src/include.am b/src/include.am index 415141f66d6..bbee8f9394d 100644 --- a/src/include.am +++ b/src/include.am @@ -285,7 +285,8 @@ endif endif if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-aes.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-aes-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-aes-asm_c.c endif BUILD_RISCV_ASM endif BUILD_AES @@ -334,7 +335,8 @@ endif !BUILD_ARMASM_NEON if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha256.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC32_ASM @@ -359,7 +361,9 @@ endif BUILD_PPC64_ASM if BUILD_SHA512 if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm_c.c else if !BUILD_FIPS_V5 @@ -462,7 +466,8 @@ endif endif !BUILD_ARMASM_INLINE endif BUILD_ARMASM if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha3.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC64_ASM if BUILD_PPC64_ASM_INLINE @@ -616,7 +621,8 @@ endif endif if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-aes.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-aes-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-aes-asm_c.c endif BUILD_RISCV_ASM if BUILD_SHA @@ -661,7 +667,8 @@ endif !BUILD_ARMASM endif !BUILD_ARMASM_NEON if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha256.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC32_ASM @@ -686,7 +693,9 @@ endif BUILD_PPC64_ASM if BUILD_SHA512 if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm_c.c else if !BUILD_FIPS_V5 @@ -787,7 +796,8 @@ endif endif !BUILD_ARMASM_INLINE endif BUILD_ARMASM if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha3.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC64_ASM if BUILD_PPC64_ASM_INLINE @@ -1039,7 +1049,8 @@ endif !BUILD_ARMASM endif !BUILD_ARMASM_NEON if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha256.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC32_ASM @@ -1064,7 +1075,9 @@ endif BUILD_PPC64_ASM if BUILD_SHA512 if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm_c.c else if !BUILD_FIPS_V5 @@ -1165,7 +1178,8 @@ endif endif !BUILD_ARMASM_INLINE endif BUILD_ARMASM if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha3.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC64_ASM if BUILD_PPC64_ASM_INLINE @@ -1439,7 +1453,8 @@ endif !BUILD_ARMASM endif !BUILD_ARMASM_NEON if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha256.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha256-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC32_ASM @@ -1605,7 +1620,8 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/af_alg/afalg_aes.c endif BUILD_AFALG if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-aes.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-aes-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-aes-asm_c.c endif BUILD_RISCV_ASM endif BUILD_AES endif !BUILD_FIPS_V2_PLUS @@ -1635,7 +1651,9 @@ endif !BUILD_FIPS_V2_PLUS if !BUILD_FIPS_V2_PLUS if BUILD_SHA512 if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha512-asm_c.c else if !BUILD_FIPS_V5 @@ -1740,7 +1758,8 @@ endif endif !BUILD_ARMASM_INLINE endif BUILD_ARMASM if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-sha3.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-sha3-asm_c.c endif BUILD_RISCV_ASM if BUILD_PPC64_ASM if BUILD_PPC64_ASM_INLINE @@ -1891,7 +1910,8 @@ endif endif !BUILD_ARMASM_INLINE endif if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-poly1305.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm_c.c endif src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/poly1305.c if !BUILD_X86_ASM @@ -1986,7 +2006,8 @@ endif endif !BUILD_ARMASM_INLINE else if BUILD_RISCV_ASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-chacha.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-chacha-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv64/riscv-64-chacha-asm_c.c endif BUILD_RISCV_ASM if !BUILD_X86_ASM if BUILD_INTELASM diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index c8a0e5f8fb4..7048db331c8 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -203,8 +203,6 @@ block cipher mechanism that uses n-bit binary string parameter key with 128-bits #include #endif -#if !defined(WOLFSSL_RISCV_ASM) - #ifdef WOLFSSL_IMX6_CAAM_BLOB /* case of possibly not using hardware acceleration for AES but using key blobs */ @@ -1527,7 +1525,36 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt(Aes* aes, const byte* inBlock, /* implemented in wolfcrypt/src/port/psa/psa_aes.c */ #elif defined(WOLFSSL_RISCV_ASM) -/* implemented in wolfcrypt/src/port/riscv/riscv-64-aes.c */ +/* Block cipher implemented by the generated RISC-V assembly + * (riscv-64-aes-asm.S / _c.c). The key schedule is wired in wc_AesSetKeyLocal. + * Vector-crypto overrides the bulk modes (ECB/CBC/CTR/GCM/XTS) with asm; scalar + * and base run the common-C modes over these single-block primitives, so the + * block routine is needed whenever a common-C mode (or Direct/CCM/GCM-stream) + * is built. */ +#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AESCCM) || \ + defined(WOLFSSL_AESGCM_STREAM) || defined(HAVE_AESGCM) || \ + defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || \ + defined(HAVE_AES_ECB) || defined(WOLFSSL_AES_XTS) || \ + defined(WOLFSSL_CMAC) || defined(WOLFSSL_AES_OFB) || \ + defined(WOLFSSL_AES_CFB) +static WARN_UNUSED_RESULT int wc_AesEncrypt(Aes* aes, const byte* inBlock, + byte* outBlock) +{ + AES_encrypt_RISCV64(inBlock, outBlock, (byte*)aes->key, (int)aes->rounds); + return 0; +} +#endif + +#if defined(HAVE_AES_DECRYPT) && (defined(WOLFSSL_AES_DIRECT) || \ + defined(HAVE_AES_CBC) || defined(HAVE_AES_ECB) || \ + defined(WOLFSSL_AES_XTS) || defined(HAVE_AESCCM)) +static WARN_UNUSED_RESULT int wc_AesDecrypt(Aes* aes, const byte* inBlock, + byte* outBlock) +{ + AES_decrypt_RISCV64(inBlock, outBlock, (byte*)aes->key, (int)aes->rounds); + return 0; +} +#endif #elif defined(WOLFSSL_SILABS_SE_ACCEL) /* implemented in wolfcrypt/src/port/silabs/silabs_aes.c */ @@ -5411,8 +5438,7 @@ static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir) #endif /* NEED_AES_TABLES */ -#ifndef WOLFSSL_RISCV_ASM - /* Software AES - SetKey */ + /* AES - SetKey (block schedule via generated asm on RISC-V) */ static WARN_UNUSED_RESULT int wc_AesSetKeyLocal( Aes* aes, const byte* userKey, word32 keylen, const byte* iv, int dir, int checkKeyLen) @@ -5714,7 +5740,12 @@ static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir) #ifndef WC_C_DYNAMIC_FALLBACK -#if defined(WOLFSSL_ARMASM) +#if defined(WOLFSSL_RISCV_ASM) + /* Generated RISC-V assembly key schedule (all paths). aes->rounds / + * aes->keylen were set above. */ + AES_set_key_RISCV64(userKey, (int)keylen, (byte*)aes->key, dir); + return 0; +#elif defined(WOLFSSL_ARMASM) #if !defined(WOLFSSL_ARMASM_NO_HW_CRYPTO) #ifndef __aarch64__ AES_set_key_AARCH32(userKey, keylen, (byte*)aes->key, dir); @@ -5893,7 +5924,6 @@ static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir) return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 1); } /* wc_AesSetKey() */ -#endif #if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) /* AES-CTR and AES-DIRECT need to use this for key setup */ @@ -6979,6 +7009,14 @@ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) } #endif +#if defined(WOLFSSL_RISCV_ASM) + AES_CBC_encrypt_RISCV64(in, out, sz, (byte*)aes->reg, (byte*)aes->key, + (int)aes->rounds); + (void)blocks; + (void)ret; + return 0; +#endif + #ifdef WOLFSSL_IMXRT_DCP /* Implemented in wolfcrypt/src/port/nxp/dcp_port.c */ if (aes->keylen == 16) @@ -7199,6 +7237,14 @@ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) #endif } +#if defined(WOLFSSL_RISCV_ASM) + AES_CBC_decrypt_RISCV64(in, out, sz, (byte*)aes->reg, (byte*)aes->key, + (int)aes->rounds); + (void)blocks; + (void)ret; + return 0; +#endif + #ifdef WOLFSSL_IMXRT_DCP /* Implemented in wolfcrypt/src/port/nxp/dcp_port.c */ if (aes->keylen == 16) @@ -7704,6 +7750,17 @@ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) aes->left -= processed; sz -= processed; + #if defined(WOLFSSL_RISCV_ASM) + if (sz > 0) { + AES_CTR_encrypt_RISCV64(in, out, sz, (byte*)aes->reg, + (byte*)aes->key, (byte*)aes->tmp, &aes->left, + (int)aes->rounds); + } + (void)scratch; + (void)ret; + return 0; + #endif + #if defined(WOLFSSL_ARMASM) #ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO #ifndef __aarch64__ @@ -7951,15 +8008,6 @@ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) #endif #endif -#else /* WOLFSSL_RISCV_ASM */ - -#define AesEncrypt_preFetchOpt(aes, inBlock, outBlock, do_preFetch) \ - wc_AesEncryptDirect(aes, outBlock, inBlock) -#define AesDecrypt_preFetchOpt(aes, inBlock, outBlock, do_preFetch) \ - wc_AesDecryptDirect(aes, outBlock, inBlock) - -#endif /* WOLFSSL_RISCV_ASM */ - /* * The IV for AES GCM and CCM, stored in struct Aes's member reg, is comprised * of two parts in order: @@ -8063,10 +8111,7 @@ int wc_local_AesGcmCheckTagSz(word32 authTagSz) { #endif } -#if defined(WOLFSSL_RISCV_ASM) - /* implemented in wolfcrypt/src/port/risc-v/riscv-64-aes.c */ - -#elif defined(WOLFSSL_AFALG) +#if defined(WOLFSSL_AFALG) /* implemented in wolfcrypt/src/port/afalg/afalg_aes.c */ #elif defined(WOLFSSL_KCAPI_AES) @@ -8390,6 +8435,14 @@ int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) if (ret == 0) { VECTOR_REGISTERS_PUSH; +#if defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) && \ + !defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) + /* Compute H reflected for the carryless-multiply GHASH; the scalar + * GHASH uses no M0 table. (Vector crypto supersedes scalar and needs H + * unreflected, so it falls through to the generic E(0) path below.) */ + AES_GCM_set_key_RISCV64(iv, (byte*)aes->key, aes->gcm.H, + (int)aes->rounds); +#else /* Generate H = AES_Encrypt(key, 0^128) */ ret = wc_AesEncrypt(aes, iv, aes->gcm.H); @@ -8425,6 +8478,7 @@ int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) } #endif /* GCM_TABLE || GCM_TABLE_4BIT */ } +#endif /* WOLFSSL_RISCV_SCALAR_CRYPTO_ASM */ VECTOR_REGISTERS_POP; } @@ -8546,7 +8600,94 @@ void AES_GCM_decrypt_vaes(const unsigned char *in, unsigned char *out, #if !defined(WOLFSSL_ARMASM) || defined(__aarch64__) || \ defined(WOLFSSL_ARMASM_NO_HW_CRYPTO) -#if defined(GCM_SMALL) +#if defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) && defined(HAVE_AESGCM) && \ + !defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) +/* GHASH using the RISC-V scalar carryless-multiply (Zbc) helper. Vector crypto + * supersedes it (fused vghsh/vgmul), so this scalar path yields when both are on. + * + * H is stored reflected by AES_GCM_set_key_RISCV64, which is the form + * GHASH_RISCV64 expects. GHASH_RISCV64(x, h, in, blocks) computes, for each + * 16-byte block, x = (x ^ block) * H in GF(2^128) (reflecting x in/out so the + * caller sees the standard domain). A single padded/length block is therefore + * just GHASH_RISCV64(x, h, block, 1) - no software GMULT or M0 table is needed. + * + * @param [in] gcm GCM object. + * @param [in] a Additional Authentication Data (AAD). + * @param [in] aSz Length of AAD in bytes. + * @param [in] c Cipher text. + * @param [in] cSz Length of cipher text in bytes. + * @param [out] s Hash result. + * @param [in] sSz Number of bytes to output. + */ +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, + word32 cSz, byte* s, word32 sSz) +{ + ALIGN8 byte x[WC_AES_BLOCK_SIZE]; + ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; + word32 blocks, partial; + byte* h = gcm->H; + + XMEMSET(x, 0, WC_AES_BLOCK_SIZE); + + /* Hash in A, the Additional Authentication Data */ + if (aSz != 0 && a != NULL) { + blocks = aSz / WC_AES_BLOCK_SIZE; + partial = aSz % WC_AES_BLOCK_SIZE; + if (blocks > 0) { + GHASH_RISCV64(x, h, a, blocks); + a += blocks * WC_AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); + XMEMCPY(scratch, a, partial); + GHASH_RISCV64(x, h, scratch, 1); + } + } + + /* Hash in C, the Ciphertext */ + if (cSz != 0 && c != NULL) { + blocks = cSz / WC_AES_BLOCK_SIZE; + partial = cSz % WC_AES_BLOCK_SIZE; + if (blocks > 0) { + GHASH_RISCV64(x, h, c, blocks); + c += blocks * WC_AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); + XMEMCPY(scratch, c, partial); + GHASH_RISCV64(x, h, scratch, 1); + } + } + + /* Hash in the lengths of A and C in bits */ + FlattenSzInBits(&scratch[0], aSz); + FlattenSzInBits(&scratch[8], cSz); + GHASH_RISCV64(x, h, scratch, 1); + + /* Copy the result into s. */ + XMEMCPY(s, x, sSz); +} + +#ifdef WOLFSSL_AESGCM_STREAM +/* No extra initialization for the carryless-multiply implementation. + * + * @param [in] aes AES GCM object. + */ +#define GHASH_INIT_EXTRA(aes) WC_DO_NOTHING + +/* GHASH one block of data into the streaming tag. + * + * x = (tag ^ block) * H using the carryless-multiply helper (reflected H). + * + * @param [in, out] aes AES GCM object. + * @param [in] block Block of AAD or cipher text. + */ +#define GHASH_ONE_BLOCK_SW(aes, block) \ + GHASH_RISCV64(AES_TAG(aes), (aes)->gcm.H, block, 1) +#endif /* WOLFSSL_AESGCM_STREAM */ + +#define HAVE_GHASH +#elif defined(GCM_SMALL) static void GMULT(byte* X, byte* Y) { byte Z[WC_AES_BLOCK_SIZE]; @@ -10769,6 +10910,21 @@ static int AES_GCM_encrypt_ASM(Aes* aes, byte* out, const byte* in, } #endif +#if defined(WOLFSSL_RISCV_ASM) +/* Pointer passed as "H" to the RISC-V GCM asm. Scalar/vector crypto use the + * raw hash subkey gcm.H. Base (software GHASH) uses the precomputed M0 table + * for GCM_TABLE/GCM_TABLE_4BIT, but gcm.H for the table-free GCM_WORD32/ + * GCM_SMALL builds (which have no M0 member). */ +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) || \ + defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + #define AES_GCM_H_PTR(aes) ((aes)->gcm.H) +#elif defined(GCM_TABLE) || defined(GCM_TABLE_4BIT) + #define AES_GCM_H_PTR(aes) ((byte*)(aes)->gcm.M0) +#else + #define AES_GCM_H_PTR(aes) ((byte*)(aes)->gcm.H) +#endif +#endif /* WOLFSSL_RISCV_ASM */ + /* Software AES - GCM Encrypt */ int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, const byte* iv, word32 ivSz, @@ -10889,6 +11045,19 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, authTagSz, authIn, authInSz); #endif /* WOLFSSL_PSOC6_CRYPTO */ +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) || \ + defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + AES_GCM_encrypt_RISCV64(in, out, sz, iv, ivSz, authTag, authTagSz, authIn, + authInSz, (byte*)aes->key, aes->gcm.H, (byte*)aes->tmp, (byte*)aes->reg, + (int)aes->rounds); + return 0; +#elif defined(WOLFSSL_RISCV_ASM) + AES_GCM_encrypt_RISCV64(in, out, sz, iv, ivSz, authTag, authTagSz, authIn, + authInSz, (byte*)aes->key, AES_GCM_H_PTR(aes), (byte*)aes->tmp, + (byte*)aes->reg, (int)aes->rounds); + return 0; +#endif + VECTOR_REGISTERS_PUSH; #if defined(WOLFSSL_ARMASM) @@ -11669,6 +11838,17 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, authTagSz, authIn, authInSz); #endif /* WOLFSSL_PSOC6_CRYPTO */ +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) || \ + defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + return AES_GCM_decrypt_RISCV64((byte*)in, out, sz, iv, ivSz, authTag, + authTagSz, authIn, authInSz, (byte*)aes->key, aes->gcm.H, + (byte*)aes->tmp, (byte*)aes->reg, (int)aes->rounds); +#elif defined(WOLFSSL_RISCV_ASM) + return AES_GCM_decrypt_RISCV64((byte*)in, out, sz, iv, ivSz, authTag, + authTagSz, authIn, authInSz, (byte*)aes->key, AES_GCM_H_PTR(aes), + (byte*)aes->tmp, (byte*)aes->reg, (int)aes->rounds); +#endif + VECTOR_REGISTERS_PUSH; #if defined(WOLFSSL_ARMASM) @@ -13372,6 +13552,369 @@ static WARN_UNUSED_RESULT int AesGcmDecryptFinal_AARCH64( #endif #endif +/* AES_GCM_H_PTR is defined earlier (before wc_AesGcmEncrypt). */ +#if defined(WOLFSSL_RISCV_ASM) && defined(WOLFSSL_AESGCM_STREAM) + +static WARN_UNUSED_RESULT int AesGcmInit_RISCV64(Aes* aes, const byte* iv, + word32 ivSz) +{ + /* Reset state fields. */ + aes->over = 0; + aes->aSz = 0; + aes->cSz = 0; + /* Set tag to all zeros as initial value. */ + XMEMSET(AES_TAG(aes), 0, WC_AES_BLOCK_SIZE); + /* Reset counts of AAD and cipher text. */ + aes->aOver = 0; + aes->cOver = 0; + + { + AES_GCM_init_RISCV64((byte*)aes->key, (int)aes->rounds, iv, ivSz, + AES_GCM_H_PTR(aes), AES_COUNTER(aes), AES_INITCTR(aes)); + } + + return 0; +} + +/* Update the AES GCM for encryption with authentication data. + * + * Implementation uses RISC-V optimized assembly code. + * + * @param [in, out] aes AES object. + * @param [in] a Buffer holding authentication data. + * @param [in] aSz Length of authentication data in bytes. + * @param [in] endA Whether no more authentication data is expected. + */ +static WARN_UNUSED_RESULT int AesGcmAadUpdate_RISCV64( + Aes* aes, const byte* a, word32 aSz, int endA) +{ + word32 blocks; + int partial; + + if (aSz != 0 && a != NULL) { + /* Total count of AAD updated. */ + aes->aSz += aSz; + /* Check if we have unprocessed data. */ + if (aes->aOver > 0) { + /* Calculate amount we can use - fill up the block. */ + byte sz = (byte)(WC_AES_BLOCK_SIZE - aes->aOver); + if (sz > aSz) { + sz = (byte)aSz; + } + /* Copy extra into last GHASH block array and update count. */ + XMEMCPY(AES_LASTGBLOCK(aes) + aes->aOver, a, sz); + aes->aOver = (byte)(aes->aOver + sz); + if (aes->aOver == WC_AES_BLOCK_SIZE) { + /* We have filled up the block and can process. */ + { + AES_GCM_ghash_block_RISCV64(AES_LASTGBLOCK(aes), + AES_TAG(aes), AES_GCM_H_PTR(aes)); + } + /* Reset count. */ + aes->aOver = 0; + } + /* Used up some data. */ + aSz -= sz; + a += sz; + } + + /* Calculate number of blocks of AAD and the leftover. */ + blocks = aSz / WC_AES_BLOCK_SIZE; + partial = aSz % WC_AES_BLOCK_SIZE; + if (blocks > 0) { + /* GHASH full blocks now. */ + { + AES_GCM_aad_update_RISCV64(a, blocks * WC_AES_BLOCK_SIZE, + AES_TAG(aes), AES_GCM_H_PTR(aes)); + } + /* Skip over to end of AAD blocks. */ + a += blocks * WC_AES_BLOCK_SIZE; + } + if (partial != 0) { + /* Cache the partial block. */ + XMEMCPY(AES_LASTGBLOCK(aes), a, (size_t)partial); + aes->aOver = (byte)partial; + } + } + if (endA && (aes->aOver > 0)) { + /* No more AAD coming and we have a partial block. */ + /* Fill the rest of the block with zeros. */ + XMEMSET(AES_LASTGBLOCK(aes) + aes->aOver, 0, + (size_t)WC_AES_BLOCK_SIZE - aes->aOver); + /* GHASH last AAD block. */ + { + AES_GCM_ghash_block_RISCV64(AES_LASTGBLOCK(aes), + AES_TAG(aes), AES_GCM_H_PTR(aes)); + } + /* Clear partial count for next time through. */ + aes->aOver = 0; + } + + return 0; +} + +/* Update the AES GCM for encryption with data and/or authentication data. + * + * Implementation uses RISC-V optimized assembly code. + * + * @param [in, out] aes AES object. + * @param [out] c Buffer to hold cipher text. + * @param [in] p Buffer holding plaintext. + * @param [in] cSz Length of cipher text/plaintext in bytes. + * @param [in] a Buffer holding authentication data. + * @param [in] aSz Length of authentication data in bytes. + */ +static WARN_UNUSED_RESULT int AesGcmEncryptUpdate_RISCV64( + Aes* aes, byte* c, const byte* p, word32 cSz, const byte* a, word32 aSz) +{ + word32 blocks; + int partial; + int ret; + + /* Hash in A, the Authentication Data */ + ret = AesGcmAadUpdate_RISCV64(aes, a, aSz, (cSz > 0) && (c != NULL)); + if (ret != 0) + return ret; + + /* Encrypt plaintext and Hash in C, the Cipher text */ + if (cSz != 0 && c != NULL) { + /* Update count of cipher text we have hashed. */ + aes->cSz += cSz; + if (aes->cOver > 0) { + /* Calculate amount we can use - fill up the block. */ + byte sz = (byte)(WC_AES_BLOCK_SIZE - aes->cOver); + if (sz > cSz) { + sz = (byte)cSz; + } + /* Encrypt some of the plaintext. */ + xorbuf(AES_LASTGBLOCK(aes) + aes->cOver, p, sz); + XMEMCPY(c, AES_LASTGBLOCK(aes) + aes->cOver, sz); + /* Update count of unused encrypted counter. */ + aes->cOver = (byte)(aes->cOver + sz); + if (aes->cOver == WC_AES_BLOCK_SIZE) { + /* We have filled up the block and can process. */ + { + AES_GCM_ghash_block_RISCV64(AES_LASTGBLOCK(aes), + AES_TAG(aes), AES_GCM_H_PTR(aes)); + } + /* Reset count. */ + aes->cOver = 0; + } + /* Used up some data. */ + cSz -= sz; + p += sz; + c += sz; + } + + /* Calculate number of blocks of plaintext and the leftover. */ + blocks = cSz / WC_AES_BLOCK_SIZE; + partial = cSz % WC_AES_BLOCK_SIZE; + if (blocks > 0) { + /* Encrypt and GHASH full blocks now. */ + { + AES_GCM_encrypt_update_RISCV64((byte*)aes->key, + (int)aes->rounds, c, p, blocks * WC_AES_BLOCK_SIZE, + AES_TAG(aes), AES_GCM_H_PTR(aes), AES_COUNTER(aes)); + } + /* Skip over to end of blocks. */ + p += blocks * WC_AES_BLOCK_SIZE; + c += blocks * WC_AES_BLOCK_SIZE; + } + if (partial != 0) { + /* Encrypt the counter - XOR in zeros as proxy for plaintext. */ + XMEMSET(AES_LASTGBLOCK(aes), 0, WC_AES_BLOCK_SIZE); + { + AES_GCM_encrypt_block_RISCV64((byte*)aes->key, (int)aes->rounds, + AES_LASTGBLOCK(aes), AES_LASTGBLOCK(aes), AES_COUNTER(aes)); + } + /* XOR the remaining plaintext to calculate cipher text. + * Keep cipher text for GHASH of last partial block. + */ + xorbuf(AES_LASTGBLOCK(aes), p, (word32)partial); + XMEMCPY(c, AES_LASTGBLOCK(aes), (size_t)partial); + /* Update count of the block used. */ + aes->cOver = (byte)partial; + } + } + return 0; +} + +/* Finalize the AES GCM for encryption and calculate the authentication tag. + * + * Calls ARCH64 optimized assembly code. + * + * @param [in, out] aes AES object. + * @param [in] authTag Buffer to hold authentication tag. + * @param [in] authTagSz Length of authentication tag in bytes. + * @return 0 on success. + */ +static WARN_UNUSED_RESULT int AesGcmEncryptFinal_RISCV64(Aes* aes, + byte* authTag, word32 authTagSz) +{ + /* AAD block incomplete when > 0 */ + byte over = aes->aOver; + + + if (aes->cOver > 0) { + /* Cipher text block incomplete. */ + over = aes->cOver; + } + if (over > 0) { + /* Fill the rest of the block with zeros. */ + XMEMSET(AES_LASTGBLOCK(aes) + over, 0, + (size_t)WC_AES_BLOCK_SIZE - over); + /* GHASH last cipher block. */ + { + AES_GCM_ghash_block_RISCV64(AES_LASTGBLOCK(aes), AES_TAG(aes), + AES_GCM_H_PTR(aes)); + } + } + /* Calculate the authentication tag. */ + { + AES_GCM_encrypt_final_RISCV64(AES_TAG(aes), authTag, authTagSz, + aes->cSz, aes->aSz, AES_GCM_H_PTR(aes), AES_INITCTR(aes)); + } + + return 0; +} + +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AESGCM_DECRYPT) +/* Update the AES GCM for decryption with data and/or authentication data. + * + * @param [in, out] aes AES object. + * @param [out] p Buffer to hold plaintext. + * @param [in] c Buffer holding cipher text. + * @param [in] cSz Length of cipher text/plaintext in bytes. + * @param [in] a Buffer holding authentication data. + * @param [in] aSz Length of authentication data in bytes. + */ +static WARN_UNUSED_RESULT int AesGcmDecryptUpdate_RISCV64(Aes* aes, byte* p, + const byte* c, word32 cSz, const byte* a, word32 aSz) +{ + word32 blocks; + int partial; + int ret; + + /* Hash in A, the Authentication Data */ + ret = AesGcmAadUpdate_RISCV64(aes, a, aSz, cSz > 0); + if (ret != 0) + return ret; + + /* Hash in C, the Cipher text, and decrypt. */ + if (cSz != 0 && p != NULL) { + /* Update count of cipher text we have hashed. */ + aes->cSz += cSz; + if (aes->cOver > 0) { + /* Calculate amount we can use - fill up the block. */ + byte sz = (byte)(WC_AES_BLOCK_SIZE - aes->cOver); + if (sz > cSz) { + sz = (byte)cSz; + } + /* Keep a copy of the cipher text for GHASH. */ + XMEMCPY(AES_LASTBLOCK(aes) + aes->cOver, c, sz); + /* Decrypt some of the cipher text. */ + xorbuf(AES_LASTGBLOCK(aes) + aes->cOver, c, sz); + XMEMCPY(p, AES_LASTGBLOCK(aes) + aes->cOver, sz); + /* Update count of unused encrypted counter. */ + aes->cOver = (byte)(aes->cOver + sz); + if (aes->cOver == WC_AES_BLOCK_SIZE) { + /* We have filled up the block and can process. */ + { + AES_GCM_ghash_block_RISCV64(AES_LASTBLOCK(aes), + AES_TAG(aes), AES_GCM_H_PTR(aes)); + } + /* Reset count. */ + aes->cOver = 0; + } + /* Used up some data. */ + cSz -= sz; + c += sz; + p += sz; + } + + /* Calculate number of blocks of plaintext and the leftover. */ + blocks = cSz / WC_AES_BLOCK_SIZE; + partial = cSz % WC_AES_BLOCK_SIZE; + if (blocks > 0) { + /* Decrypt and GHASH full blocks now. */ + { + AES_GCM_decrypt_update_RISCV64((byte*)aes->key, + (int)aes->rounds, p, c, blocks * WC_AES_BLOCK_SIZE, + AES_TAG(aes), AES_GCM_H_PTR(aes), AES_COUNTER(aes)); + } + /* Skip over to end of blocks. */ + c += blocks * WC_AES_BLOCK_SIZE; + p += blocks * WC_AES_BLOCK_SIZE; + } + if (partial != 0) { + /* Encrypt the counter - XOR in zeros as proxy for cipher text. */ + XMEMSET(AES_LASTGBLOCK(aes), 0, WC_AES_BLOCK_SIZE); + { + AES_GCM_encrypt_block_RISCV64((byte*)aes->key, (int)aes->rounds, + AES_LASTGBLOCK(aes), AES_LASTGBLOCK(aes), AES_COUNTER(aes)); + } + /* Keep cipher text for GHASH of last partial block. */ + XMEMCPY(AES_LASTBLOCK(aes), c, (size_t)partial); + /* XOR the remaining cipher text to calculate plaintext. */ + xorbuf(AES_LASTGBLOCK(aes), c, (word32)partial); + XMEMCPY(p, AES_LASTGBLOCK(aes), (size_t)partial); + /* Update count of the block used. */ + aes->cOver = (byte)partial; + } + } + + return 0; +} + +/* Finalize the AES GCM for decryption and check the authentication tag. + * + * Implementation uses RISC-V optimized assembly code. + * + * @param [in, out] aes AES object. + * @param [in] authTag Buffer holding authentication tag. + * @param [in] authTagSz Length of authentication tag in bytes. + * @return 0 on success. + * @return AES_GCM_AUTH_E when authentication tag doesn't match calculated + * value. + */ +static WARN_UNUSED_RESULT int AesGcmDecryptFinal_RISCV64( + Aes* aes, const byte* authTag, word32 authTagSz) +{ + int ret = 0; + int res; + /* AAD block incomplete when > 0 */ + byte over = aes->aOver; + byte *lastBlock = AES_LASTGBLOCK(aes); + + + if (aes->cOver > 0) { + /* Cipher text block incomplete. */ + over = aes->cOver; + lastBlock = AES_LASTBLOCK(aes); + } + if (over > 0) { + /* Zeroize the unused part of the block. */ + XMEMSET(lastBlock + over, 0, (size_t)WC_AES_BLOCK_SIZE - over); + /* Hash the last block of cipher text. */ + { + AES_GCM_ghash_block_RISCV64(lastBlock, AES_TAG(aes), AES_GCM_H_PTR(aes)); + } + } + /* Calculate and compare the authentication tag. */ + { + AES_GCM_decrypt_final_RISCV64(AES_TAG(aes), authTag, authTagSz, + aes->cSz, aes->aSz, AES_GCM_H_PTR(aes), AES_INITCTR(aes), &res); + } + + /* Return error code when calculated doesn't match input. */ + if (res == 0) { + ret = AES_GCM_AUTH_E; + } + return ret; +} +#endif +#endif /* WOLFSSL_RISCV_ASM && WOLFSSL_AESGCM_STREAM */ + /* Initialize an AES GCM cipher for encryption or decryption. * * Must call wc_AesInit() before calling this function. @@ -13446,6 +13989,9 @@ int wc_AesGcmInit(Aes* aes, const byte* key, word32 len, const byte* iv, ret = AesGcmInit_AARCH64(aes, iv, ivSz); } else + #elif defined(WOLFSSL_RISCV_ASM) + ret = AesGcmInit_RISCV64(aes, iv, ivSz); + if (0) #endif /* WOLFSSL_AESNI */ { ret = AesGcmInit_C(aes, iv, ivSz); @@ -13574,6 +14120,9 @@ int wc_AesGcmEncryptUpdate(Aes* aes, byte* out, const byte* in, word32 sz, authInSz); } else + #elif defined(WOLFSSL_RISCV_ASM) + ret = AesGcmEncryptUpdate_RISCV64(aes, out, in, sz, authIn, authInSz); + if (0) #endif { /* Encrypt the plaintext. */ @@ -13635,6 +14184,9 @@ int wc_AesGcmEncryptFinal(Aes* aes, byte* authTag, word32 authTagSz) ret = AesGcmEncryptFinal_AARCH64(aes, authTag, authTagSz); } else + #elif defined(WOLFSSL_RISCV_ASM) + ret = AesGcmEncryptFinal_RISCV64(aes, authTag, authTagSz); + if (0) #endif { ret = AesGcmFinal_C(aes, authTag, authTagSz); @@ -13720,6 +14272,9 @@ int wc_AesGcmDecryptUpdate(Aes* aes, byte* out, const byte* in, word32 sz, authInSz); } else + #elif defined(WOLFSSL_RISCV_ASM) + ret = AesGcmDecryptUpdate_RISCV64(aes, out, in, sz, authIn, authInSz); + if (0) #endif { /* Update the authentication tag with any authentication data and @@ -13779,6 +14334,9 @@ int wc_AesGcmDecryptFinal(Aes* aes, const byte* authTag, word32 authTagSz) ret = AesGcmDecryptFinal_AARCH64(aes, authTag, authTagSz); } else + #elif defined(WOLFSSL_RISCV_ASM) + ret = AesGcmDecryptFinal_RISCV64(aes, authTag, authTagSz); + if (0) #endif { ALIGN32 byte calcTag[WC_AES_BLOCK_SIZE]; @@ -14049,10 +14607,7 @@ int wc_AesCcmCheckTagSize(int sz) return 0; } -#if defined(WOLFSSL_RISCV_ASM) - /* implementation located in wolfcrypt/src/port/riscv/riscv-64-aes.c */ - -#elif defined(HAVE_COLDFIRE_SEC) +#if defined(HAVE_COLDFIRE_SEC) #error "Coldfire SEC doesn't currently support AES-CCM mode" #elif defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_AES) && \ @@ -15107,9 +15662,6 @@ int wc_AesGetKeySize(Aes* aes, word32* keySize) #elif defined(WOLFSSL_DEVCRYPTO_AES) /* implemented in wolfcrypt/src/port/devcrypt/devcrypto_aes.c */ -#elif defined(WOLFSSL_RISCV_ASM) - /* implemented in wolfcrypt/src/port/riscv/riscv-64-aes.c */ - #elif defined(WOLFSSL_NXP_HASHCRYPT_AES) /* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */ @@ -15234,7 +15786,9 @@ static WARN_UNUSED_RESULT int _AesEcbEncrypt( VECTOR_REGISTERS_PUSH; -#if !defined(__aarch64__) && defined(WOLFSSL_ARMASM) +#if defined(WOLFSSL_RISCV_ASM) + AES_encrypt_blocks_RISCV64(in, out, sz, (byte*)aes->key, (int)aes->rounds); +#elif !defined(__aarch64__) && defined(WOLFSSL_ARMASM) #ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO AES_encrypt_blocks_AARCH32(in, out, sz, (byte*)aes->key, (int)aes->rounds); #else @@ -15333,7 +15887,9 @@ static WARN_UNUSED_RESULT int _AesEcbDecrypt( VECTOR_REGISTERS_PUSH; -#if !defined(__aarch64__) && defined(WOLFSSL_ARMASM) +#if defined(WOLFSSL_RISCV_ASM) + AES_decrypt_blocks_RISCV64(in, out, sz, (byte*)aes->key, (int)aes->rounds); +#elif !defined(__aarch64__) && defined(WOLFSSL_ARMASM) #ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO AES_decrypt_blocks_AARCH32(in, out, sz, (byte*)aes->key, (int)aes->rounds); #else @@ -16809,6 +17365,7 @@ static WARN_UNUSED_RESULT int _AesXtsHelper( static int AesXtsEncryptUpdate_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, byte *i); +#if !defined(WOLFSSL_RISCV_ASM) static int AesXtsEncrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, const byte* i) { @@ -16821,6 +17378,7 @@ static int AesXtsEncrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, return AesXtsEncryptUpdate_sw(xaes, out, in, sz, tweak_block); } +#endif /* !WOLFSSL_RISCV_ASM */ #endif #ifdef WOLFSSL_AESXTS_STREAM @@ -16986,7 +17544,11 @@ int wc_AesXtsEncrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, return BAD_FUNC_ARG; } -#if !defined(__aarch64__) && defined(WOLFSSL_ARMASM) && \ +#if defined(WOLFSSL_RISCV_ASM) + AES_XTS_encrypt_RISCV64(in, out, sz, i, (byte*)xaes->aes.key, + (byte*)xaes->tweak.key, (byte*)xaes->aes.tmp, (int)xaes->aes.rounds); + ret = 0; +#elif !defined(__aarch64__) && defined(WOLFSSL_ARMASM) && \ !defined(WOLFSSL_ARMASM_NO_HW_CRYPTO) AES_XTS_encrypt_AARCH32(in, out, sz, i, (byte*)xaes->aes.key, (byte*)xaes->tweak.key, (byte*)xaes->aes.tmp, xaes->aes.rounds); @@ -17330,6 +17892,7 @@ int wc_AesXtsEncryptFinal(XtsAes* xaes, byte* out, const byte* in, word32 sz, static int AesXtsDecryptUpdate_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, byte *i); +#if !defined(WOLFSSL_RISCV_ASM) static int AesXtsDecrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, const byte* i) { @@ -17342,6 +17905,7 @@ static int AesXtsDecrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, return AesXtsDecryptUpdate_sw(xaes, out, in, sz, tweak_block); } +#endif /* !WOLFSSL_RISCV_ASM */ #endif #if (!defined(WOLFSSL_ARMASM) || (!defined(__aarch64__) && \ @@ -17525,7 +18089,14 @@ int wc_AesXtsDecrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, return BAD_FUNC_ARG; } -#if !defined(__aarch64__) && defined(WOLFSSL_ARMASM) && \ +#if defined(WOLFSSL_RISCV_ASM) + /* Use the selected decrypt schedule (aes), not xaes->aes - under + * WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS xaes->aes holds the + * ENCRYPT schedule; matches the AESNI branch below. */ + AES_XTS_decrypt_RISCV64(in, out, sz, i, (byte*)aes->key, + (byte*)xaes->tweak.key, (byte*)aes->tmp, (int)aes->rounds); + ret = 0; +#elif !defined(__aarch64__) && defined(WOLFSSL_ARMASM) && \ !defined(WOLFSSL_ARMASM_NO_HW_CRYPTO) AES_XTS_decrypt_AARCH32(in, out, sz, i, (byte*)xaes->aes.key, (byte*)xaes->tweak.key, (byte*)xaes->aes.tmp, xaes->aes.rounds); diff --git a/wolfcrypt/src/chacha.c b/wolfcrypt/src/chacha.c index 55456345136..bc4ec134ecf 100644 --- a/wolfcrypt/src/chacha.c +++ b/wolfcrypt/src/chacha.c @@ -67,11 +67,6 @@ Public domain. #endif /* HAVE_CHACHA */ -#if defined(WOLFSSL_RISCV_ASM) && !defined(NO_CHACHA_ASM) - /* implementation located in wolfcrypt/src/port/riscv/riscv-64-chacha.c */ - -#else - /* BEGIN ChaCha C implementation */ #if defined(HAVE_CHACHA) @@ -140,7 +135,8 @@ Public domain. */ int wc_Chacha_SetIV(ChaCha* ctx, const byte* inIv, word32 counter) { -#if !defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C) +#if (!defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C)) && \ + !defined(USE_RISCV_CHACHA_SPEEDUP) word32 temp[CHACHA_IV_WORDS];/* used for alignment of memory */ #endif @@ -153,10 +149,12 @@ int wc_Chacha_SetIV(ChaCha* ctx, const byte* inIv, word32 counter) if (chacha_use_neon()) wc_chacha_setiv(ctx->X, inIv, counter); else -#elif defined(USE_ARM_CHACHA_SPEEDUP) && !defined(WOLFSSL_ARM_CHACHA_C_ONLY) +#elif (defined(USE_ARM_CHACHA_SPEEDUP) && !defined(WOLFSSL_ARM_CHACHA_C_ONLY)) || \ + defined(USE_RISCV_CHACHA_SPEEDUP) wc_chacha_setiv(ctx->X, inIv, counter); #endif -#if !defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C) +#if (!defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C)) && \ + !defined(USE_RISCV_CHACHA_SPEEDUP) { XMEMCPY(temp, inIv, CHACHA_IV_BYTES); /* block counter */ @@ -173,7 +171,8 @@ int wc_Chacha_SetIV(ChaCha* ctx, const byte* inIv, word32 counter) return 0; } -#if !defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C) +#if (!defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C)) && \ + !defined(USE_RISCV_CHACHA_SPEEDUP) /* "expand 32-byte k" as unsigned 32 byte */ static const word32 sigma[4] = {0x61707865, 0x3320646e, 0x79622d32, 0x6b206574}; /* "expand 16-byte k" as unsigned 16 byte */ @@ -185,7 +184,8 @@ static const word32 tau[4] = {0x61707865, 0x3120646e, 0x79622d36, 0x6b206574}; */ int wc_Chacha_SetKey(ChaCha* ctx, const byte* key, word32 keySz) { -#if !defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C) +#if (!defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C)) && \ + !defined(USE_RISCV_CHACHA_SPEEDUP) const word32* constants; const byte* k; #ifdef XSTREAM_ALIGN @@ -203,10 +203,12 @@ int wc_Chacha_SetKey(ChaCha* ctx, const byte* key, word32 keySz) if (chacha_use_neon()) wc_chacha_setkey(ctx->X, key, keySz); else -#elif defined(USE_ARM_CHACHA_SPEEDUP) && !defined(WOLFSSL_ARM_CHACHA_C_ONLY) +#elif (defined(USE_ARM_CHACHA_SPEEDUP) && !defined(WOLFSSL_ARM_CHACHA_C_ONLY)) || \ + defined(USE_RISCV_CHACHA_SPEEDUP) wc_chacha_setkey(ctx->X, key, keySz); #endif -#if !defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C) +#if (!defined(USE_ARM_CHACHA_SPEEDUP) || defined(WOLFSSL_ARM_CHACHA_NEED_C)) && \ + !defined(USE_RISCV_CHACHA_SPEEDUP) { #ifdef XSTREAM_ALIGN if ((wc_ptr_t)key % 4) { @@ -259,8 +261,8 @@ int wc_Chacha_SetKey(ChaCha* ctx, const byte* key, word32 keySz) return 0; } -#if (!defined(USE_INTEL_CHACHA_SPEEDUP) && !defined(USE_ARM_CHACHA_SPEEDUP)) || \ - defined(WOLFSSL_ARM_CHACHA_NEED_C) +#if (!defined(USE_INTEL_CHACHA_SPEEDUP) && !defined(USE_ARM_CHACHA_SPEEDUP) && \ + !defined(USE_RISCV_CHACHA_SPEEDUP)) || defined(WOLFSSL_ARM_CHACHA_NEED_C) /** * Converts word into bytes with rotations having been done. */ @@ -307,8 +309,8 @@ extern void chacha_encrypt_avx2(ChaCha* ctx, const byte* m, byte* c, #endif -#if (!defined(USE_INTEL_CHACHA_SPEEDUP) && !defined(USE_ARM_CHACHA_SPEEDUP)) || \ - defined(WOLFSSL_ARM_CHACHA_NEED_C) +#if (!defined(USE_INTEL_CHACHA_SPEEDUP) && !defined(USE_ARM_CHACHA_SPEEDUP) && \ + !defined(USE_RISCV_CHACHA_SPEEDUP)) || defined(WOLFSSL_ARM_CHACHA_NEED_C) /** * Encrypt a stream of bytes */ @@ -406,7 +408,7 @@ int wc_Chacha_Process(ChaCha* ctx, byte* output, const byte* input, chacha_encrypt_x64(ctx, input, output, msglen); return 0; } -#elif defined(USE_ARM_CHACHA_SPEEDUP) +#elif defined(USE_ARM_CHACHA_SPEEDUP) || defined(USE_RISCV_CHACHA_SPEEDUP) #ifdef WOLFSSL_ARM_CHACHA_NEON_FALLBACK if (chacha_use_neon()) #endif @@ -446,7 +448,7 @@ int wc_Chacha_Process(ChaCha* ctx, byte* output, const byte* input, #endif } #endif /* HAVE_CHACHA */ -#endif /* END ChaCha C implementation */ +/* END ChaCha C implementation */ #if defined(HAVE_CHACHA) && defined(HAVE_XCHACHA) diff --git a/wolfcrypt/src/poly1305.c b/wolfcrypt/src/poly1305.c index 81214826c40..503ceff5850 100644 --- a/wolfcrypt/src/poly1305.c +++ b/wolfcrypt/src/poly1305.c @@ -799,6 +799,7 @@ static int poly1305_blocks(Poly1305* ctx, const unsigned char *m, return poly1305_c_blocks(ctx, m, bytes); #endif } +#endif /* !WOLFSSL_RISCV_ASM */ /* This local function is used for the last call when a message with a given @@ -821,6 +822,9 @@ static WC_INLINE int poly1305_block(Poly1305* ctx, const unsigned char *m) #elif defined(WOLFSSL_ARMASM) poly1305_block_aarch64(ctx, m); return 0; +#elif defined(WOLFSSL_RISCV_ASM) + poly1305_block_16_riscv64(ctx, m); + return 0; #else return poly1305_blocks(ctx, m, POLY1305_BLOCK_SIZE); #endif @@ -865,6 +869,8 @@ int wc_Poly1305SetKey(Poly1305* ctx, const byte* key, word32 keySz) poly1305_set_key(ctx, key); #endif ctx->finished = 0; +#elif defined(WOLFSSL_RISCV_ASM) + poly1305_set_key_riscv64(ctx, key); #else poly1305_c_setkey(ctx, key); #endif @@ -913,6 +919,18 @@ int wc_Poly1305Final(Poly1305* ctx, byte* mac) #else poly1305_final(ctx, mac); #endif +#elif defined(WOLFSSL_RISCV_ASM) + /* process the remaining block */ + if (ctx->leftover) { + size_t i = ctx->leftover; + ctx->buffer[i] = 1; + for (i = i + 1; i < POLY1305_BLOCK_SIZE; i++) + ctx->buffer[i] = 0; + ctx->finished = 1; + poly1305_block_16_riscv64(ctx, ctx->buffer); + } + + poly1305_final_riscv64(ctx, mac); #else /* process the remaining block */ if (ctx->leftover) { @@ -928,7 +946,6 @@ int wc_Poly1305Final(Poly1305* ctx, byte* mac) return 0; } -#endif /* !WOLFSSL_RISCV_ASM */ int wc_Poly1305Update(Poly1305* ctx, const byte* m, word32 bytes) diff --git a/wolfcrypt/src/port/riscv/riscv-64-aes.c b/wolfcrypt/src/port/riscv/riscv-64-aes.c deleted file mode 100644 index 603763cdcb1..00000000000 --- a/wolfcrypt/src/port/riscv/riscv-64-aes.c +++ /dev/null @@ -1,9328 +0,0 @@ -/* riscv-64-aes.c - * - * Copyright (C) 2006-2026 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 3 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 - */ - -#include - -#if FIPS_VERSION3_GE(2,0,0) - /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ - #define FIPS_NO_WRAPPERS -#endif - -#include - -#if !defined(NO_AES) - -#include - -#ifdef NO_INLINE - #include -#else - #define WOLFSSL_MISC_INCLUDED - #include -#endif - -#ifdef WOLFSSL_RISCV_ASM - -#if FIPS_VERSION3_GE(6,0,0) - const unsigned int wolfCrypt_FIPS_aes_ro_sanity[2] = - { 0x1a2b3c4d, 0x00000002 }; - int wolfCrypt_FIPS_AES_sanity(void) - { - return 0; - } -#endif - -/* Copy a 16-byte value from in to out. - * - * @param [out] out 16-byte value destination. - * @param [in] in 16-byte value source. - */ -static WC_INLINE void memcpy16(byte* out, const byte* in) -{ - word64* out64 = (word64*)out; - word64* in64 = (word64*)in; - - out64[0] = in64[0]; - out64[1] = in64[1]; -} - -#ifdef WOLFSSL_RISCV_BIT_MANIPULATION - -/* Reverse bits in each byte of 64-bit register. */ -#define BREV8(rd, rs) \ - ASM_WORD(0b01101000011100000101000000010011 | \ - (rs << 15) | (rd << 7)) - -#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ - -#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - -/* Reverse bits in each byte of 128-bit vector register. */ -#define VBREV8(vd, vs2) \ - ASM_WORD((0b010010 << 26) | (0b1 << 25) | (0b1000 << 15) | \ - (0b010 << 12) | (0b1010111 << 0) | \ - (vs2 << 20) | (vd << 7)) -#endif - - -/* Vector register set if equal: vd[i] = vs1[i] == vs2[i] ? 1 : 0 */ -#define VMSEQ_VV(vd, vs1, vs2) \ - ASM_WORD((0b011000 << 26) | (0b1 << 25) | \ - (0b000 << 12) | (0b1010111 << 0) | \ - (vs2 << 20) | (vs1 << 15) | (vd << 7)) -/* Vector register set if equal: vd[i] = vs1[i] != vs2[i] ? 1 : 0 */ -#define VMSNE_VV(vd, vs1, vs2) \ - ASM_WORD((0b011001 << 26) | (0b1 << 25) | \ - (0b000 << 12) | (0b1010111 << 0) | \ - (vs2 << 20) | (vs1 << 15) | (vd << 7)) - -/* rd = Count of vs2[i] that has a value of 1. */ -#define VCPOP_M(rd, vs2) \ - ASM_WORD((0b010000 << 26) | (0b1 << 25) | \ - (0b10000 << 15) | \ - (0b010 << 12) | (0b1010111 << 0) | \ - (vs2 << 20) | (rd << 7)) - -#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) - -/* - * Vector crypto instruction implementation of base operations. - */ - -/* Vector AES-128 forward key schedule computation. */ -#define VAESKF1_VI(rd, rs2, rnum) \ - ASM_WORD((0b100010 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (rd << 7) | (rnum << 15) | (rs2 << 20)) -/* Vector AES-256 forward key schedule computation. */ -#define VAESKF2_VI(rd, rs2, rnum) \ - ASM_WORD((0b101010 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (rd << 7) | (rnum << 15) | (rs2 << 20)) - -/* Vector AES round zero encryption/decryption. */ -#define VAESZ_VS(rd, rs2) \ - ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ - (0b00111 << 15) | (0b010 << 12) | \ - (0b1110111 << 0) | \ - (rd << 7) | (rs2 << 20)) -/* Vector AES middle-round encryption. */ -#define VAESEM_VS(rd, rs2) \ - ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ - (0b00010 << 15) | (0b010 << 12) | \ - (0b1110111 << 0) | \ - (rd << 7) | (rs2 << 20)) -/* Vector AES final-round encryption. */ -#define VAESEF_VS(rd, rs2) \ - ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ - (0b00011 << 15) | (0b010 << 12) | \ - (0b1110111 << 0) | \ - (rd << 7) | (rs2 << 20)) -/* Vector AES middle-round decryption. */ -#define VAESDM_VS(rd, rs2) \ - ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ - (0b00000 << 15) | (0b010 << 12) | \ - (0b1110111 << 0) | \ - (rd << 7) | (rs2 << 20)) -/* Vector AES final-round decryption. */ -#define VAESDF_VS(rd, rs2) \ - ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ - (0b00001 << 15) | (0b010 << 12) | \ - (0b1110111 << 0) | \ - (rd << 7) | (rs2 << 20)) - -/* Set the key and/or IV into the AES object. - * - * Creates the key schedule from the key. - * Uses Vector Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [in] key Secret key to use. - * @param [in] keyLen Length of key in bytes. - * @param [in] iv Initialization Vector (IV) to use. May be NULL. - * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes or key is NULL. - * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. - */ -int wc_AesSetKey(Aes* aes, const byte* key, word32 keyLen, const byte* iv, - int dir) -{ - int ret = 0; - - /* Validate parameters. */ - if ((aes == NULL) || (key == NULL)) { - ret = BAD_FUNC_ARG; - } -#ifdef WOLFSSL_AES_128 - else if ((keyLen == 16) && (dir == AES_ENCRYPTION)) { - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - "mv t0, %[key]\n\t" - VL1RE32_V(REG_V0, REG_T0) - "mv t0, %[ks]\n\t" - VAESKF1_VI(REG_V1, REG_V0, 1) - VAESKF1_VI(REG_V2, REG_V1, 2) - VAESKF1_VI(REG_V3, REG_V2, 3) - VAESKF1_VI(REG_V4, REG_V3, 4) - VAESKF1_VI(REG_V5, REG_V4, 5) - VAESKF1_VI(REG_V6, REG_V5, 6) - VAESKF1_VI(REG_V7, REG_V6, 7) - VAESKF1_VI(REG_V8, REG_V7, 8) - VAESKF1_VI(REG_V9, REG_V8, 9) - VAESKF1_VI(REG_V10, REG_V9, 10) - VS8R_V(REG_V0, REG_T0) - "add t0, t0, 128\n\t" - VS2R_V(REG_V8, REG_T0) - "add t0, t0, 96\n\t" - VS1R_V(REG_V10, REG_T0) - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2" - ); - aes->rounds = 10; - } -#ifdef HAVE_AES_DECRYPT - else if ((keyLen == 16) && (dir == AES_DECRYPTION)) { - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - "mv t0, %[key]\n\t" - VL1RE32_V(REG_V10, REG_T0) - "mv t0, %[ks]\n\t" - VAESKF1_VI(REG_V9, REG_V10, 1) - VAESKF1_VI(REG_V8, REG_V9 , 2) - VAESKF1_VI(REG_V7, REG_V8 , 3) - VAESKF1_VI(REG_V6, REG_V7 , 4) - VAESKF1_VI(REG_V5, REG_V6 , 5) - VAESKF1_VI(REG_V4, REG_V5 , 6) - VAESKF1_VI(REG_V3, REG_V4 , 7) - VAESKF1_VI(REG_V2, REG_V3 , 8) - VAESKF1_VI(REG_V1, REG_V2 , 9) - VAESKF1_VI(REG_V0, REG_V1 , 10) - VS8R_V(REG_V0, REG_T0) - "add t0, t0, 128\n\t" - VS2R_V(REG_V8, REG_T0) - "add t0, t0, 96\n\t" - VS1R_V(REG_V10, REG_T0) - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2" - ); - aes->rounds = 10; - } -#endif -#endif -#ifdef WOLFSSL_AES_192 - -/* One round of computing key schedule for AES-192. */ -#define AES_192_ROUND(d, s, r) \ - /* Place key[3] in v16[3] */ \ - VSLIDEDOWN_VI(REG_V17, s, 3) \ - VSLIDEUP_VI(REG_V16, REG_V17, 3) \ - /* Place key[5] in s[3] */ \ - VSLIDEUP_VI(s, REG_V14, 3) \ - /* key'[0] = key[0] ^ ks1(key[5]) */ \ - /* key'[1] = key[1] ^ key'[0] */ \ - /* key'[2] = key[2] ^ key'[1] */ \ - /* key'[3] = key[5] ^ key'[2] */ \ - VAESKF1_VI(d, s, r) \ - /* key'[3] = key[3] ^ key[5] ^ key'[2] */ \ - VXOR_VV(d, d, REG_V16) \ - /* key'[3] = key[3] ^ key'[2] */ \ - VSLIDEUP_VI(REG_V16, REG_V14, 3) \ - VXOR_VV(d, d, REG_V16) \ - /* key'[4] = key[4] ^ key'[3] */ \ - VSLIDEDOWN_VI(REG_V15, d, 3) \ - VXOR_VV(REG_V13, REG_V13, REG_V15) \ - /* key'[5] = key[5] ^ key'[4] */ \ - VXOR_VV(REG_V14, REG_V14, REG_V13) \ - -/* Store 6 words. - * V13[0] and V14[0] contain last two words. */ -#define AES_192_STORE(d) \ - VS1R_V(d, REG_T0) \ - "addi t0, t0, 16\n\t" \ - VSLIDEUP_VI(REG_V13, REG_V14, 1) \ - VSETIVLI(REG_X0, 2, 1, 1, 0b010, 0b000) \ - VS1R_V(REG_V13, REG_T0) \ - "addi t0, t0, 8\n\t" \ - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - else if ((keyLen == 24) && (dir == AES_ENCRYPTION)) { - /* Not supported with specific instructions - make it work anyway! */ - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - "mv t0, %[key]\n\t" - VL1RE32_V(REG_V0, REG_T0) - VSETIVLI(REG_X0, 1, 1, 1, 0b010, 0b000) - "addi t0, t0, 16\n\t" - VL1RE32_V(REG_V13, REG_T0) - "addi t0, t0, 4\n\t" - VL1RE32_V(REG_V14, REG_T0) - VXOR_VV(REG_V16, REG_V16, REG_V16) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - "mv t0, %[ks]\n\t" - - /* Round 0 */ - AES_192_STORE(REG_V0) - /* Round 1 */ - AES_192_ROUND(REG_V1, REG_V0, 1) - AES_192_STORE(REG_V1) - /* Round 2 */ - AES_192_ROUND(REG_V0, REG_V1, 2) - AES_192_STORE(REG_V0) - /* Round 3 */ - AES_192_ROUND(REG_V1, REG_V0, 3) - AES_192_STORE(REG_V1) - /* Round 4 */ - AES_192_ROUND(REG_V0, REG_V1, 4) - AES_192_STORE(REG_V0) - /* Round 5 */ - AES_192_ROUND(REG_V1, REG_V0, 5) - AES_192_STORE(REG_V1) - /* Round 6 */ - AES_192_ROUND(REG_V0, REG_V1, 6) - AES_192_STORE(REG_V0) - /* Round 7 */ - AES_192_ROUND(REG_V1, REG_V0, 7) - AES_192_STORE(REG_V1) - /* Round 8 */ - AES_192_ROUND(REG_V0, REG_V1, 8) - "addi t0, t0, 32\n\t" - VS1R_V(REG_V0, REG_T0) - /* Only need 52 32-bit words - 13 rounds x 4 32-bit words. */ - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0" - ); - aes->rounds = 12; - } -#ifdef HAVE_AES_DECRYPT - else if ((keyLen == 24) && (dir == AES_DECRYPTION)) { - /* Not supported with specific instructions - make it work anyway! */ - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - "mv t0, %[key]\n\t" - VL1RE32_V(REG_V0, REG_T0) - VSETIVLI(REG_X0, 1, 1, 1, 0b010, 0b000) - "addi t0, t0, 16\n\t" - VL1RE32_V(REG_V13, REG_T0) - "addi t0, t0, 4\n\t" - VL1RE32_V(REG_V14, REG_T0) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VXOR_VV(REG_V16, REG_V16, REG_V16) - - "addi t0, %[ks], 224\n\t" - VS1R_V(REG_V0, REG_T0) - - "mv t0, %[ks]\n\t" - - /* Round 0 */ - AES_192_STORE(REG_V0) - /* Round 1 */ - AES_192_ROUND(REG_V1, REG_V0, 1) - AES_192_STORE(REG_V1) - /* Round 2 */ - AES_192_ROUND(REG_V0, REG_V1, 2) - AES_192_STORE(REG_V0) - /* Round 3 */ - AES_192_ROUND(REG_V1, REG_V0, 3) - AES_192_STORE(REG_V1) - /* Round 4 */ - AES_192_ROUND(REG_V0, REG_V1, 4) - AES_192_STORE(REG_V0) - /* Round 5 */ - AES_192_ROUND(REG_V1, REG_V0, 5) - AES_192_STORE(REG_V1) - /* Round 6 */ - AES_192_ROUND(REG_V0, REG_V1, 6) - AES_192_STORE(REG_V0) - /* Round 7 */ - AES_192_ROUND(REG_V1, REG_V0, 7) - AES_192_STORE(REG_V1) - /* Round 8 */ - AES_192_ROUND(REG_V0, REG_V1, 8) - VS1R_V(REG_V0, REG_T0) - /* Only need 52 32-bit words - 13 rounds x 4 32-bit words. */ - - /* Invert the order of the round keys. */ - "mv t0, %[ks]\n\t" - VL4RE32_V(REG_V0, REG_T0) - "addi t0, %[ks], 64\n\t" - VL2RE32_V(REG_V4, REG_T0) - "addi t1, %[ks], 112\n\t" - VL4RE32_V(REG_V8, REG_T1) - "addi t1, %[ks], 176\n\t" - VL2RE32_V(REG_V12, REG_T1) - VMV_V_V(REG_V21, REG_V0 ) - VMV_V_V(REG_V20, REG_V1 ) - VMV_V_V(REG_V19, REG_V2 ) - VMV_V_V(REG_V18, REG_V3 ) - VMV_V_V(REG_V17, REG_V4 ) - VMV_V_V(REG_V16, REG_V5 ) - VMV_V_V(REG_V5 , REG_V8 ) - VMV_V_V(REG_V4 , REG_V9 ) - VMV_V_V(REG_V3 , REG_V10) - VMV_V_V(REG_V2 , REG_V11) - VMV_V_V(REG_V1 , REG_V12) - VMV_V_V(REG_V0 , REG_V13) - "mv t0, %[ks]\n\t" - VS4R_V(REG_V0, REG_T0) - "addi t0, %[ks], 64\n\t" - VS2R_V(REG_V4, REG_T0) - "addi t1, %[ks], 112\n\t" - VS4R_V(REG_V16, REG_T1) - "addi t1, %[ks], 176\n\t" - VS2R_V(REG_V20, REG_T1) - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1" - ); - aes->rounds = 12; - } -#endif -#endif -#ifdef WOLFSSL_AES_256 - else if ((keyLen == 32) && (dir == AES_ENCRYPTION)) { - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - "mv t0, %[key]\n\t" - VL2RE32_V(REG_V0, REG_T0) - "mv t0, %[ks]\n\t" - VMV_V_V(REG_V14, REG_V0) - VMV_V_V(REG_V13, REG_V1) - VAESKF2_VI(REG_V14, REG_V13, 2) - VMV_V_V(REG_V2, REG_V14) - VAESKF2_VI(REG_V13, REG_V14, 3) - VMV_V_V(REG_V3, REG_V13) - VAESKF2_VI(REG_V14, REG_V13, 4) - VMV_V_V(REG_V4, REG_V14) - VAESKF2_VI(REG_V13, REG_V14, 5) - VMV_V_V(REG_V5, REG_V13) - VAESKF2_VI(REG_V14, REG_V13, 6) - VMV_V_V(REG_V6, REG_V14) - VAESKF2_VI(REG_V13, REG_V14, 7) - VMV_V_V(REG_V7, REG_V13) - VAESKF2_VI(REG_V14, REG_V13, 8) - VMV_V_V(REG_V8, REG_V14) - VAESKF2_VI(REG_V13, REG_V14, 9) - VMV_V_V(REG_V9, REG_V13) - VAESKF2_VI(REG_V14, REG_V13, 10) - VMV_V_V(REG_V10, REG_V14) - VAESKF2_VI(REG_V13, REG_V14, 11) - VMV_V_V(REG_V11, REG_V13) - VAESKF2_VI(REG_V14, REG_V13, 12) - VMV_V_V(REG_V12, REG_V14) - VAESKF2_VI(REG_V13, REG_V14, 13) - VAESKF2_VI(REG_V14, REG_V13, 14) - VS8R_V(REG_V0, REG_T0) - "add t0, t0, 128\n\t" - VSR_V(REG_V8, REG_T0, 4) - "add t0, t0, 64\n\t" - VSR_V(REG_V12, REG_T0, 2) - "add t0, t0, 32\n\t" - VSR_V(REG_V14, REG_T0, 1) - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2" - ); - aes->rounds = 14; - } -#ifdef HAVE_AES_DECRYPT - else if ((keyLen == 32) && (dir == AES_DECRYPTION)) { - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - "mv t0, %[key]\n\t" - VL2RE32_V(REG_V0, REG_T0) - VMV_V_V(REG_V13, REG_V1) - VMV_V_V(REG_V14, REG_V0) - "mv t0, %[ks]\n\t" - VAESKF2_VI(REG_V0, REG_V1, 2) - VMV_V_V(REG_V12, REG_V0) - VAESKF2_VI(REG_V1, REG_V0, 3) - VMV_V_V(REG_V11, REG_V1) - VAESKF2_VI(REG_V0, REG_V1, 4) - VMV_V_V(REG_V10, REG_V0) - VAESKF2_VI(REG_V1, REG_V0, 5) - VMV_V_V(REG_V9 , REG_V1) - VAESKF2_VI(REG_V0, REG_V1, 6) - VMV_V_V(REG_V8 , REG_V0) - VAESKF2_VI(REG_V1, REG_V0, 7) - VMV_V_V(REG_V7 , REG_V1) - VAESKF2_VI(REG_V0, REG_V1, 8) - VMV_V_V(REG_V6 , REG_V0) - VAESKF2_VI(REG_V1, REG_V0, 9) - VMV_V_V(REG_V5 , REG_V1) - VAESKF2_VI(REG_V0, REG_V1, 10) - VMV_V_V(REG_V4 , REG_V0) - VAESKF2_VI(REG_V1, REG_V0, 11) - VMV_V_V(REG_V3 , REG_V1) - VAESKF2_VI(REG_V0, REG_V1, 12) - VMV_V_V(REG_V2 , REG_V0) - VAESKF2_VI(REG_V1, REG_V0, 13) - VAESKF2_VI(REG_V0, REG_V1, 14) - VS8R_V(REG_V0, REG_T0) - "add t0, t0, 128\n\t" - VSR_V(REG_V8, REG_T0, 4) - "add t0, t0, 64\n\t" - VSR_V(REG_V12, REG_T0, 2) - "add t0, t0, 32\n\t" - VSR_V(REG_V14, REG_T0, 1) - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2" - ); - aes->rounds = 14; - } -#endif -#endif - else { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - /* Set the IV. */ - ret = wc_AesSetIV(aes, iv); - } - if (ret == 0) { - /* Finish setting the AES object. */ - aes->keylen = keyLen; -#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) || \ - defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_XTS) - aes->left = 0; -#endif - } - - return ret; -} - -#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AESGCM) || defined(HAVE_AESCCM) -/* Encrypt a block using AES. - * - * Uses Vector Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [in] in Block to encrypt. - * @param [out] out Encrypted block. - */ -static void wc_AesEncrypt(Aes* aes, const byte* in, byte* out) -{ - word32* key = aes->key; - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..9]. */ - "addi t0, t0, 128\n\t" - VL2RE32_V(REG_V8, REG_T0) - /* Check for 11 rounds. */ - "li t4, 11\n\t" - "ble %[rounds], t4, L_aes_encrypt_loaded\n\t" - /* Load key[10..11]. */ - "addi t0, t0, 32\n\t" - VL2RE32_V(REG_V10, REG_T0) - /* Check for 13 rounds. */ - "li t4, 13\n\t" - "ble %[rounds], t4, L_aes_encrypt_loaded\n\t" - /* Load key[12..13]. */ - "addi t0, t0, 32\n\t" - VL2RE32_V(REG_V12, REG_T0) - "L_aes_encrypt_loaded:\n\t" - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V14, REG_T0) - - /* Load block. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - - /* Encrypt 10 rounds. */ - VAESZ_VS(REG_V15, REG_V0) - VAESEM_VS(REG_V15, REG_V1) - VAESEM_VS(REG_V15, REG_V2) - VAESEM_VS(REG_V15, REG_V3) - VAESEM_VS(REG_V15, REG_V4) - VAESEM_VS(REG_V15, REG_V5) - VAESEM_VS(REG_V15, REG_V6) - VAESEM_VS(REG_V15, REG_V7) - VAESEM_VS(REG_V15, REG_V8) - VAESEM_VS(REG_V15, REG_V9) - /* Check for 11 rounds. */ - "li t4, 11\n\t" - "ble %[rounds], t4, L_aes_encrypt_done\n\t" - VAESEM_VS(REG_V15, REG_V10) - VAESEM_VS(REG_V15, REG_V11) - /* Check for 13 rounds. */ - "li t4, 13\n\t" - "ble %[rounds], t4, L_aes_encrypt_done\n\t" - VAESEM_VS(REG_V15, REG_V12) - VAESEM_VS(REG_V15, REG_V13) - "L_aes_encrypt_done:\n\t" - /* Last round. */ - VAESEF_VS(REG_V15, REG_V14) - - /* Store encrypted block. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - - : - : [in] "r" (in), [out] "r" (out), [key] "r" (key), - [rounds] "r" (aes->rounds) - : "memory", "t0", "t1", "t2", "t4" - ); -} -#endif - -#ifdef HAVE_AES_DECRYPT -#ifdef WOLFSSL_AES_DIRECT -/* Decrypt a block using AES. - * - * Uses Vector Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [in] in Block to decrypt. - * @param [out] out Decrypted block. - */ -static void wc_AesDecrypt(Aes* aes, const byte* in, byte* out) -{ - word32* key = aes->key; - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..9]. */ - "addi t0, t0, 128\n\t" - VL2RE32_V(REG_V8, REG_T0) - /* Check for 11 rounds. */ - "li t4, 11\n\t" - "ble %[rounds], t4, L_aes_decrypt_loaded\n\t" - /* Load key[10..11]. */ - "addi t0, t0, 32\n\t" - VL2RE32_V(REG_V10, REG_T0) - /* Check for 13 rounds. */ - "li t4, 13\n\t" - "ble %[rounds], t4, L_aes_decrypt_loaded\n\t" - /* Load key[12..13]. */ - "addi t0, t0, 32\n\t" - VL2RE32_V(REG_V12, REG_T0) - "L_aes_decrypt_loaded:\n\t" - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V14, REG_T0) - - /* Load block. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - - /* Decrypt 10 rounds. */ - VAESZ_VS(REG_V15, REG_V0) - VAESDM_VS(REG_V15, REG_V1) - VAESDM_VS(REG_V15, REG_V2) - VAESDM_VS(REG_V15, REG_V3) - VAESDM_VS(REG_V15, REG_V4) - VAESDM_VS(REG_V15, REG_V5) - VAESDM_VS(REG_V15, REG_V6) - VAESDM_VS(REG_V15, REG_V7) - VAESDM_VS(REG_V15, REG_V8) - VAESDM_VS(REG_V15, REG_V9) - /* Check for 11 rounds. */ - "li t4, 11\n\t" - "ble %[rounds], t4, L_aes_decrypt_done\n\t" - VAESDM_VS(REG_V15, REG_V10) - VAESDM_VS(REG_V15, REG_V11) - /* Check for 13 rounds. */ - "li t4, 13\n\t" - "ble %[rounds], t4, L_aes_decrypt_done\n\t" - VAESDM_VS(REG_V15, REG_V12) - VAESDM_VS(REG_V15, REG_V13) - "L_aes_decrypt_done:\n\t" - /* Last round. */ - VAESDF_VS(REG_V15, REG_V14) - - /* Store decrypted block. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - - : - : [in] "r" (in), [out] "r" (out), [key] "r" (key), - [rounds] "r" (aes->rounds) - : "memory", "t0", "t1", "t2", "t4" - ); -} -#endif /* WOLFSSL_AES_DIRECT */ -#endif /* HAVE_AES_DECRYPT */ - -/* AES-CBC */ -#ifdef HAVE_AES_CBC -/* Encrypt blocks of data using AES-CBC. - * - * Uses Vector Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [out] out Encrypted blocks. - * @param [in] in Blocks to encrypt. - * @param pin] sz Number of bytes to encrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_LENGTH_E when sz is not a multiple of WC_AES_BLOCK_SIZE. - */ -int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - int ret = 0; - word32 blocks = sz / WC_AES_BLOCK_SIZE; - - /* Validate parameters. */ - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } -#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS - /* Ensure a multiple of blocks is to be encrypted. */ - if ((ret == 0) && (sz % WC_AES_BLOCK_SIZE)) { - ret = BAD_LENGTH_E; - } -#endif - - if ((ret == 0) && (sz > 0)) { - switch (aes->rounds) { -#ifdef WOLFSSL_AES_128 - case 10: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..9]. */ - "addi t0, t0, 128\n\t" - VL2RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V10, REG_T0) - /* Load the IV. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V11, REG_T0) - - "L_aes_cbc_128_encrypt_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - VXOR_VV(REG_V15, REG_V15, REG_V11) - - VAESZ_VS(REG_V15, REG_V0) - VAESEM_VS(REG_V15, REG_V1) - VAESEM_VS(REG_V15, REG_V2) - VAESEM_VS(REG_V15, REG_V3) - VAESEM_VS(REG_V15, REG_V4) - VAESEM_VS(REG_V15, REG_V5) - VAESEM_VS(REG_V15, REG_V6) - VAESEM_VS(REG_V15, REG_V7) - VAESEM_VS(REG_V15, REG_V8) - VAESEM_VS(REG_V15, REG_V9) - VAESEF_VS(REG_V15, REG_V10) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - VMV_V_V(REG_V11, REG_V15) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_cbc_128_encrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V11, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif -#ifdef WOLFSSL_AES_192 - case 12: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V12, REG_T0) - /* Load the IV. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V13, REG_T0) - - "L_aes_cbc_192_encrypt_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - VXOR_VV(REG_V15, REG_V15, REG_V13) - - VAESZ_VS(REG_V15, REG_V0) - VAESEM_VS(REG_V15, REG_V1) - VAESEM_VS(REG_V15, REG_V2) - VAESEM_VS(REG_V15, REG_V3) - VAESEM_VS(REG_V15, REG_V4) - VAESEM_VS(REG_V15, REG_V5) - VAESEM_VS(REG_V15, REG_V6) - VAESEM_VS(REG_V15, REG_V7) - VAESEM_VS(REG_V15, REG_V8) - VAESEM_VS(REG_V15, REG_V9) - VAESEM_VS(REG_V15, REG_V10) - VAESEM_VS(REG_V15, REG_V11) - VAESEF_VS(REG_V15, REG_V12) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - VMV_V_V(REG_V13, REG_V15) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_cbc_192_encrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V13, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif -#ifdef WOLFSSL_AES_256 - case 14: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load key[12..13]. */ - "addi t0, t0, 64\n\t" - VL2RE32_V(REG_V12, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V14, REG_T0) - /* Load the IV. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V16, REG_T0) - - "L_aes_cbc_256_encrypt_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - VXOR_VV(REG_V15, REG_V15, REG_V16) - - VAESZ_VS(REG_V15, REG_V0) - VAESEM_VS(REG_V15, REG_V1) - VAESEM_VS(REG_V15, REG_V2) - VAESEM_VS(REG_V15, REG_V3) - VAESEM_VS(REG_V15, REG_V4) - VAESEM_VS(REG_V15, REG_V5) - VAESEM_VS(REG_V15, REG_V6) - VAESEM_VS(REG_V15, REG_V7) - VAESEM_VS(REG_V15, REG_V8) - VAESEM_VS(REG_V15, REG_V9) - VAESEM_VS(REG_V15, REG_V10) - VAESEM_VS(REG_V15, REG_V11) - VAESEM_VS(REG_V15, REG_V12) - VAESEM_VS(REG_V15, REG_V13) - VAESEF_VS(REG_V15, REG_V14) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - VMV_V_V(REG_V16, REG_V15) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_cbc_256_encrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V16, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif - } - } - - return ret; -} - -#ifdef HAVE_AES_DECRYPT -/* Decrypt blocks of data using AES-CBC. - * - * Uses Vector Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [out] out Decrypted blocks. - * @param [in] in Blocks to decrypt. - * @param pin] sz Number of bytes to decrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_FUNC_ARG when sz is not a multiple of WC_AES_BLOCK_SIZE. - * @return BAD_LENGTH_E when sz is not a multiple of WC_AES_BLOCK_SIZE. - */ -int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - int ret = 0; - word32 blocks = sz / WC_AES_BLOCK_SIZE; - - /* Validate parameters. */ - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } - /* Ensure a multiple of blocks is being decrypted. */ - if ((ret == 0) && (sz % WC_AES_BLOCK_SIZE)) { -#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS - ret = BAD_LENGTH_E; -#else - ret = BAD_FUNC_ARG; -#endif - } - - if ((ret == 0) && (sz > 0)) { - switch (aes->rounds) { -#ifdef WOLFSSL_AES_128 - case 10: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..9]. */ - "addi t0, t0, 128\n\t" - VL2RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V10, REG_T0) - /* Load the IV. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V11, REG_T0) - - "L_aes_cbc_128_decrypt_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - VMV_V_V(REG_V14, REG_V15) - - VAESZ_VS(REG_V15, REG_V0) - VAESDM_VS(REG_V15, REG_V1) - VAESDM_VS(REG_V15, REG_V2) - VAESDM_VS(REG_V15, REG_V3) - VAESDM_VS(REG_V15, REG_V4) - VAESDM_VS(REG_V15, REG_V5) - VAESDM_VS(REG_V15, REG_V6) - VAESDM_VS(REG_V15, REG_V7) - VAESDM_VS(REG_V15, REG_V8) - VAESDM_VS(REG_V15, REG_V9) - VAESDF_VS(REG_V15, REG_V10) - VXOR_VV(REG_V15, REG_V15, REG_V11) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - VMV_V_V(REG_V11, REG_V14) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_cbc_128_decrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V11, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif -#ifdef WOLFSSL_AES_192 - case 12: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V12, REG_T0) - /* Load the IV. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V13, REG_T0) - - "L_aes_cbc_192_decrypt_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - VMV_V_V(REG_V14, REG_V15) - - VAESZ_VS(REG_V15, REG_V0) - VAESDM_VS(REG_V15, REG_V1) - VAESDM_VS(REG_V15, REG_V2) - VAESDM_VS(REG_V15, REG_V3) - VAESDM_VS(REG_V15, REG_V4) - VAESDM_VS(REG_V15, REG_V5) - VAESDM_VS(REG_V15, REG_V6) - VAESDM_VS(REG_V15, REG_V7) - VAESDM_VS(REG_V15, REG_V8) - VAESDM_VS(REG_V15, REG_V9) - VAESDM_VS(REG_V15, REG_V10) - VAESDM_VS(REG_V15, REG_V11) - VAESDF_VS(REG_V15, REG_V12) - VXOR_VV(REG_V15, REG_V15, REG_V13) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - VMV_V_V(REG_V13, REG_V14) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_cbc_192_decrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V13, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif -#ifdef WOLFSSL_AES_256 - case 14: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load key[12..13]. */ - "addi t0, t0, 64\n\t" - VL2RE32_V(REG_V12, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V14, REG_T0) - /* Load the IV. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V16, REG_T0) - - "L_aes_cbc_256_decrypt_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V15, REG_T0) - VMV_V_V(REG_V17, REG_V15) - - VAESZ_VS(REG_V15, REG_V0) - VAESDM_VS(REG_V15, REG_V1) - VAESDM_VS(REG_V15, REG_V2) - VAESDM_VS(REG_V15, REG_V3) - VAESDM_VS(REG_V15, REG_V4) - VAESDM_VS(REG_V15, REG_V5) - VAESDM_VS(REG_V15, REG_V6) - VAESDM_VS(REG_V15, REG_V7) - VAESDM_VS(REG_V15, REG_V8) - VAESDM_VS(REG_V15, REG_V9) - VAESDM_VS(REG_V15, REG_V10) - VAESDM_VS(REG_V15, REG_V11) - VAESDM_VS(REG_V15, REG_V12) - VAESDM_VS(REG_V15, REG_V13) - VAESDF_VS(REG_V15, REG_V14) - VXOR_VV(REG_V15, REG_V15, REG_V16) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - VMV_V_V(REG_V16, REG_V17) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_cbc_256_decrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V16, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif - } - } - - return ret; -} -#endif /* HAVE_AES_DECRYPT */ - -/* Don't need generic implementation. */ -#define HAVE_AES_CBC_ENC_DEC - -#endif /* HAVE_AES_CBC */ - -/* AES-CTR */ -#ifdef WOLFSSL_AES_COUNTER -/* Encrypt blocks using AES-CTR. - * - * Uses Vector Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [out] out Encrypted blocks. - * @param [in] in Blocks to encrypt. - * @param [in] blocks Number of blocks to encrypt. - */ -static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in, - word32 blocks) -{ - switch(aes->rounds) { -#ifdef WOLFSSL_AES_128 - case 10: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..9]. */ - "addi t0, t0, 128\n\t" - VL2RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V10, REG_T0) - /* Load the counter. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V16, REG_T0) - "li t2, 1 \n\t" - - "L_aes_ctr_128_encrypt_block_loop:\n\t" - VMV_V_V(REG_V15, REG_V16) - VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) - VREV8(REG_V16, REG_V16) - VSLIDEDOWN_VI(REG_V17, REG_V16, 1) - VXOR_VV(REG_V18, REG_V18, REG_V18) - VADD_VI(REG_V17, REG_V17, 1) - VMSEQ_VV(REG_V18, REG_V18, REG_V17) - VSLIDEUP_VI(REG_V16, REG_V17, 1) - VADD_VV(REG_V16, REG_V16, REG_V18) - VREV8(REG_V16, REG_V16) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - VAESZ_VS(REG_V15, REG_V0) - VAESEM_VS(REG_V15, REG_V1) - VAESEM_VS(REG_V15, REG_V2) - VAESEM_VS(REG_V15, REG_V3) - VAESEM_VS(REG_V15, REG_V4) - VAESEM_VS(REG_V15, REG_V5) - VAESEM_VS(REG_V15, REG_V6) - VAESEM_VS(REG_V15, REG_V7) - VAESEM_VS(REG_V15, REG_V8) - VAESEM_VS(REG_V15, REG_V9) - VAESEF_VS(REG_V15, REG_V10) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V15, REG_V15, REG_V17) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_ctr_128_encrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V16, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif -#ifdef WOLFSSL_AES_192 - case 12: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V12, REG_T0) - /* Load the counter. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V16, REG_T0) - "li t2, 1 \n\t" - - "L_aes_ctr_192_encrypt_block_loop:\n\t" - VMV_V_V(REG_V15, REG_V16) - VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) - VREV8(REG_V16, REG_V16) - VSLIDEDOWN_VI(REG_V17, REG_V16, 1) - VXOR_VV(REG_V18, REG_V18, REG_V18) - VADD_VI(REG_V17, REG_V17, 1) - VMSEQ_VV(REG_V18, REG_V18, REG_V17) - VSLIDEUP_VI(REG_V16, REG_V17, 1) - VADD_VV(REG_V16, REG_V16, REG_V18) - VREV8(REG_V16, REG_V16) - VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) - - VAESZ_VS(REG_V15, REG_V0) - VAESEM_VS(REG_V15, REG_V1) - VAESEM_VS(REG_V15, REG_V2) - VAESEM_VS(REG_V15, REG_V3) - VAESEM_VS(REG_V15, REG_V4) - VAESEM_VS(REG_V15, REG_V5) - VAESEM_VS(REG_V15, REG_V6) - VAESEM_VS(REG_V15, REG_V7) - VAESEM_VS(REG_V15, REG_V8) - VAESEM_VS(REG_V15, REG_V9) - VAESEM_VS(REG_V15, REG_V10) - VAESEM_VS(REG_V15, REG_V11) - VAESEF_VS(REG_V15, REG_V12) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V15, REG_V15, REG_V17) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_ctr_192_encrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V16, REG_T0) - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif -#ifdef WOLFSSL_AES_256 - case 14: - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load key[12..13]. */ - "addi t0, t0, 64\n\t" - VL2RE32_V(REG_V12, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V14, REG_T0) - /* Load the counter. */ - "mv t0, %[reg]\n\t" - VL1RE32_V(REG_V16, REG_T0) - "li t2, 1 \n\t" - - "L_aes_ctr_256_encrypt_block_loop:\n\t" - VMV_V_V(REG_V15, REG_V16) - VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) - VREV8(REG_V16, REG_V16) - VSLIDEDOWN_VI(REG_V17, REG_V16, 1) - VXOR_VV(REG_V18, REG_V18, REG_V18) - VADD_VI(REG_V17, REG_V17, 1) - VMSEQ_VV(REG_V18, REG_V18, REG_V17) - VSLIDEUP_VI(REG_V16, REG_V17, 1) - VADD_VV(REG_V16, REG_V16, REG_V18) - VREV8(REG_V16, REG_V16) - VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) - - VAESZ_VS(REG_V15, REG_V0) - VAESEM_VS(REG_V15, REG_V1) - VAESEM_VS(REG_V15, REG_V2) - VAESEM_VS(REG_V15, REG_V3) - VAESEM_VS(REG_V15, REG_V4) - VAESEM_VS(REG_V15, REG_V5) - VAESEM_VS(REG_V15, REG_V6) - VAESEM_VS(REG_V15, REG_V7) - VAESEM_VS(REG_V15, REG_V8) - VAESEM_VS(REG_V15, REG_V9) - VAESEM_VS(REG_V15, REG_V10) - VAESEM_VS(REG_V15, REG_V11) - VAESEM_VS(REG_V15, REG_V12) - VAESEM_VS(REG_V15, REG_V13) - VAESEF_VS(REG_V15, REG_V14) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V15, REG_V15, REG_V17) - - "mv t0, %[out]\n\t" - VS1R_V(REG_V15, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_aes_ctr_256_encrypt_block_loop\n\t" - - "mv t0, %[reg]\n\t" - VS1R_V(REG_V16, REG_T0) - "mv t0, %[reg]\n\t" - : [blocks] "+r" (blocks) - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [reg] "r" (aes->reg) - : "memory", "t0", "t1", "t2", "t4" - ); - break; -#endif - } -} - -/* Encrypt blocks of data using AES-CTR. - * - * Uses Vector Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [out] out Encrypted blocks. - * @param [in] in Blocks to encrypt. - * @param [in] sz Number of bytes to encrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_FUNC_ARG when key size in AES object is not supported. - */ -int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - int ret = 0; - word32 processed; - - /* Validate parameters. */ - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - /* Check key size is supported. */ - switch (aes->rounds) { - #ifdef WOLFSSL_AES_128 - case 10: /* AES 128 BLOCK */ - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - case 12: /* AES 192 BLOCK */ - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - case 14: /* AES 256 BLOCK */ - #endif /* WOLFSSL_AES_256 */ - break; - default: - /* Not set or corrupted: match the generic wc_AesEncrypt - * (aes.c) behavior for an unusable key schedule. */ - WOLFSSL_MSG("Bad AES-CTR round value"); - ret = KEYUSAGE_E; - } - } - - if (ret == 0) { - /* Use up any unused bytes left in aes->tmp */ - processed = min(aes->left, sz); - if (processed > 0) { - /* XOR in encrypted counter. */ - xorbufout(out, in, (byte*)aes->tmp + WC_AES_BLOCK_SIZE - aes->left, - processed); - out += processed; - in += processed; - aes->left -= processed; - sz -= processed; - } - - /* Do whole blocks of data. */ - while (sz >= WC_AES_BLOCK_SIZE) { - word32 blocks = sz / WC_AES_BLOCK_SIZE; - - wc_aes_ctr_encrypt_asm(aes, out, in, blocks); - - processed = blocks * WC_AES_BLOCK_SIZE; - out += processed; - in += processed; - sz -= processed; - aes->left = 0; - } - - if (sz > 0) { - /* Encrypt counter and store in aes->tmp. - * Use up aes->tmp to encrypt data less than a block. - */ - static const byte zeros[WC_AES_BLOCK_SIZE] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - - wc_aes_ctr_encrypt_asm(aes, (byte*)aes->tmp, zeros, 1); - /* XOR in encrypted counter. */ - xorbufout(out, in, aes->tmp, sz); - aes->left = WC_AES_BLOCK_SIZE - sz; - } - } - - return ret; -} - -/* Don't need generic implementation. */ -#define HAVE_AES_COUNTER_ENC - -#endif /* WOLFSSL_AES_COUNTER */ - -#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) - -/* - * Scalar crypto instruction implementation of base operations. - */ - -/* AES key schedule SBox operation. */ -#define AES64KS1I(rd, rs1, rnum) \ - ASM_WORD(0b00110001000000000001000000010011 | \ - (((rd) << 7) | ((rs1) << 15) | (rnum) << 20)) -/* AES key schedule operation. */ -#define AES64KS2(rd, rs1, rs2) \ - ASM_WORD(0b01111110000000000000000000110011 | \ - (((rd) << 7) | ((rs1) << 15) | (rs2) << 20)) -/* AES inverse MixColums step. */ -#define AES64IM(rd, rs1) \ - ASM_WORD(0b00110000000000000001000000010011 | \ - ((rd) << 7) | ((rs1) << 15)) - -/* Perform computation of one round of key schedule for AES-128 encryption. */ -#define AES64_128_KS_RND_INS(rnum, o1, o2) \ - AES64KS1I(REG_T2, REG_T1, rnum) \ - AES64KS2(REG_T0, REG_T2, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - "sd t0, " #o1 "(%[ks])\n\t" \ - "sd t1, " #o2 "(%[ks])\n\t" -/* Perform computation of one round of key schedule for AES-128 decryption. */ -#define AES64_128_INV_KS_RND_INS(rnum, o1, o2) \ - AES64KS1I(REG_T2, REG_T1, rnum) \ - AES64KS2(REG_T0, REG_T2, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - AES64IM(REG_T2, REG_T0) \ - AES64IM(REG_T3, REG_T1) \ - "sd t2, " #o1 "(%[ks])\n\t" \ - "sd t3, " #o2 "(%[ks])\n\t" - -/* Perform computation of numbered round of key schedule for AES-128 encryption. - */ -#define AES64_128_KS_RND(rnum) \ - AES64_128_KS_RND_INS((rnum), ((rnum) + 1) * 16, \ - ((rnum) + 1) * 16 + 8) -/* Perform computation of numbered round of key schedule for AES-128 decryption. - */ -#define AES64_128_INV_KS_RND(rnum, o) \ - AES64_128_INV_KS_RND_INS((rnum), (o) * 16, (o) * 16 + 8) -/* Perform computation of numbered last round of key schedule for AES-128 - * decryption. */ -#define AES64_128_INV_KS_LRND(rnum, o) \ - AES64_128_KS_RND_INS((rnum), (o) * 16, (o) * 16 + 8) - - -/* Perform computation of one round of key schedule for AES-192 encryption. */ -#define AES64_192_KS_RND_INS(rnum, o1, o2, o3) \ - AES64KS1I(REG_T3, REG_T2, rnum) \ - AES64KS2(REG_T0, REG_T3, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - AES64KS2(REG_T2, REG_T1, REG_T2) \ - "sd t0, " #o1 "(%[ks])\n\t" \ - "sd t1, " #o2 "(%[ks])\n\t" \ - "sd t2, " #o3 "(%[ks])\n\t" -/* Perform computation of one round of key schedule for AES-192 decryption. */ -#define AES64_192_INV_KS_RND_INS(rnum, o1, o2, o3) \ - AES64KS1I(REG_T3, REG_T2, rnum) \ - AES64KS2(REG_T0, REG_T3, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - AES64KS2(REG_T2, REG_T1, REG_T2) \ - AES64IM(REG_T3, REG_T0) \ - AES64IM(REG_T4, REG_T1) \ - AES64IM(REG_T5, REG_T2) \ - "sd t3, " #o1 "(%[ks])\n\t" \ - "sd t4, " #o2 "(%[ks])\n\t" \ - "sd t5, " #o3 "(%[ks])\n\t" -/* Perform computation of last round of key schedule for AES-192 decryption. */ -#define AES64_192_KS_LRND_INS(rnum, o1, o2) \ - AES64KS1I(REG_T3, REG_T2, rnum) \ - AES64KS2(REG_T0, REG_T3, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - "sd t0, " #o1 "(%[ks])\n\t" \ - "sd t1, " #o2 "(%[ks])\n\t" \ - -/* Perform computation of numbered round of key schedule for AES-192 encryption. - */ -#define AES64_192_KS_RND(rnum) \ - AES64_192_KS_RND_INS((rnum), ((rnum) + 1) * 24, \ - ((rnum) + 1) * 24 + 8, ((rnum) + 1) * 24 + 16) -/* Perform computation of numbered round of key schedule for AES-192 decryption. - */ -#define AES64_192_INV_KS_RND(rnum, o1, o2, o3) \ - AES64_192_INV_KS_RND_INS((rnum), (o1) * 8, (o2) * 8, \ - (o3) * 8) -/* Perform computation of numbered last round of key schedule for AES-192 - * encryption. */ -#define AES64_192_KS_LRND(rnum) \ - AES64_192_KS_LRND_INS((rnum), ((rnum) + 1) * 24, \ - ((rnum) + 1) * 24 + 8) -/* Perform computation of numbered last round of key schedule for AES-192 - * decryption. */ -#define AES64_192_INV_KS_LRND(rnum) \ - AES64_192_KS_LRND_INS((rnum), 0, 8) - - -/* Perform computation of one round of key schedule for AES-256 encryption. */ -#define AES64_256_KS_RND_INS(rnum, o1, o2, o3, o4) \ - AES64KS1I(REG_T4, REG_T3, rnum) \ - AES64KS2(REG_T0, REG_T4, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - AES64KS1I(REG_T4, REG_T1, 10) \ - AES64KS2(REG_T2, REG_T4, REG_T2) \ - AES64KS2(REG_T3, REG_T2, REG_T3) \ - "sd t0, " #o1 "(%[ks])\n\t" \ - "sd t1, " #o2 "(%[ks])\n\t" \ - "sd t2, " #o3 "(%[ks])\n\t" \ - "sd t3, " #o4 "(%[ks])\n\t" -/* Perform computation of one round of key schedule for AES-256 decryption. */ -#define AES64_256_INV_KS_RND_INS(rnum, o1, o2, o3, o4) \ - AES64KS1I(REG_T4, REG_T3, rnum) \ - AES64KS2(REG_T0, REG_T4, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - AES64KS1I(REG_T4, REG_T1, 10) \ - AES64KS2(REG_T2, REG_T4, REG_T2) \ - AES64KS2(REG_T3, REG_T2, REG_T3) \ - AES64IM(REG_T4, REG_T0) \ - AES64IM(REG_T5, REG_T1) \ - "sd t4, " #o1 "(%[ks])\n\t" \ - "sd t5, " #o2 "(%[ks])\n\t" \ - AES64IM(REG_T4, REG_T2) \ - AES64IM(REG_T5, REG_T3) \ - "sd t4, " #o3 "(%[ks])\n\t" \ - "sd t5, " #o4 "(%[ks])\n\t" -/* Perform computation of last round of key schedule for AES-256 decryption. */ -#define AES64_256_KS_LRND_INS(rnum, o1, o2) \ - AES64KS1I(REG_T4, REG_T3, rnum) \ - AES64KS2(REG_T0, REG_T4, REG_T0) \ - AES64KS2(REG_T1, REG_T0, REG_T1) \ - "sd t0, " #o1 "(%[ks])\n\t" \ - "sd t1, " #o2 "(%[ks])\n\t" \ - -/* Perform computation of numbered round of key schedule for AES-256 encryption. - */ -#define AES64_256_KS_RND(rnum) \ - AES64_256_KS_RND_INS((rnum), ((rnum) + 1) * 32, \ - ((rnum) + 1) * 32 + 8, ((rnum) + 1) * 32 + 16, \ - ((rnum) + 1) * 32 + 24) -/* Perform computation of numbered round of key schedule for AES-256 decryption. - */ -#define AES64_256_INV_KS_RND(rnum, o) \ - AES64_256_INV_KS_RND_INS((rnum), (o) * 32, \ - (o) * 32 + 8, (o) * 32 - 16, (o) * 32 - 8) -/* Perform computation of numbered last round of key schedule for AES-256 - * encryption. */ -#define AES64_256_KS_LRND(rnum) \ - AES64_256_KS_LRND_INS((rnum), ((rnum) + 1) * 32, \ - ((rnum) + 1) * 32 + 8) -/* Perform computation of numbered last round of key schedule for AES-256 - * decryption. */ -#define AES64_256_INV_KS_LRND(rnum) \ - AES64_256_KS_LRND_INS((rnum), 0, 8) - -/* Set the key and/or IV into the AES object. - * - * Creates the key schedule from the key. - * Uses Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [in] key Secret key to use. - * @param [in] keyLen Length of key in bytes. - * @param [in] iv Initialization Vector (IV) to use. May be NULL. - * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes or key is NULL. - * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. - */ -int wc_AesSetKey(Aes* aes, const byte* key, word32 keyLen, const byte* iv, - int dir) -{ - int ret = 0; - - /* Validate parameters. */ - if ((aes == NULL) || (key == NULL)) { - ret = BAD_FUNC_ARG; - } -#ifdef WOLFSSL_AES_128 - else if ((keyLen == 16) && (dir == AES_ENCRYPTION)) { - __asm__ __volatile__ ( - "ld t0, 0(%[key])\n\t" - "ld t1, 8(%[key])\n\t" - "sd t0, 0(%[ks])\n\t" - "sd t1, 8(%[ks])\n\t" - AES64_128_KS_RND(0) - AES64_128_KS_RND(1) - AES64_128_KS_RND(2) - AES64_128_KS_RND(3) - AES64_128_KS_RND(4) - AES64_128_KS_RND(5) - AES64_128_KS_RND(6) - AES64_128_KS_RND(7) - AES64_128_KS_RND(8) - AES64_128_KS_RND(9) - "sd t0, 224(%[ks])\n\t" - "sd t1, 232(%[ks])\n\t" - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2" - ); - aes->rounds = 10; - } -#ifdef HAVE_AES_DECRYPT - else if ((keyLen == 16) && (dir == AES_DECRYPTION)) { - __asm__ __volatile__ ( - "ld t0, 0(%[key])\n\t" - "ld t1, 8(%[key])\n\t" - "sd t0, 160(%[ks])\n\t" - "sd t1, 168(%[ks])\n\t" - AES64_128_INV_KS_RND(0, 9) - AES64_128_INV_KS_RND(1, 8) - AES64_128_INV_KS_RND(2, 7) - AES64_128_INV_KS_RND(3, 6) - AES64_128_INV_KS_RND(4, 5) - AES64_128_INV_KS_RND(5, 4) - AES64_128_INV_KS_RND(6, 3) - AES64_128_INV_KS_RND(7, 2) - AES64_128_INV_KS_RND(8, 1) - AES64_128_INV_KS_LRND(9, 0) - "sd t4, 224(%[ks])\n\t" - "sd t5, 232(%[ks])\n\t" - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2", "t3" - ); - aes->rounds = 10; - } -#endif -#endif -#ifdef WOLFSSL_AES_192 - else if ((keyLen == 24) && (dir == AES_ENCRYPTION)) { - __asm__ __volatile__ ( - "ld t0, 0(%[key])\n\t" - "ld t1, 8(%[key])\n\t" - "ld t2, 16(%[key])\n\t" - "sd t0, 0(%[ks])\n\t" - "sd t1, 8(%[ks])\n\t" - "sd t2, 16(%[ks])\n\t" - AES64_192_KS_RND(0) - AES64_192_KS_RND(1) - AES64_192_KS_RND(2) - AES64_192_KS_RND(3) - AES64_192_KS_RND(4) - AES64_192_KS_RND(5) - AES64_192_KS_RND(6) - AES64_192_KS_LRND(7) - "sd t0, 224(%[ks])\n\t" - "sd t1, 232(%[ks])\n\t" - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2", "t3" - ); - aes->rounds = 12; - } -#ifdef HAVE_AES_DECRYPT - else if ((keyLen == 24) && (dir == AES_DECRYPTION)) { - __asm__ __volatile__ ( - "ld t0, 0(%[key])\n\t" - "ld t1, 8(%[key])\n\t" - "ld t2, 16(%[key])\n\t" - AES64IM(REG_T3, REG_T2) - "sd t0, 192(%[ks])\n\t" - "sd t1, 200(%[ks])\n\t" - "sd t3, 176(%[ks])\n\t" - AES64_192_INV_KS_RND(0, 23, 20, 21) - AES64_192_INV_KS_RND(1, 18, 19, 16) - AES64_192_INV_KS_RND(2, 17, 14, 15) - AES64_192_INV_KS_RND(3, 12, 13, 10) - AES64_192_INV_KS_RND(4, 11, 8, 9) - AES64_192_INV_KS_RND(5, 6, 7, 4) - AES64_192_INV_KS_RND(6, 5, 2, 3) - AES64_192_INV_KS_LRND(7) - "sd t4, 224(%[ks])\n\t" - "sd t5, 232(%[ks])\n\t" - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5" - ); - aes->rounds = 12; - } -#endif -#endif -#ifdef WOLFSSL_AES_256 - else if ((keyLen == 32) && (dir == AES_ENCRYPTION)) { - __asm__ __volatile__ ( - "ld t0, 0(%[key])\n\t" - "ld t1, 8(%[key])\n\t" - "ld t2, 16(%[key])\n\t" - "ld t3, 24(%[key])\n\t" - "sd t0, 0(%[ks])\n\t" - "sd t1, 8(%[ks])\n\t" - "sd t2, 16(%[ks])\n\t" - "sd t3, 24(%[ks])\n\t" - AES64_256_KS_RND(0) - AES64_256_KS_RND(1) - AES64_256_KS_RND(2) - AES64_256_KS_RND(3) - AES64_256_KS_RND(4) - AES64_256_KS_RND(5) - AES64_256_KS_LRND(6) - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2", "t3", "t4" - ); - aes->rounds = 14; - } -#ifdef HAVE_AES_DECRYPT - else if ((keyLen == 32) && (dir == AES_DECRYPTION)) { - __asm__ __volatile__ ( - "ld t0, 0(%[key])\n\t" - "ld t1, 8(%[key])\n\t" - "ld t2, 16(%[key])\n\t" - "ld t3, 24(%[key])\n\t" - "sd t0, 224(%[ks])\n\t" - "sd t1, 232(%[ks])\n\t" - AES64IM(REG_T4, REG_T2) - AES64IM(REG_T5, REG_T3) - "sd t4, 208(%[ks])\n\t" - "sd t5, 216(%[ks])\n\t" - AES64_256_INV_KS_RND(0, 6) - AES64_256_INV_KS_RND(1, 5) - AES64_256_INV_KS_RND(2, 4) - AES64_256_INV_KS_RND(3, 3) - AES64_256_INV_KS_RND(4, 2) - AES64_256_INV_KS_RND(5, 1) - AES64_256_INV_KS_LRND(6) - : - : [ks] "r" (aes->key), [key] "r" (key) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5" - ); - aes->rounds = 14; - } -#endif -#endif - else { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - /* Set the IV. */ - ret = wc_AesSetIV(aes, iv); - } - if (ret == 0) { - /* Finish setting the AES object. */ - aes->keylen = keyLen; -#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) || \ - defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_XTS) - aes->left = 0; -#endif - } - - return ret; -} - - -/* AES middle round encryption with 64-bit registers. */ -#define AES64ESM(rd, rs1, rs2) \ - ASM_WORD(0b00110110000000000000000000110011 | \ - (rd << 7) | (rs1 << 15) | (rs2 << 20)) -/* AES final round encryption with 64-bit registers. */ -#define AES64ES(rd, rs1, rs2) \ - ASM_WORD(0b00110010000000000000000000110011 | \ - (rd << 7) | (rs1 << 15) | (rs2 << 20)) - -/* Two rounds of encryption. - * kr01 - offset of first half of key for second round. - * kr02 - offset of second half of key for second round. - * kr03 - offset of first half of key for next round. - * kr04 - offset of second half of key for next round. - */ -#define AESENC_2_ROUNDS(kro1, kro2, kro3, kro4) \ - "ld a5, " #kro1 " (%[key])\n\t" \ - "ld a6, " #kro2 " (%[key])\n\t" \ - AES64ESM(REG_T2, REG_T0, REG_T1) \ - AES64ESM(REG_T3, REG_T1, REG_T0) \ - "xor t2, t2, a3\n\t" \ - "xor t3, t3, a4\n\t" \ - AES64ESM(REG_T0, REG_T2, REG_T3) \ - AES64ESM(REG_T1, REG_T3, REG_T2) \ - "xor t0, t0, a5\n\t" \ - "xor t1, t1, a6\n\t" \ - "ld a3, " #kro3 " (%[key])\n\t" \ - "ld a4, " #kro4 " (%[key])\n\t" - -/* Last round of encryption. */ -#define AESENC_LAST_ROUND() \ - AES64ES(REG_T2, REG_T0, REG_T1) \ - AES64ES(REG_T3, REG_T1, REG_T0) \ - "xor t2, t2, a3\n\t" \ - "xor t3, t3, a4\n\t" - -/* AES middle round decryption with 64-bit registers. */ -#define AES64DSM(rd, rs1, rs2) \ - ASM_WORD(0b00111110000000000000000000110011 | \ - (rd << 7) | (rs1 << 15) | (rs2 << 20)) -/* AES final round decryption with 64-bit registers. */ -#define AES64DS(rd, rs1, rs2) \ - ASM_WORD(0b00111010000000000000000000110011 | \ - (rd << 7) | (rs1 << 15) | (rs2 << 20)) - -/* Two rounds of decryption. - * kr01 - offset of first half of key for second round. - * kr02 - offset of second half of key for second round. - * kr03 - offset of first half of key for next round. - * kr04 - offset of second half of key for next round. - */ -#define AESDEC_2_ROUNDS(kro1, kro2, kro3, kro4) \ - "ld a5, " #kro1 " (%[key])\n\t" \ - "ld a6, " #kro2 " (%[key])\n\t" \ - AES64DSM(REG_T2, REG_T0, REG_T1) \ - AES64DSM(REG_T3, REG_T1, REG_T0) \ - "xor t2, t2, a3\n\t" \ - "xor t3, t3, a4\n\t" \ - AES64DSM(REG_T0, REG_T2, REG_T3) \ - AES64DSM(REG_T1, REG_T3, REG_T2) \ - "xor t0, t0, a5\n\t" \ - "xor t1, t1, a6\n\t" \ - "ld a3, " #kro3 " (%[key])\n\t" \ - "ld a4, " #kro4 " (%[key])\n\t" - -/* Last round of decryption. */ -#define AESDEC_LAST_ROUND() \ - AES64DS(REG_T2, REG_T0, REG_T1) \ - AES64DS(REG_T3, REG_T1, REG_T0) \ - "xor t2, t2, a3\n\t" \ - "xor t3, t3, a4\n\t" \ - -#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) || \ - defined(HAVE_AESGCM) || defined(HAVE_AESCCM) -/* Encrypt a block using AES. - * - * @param [in] aes AES object. - * @param [in] in Block to encrypt. - * @param [out] out Encrypted block. - */ -static void wc_AesEncrypt(Aes* aes, const byte* in, byte* out) -{ - __asm__ __volatile__ ( - UNALIGNED_LD2(t2, t3, 0, %[in], t0) - "ld a3, 0(%[key])\n\t" - "ld a4, 8(%[key])\n\t" - "ld a5, 16(%[key])\n\t" - "ld a6, 24(%[key])\n\t" - "xor t2, t2, a3\n\t" - "xor t3, t3, a4\n\t" - AES64ESM(REG_T0, REG_T2, REG_T3) - AES64ESM(REG_T1, REG_T3, REG_T2) - "xor t0, t0, a5\n\t" - "xor t1, t1, a6\n\t" - "ld a3, 32(%[key])\n\t" - "ld a4, 40(%[key])\n\t" - AESENC_2_ROUNDS(48, 56, 64, 72) - AESENC_2_ROUNDS(80, 88, 96, 104) - AESENC_2_ROUNDS(112, 120, 128, 136) - AESENC_2_ROUNDS(144, 152, 160, 168) - "li t4, 11\n\t" - "ble %[rounds], t4, L_aes_encrypt_done\n\t" - AESENC_2_ROUNDS(176, 184, 192, 200) - "li t4, 13\n\t" - "ble %[rounds], t4, L_aes_encrypt_done\n\t" - AESENC_2_ROUNDS(208, 216, 224, 232) - "L_aes_encrypt_done:\n\t" - AESENC_LAST_ROUND() - UNALIGNED_SD2(t2, t3, 0, %[out], t0) - : - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [rounds] "r" (aes->rounds) - : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6" - ); -} -#endif - -#ifdef HAVE_AES_DECRYPT -#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) -/* Decrypt a block using AES. - * - * @param [in] aes AES object. - * @param [in] in Block to decrypt. - * @param [out] out Decrypted block. - */ -static void wc_AesDecrypt(Aes* aes, const byte* in, byte* out) -{ - __asm__ __volatile__ ( - UNALIGNED_LD2(t2, t3, 0, %[in], t0) - "ld a3, 0(%[key])\n\t" - "ld a4, 8(%[key])\n\t" - "ld a5, 16(%[key])\n\t" - "ld a6, 24(%[key])\n\t" - "xor t2, t2, a3\n\t" - "xor t3, t3, a4\n\t" - AES64DSM(REG_T0, REG_T2, REG_T3) - AES64DSM(REG_T1, REG_T3, REG_T2) - "xor t0, t0, a5\n\t" - "xor t1, t1, a6\n\t" - "ld a3, 32(%[key])\n\t" - "ld a4, 40(%[key])\n\t" - AESDEC_2_ROUNDS(48, 56, 64, 72) - AESDEC_2_ROUNDS(80, 88, 96, 104) - AESDEC_2_ROUNDS(112, 120, 128, 136) - AESDEC_2_ROUNDS(144, 152, 160, 168) - "li t4, 11\n\t" - "ble %[rounds], t4, L_aes_decrypt_done\n\t" - AESDEC_2_ROUNDS(176, 184, 192, 200) - "li t4, 13\n\t" - "ble %[rounds], t4, L_aes_decrypt_done\n\t" - AESDEC_2_ROUNDS(208, 216, 224, 232) - "L_aes_decrypt_done:\n\t" - AESDEC_LAST_ROUND() - UNALIGNED_SD2(t2, t3, 0, %[out], t0) - : - : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), - [rounds] "r" (aes->rounds) - : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6" - ); -} -#endif -#endif /* HAVE_AES_DECRYPT */ - -#else - -/* - * Standard instructions implementation of base operations. - */ - -/* Load a word with bytes reversed. */ -#define LOAD_WORD_REV(r, o, p) \ - "lbu t4, " #o "(" #p ")\n\t" \ - "lbu t5, " #o "+1(" #p ")\n\t" \ - "lbu t6, " #o "+2(" #p ")\n\t" \ - "lbu " #r ", " #o "+3(" #p ")\n\t" \ - "slli t4, t4, 24\n\t" \ - "slli t5, t5, 16\n\t" \ - "slli t6, t6, 8\n\t" \ - "or " #r ", " #r ", t4\n\t" \ - "or " #r ", " #r ", t5\n\t" \ - "or " #r ", " #r ", t6\n\t" - -/* Store a word with bytes reversed. */ -#define STORE_WORD_REV(r, o, p) \ - "srli t0, " #r ", 24\n\t" \ - "srli t1, " #r ", 16\n\t" \ - "srli t2, " #r ", 8\n\t" \ - "sb t0, " #o "+0(" #p ")\n\t" \ - "sb t1, " #o "+1(" #p ")\n\t" \ - "sb t2, " #o "+2(" #p ")\n\t" \ - "sb " #r ", " #o "+3(" #p ")\n\t" - -/* AES encryption table. */ -static const FLASH_QUALIFIER word32 Te[4][256] = { -{ - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, - 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, - 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, - 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, - 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, - 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, - 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, - 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, - 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, - 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, - 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, - 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, - 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, - 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, - 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, - 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, - 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, - 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, - 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, - 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, - 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, - 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, - 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, - 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, - 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, - 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, - 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, - 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, - 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, - 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, - 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, - 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, - 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, - 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, - 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, - 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, - 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, - 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, - 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, - 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, - 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, - 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, - 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, - 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, - 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, - 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, - 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, - 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, - 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, - 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, - 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, - 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, -}, -{ - 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, - 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, - 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, - 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, - 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, - 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, - 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, - 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, - 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, - 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, - 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, - 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, - 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, - 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, - 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, - 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, - 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, - 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, - 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, - 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, - 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, - 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, - 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, - 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, - 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, - 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, - 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, - 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, - 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, - 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, - 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, - 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, - 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, - 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, - 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, - 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, - 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, - 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, - 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, - 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, - 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, - 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, - 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, - 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, - 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, - 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, - 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, - 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, - 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, - 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, - 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, - 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, - 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, - 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, - 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, - 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, - 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, - 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, - 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, - 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, - 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, - 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, - 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, - 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, -}, -{ - 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, - 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, - 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, - 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, - 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, - 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, - 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, - 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, - 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, - 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, - 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, - 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, - 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, - 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, - 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, - 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, - 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, - 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, - 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, - 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, - 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, - 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, - 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, - 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, - 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, - 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, - 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, - 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, - 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, - 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, - 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, - 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, - 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, - 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, - 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, - 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, - 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, - 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, - 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, - 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, - 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, - 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, - 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, - 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, - 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, - 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, - 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, - 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, - 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, - 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, - 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, - 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, - 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, - 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, - 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, - 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, - 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, - 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, - 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, - 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, - 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, - 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, - 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, - 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, -}, -{ - 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, - 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, - 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, - 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, - 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, - 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, - 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, - 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, - 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, - 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, - 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, - 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, - 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, - 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, - 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, - 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, - 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, - 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, - 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, - 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, - 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, - 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, - 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, - 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, - 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, - 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, - 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, - 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, - 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, - 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, - 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, - 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, - 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, - 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, - 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, - 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, - 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, - 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, - 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, - 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, - 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, - 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, - 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, - 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, - 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, - 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, - 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, - 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, - 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, - 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, - 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, - 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, - 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, - 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, - 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, - 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, - 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, - 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, - 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, - 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, - 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, - 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, - 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, - 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, -} -}; - -/* Round constant used in computing key schedule. */ -static const FLASH_QUALIFIER word32 rcon[] = { - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, - /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ -}; - -#ifdef HAVE_AES_DECRYPT -/* AES decryption table. */ -static const FLASH_QUALIFIER word32 Td[4][256] = { -{ - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, - 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, - 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, - 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, - 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, - 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, - 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, - 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, - 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, - 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, - 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, - 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, - 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, - 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, - 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, - 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, - 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, - 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, - 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, - 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, - 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, - 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, - 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, - 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, - 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, - 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, - 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, - 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, - 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, - 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, - 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, - 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, - 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, - 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, - 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, - 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, - 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, - 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, - 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, - 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, - 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, - 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, - 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, - 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, - 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, - 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, - 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, - 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, - 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, - 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, - 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, - 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, -}, -{ - 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, - 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, - 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, - 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, - 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, - 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, - 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, - 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, - 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, - 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, - 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, - 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, - 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, - 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, - 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, - 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, - 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, - 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, - 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, - 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, - 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, - 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, - 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, - 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, - 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, - 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, - 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, - 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, - 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, - 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, - 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, - 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, - 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, - 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, - 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, - 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, - 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, - 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, - 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, - 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, - 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, - 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, - 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, - 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, - 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, - 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, - 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, - 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, - 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, - 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, - 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, - 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, - 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, - 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, - 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, - 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, - 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, - 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, - 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, - 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, - 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, - 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, - 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, - 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, -}, -{ - 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, - 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, - 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, - 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, - 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, - 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, - 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, - 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, - 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, - 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, - 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, - 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, - 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, - 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, - 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, - 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, - 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, - 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, - 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, - 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, - 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, - 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, - 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, - 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, - 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, - 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, - 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, - 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, - 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, - 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, - 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, - 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, - 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, - 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, - 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, - 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, - 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, - 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, - 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, - 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, - 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, - 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, - 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, - 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, - 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, - 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, - 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, - 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, - 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, - 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, - 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, - 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, - 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, - 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, - 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, - 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, - 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, - 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, - 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, - 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, - 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, - 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, - 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, - 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, -}, -{ - 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, - 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, - 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, - 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, - 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, - 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, - 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, - 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, - 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, - 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, - 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, - 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, - 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, - 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, - 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, - 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, - 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, - 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, - 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, - 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, - 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, - 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, - 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, - 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, - 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, - 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, - 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, - 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, - 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, - 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, - 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, - 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, - 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, - 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, - 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, - 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, - 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, - 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, - 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, - 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, - 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, - 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, - 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, - 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, - 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, - 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, - 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, - 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, - 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, - 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, - 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, - 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, - 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, - 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, - 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, - 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, - 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, - 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, - 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, - 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, - 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, - 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, - 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, - 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, -} -}; - -#endif /* HAVE_AES_DECRYPT */ - -/* AES substitute rotated word with round constant application. */ -#define AES_SUB_ROT_WORD_RCON(s) \ - "andi t5, " #s ", 0xff\n\t" \ - "slli t5, t5, 2\n\t" \ - "add t5, t5, %[te]\n\t" \ - "lw t5, (t5)\n\t" \ - "li t6, 0x0000ff00\n\t" \ - "and t5, t5, t6\n\t" \ - "xor t0, t0, t5\n\t" \ - \ - "srli t5, " #s ", 22\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te]\n\t" \ - "addi t5, t5, 0x400\n\t" \ - "lbu t5, (t5)\n\t" \ - "xor t0, t0, t5\n\t" \ - \ - "srli t5, " #s ", 14\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te]\n\t" \ - "li t6, 0x800\n\t" \ - "add t5, t5, t6\n\t" \ - "lw t5, (t5)\n\t" \ - "li t6, 0xff000000\n\t" \ - "and t5, t5, t6\n\t" \ - "xor t0, t0, t5\n\t" \ - \ - "srli t5, " #s ", 6\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te]\n\t" \ - "li t6, 0xc00\n\t" \ - "add t5, t5, t6\n\t" \ - "lw t5, (t5)\n\t" \ - "li t6, 0x00ff0000\n\t" \ - "and t5, t5, t6\n\t" \ - "xor t0, t0, t5\n\t" \ - \ - "add t5, %[rcon], a5\n\t" \ - "lw t5, (t5)\n\t" \ - "xor t0, t0, t5\n\t" - -/* AES substitute word. */ -#define AES_SUB_WORD(s) \ - "srli t5, " #s ", 6\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te]\n\t" \ - "lw t5, (t5)\n\t" \ - "li t6, 0x0000ff00\n\t" \ - "and t5, t5, t6\n\t" \ - "xor a6, a6, t5\n\t" \ - \ - "andi t5, " #s ", 0xff\n\t" \ - "slli t5, t5, 2\n\t" \ - "add t5, t5, %[te]\n\t" \ - "addi t5, t5, 0x400\n\t" \ - "lbu t5, (t5)\n\t" \ - "xor a6, a6, t5\n\t" \ - \ - "srli t5, " #s ", 22\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te]\n\t" \ - "li t6, 0x800\n\t" \ - "add t5, t5, t6\n\t" \ - "lw t5, (t5)\n\t" \ - "li t6, 0xff000000\n\t" \ - "and t5, t5, t6\n\t" \ - "xor a6, a6, t5\n\t" \ - \ - "srli t5, " #s ", 14\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te]\n\t" \ - "li t6, 0xc00\n\t" \ - "add t5, t5, t6\n\t" \ - "lw t5, (t5)\n\t" \ - "li t6, 0x00ff0000\n\t" \ - "and t5, t5, t6\n\t" \ - "xor a6, a6, t5\n\t" - -/* Set the AES key and expand. - * - * @param [in] aes AES object. - * @param [in] key Block to encrypt. - * @param [in] keySz Number of bytes in key. - * @param [in] dir Direction of crypt: AES_ENCRYPTION or AES_DECRYPTION. - */ -static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir) -{ - word32* rk = aes->key; - - switch (keySz) { -#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 128 && \ - defined(WOLFSSL_AES_128) - case 16: - __asm__ __volatile__ ( -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* Load 4 32-bit words in reverse byte order. */ - LOAD_WORD_REV(t0, 0, %[key]) - LOAD_WORD_REV(t1, 4, %[key]) - LOAD_WORD_REV(t2, 8, %[key]) - LOAD_WORD_REV(t3, 12, %[key]) -#else - "ld t1, 0(%[key])\n\t" - "ld t3, 8(%[key])\n\t" - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - "srli t0, t1, 32\n\t" - "srli t2, t3, 32\n\t" -#endif - /* Store round 0 key. */ - "sw t0, 0(%[rk])\n\t" - "sw t1, 4(%[rk])\n\t" - "sw t2, 8(%[rk])\n\t" - "sw t3, 12(%[rk])\n\t" - - "li a4, 10\n\t" - "mv a5, x0\n\t" - "L_aes_set_key_c_16_loop:\n\t" - "addi %[rk], %[rk], 16\n\t" - /* Permute key. */ - AES_SUB_ROT_WORD_RCON(t3) - "xor t1, t1, t0\n\t" - "xor t2, t2, t1\n\t" - "xor t3, t3, t2\n\t" - /* Store round key. */ - "sw t0, 0(%[rk])\n\t" - "sw t1, 4(%[rk])\n\t" - "sw t2, 8(%[rk])\n\t" - "sw t3, 12(%[rk])\n\t" - - "addi a4, a4, -1\n\t" - "addi a5, a5, 4\n\t" - "bnez a4, L_aes_set_key_c_16_loop\n\t" - : [rk] "+r" (rk) - : [key] "r" (key), [te] "r" (Te), [rcon] "r" (rcon) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5" - ); - break; -#endif /* 128 */ - -#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 192 && \ - defined(WOLFSSL_AES_192) - case 24: - __asm__ __volatile__ ( -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* Load 6 32-bit words in reverse byte order. */ - LOAD_WORD_REV(t0, 0, %[key]) - LOAD_WORD_REV(t1, 4, %[key]) - LOAD_WORD_REV(t2, 8, %[key]) - LOAD_WORD_REV(t3, 12, %[key]) - LOAD_WORD_REV(a6, 16, %[key]) - LOAD_WORD_REV(a7, 20, %[key]) -#else - "ld t1, 0(%[key])\n\t" - "ld t3, 8(%[key])\n\t" - "ld a7, 16(%[key])\n\t" - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - REV8(REG_A7, REG_A7) - "srli t0, t1, 32\n\t" - "srli t2, t3, 32\n\t" - "srli a6, a7, 32\n\t" -#endif - /* Store round 0 key. */ - "sw t0, 0(%[rk])\n\t" - "sw t1, 4(%[rk])\n\t" - "sw t2, 8(%[rk])\n\t" - "sw t3, 12(%[rk])\n\t" - "sw a6, 16(%[rk])\n\t" - "sw a7, 20(%[rk])\n\t" - - "li a4, 8\n\t" - "mv a5, x0\n\t" - "L_aes_set_key_c_24_loop:\n\t" - "addi %[rk], %[rk], 24\n\t" - /* Permute key. */ - AES_SUB_ROT_WORD_RCON(a7) - "xor t1, t1, t0\n\t" - "xor t2, t2, t1\n\t" - "xor t3, t3, t2\n\t" - "xor a6, a6, t3\n\t" - "xor a7, a7, a6\n\t" - /* Store round key. */ - "sw t0, 0(%[rk])\n\t" - "sw t1, 4(%[rk])\n\t" - "sw t2, 8(%[rk])\n\t" - "sw t3, 12(%[rk])\n\t" - "sw a6, 16(%[rk])\n\t" - "sw a7, 20(%[rk])\n\t" - - "addi a4, a4, -1\n\t" - "addi a5, a5, 4\n\t" - "bnez a4, L_aes_set_key_c_24_loop\n\t" - - : [rk] "+r" (rk) - : [key] "r" (key), [te] "r" (Te), [rcon] "r" (rcon) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", - "a6", "a7" - ); - break; -#endif /* 192 */ - -#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 256 && \ - defined(WOLFSSL_AES_256) - case 32: - __asm__ __volatile__ ( -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* Load 8 32-bit words in reverse byte order. */ - LOAD_WORD_REV(t0, 0, %[key]) - LOAD_WORD_REV(t1, 4, %[key]) - LOAD_WORD_REV(t2, 8, %[key]) - LOAD_WORD_REV(t3, 12, %[key]) - LOAD_WORD_REV(a6, 16, %[key]) - LOAD_WORD_REV(a7, 20, %[key]) - LOAD_WORD_REV(s1, 24, %[key]) - LOAD_WORD_REV(s2, 28, %[key]) -#else - "ld t1, 0(%[key])\n\t" - "ld t3, 8(%[key])\n\t" - "ld a7, 16(%[key])\n\t" - "ld s2, 24(%[key])\n\t" - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - REV8(REG_A7, REG_A7) - REV8(REG_S2, REG_S2) - "srli t0, t1, 32\n\t" - "srli t2, t3, 32\n\t" - "srli a6, a7, 32\n\t" - "srli s1, s2, 32\n\t" -#endif - /* Store round 0 key. */ - "sw t0, 0(%[rk])\n\t" - "sw t1, 4(%[rk])\n\t" - "sw t2, 8(%[rk])\n\t" - "sw t3, 12(%[rk])\n\t" - "sw a6, 16(%[rk])\n\t" - "sw a7, 20(%[rk])\n\t" - "sw s1, 24(%[rk])\n\t" - "sw s2, 28(%[rk])\n\t" - - "li a4, 7\n\t" - "mv a5, x0\n\t" - "L_aes_set_key_c_32_loop:\n\t" - "addi %[rk], %[rk], 32\n\t" - /* Permute key. */ - AES_SUB_ROT_WORD_RCON(s2) - "xor t1, t1, t0\n\t" - "xor t2, t2, t1\n\t" - "xor t3, t3, t2\n\t" - /* Store half round key. */ - "sw t0, 0(%[rk])\n\t" - "sw t1, 4(%[rk])\n\t" - "sw t2, 8(%[rk])\n\t" - "sw t3, 12(%[rk])\n\t" - - "addi a5, a5, 4\n\t" - "addi a4, a4, -1\n\t" - "beqz a4, L_aes_set_key_c_32_done\n\t" - - AES_SUB_WORD(t3) - "xor a7, a7, a6\n\t" - "xor s1, s1, a7\n\t" - "xor s2, s2, s1\n\t" - /* Store second half round key. */ - "sw a6, 16(%[rk])\n\t" - "sw a7, 20(%[rk])\n\t" - "sw s1, 24(%[rk])\n\t" - "sw s2, 28(%[rk])\n\t" - - "beqz x0, L_aes_set_key_c_32_loop\n\t" - "L_aes_set_key_c_32_done:\n\t" - - : [rk] "+r" (rk) - : [key] "r" (key), [te] "r" (Te), [rcon] "r" (rcon) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", - "a6", "a7", "s1", "s2" - ); - break; -#endif /* 256 */ - } - -#if defined(HAVE_AES_DECRYPT) - -#define INV_MIXCOL(rki) \ - "srli t5, " #rki ", 22\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te1]\n\t" \ - "lbu t5, (t5)\n\t" \ - "slli t5, t5, 2\n\t" \ - "add t5, t5, %[td]\n\t" \ - "lw t6, (t5)\n\t" \ - "srli t5, " #rki ", 14\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te1]\n\t" \ - "lbu t5, (t5)\n\t" \ - "slli t5, t5, 2\n\t" \ - "add t5, t5, %[td]\n\t" \ - "addi t5, t5, 0x400\n\t" \ - "lw t5, (t5)\n\t" \ - "xor t6, t6, t5\n\t" \ - "srli t5, " #rki ", 6\n\t" \ - "andi t5, t5, 0x3fc\n\t" \ - "add t5, t5, %[te1]\n\t" \ - "lbu t5, (t5)\n\t" \ - "slli t5, t5, 2\n\t" \ - "add t5, t5, %[td]\n\t" \ - "li t4, 0x800\n\t" \ - "add t5, t5, t4\n\t" \ - "lw t5, (t5)\n\t" \ - "xor t6, t6, t5\n\t" \ - "andi t5, " #rki ", 0xff\n\t" \ - "slli t5, t5, 2\n\t" \ - "add t5, t5, %[te1]\n\t" \ - "lbu t5, (t5)\n\t" \ - "slli t5, t5, 2\n\t" \ - "add t5, t5, %[td]\n\t" \ - "li t4, 0xc00\n\t" \ - "add t5, t5, t4\n\t" \ - "lw t5, (t5)\n\t" \ - "xor " #rki ", t6, t5\n\t" - - if (dir == AES_DECRYPTION) { - int r = aes->rounds; - rk = aes->key; - - __asm__ __volatile__ ( - /* Change key schedule for decryption. */ - "slli s1, %[r], 4\n\t" - "add s1, s1, %[rk]\n\t" - "srli %[r], %[r], 1\n\t" - "addi %[r], %[r], -1\n\t" - - /* Swap first two rounds. */ - "ld t0, 0(%[rk])\n\t" - "ld t1, 8(%[rk])\n\t" - "ld t2, 0(s1)\n\t" - "ld t3, 8(s1)\n\t" - "sd t0, 0(s1)\n\t" - "sd t1, 8(s1)\n\t" - "sd t2, 0(%[rk])\n\t" - "sd t3, 8(%[rk])\n\t" - - "L_aes_set_key_inv_mixcol_loop:\n\t" - "addi %[rk], %[rk], 16\n\t" - "addi s1, s1, -16\n\t" - - "lw t0, 0(%[rk])\n\t" - "lw t1, 4(%[rk])\n\t" - "lw t2, 8(%[rk])\n\t" - "lw t3, 12(%[rk])\n\t" - "lw a4, 0(s1)\n\t" - "lw a5, 4(s1)\n\t" - "lw a6, 8(s1)\n\t" - "lw a7, 12(s1)\n\t" - - INV_MIXCOL(t0) - INV_MIXCOL(t1) - INV_MIXCOL(t2) - INV_MIXCOL(t3) - INV_MIXCOL(a4) - INV_MIXCOL(a5) - INV_MIXCOL(a6) - INV_MIXCOL(a7) - - "sw t0, 0(s1)\n\t" - "sw t1, 4(s1)\n\t" - "sw t2, 8(s1)\n\t" - "sw t3, 12(s1)\n\t" - "sw a4, 0(%[rk])\n\t" - "sw a5, 4(%[rk])\n\t" - "sw a6, 8(%[rk])\n\t" - "sw a7, 12(%[rk])\n\t" - - "addi %[r], %[r], -1\n\t" - "bnez %[r], L_aes_set_key_inv_mixcol_loop\n\t" - - "lw t0, 16(%[rk])\n\t" - "lw t1, 20(%[rk])\n\t" - "lw t2, 24(%[rk])\n\t" - "lw t3, 28(%[rk])\n\t" - - INV_MIXCOL(t0) - INV_MIXCOL(t1) - INV_MIXCOL(t2) - INV_MIXCOL(t3) - - "sw t0, 16(%[rk])\n\t" - "sw t1, 20(%[rk])\n\t" - "sw t2, 24(%[rk])\n\t" - "sw t3, 28(%[rk])\n\t" - - : [rk] "+r" (rk), [r] "+r" (r) - : [td] "r" (Td), [te1] "r" (Te[1]) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", - "a6", "a7", "s1" - ); - } -#endif /* HAVE_AES_DECRYPT */ -} - -/* Set the key and/or IV into the AES object. - * - * Creates the key schedule from the key. - * Uses Cryptographic instructions. - * - * @param [in] aes AES object. - * @param [in] key Secret key to use. - * @param [in] keyLen Length of key in bytes. - * @param [in] iv Initialization Vector (IV) to use. May be NULL. - * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes or key is NULL. - * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. - */ -int wc_AesSetKey(Aes* aes, const byte* key, word32 keyLen, const byte* iv, - int dir) -{ - int ret = 0; - - /* Validate parameters. */ - if ((aes == NULL) || (key == NULL)) { - ret = BAD_FUNC_ARG; - } - /* Check key size is supported by AES object. */ - if ((ret == 0) && (keyLen > (word32)sizeof(aes->key))) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - /* Check key length is supported. */ - switch (keyLen) { - #if defined(AES_MAX_KEY_SIZE) && (AES_MAX_KEY_SIZE >= 128) && \ - defined(WOLFSSL_AES_128) - case 16: - #endif - #if defined(AES_MAX_KEY_SIZE) && (AES_MAX_KEY_SIZE >= 192) && \ - defined(WOLFSSL_AES_192) - case 24: - #endif - #if defined(AES_MAX_KEY_SIZE) && (AES_MAX_KEY_SIZE >= 256) && \ - defined(WOLFSSL_AES_256) - case 32: - #endif - break; - default: - ret = BAD_FUNC_ARG; - } - } -#ifndef HAVE_AES_DECRYPT - if ((ret == 0) && (dir == AES_DECRYPTION)) { - ret = BAD_FUNC_ARG; - } -#endif - - if (ret == 0) { - /* Initialize fields. */ - #if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) || \ - defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_XTS) - aes->left = 0; - #endif - aes->keylen = (int)keyLen; - aes->rounds = (keyLen / 4) + 6; - - /* Compute the key schedule. */ - AesSetKey_C(aes, key, keyLen, dir); - - /* Set the IV. */ - ret = wc_AesSetIV(aes, iv); - } - - return ret; -} - -#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) || \ - defined(HAVE_AESGCM) || defined(HAVE_AESCCM) -/* Encrypt a block using AES. - * - * @param [in] aes AES object. - * @param [in] in Block to encrypt. - * @param [out] out Encrypted block. - */ -static void wc_AesEncrypt(Aes* aes, const byte* in, byte* out) -{ -/* A round of encryption from set 2 to 1 registers. */ -#define ENC_ROUND_T_S_ASM(o) \ - "srliw t0, a4, 24\n\t" \ - "srliw t1, a5, 24\n\t" \ - "srliw t2, a6, 24\n\t" \ - "srliw t3, a7, 24\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, %[te]\n\t" \ - "add t1, t1, %[te]\n\t" \ - "add t2, t2, %[te]\n\t" \ - "add t3, t3, %[te]\n\t" \ - "lw t5, (t0)\n\t" \ - "lw t6, (t1)\n\t" \ - "lw s1, (t2)\n\t" \ - "lw s2, (t3)\n\t" \ - \ - "addi t4, %[te], 0x400\n\t" \ - "srliw t0, a5, 14\n\t" \ - "srliw t1, a6, 14\n\t" \ - "srliw t2, a7, 14\n\t" \ - "srliw t3, a4, 14\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "srliw t0, a6, 6\n\t" \ - "srliw t1, a7, 6\n\t" \ - "srliw t2, a4, 6\n\t" \ - "srliw t3, a5, 6\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "andi t0, a7, 0xff\n\t" \ - "andi t1, a4, 0xff\n\t" \ - "andi t2, a5, 0xff\n\t" \ - "andi t3, a6, 0xff\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" \ - \ - "lw t0, " #o "(%[rk])\n\t" \ - "lw t1, " #o "+4(%[rk])\n\t" \ - "lw t2, " #o "+8(%[rk])\n\t" \ - "lw t3, " #o "+12(%[rk])\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" - -/* A round of encryption from set 1 to 2 registers. */ -#define ENC_ROUND_S_T_ASM(o) \ - "srliw t0, t5, 24\n\t" \ - "srliw t1, t6, 24\n\t" \ - "srliw t2, s1, 24\n\t" \ - "srliw t3, s2, 24\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, %[te]\n\t" \ - "add t1, t1, %[te]\n\t" \ - "add t2, t2, %[te]\n\t" \ - "add t3, t3, %[te]\n\t" \ - "lw a4, (t0)\n\t" \ - "lw a5, (t1)\n\t" \ - "lw a6, (t2)\n\t" \ - "lw a7, (t3)\n\t" \ - \ - "addi t4, %[te], 0x400\n\t" \ - "srliw t0, t6, 14\n\t" \ - "srliw t1, s1, 14\n\t" \ - "srliw t2, s2, 14\n\t" \ - "srliw t3, t5, 14\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "srliw t0, s1, 6\n\t" \ - "srliw t1, s2, 6\n\t" \ - "srliw t2, t5, 6\n\t" \ - "srliw t3, t6, 6\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "andi t0, s2, 0xff\n\t" \ - "andi t1, t5, 0xff\n\t" \ - "andi t2, t6, 0xff\n\t" \ - "andi t3, s1, 0xff\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" \ - \ - "lw t0, " #o "(%[rk])\n\t" \ - "lw t1, " #o "+4(%[rk])\n\t" \ - "lw t2, " #o "+8(%[rk])\n\t" \ - "lw t3, " #o "+12(%[rk])\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" - - __asm__ __volatile__ ( -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* Load 4 32-bit words in reverse byte order. */ - LOAD_WORD_REV(t0, 0, %[in]) - LOAD_WORD_REV(t1, 4, %[in]) - LOAD_WORD_REV(t2, 8, %[in]) - LOAD_WORD_REV(t3, 12, %[in]) -#else - UNALIGNED_LD2(t1, t3, 0, %[in], t0) - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - "srli t0, t1, 32\n\t" - "srli t2, t3, 32\n\t" -#endif - "lw a4, 0(%[rk])\n\t" - "lw a5, 4(%[rk])\n\t" - "lw a6, 8(%[rk])\n\t" - "lw a7, 12(%[rk])\n\t" - /* AddRoundKey */ - "xor a4, t0, a4\n\t" - "xor a5, t1, a5\n\t" - "xor a6, t2, a6\n\t" - "xor a7, t3, a7\n\t" - - ENC_ROUND_T_S_ASM(16) - ENC_ROUND_S_T_ASM(32) - ENC_ROUND_T_S_ASM(48) - ENC_ROUND_S_T_ASM(64) - ENC_ROUND_T_S_ASM(80) - ENC_ROUND_S_T_ASM(96) - ENC_ROUND_T_S_ASM(112) - ENC_ROUND_S_T_ASM(128) - ENC_ROUND_T_S_ASM(144) - - "li t4, 5\n\t" - "ble %[r], t4, L_aes_encrypt_done\n\t" - ENC_ROUND_S_T_ASM(160) - ENC_ROUND_T_S_ASM(176) - - "li t4, 6\n\t" - "ble %[r], t4, L_aes_encrypt_done\n\t" - ENC_ROUND_S_T_ASM(192) - ENC_ROUND_T_S_ASM(208) - "L_aes_encrypt_done:\n\t" - - /* Last round. */ - "srliw t0, s1, 6\n\t" - "srliw t1, s2, 6\n\t" - "srliw t2, t5, 6\n\t" - "srliw t3, t6, 6\n\t" - "andi t0, t0, 0x3fc\n\t" - "andi t1, t1, 0x3fc\n\t" - "andi t2, t2, 0x3fc\n\t" - "andi t3, t3, 0x3fc\n\t" - "add t0, t0, %[te]\n\t" - "add t1, t1, %[te]\n\t" - "add t2, t2, %[te]\n\t" - "add t3, t3, %[te]\n\t" - "lw a4, (t0)\n\t" - "lw a5, (t1)\n\t" - "lw a6, (t2)\n\t" - "lw a7, (t3)\n\t" - "li t4, 0x0000ff00\n\t" - "and a4, a4, t4\n\t" - "and a5, a5, t4\n\t" - "and a6, a6, t4\n\t" - "and a7, a7, t4\n\t" - - "addi t4, %[te], 0x400\n\t" - "andi t0, s2, 0xff\n\t" - "andi t1, t5, 0xff\n\t" - "andi t2, t6, 0xff\n\t" - "andi t3, s1, 0xff\n\t" - "slli t0, t0, 2\n\t" - "slli t1, t1, 2\n\t" - "slli t2, t2, 2\n\t" - "slli t3, t3, 2\n\t" - "add t0, t0, t4\n\t" - "add t1, t1, t4\n\t" - "add t2, t2, t4\n\t" - "add t3, t3, t4\n\t" - "lbu t0, (t0)\n\t" - "lbu t1, (t1)\n\t" - "lbu t2, (t2)\n\t" - "lbu t3, (t3)\n\t" - "or a4, a4, t0\n\t" - "or a5, a5, t1\n\t" - "or a6, a6, t2\n\t" - "or a7, a7, t3\n\t" - - "addi t4, t4, 0x400\n\t" - "srliw t0, t5, 24\n\t" - "srliw t1, t6, 24\n\t" - "srliw t2, s1, 24\n\t" - "srliw t3, s2, 24\n\t" - "slli t0, t0, 2\n\t" - "slli t1, t1, 2\n\t" - "slli t2, t2, 2\n\t" - "slli t3, t3, 2\n\t" - "add t0, t0, t4\n\t" - "add t1, t1, t4\n\t" - "add t2, t2, t4\n\t" - "add t3, t3, t4\n\t" - "lw t0, (t0)\n\t" - "lw t1, (t1)\n\t" - "lw t2, (t2)\n\t" - "lw t3, (t3)\n\t" - "li t4, 0xff000000\n\t" - "and t0, t0, t4\n\t" - "and t1, t1, t4\n\t" - "and t2, t2, t4\n\t" - "and t3, t3, t4\n\t" - "or a4, a4, t0\n\t" - "or a5, a5, t1\n\t" - "or a6, a6, t2\n\t" - "or a7, a7, t3\n\t" - - "li t4, 0xc00\n\t" - "add t4, %[te], t4\n\t" - "srliw t0, t6, 14\n\t" - "srliw t1, s1, 14\n\t" - "srliw t2, s2, 14\n\t" - "srliw t3, t5, 14\n\t" - "andi t0, t0, 0x3fc\n\t" - "andi t1, t1, 0x3fc\n\t" - "andi t2, t2, 0x3fc\n\t" - "andi t3, t3, 0x3fc\n\t" - "add t0, t0, t4\n\t" - "add t1, t1, t4\n\t" - "add t2, t2, t4\n\t" - "add t3, t3, t4\n\t" - "lw t0, (t0)\n\t" - "lw t1, (t1)\n\t" - "lw t2, (t2)\n\t" - "lw t3, (t3)\n\t" - "li t4, 0x00ff0000\n\t" - "and t0, t0, t4\n\t" - "and t1, t1, t4\n\t" - "and t2, t2, t4\n\t" - "and t3, t3, t4\n\t" - "or a4, a4, t0\n\t" - "or a5, a5, t1\n\t" - "or a6, a6, t2\n\t" - "or a7, a7, t3\n\t" - - "slli t4, %[r], 5\n\t" - "add t4, %[rk], t4\n\t" - "lw t0, 0(t4)\n\t" - "lw t1, 4(t4)\n\t" - "lw t2, 8(t4)\n\t" - "lw t3, 12(t4)\n\t" - "xor a4, a4, t0\n\t" - "xor a5, a5, t1\n\t" - "xor a6, a6, t2\n\t" - "xor a7, a7, t3\n\t" - - /* Reverse byte in 32-bit words. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - STORE_WORD_REV(a4, 0, %[out]) - STORE_WORD_REV(a5, 4, %[out]) - STORE_WORD_REV(a6, 8, %[out]) - STORE_WORD_REV(a7, 12, %[out]) -#elif !defined(WOLFSSL_RISCV_BIT_MANIPULATION) - "slli t0, a4, 32\n\t" - "slli t1, a5, 32\n\t" - "slli t2, a6, 32\n\t" - "slli t3, a7, 32\n\t" - "srli t1, t1, 32\n\t" - "srli t3, t3, 32\n\t" - "or t1, t1, t0\n\t" - "or t3, t3, t2\n\t" - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - /* Write encrypted block to output. */ - UNALIGNED_SD2(t1, t3, 0, %[out], t0) -#else - PACK(REG_T1, REG_A5, REG_A4) - PACK(REG_T3, REG_A7, REG_A6) - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - /* Write encrypted block to output. */ - UNALIGNED_SD2(t1, t3, 0, %[out], t0) -#endif - - : - : [in] "r" (in), [rk] "r" (aes->key), [te] "r" (Te), - [r] "r" (aes->rounds >> 1), [out] "r" (out) - : "memory", "t0", "t1", "t2", "t3", "t4", - "a4", "a5", "a6", "a7", - "t5", "t6", "s1", "s2" - ); -} -#endif /* WOLFSSL_AES_DIRECT || HAVE_AES_CBC || HAVE_AESGCM || HAVE_AESCCM */ - -#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) -#ifdef HAVE_AES_DECRYPT -/* AES byte decryption table. */ -static const FLASH_QUALIFIER byte Td4[256] = -{ - 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, - 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, - 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, - 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, - 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, - 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, - 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, - 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, - 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, - 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, - 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, - 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, - 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, - 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, - 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, - 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, - 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, - 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, - 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, - 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, - 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, - 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, - 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, - 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, - 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, - 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, - 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, - 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, - 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, - 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, - 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, - 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, -}; - -/* Decrypt a block using AES. - * - * @param [in] aes AES object. - * @param [in] in Block to decrypt. - * @param [out] out Decrypted block. - */ -static void wc_AesDecrypt(Aes* aes, const byte* in, byte* out) -{ -/* A round of decryption from set 2 to 1 registers. */ -#define DEC_ROUND_T_S_ASM(o) \ - "srliw t0, a4, 24\n\t" \ - "srliw t1, a5, 24\n\t" \ - "srliw t2, a6, 24\n\t" \ - "srliw t3, a7, 24\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, %[td]\n\t" \ - "add t1, t1, %[td]\n\t" \ - "add t2, t2, %[td]\n\t" \ - "add t3, t3, %[td]\n\t" \ - "lw t5, (t0)\n\t" \ - "lw t6, (t1)\n\t" \ - "lw s1, (t2)\n\t" \ - "lw s2, (t3)\n\t" \ - \ - "addi t4, %[td], 0x400\n\t" \ - "srliw t0, a7, 14\n\t" \ - "srliw t1, a4, 14\n\t" \ - "srliw t2, a5, 14\n\t" \ - "srliw t3, a6, 14\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "srliw t0, a6, 6\n\t" \ - "srliw t1, a7, 6\n\t" \ - "srliw t2, a4, 6\n\t" \ - "srliw t3, a5, 6\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "andi t0, a5, 0xff\n\t" \ - "andi t1, a6, 0xff\n\t" \ - "andi t2, a7, 0xff\n\t" \ - "andi t3, a4, 0xff\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" \ - \ - "lw t0, " #o "(%[rk])\n\t" \ - "lw t1, " #o "+4(%[rk])\n\t" \ - "lw t2, " #o "+8(%[rk])\n\t" \ - "lw t3, " #o "+12(%[rk])\n\t" \ - "xor t5, t5, t0\n\t" \ - "xor t6, t6, t1\n\t" \ - "xor s1, s1, t2\n\t" \ - "xor s2, s2, t3\n\t" - -/* A round of decryption from set 1 to 2 registers. */ -#define DEC_ROUND_S_T_ASM(o) \ - "srliw t0, t5, 24\n\t" \ - "srliw t1, t6, 24\n\t" \ - "srliw t2, s1, 24\n\t" \ - "srliw t3, s2, 24\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, %[td]\n\t" \ - "add t1, t1, %[td]\n\t" \ - "add t2, t2, %[td]\n\t" \ - "add t3, t3, %[td]\n\t" \ - "lw a4, (t0)\n\t" \ - "lw a5, (t1)\n\t" \ - "lw a6, (t2)\n\t" \ - "lw a7, (t3)\n\t" \ - \ - "addi t4, %[td], 0x400\n\t" \ - "srliw t0, s2, 14\n\t" \ - "srliw t1, t5, 14\n\t" \ - "srliw t2, t6, 14\n\t" \ - "srliw t3, s1, 14\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "srliw t0, s1, 6\n\t" \ - "srliw t1, s2, 6\n\t" \ - "srliw t2, t5, 6\n\t" \ - "srliw t3, t6, 6\n\t" \ - "andi t0, t0, 0x3fc\n\t" \ - "andi t1, t1, 0x3fc\n\t" \ - "andi t2, t2, 0x3fc\n\t" \ - "andi t3, t3, 0x3fc\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" \ - \ - "addi t4, t4, 0x400\n\t" \ - "andi t0, t6, 0xff\n\t" \ - "andi t1, s1, 0xff\n\t" \ - "andi t2, s2, 0xff\n\t" \ - "andi t3, t5, 0xff\n\t" \ - "slliw t0, t0, 2\n\t" \ - "slliw t1, t1, 2\n\t" \ - "slliw t2, t2, 2\n\t" \ - "slliw t3, t3, 2\n\t" \ - "add t0, t0, t4\n\t" \ - "add t1, t1, t4\n\t" \ - "add t2, t2, t4\n\t" \ - "add t3, t3, t4\n\t" \ - "lw t0, (t0)\n\t" \ - "lw t1, (t1)\n\t" \ - "lw t2, (t2)\n\t" \ - "lw t3, (t3)\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" \ - \ - "lw t0, " #o "(%[rk])\n\t" \ - "lw t1, " #o "+4(%[rk])\n\t" \ - "lw t2, " #o "+8(%[rk])\n\t" \ - "lw t3, " #o "+12(%[rk])\n\t" \ - "xor a4, a4, t0\n\t" \ - "xor a5, a5, t1\n\t" \ - "xor a6, a6, t2\n\t" \ - "xor a7, a7, t3\n\t" - - __asm__ __volatile__ ( -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* Load 4 32-bit words in reverse byte order. */ - LOAD_WORD_REV(t0, 0, %[in]) - LOAD_WORD_REV(t1, 4, %[in]) - LOAD_WORD_REV(t2, 8, %[in]) - LOAD_WORD_REV(t3, 12, %[in]) -#else - UNALIGNED_LD2(t1, t3, 0, %[in], t0) - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - "srli t0, t1, 32\n\t" - "srli t2, t3, 32\n\t" -#endif - "lw a4, 0(%[rk])\n\t" - "lw a5, 4(%[rk])\n\t" - "lw a6, 8(%[rk])\n\t" - "lw a7, 12(%[rk])\n\t" - /* AddRoundKey */ - "xor a4, t0, a4\n\t" - "xor a5, t1, a5\n\t" - "xor a6, t2, a6\n\t" - "xor a7, t3, a7\n\t" - - DEC_ROUND_T_S_ASM(16) - DEC_ROUND_S_T_ASM(32) - DEC_ROUND_T_S_ASM(48) - DEC_ROUND_S_T_ASM(64) - DEC_ROUND_T_S_ASM(80) - DEC_ROUND_S_T_ASM(96) - DEC_ROUND_T_S_ASM(112) - DEC_ROUND_S_T_ASM(128) - DEC_ROUND_T_S_ASM(144) - - "li t4, 5\n\t" - "ble %[r], t4, L_aes_decrypt_done\n\t" - DEC_ROUND_S_T_ASM(160) - DEC_ROUND_T_S_ASM(176) - - "li t4, 6\n\t" - "ble %[r], t4, L_aes_decrypt_done\n\t" - DEC_ROUND_S_T_ASM(192) - DEC_ROUND_T_S_ASM(208) - "L_aes_decrypt_done:\n\t" - - /* Last round. */ - "srliw t0, t5, 24\n\t" - "srliw t1, t6, 24\n\t" - "srliw t2, s1, 24\n\t" - "srliw t3, s2, 24\n\t" - "add t0, t0, %[td4]\n\t" - "add t1, t1, %[td4]\n\t" - "add t2, t2, %[td4]\n\t" - "add t3, t3, %[td4]\n\t" - "lbu a4, (t0)\n\t" - "lbu a5, (t1)\n\t" - "lbu a6, (t2)\n\t" - "lbu a7, (t3)\n\t" - "slli a4, a4, 24\n\t" - "slli a5, a5, 24\n\t" - "slli a6, a6, 24\n\t" - "slli a7, a7, 24\n\t" - - "srliw t0, s2, 16\n\t" - "srliw t1, t5, 16\n\t" - "srliw t2, t6, 16\n\t" - "srliw t3, s1, 16\n\t" - "andi t0, t0, 0xff\n\t" - "andi t1, t1, 0xff\n\t" - "andi t2, t2, 0xff\n\t" - "andi t3, t3, 0xff\n\t" - "add t0, t0, %[td4]\n\t" - "add t1, t1, %[td4]\n\t" - "add t2, t2, %[td4]\n\t" - "add t3, t3, %[td4]\n\t" - "lbu t0, (t0)\n\t" - "lbu t1, (t1)\n\t" - "lbu t2, (t2)\n\t" - "lbu t3, (t3)\n\t" - "slli t0, t0, 16\n\t" - "slli t1, t1, 16\n\t" - "slli t2, t2, 16\n\t" - "slli t3, t3, 16\n\t" - "or a4, a4, t0\n\t" - "or a5, a5, t1\n\t" - "or a6, a6, t2\n\t" - "or a7, a7, t3\n\t" - - "srliw t0, s1, 8\n\t" - "srliw t1, s2, 8\n\t" - "srliw t2, t5, 8\n\t" - "srliw t3, t6, 8\n\t" - "andi t0, t0, 0xff\n\t" - "andi t1, t1, 0xff\n\t" - "andi t2, t2, 0xff\n\t" - "andi t3, t3, 0xff\n\t" - "add t0, t0, %[td4]\n\t" - "add t1, t1, %[td4]\n\t" - "add t2, t2, %[td4]\n\t" - "add t3, t3, %[td4]\n\t" - "lbu t0, (t0)\n\t" - "lbu t1, (t1)\n\t" - "lbu t2, (t2)\n\t" - "lbu t3, (t3)\n\t" - "slli t0, t0, 8\n\t" - "slli t1, t1, 8\n\t" - "slli t2, t2, 8\n\t" - "slli t3, t3, 8\n\t" - "or a4, a4, t0\n\t" - "or a5, a5, t1\n\t" - "or a6, a6, t2\n\t" - "or a7, a7, t3\n\t" - - "andi t0, t6, 0xff\n\t" - "andi t1, s1, 0xff\n\t" - "andi t2, s2, 0xff\n\t" - "andi t3, t5, 0xff\n\t" - "add t0, t0, %[td4]\n\t" - "add t1, t1, %[td4]\n\t" - "add t2, t2, %[td4]\n\t" - "add t3, t3, %[td4]\n\t" - "lbu t0, (t0)\n\t" - "lbu t1, (t1)\n\t" - "lbu t2, (t2)\n\t" - "lbu t3, (t3)\n\t" - "or a4, a4, t0\n\t" - "or a5, a5, t1\n\t" - "or a6, a6, t2\n\t" - "or a7, a7, t3\n\t" - - "slli t4, %[r], 5\n\t" - "add t4, %[rk], t4\n\t" - "lw t0, 0(t4)\n\t" - "lw t1, 4(t4)\n\t" - "lw t2, 8(t4)\n\t" - "lw t3, 12(t4)\n\t" - "xor a4, a4, t0\n\t" - "xor a5, a5, t1\n\t" - "xor a6, a6, t2\n\t" - "xor a7, a7, t3\n\t" - - /* Reverse byte in 32-bit words. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - STORE_WORD_REV(a4, 0, %[out]) - STORE_WORD_REV(a5, 4, %[out]) - STORE_WORD_REV(a6, 8, %[out]) - STORE_WORD_REV(a7, 12, %[out]) -#elif !defined(WOLFSSL_RISCV_BIT_MANIPULATION) - "slli t0, a4, 32\n\t" - "slli t1, a5, 32\n\t" - "slli t2, a6, 32\n\t" - "slli t3, a7, 32\n\t" - "srli t1, t1, 32\n\t" - "srli t3, t3, 32\n\t" - "or t1, t1, t0\n\t" - "or t3, t3, t2\n\t" - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - /* Write encrypted block to output. */ - UNALIGNED_SD2(t1, t3, 0, %[out], t0) -#else - PACK(REG_T1, REG_A5, REG_A4) - PACK(REG_T3, REG_A7, REG_A6) - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - /* Write encrypted block to output. */ - UNALIGNED_SD2(t1, t3, 0, %[out], t0) -#endif - - : - : [in] "r" (in), [rk] "r" (aes->key), [td] "r" (Td), - [r] "r" (aes->rounds >> 1), [out] "r" (out), [td4] "r" (Td4) - : "memory", "t0", "t1", "t2", "t3", "t4", - "a4", "a5", "a6", "a7", - "t5", "t6", "s1", "s2" - ); -} -#endif /* HAVE_AES_DECRYPT */ -#endif /* WOLFSSL_AES_DIRECT || HAVE_AES_CBC */ - -#endif /* WOLFSSL_RISCV_SCALAR_CRYPTO_ASM */ - -/* AES-CBC */ -#if (defined(HAVE_AES_CBC) && !defined(HAVE_AES_CBC_ENC_DEC)) || \ - (defined(WOLFSSL_AES_COUNTER) && !defined(HAVE_AES_COUNTER_ENC)) || \ - (defined(HAVE_AESGCM) && !defined(WOLFSSL_RISCV_VECTOR_GCM)) || \ - defined(HAVE_AESCCM) -/* XOR two 16-byte values, out and in, into out. - * - * @param [in, out] out 16-byte value. - * @param [in] in 16-byte value. - */ -static WC_INLINE void xorbuf16(byte* out, const byte* in) -{ - word64* out64 = (word64*)out; - word64* in64 = (word64*)in; - - out64[0] ^= in64[0]; - out64[1] ^= in64[1]; -} -#endif - -#if (defined(HAVE_AES_CBC) && !defined(HAVE_AES_CBC_ENC_DEC)) || \ - (defined(HAVE_AESGCM) && (!defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) || \ - !defined(WOLFSSL_RISCV_VECTOR_GCM))) -/* XOR two 16-byte values into out. - * - * @param [out] out 16-byte value. - * @param [in] a 16-byte value. - * @param [in] b 16-byte value. - */ -static WC_INLINE void xorbufout16(byte* out, const byte* a, const byte* b) -{ - word64* out64 = (word64*)out; - word64* a64 = (word64*)a; - word64* b64 = (word64*)b; - - out64[0] = a64[0] ^ b64[0]; - out64[1] = a64[1] ^ b64[1]; -} -#endif - -#if defined(HAVE_AES_CBC) && !defined(HAVE_AES_CBC_ENC_DEC) -/* Encrypt blocks of data using AES-CBC. - * - * Implementation using wc_AesEncrypt(). - * - * @param [in] aes AES object. - * @param [out] out Encrypted blocks. - * @param [in] in Blocks to encrypt. - * @param pin] sz Number of bytes to encrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_LENGTH_E when sz is not a multiple of WC_AES_BLOCK_SIZE. - */ -int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - int ret = 0; - word32 blocks = sz / WC_AES_BLOCK_SIZE; - - /* Validate parameters. */ - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } -#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS - /* Ensure a multiple of blocks is to be encrypted. */ - if ((ret == 0) && (sz % WC_AES_BLOCK_SIZE)) { - ret = BAD_LENGTH_E; - } -#endif - - if ((ret == 0) && (blocks > 0)) { - if (in != out) { - /* Encrypt first block with IV. */ - xorbufout16(out, (byte*)aes->reg, in); - wc_AesEncrypt(aes, out, out); - in += WC_AES_BLOCK_SIZE; - out += WC_AES_BLOCK_SIZE; - for (blocks--; blocks > 0; blocks--) { - /* Encrypt a block with previous output block as IV. */ - xorbufout16(out, out - WC_AES_BLOCK_SIZE, in); - wc_AesEncrypt(aes, out, out); - in += WC_AES_BLOCK_SIZE; - out += WC_AES_BLOCK_SIZE; - } - /* Copy last output block into AES object as next IV. */ - memcpy16((byte*)aes->reg, out - WC_AES_BLOCK_SIZE); - } - /* in and out are same buffer. */ - else { - byte* data = out; - /* Encrypt first block with IV. */ - xorbuf16(data, (byte*)aes->reg); - wc_AesEncrypt(aes, data, data); - data += WC_AES_BLOCK_SIZE; - for (blocks--; blocks > 0; blocks--) { - /* Encrypt a block with previous output block as IV. */ - xorbuf16(data, data - WC_AES_BLOCK_SIZE); - wc_AesEncrypt(aes, data, data); - data += WC_AES_BLOCK_SIZE; - } - /* Copy last output block into AES object as next IV. */ - memcpy16((byte*)aes->reg, data - WC_AES_BLOCK_SIZE); - } - } - - return ret; -} - -#ifdef HAVE_AES_DECRYPT -/* Decrypt blocks of data using AES-CBC. - * - * Implementation using wc_AesDecrypt(). - * - * @param [in] aes AES object. - * @param [out] out Decrypted blocks. - * @param [in] in Blocks to decrypt. - * @param pin] sz Number of bytes to decrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_FUNC_ARG when sz is not a multiple of WC_AES_BLOCK_SIZE. - * @return BAD_LENGTH_E when sz is not a multiple of WC_AES_BLOCK_SIZE. - */ -int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - int ret = 0; - word32 blocks = sz / WC_AES_BLOCK_SIZE; - - /* Validate parameters. */ - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } - /* Ensure a multiple of blocks is being decrypted. */ - if ((ret == 0) && (sz % WC_AES_BLOCK_SIZE)) { -#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS - ret = BAD_LENGTH_E; -#else - ret = BAD_FUNC_ARG; -#endif - } - - if ((ret == 0) && (blocks > 0)) { - if (in != out) { - /* Decrypt first block with the IV. */ - wc_AesDecrypt(aes, in, out); - xorbuf16(out, (byte*)aes->reg); - in += WC_AES_BLOCK_SIZE; - out += WC_AES_BLOCK_SIZE; - for (blocks--; blocks > 0; blocks--) { - /* Decrypt a block with previous input block as IV. */ - wc_AesDecrypt(aes, in, out); - xorbuf16(out, in - WC_AES_BLOCK_SIZE); - in += WC_AES_BLOCK_SIZE; - out += WC_AES_BLOCK_SIZE; - } - /* Copy last output block into AES object as next IV. */ - memcpy16((byte*)aes->reg, in - WC_AES_BLOCK_SIZE); - } - /* in and out are same buffer. */ - else { - byte* data = out; - for (; blocks > 0; blocks -= 2) { - /* Decrypt block with the IV in aes->reg. */ - memcpy16((byte*)aes->tmp, data); - wc_AesDecrypt(aes, data, data); - xorbuf16(data, (byte*)aes->reg); - if (blocks == 1) { - memcpy16((byte*)aes->reg, (byte*)aes->tmp); - break; - } - data += WC_AES_BLOCK_SIZE; - /* Decrypt block with the IV in aes->tmp. */ - memcpy16((byte*)aes->reg, data); - wc_AesDecrypt(aes, data, data); - xorbuf16(data, (byte*)aes->tmp); - data += WC_AES_BLOCK_SIZE; - } - } - } - - return ret; -} -#endif -#endif - -/* AES-ECB */ -#ifdef HAVE_AES_ECB -/* Encrypt blocks of data using AES-ECB. - * - * @param [in] aes AES object. - * @param [out] out Encrypted blocks. - * @param [in] in Blocks to encrypt. - * @param pin] sz Number of bytes to encrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_LENGTH_E when sz is not a multiple of WC_AES_BLOCK_SIZE. - */ -int wc_AesEcbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - int ret = 0; - - /* Validate parameters. */ - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } - /* Ensure a multiple of blocks is to be encrypted. */ - if ((ret == 0) && ((sz % WC_AES_BLOCK_SIZE) != 0)) { - ret = BAD_LENGTH_E; - } - - if (ret == 0) { - /* Encrypt block by block. */ - while (sz > 0) { - wc_AesEncrypt(aes, in, out); - out += WC_AES_BLOCK_SIZE; - in += WC_AES_BLOCK_SIZE; - sz -= WC_AES_BLOCK_SIZE; - } - } - - return ret; -} - -#ifdef HAVE_AES_DECRYPT -/* Decrypt blocks of data using AES-ECB. - * - * @param [in] aes AES object. - * @param [out] out Encrypted blocks. - * @param [in] in Blocks to encrypt. - * @param pin] sz Number of bytes to encrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_LENGTH_E when sz is not a multiple of WC_AES_BLOCK_SIZE. - */ -int wc_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - int ret = 0; - - /* Validate parameters. */ - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } - /* Ensure a multiple of blocks is to be decrypted. */ - if ((ret == 0) && ((sz % WC_AES_BLOCK_SIZE) != 0)) { - ret = BAD_LENGTH_E; - } - - if (ret == 0) { - /* Decrypt block by block. */ - while (sz > 0) { - wc_AesDecrypt(aes, in, out); - out += WC_AES_BLOCK_SIZE; - in += WC_AES_BLOCK_SIZE; - sz -= WC_AES_BLOCK_SIZE; - } - } - - return ret; -} -#endif -#endif /* HAVE_AES_ECB */ - -/* AES-CTR */ -#if defined(WOLFSSL_AES_COUNTER) && !defined(HAVE_AES_COUNTER_ENC) -/* Increment AES counter. - * - * Big-endian byte ordering. - * - * @param [in, out] inOutCtr Counter value to be incremented. - */ -static WC_INLINE void IncrementAesCounter(byte* inOutCtr) -{ - int i; - - /* Big-endian array - start at last element and move back. */ - for (i = WC_AES_BLOCK_SIZE - 1; i >= 0; i--) { - /* Result not zero means no carry. */ - if ((++inOutCtr[i]) != 0) { - return; - } - } -} - -/* Encrypt blocks of data using AES-CTR. - * - * Implementation uses wc_AesEncrypt(). - * - * @param [in] aes AES object. - * @param [out] out Encrypted blocks. - * @param [in] in Blocks to encrypt. - * @param [in] sz Number of bytes to encrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out or in is NULL. - * @return BAD_FUNC_ARG when key size in AES object is not supported. - */ -int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - word32 processed; - int ret = 0; - - /* Validate parameters. */ - if (aes == NULL || out == NULL || in == NULL) { - ret = BAD_FUNC_ARG; - } - if (ret == 0) { - /* Check key size is supported. */ - switch(aes->rounds) { - #ifdef WOLFSSL_AES_128 - case 10: /* AES 128 BLOCK */ - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - case 12: /* AES 192 BLOCK */ - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - case 14: /* AES 256 BLOCK */ - #endif /* WOLFSSL_AES_256 */ - break; - default: - /* Not set or corrupted: match the generic wc_AesEncrypt - * (aes.c) behavior for an unusable key schedule. */ - WOLFSSL_MSG("Bad AES-CTR round value"); - ret = KEYUSAGE_E; - } - } - - if (ret == 0) { - /* Use up any unused bytes left in aes->tmp */ - processed = min(aes->left, sz); - if (processed > 0) { - /* XOR in encrypted counter. */ - xorbufout(out, in, (byte*)aes->tmp + WC_AES_BLOCK_SIZE - aes->left, - processed); - out += processed; - in += processed; - aes->left -= processed; - sz -= processed; - } - - /* Do whole blocks of data. */ - while (sz >= WC_AES_BLOCK_SIZE) { - wc_AesEncrypt(aes, (byte*)aes->reg, scratch); - xorbuf16(scratch, in); - memcpy16(out, scratch); - IncrementAesCounter((byte*)aes->reg); - - out += WC_AES_BLOCK_SIZE; - in += WC_AES_BLOCK_SIZE; - sz -= WC_AES_BLOCK_SIZE; - aes->left = 0; - } - ForceZero(scratch, WC_AES_BLOCK_SIZE); - - if (sz > 0) { - /* Encrypt counter and store in aes->tmp. - * Use up aes->tmp to encrypt data less than a block. - */ - wc_AesEncrypt(aes, (byte*)aes->reg, (byte*)aes->tmp); - IncrementAesCounter((byte*)aes->reg); - aes->left = WC_AES_BLOCK_SIZE - sz; - /* XOR in encrypted counter. */ - xorbufout(out, in, aes->tmp, sz); - } - } - - return ret; -} - -#endif /* WOLFSSL_AES_COUNTER */ - -#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) -/* Set AES key directly. - * - * @param [in] aes AES object. - * @param [in] key Secret key to use. - * @param [in] keyLen Length of key in bytes. - * @param [in] iv Initialization Vector (IV) to use. May be NULL. - * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes or key is NULL. - * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. - */ -int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 keyLen, const byte* iv, - int dir) -{ - return wc_AesSetKey(aes, key, keyLen, iv, dir); -} -#endif - -/* Set the IV. - * - * @param [in] aes AES object. - * @param [in] iv Initialization Vector (IV) to set. - * When NULL, an IV of all zeros is set. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes is NULL. - */ -int wc_AesSetIV(Aes* aes, const byte* iv) -{ - int ret = 0; - - if (aes == NULL) { - ret = BAD_FUNC_ARG; - } - else if (iv != NULL) { - memcpy16((byte*)aes->reg, iv); - } - else { - XMEMSET(aes->reg, 0, WC_AES_BLOCK_SIZE); - } - - return ret; -} - -/* AES-DIRECT */ -#ifdef WOLFSSL_AES_DIRECT -/* Direct encryption of a block. - * - * @param [in] aes AES object. - * @param [out] out Encrypted block. - * @param [in] in Block to encrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out, or in is NULL. - */ -int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) -{ - int ret = 0; - - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - WOLFSSL_MSG("Invalid input to wc_AesEncryptDirect"); - ret = BAD_FUNC_ARG; - } - /* wc_AesEncrypt is void here so it cannot report an unusable key - * schedule itself; match the generic wc_AesEncrypt (aes.c) check. */ - if ((ret == 0) && - (((aes->rounds >> 1) > 7) || ((aes->rounds >> 1) == 0))) { - ret = KEYUSAGE_E; - } - if (ret == 0) { - wc_AesEncrypt(aes, in, out); - } - - return ret; -} -#ifdef HAVE_AES_DECRYPT -/* Direct decryption of a block. - * - * @param [in] aes AES object. - * @param [out] out Decrypted block. - * @param [in] in Block to decrypt. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, out, or in is NULL. - */ -int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) -{ - int ret = 0; - - if ((aes == NULL) || (out == NULL) || (in == NULL)) { - WOLFSSL_MSG("Invalid input to wc_AesDecryptDirect"); - ret = BAD_FUNC_ARG; - } - /* wc_AesDecrypt is void here so it cannot report an unusable key - * schedule itself; match the generic wc_AesDecrypt (aes.c) check. */ - if ((ret == 0) && - (((aes->rounds >> 1) > 7) || ((aes->rounds >> 1) == 0))) { - ret = KEYUSAGE_E; - } - if (ret == 0) { - wc_AesDecrypt(aes, in, out); - } - - return ret; -} -#endif /* HAVE_AES_DECRYPT */ -#endif /* WOLFSSL_AES_DIRECT */ - -#ifdef WOLFSSL_AES_COUNTER - -/* Set the key for AES-CTR. - * - * @param [in] aes AES object. - * @param [in] key Secret key to use. - * @param [in] keyLen Length of key in bytes. - * @param [in] iv Initialization Vector (IV) to use. May be NULL. - * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. - * For CTR mode, underlying key is always for encryption. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes or key is NULL. - * @return BAD_FUNC_ARG when keyLen is not supported or valid. - */ -int wc_AesCtrSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, - int dir) -{ - (void)dir; - return wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); -} - -#endif /* WOLFSSL_AES_COUNTER */ - -#ifdef HAVE_AESGCM - -#if !defined(WOLFSSL_RISCV_VECTOR_GCM) && \ - !defined(WOLFSSL_RISCV_VECTOR_CARRYLESS) && \ - !defined(WOLFSSL_RISCV_CARRYLESS) -/* Shift x in GF2 - * - * @param [in, out] x 128-bit value to shift. - */ -static WC_INLINE void RIGHTSHIFTX(byte* x) -{ - int i; - int carryIn = 0; - byte borrow = (0x00 - (x[15] & 0x01)) & 0xE1; - - for (i = 0; i < WC_AES_BLOCK_SIZE; i++) { - int carryOut = (x[i] & 0x01) << 7; - x[i] = (byte) ((x[i] >> 1) | carryIn); - carryIn = carryOut; - } - x[0] ^= borrow; -} - -/* Shift right by 4 a big-endian value in little-endian. - * - * @param [out] r8 Result of shift. - * @param [in] z8 128-bit value to shift. - */ -static WC_INLINE void Shift4_M0(byte *r8, byte *z8) -{ - int i; - for (i = 15; i > 0; i--) - r8[i] = (byte)(z8[i-1] << 4) | (byte)(z8[i] >> 4); - r8[0] = (byte)(z8[0] >> 4); -} - -/* Generate 4-bit table. - * - * @param [in, out] gcm GCM object. - */ -void GenerateM0(Gcm* gcm) -{ - int i; - byte (*m)[WC_AES_BLOCK_SIZE] = gcm->M0; - - /* 0 times -> 0x0 */ - XMEMSET(m[0x0], 0, WC_AES_BLOCK_SIZE); - /* 1 times -> 0x8 */ - memcpy16(m[0x8], gcm->H); - /* 2 times -> 0x4 */ - memcpy16(m[0x4], m[0x8]); - RIGHTSHIFTX(m[0x4]); - /* 4 times -> 0x2 */ - memcpy16(m[0x2], m[0x4]); - RIGHTSHIFTX(m[0x2]); - /* 8 times -> 0x1 */ - memcpy16(m[0x1], m[0x2]); - RIGHTSHIFTX(m[0x1]); - - /* 0x3 */ - memcpy16(m[0x3], m[0x2]); - xorbuf16(m[0x3], m[0x1]); - - /* 0x5 -> 0x7 */ - memcpy16(m[0x5], m[0x4]); - xorbuf16(m[0x5], m[0x1]); - memcpy16(m[0x6], m[0x4]); - xorbuf16(m[0x6], m[0x2]); - memcpy16(m[0x7], m[0x4]); - xorbuf16(m[0x7], m[0x3]); - - /* 0x9 -> 0xf */ - memcpy16(m[0x9], m[0x8]); - xorbuf16(m[0x9], m[0x1]); - memcpy16(m[0xa], m[0x8]); - xorbuf16(m[0xa], m[0x2]); - memcpy16(m[0xb], m[0x8]); - xorbuf16(m[0xb], m[0x3]); - memcpy16(m[0xc], m[0x8]); - xorbuf16(m[0xc], m[0x4]); - memcpy16(m[0xd], m[0x8]); - xorbuf16(m[0xd], m[0x5]); - memcpy16(m[0xe], m[0x8]); - xorbuf16(m[0xe], m[0x6]); - memcpy16(m[0xf], m[0x8]); - xorbuf16(m[0xf], m[0x7]); - - for (i = 0; i < 16; i++) { - Shift4_M0(m[16+i], m[i]); - } -} -#endif - -/* Setup the AES-GCM operation with the key. - * - * @param [in] aes AES object. - * @param [in] key Secret key to use. - * @param [in] ken Length of key in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes or key is NULL. - * @return BAD_FUNC_ARG when the key length is not supported. - */ -int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) -{ - int ret = 0; - byte iv[WC_AES_BLOCK_SIZE]; - - if (aes == NULL) { - ret = BAD_FUNC_ARG; - } - if ((ret == 0) && (len != 16) && (len != 24) && (len != 32)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - XMEMSET(iv, 0, WC_AES_BLOCK_SIZE); - ret = wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); - } - if (ret == 0) { - wc_AesEncrypt(aes, (byte*)aes->reg, aes->gcm.H); -#ifdef WOLFSSL_RISCV_VECTOR_GCM - /* Vector crypto instructions do bit reversal. */ -#elif defined(WOLFSSL_RISCV_VECTOR_CARRYLESS) - /* Vector crypto instructions do bit reversal. */ -#elif defined(WOLFSSL_RISCV_CARRYLESS) - /* Reverse bits in aes->gcm.H. */ -#ifdef WOLFSSL_RISCV_BIT_MANIPULATION - __asm__ __volatile__ ( - "ld t0, 0(%[data])\n\t" - "ld t1, 8(%[data])\n\t" - BREV8(REG_T0, REG_T0) - BREV8(REG_T1, REG_T1) - "sd t0, 0(%[data])\n\t" - "sd t1, 8(%[data])\n\t" - : - : [data] "r" (aes->gcm.H) - : "memory", "t0", "t1" - ); -#else - __asm__ __volatile__ ( - "ld t0, 0(%[data])\n\t" - "ld t1, 8(%[data])\n\t" - - /* Swap odd-even bits. */ - "li t4, 0x5555555555555555\n\t" - "srli t2, t0, 1\n\t" - "srli t3, t1, 1\n\t" - "and t0, t0, t4\n\t" - "and t1, t1, t4\n\t" - "and t2, t2, t4\n\t" - "and t3, t3, t4\n\t" - "slli t0, t0, 1\n\t" - "slli t1, t1, 1\n\t" - "or t0, t0, t2\n\t" - "or t1, t1, t3\n\t" - /* Swap pairs. */ - "li t4, 0x3333333333333333\n\t" - "srli t2, t0, 2\n\t" - "srli t3, t1, 2\n\t" - "and t0, t0, t4\n\t" - "and t1, t1, t4\n\t" - "and t2, t2, t4\n\t" - "and t3, t3, t4\n\t" - "slli t0, t0, 2\n\t" - "slli t1, t1, 2\n\t" - "or t0, t0, t2\n\t" - "or t1, t1, t3\n\t" - /* Swap nibbles. */ - "li t4, 0x0f0f0f0f0f0f0f0f\n\t" - "srli t2, t0, 4\n\t" - "srli t3, t1, 4\n\t" - "and t0, t0, t4\n\t" - "and t1, t1, t4\n\t" - "and t2, t2, t4\n\t" - "and t3, t3, t4\n\t" - "slli t0, t0, 4\n\t" - "slli t1, t1, 4\n\t" - "or t0, t0, t2\n\t" - "or t1, t1, t3\n\t" - - "sd t0, 0(%[data])\n\t" - "sd t1, 8(%[data])\n\t" - : - : [data] "r" (aes->gcm.H) - : "memory", "t0", "t1", "t2", "t3", "t4" - ); -#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ -#else - GenerateM0(&aes->gcm); -#endif - } - - return ret; -} - -#ifndef WOLFSSL_RISCV_VECTOR_GCM -/* Encode sz in bytes into array as big-endian number of bits. - * - * @param [out] buf Buffer to encode size into. - * @param [in] sz Size in bytes. - */ -static WC_INLINE void FlattenSzInBits(byte* buf, word32 sz) -{ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - __asm__ __volatile__ ( - /* sz is only 32-bits */ - /* Multiply by 8 to get size in bits. */ - "slli %[sz], %[sz], 3\n\t" - "srli t0, %[sz], 32\n\t" - "srli t1, %[sz], 24\n\t" - "srli t2, %[sz], 16\n\t" - "srli t3, %[sz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[buf])\n\t" - "sb x0 , 2(%[buf])\n\t" - "sb t0 , 3(%[buf])\n\t" - "sb t1 , 4(%[buf])\n\t" - "sb t2 , 5(%[buf])\n\t" - "sb t3 , 6(%[buf])\n\t" - "sb %[sz], 7(%[buf])\n\t" - : [sz] "+r" (sz) - : [buf] "r" (buf) - : "memory", "t0", "t1", "t2", "t3" - ); -#else - __asm__ __volatile__ ( - "slli t0, %[sz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[buf])\n\t" - : - : [sz] "r" (sz), [buf] "r" (buf) - : "memory", "t0" - ); -#endif -} -#endif - -#if defined(WOLFSSL_RISCV_VECTOR_GCM) - -/* Vector GHASH: vd = (vd ^ vs1) * vs2 */ -#define VGHSH_VV(vd, vs1, vs2) \ - ASM_WORD((0b101100 << 26) | (0b1 << 25) | (0b010 << 12) | \ - (0b1110111 << 0) | (vs2 << 20) | (vs1 << 15) | (vd << 7)) -/* Vector GMULT: vd = vd * vs2 */ -#define VGMUL_VV(vd, vs2) \ - ASM_WORD((0b101000 << 26) | (0b1 << 25) | (0b010 << 12) | \ - (0b1110111 << 0) | (vs2 << 20) | (0b10001 << 15) | (vd << 7)) - -/* GHASH Additional Authentication Data (AAD) and cipher text. - * - * @param [in] gcm GCM object. - * @param [in] a Additional Authentication Data (AAD). - * @param [in] aSz Size of AAD in bytes. - * @param [in] c Cipher text. - * @param [in] cSz Size of cipher text in bytes. - * @param [out] s Hash result. - * @param [in] sSz Number of bytes to put into hash result. - */ -void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, - byte* s, word32 sSz) -{ - ALIGN8 byte x[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - byte* h = gcm->H; - - __asm__ __volatile__ ( - VXOR_VV(REG_V0, REG_V0, REG_V0) - - /* Hash in A, the Additional Authentication Data */ - "beqz %[aSz], L_ghash_aad_done\n\t" - "beqz %[a], L_ghash_aad_done\n\t" - - "srli t3, %[aSz], 4\n\t" - VSETIVLI(REG_T0, 4, 0, 0, 0b010, 0b000) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V1, REG_T0) - - "beqz t3, L_ghash_aad_blocks_done\n\t" - "L_ghash_aad_loop:\n\t" - "mv t0, %[a]\n\t" - VL1RE32_V(REG_V2, REG_T0) - VGHSH_VV(REG_V0, REG_V2, REG_V1) - "addi %[a], %[a], 16\n\t" - "addi t3, t3, -1\n\t" - "bnez t3, L_ghash_aad_loop\n\t" - "L_ghash_aad_blocks_done:\n\t" - "andi t3, %[aSz], 0xf\n\t" - "beqz t3, L_ghash_aad_done\n\t" - VXOR_VV(REG_V2, REG_V2, REG_V2) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V2, REG_T0) - "mv t2, t3\n\t" - "L_ghash_aad_load_byte:\n\t" - "lb t0, (%[a])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[a], %[a], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_ghash_aad_load_byte\n\t" - "sub %[scratch], %[scratch], t3\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V2, REG_T0) - VGHSH_VV(REG_V0, REG_V2, REG_V1) - "L_ghash_aad_done:\n\t" - - /* Hash in C, the Ciphertext */ - "beqz %[cSz], L_ghash_ct_done\n\t" - "beqz %[c], L_ghash_ct_done\n\t" - - "srli t3, %[cSz], 4\n\t" - VSETIVLI(REG_T0, 4, 0, 0, 0b010, 0b000) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V1, REG_T0) - - "beqz t3, L_ghash_ct_blocks_done\n\t" - "L_ghash_ct_loop:\n\t" - "mv t0, %[c]\n\t" - VL1RE32_V(REG_V2, REG_T0) - VGHSH_VV(REG_V0, REG_V2, REG_V1) - "addi %[c], %[c], 16\n\t" - "addi t3, t3, -1\n\t" - "bnez t3, L_ghash_ct_loop\n\t" - "L_ghash_ct_blocks_done:\n\t" - "andi t3, %[cSz], 0xf\n\t" - "beqz t3, L_ghash_ct_done\n\t" - VXOR_VV(REG_V2, REG_V2, REG_V2) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V2, REG_T0) - "mv t2, t3\n\t" - "L_ghash_ct_load_byte:\n\t" - "lb t0, (%[c])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[c], %[c], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_ghash_ct_load_byte\n\t" - "sub %[scratch], %[scratch], t3\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V2, REG_T0) - VGHSH_VV(REG_V0, REG_V2, REG_V1) - "L_ghash_ct_done:\n\t" - - /* Hash in the lengths of A and C in bits */ - #ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* aSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[aSz], %[aSz], 3\n\t" - "srli t0, %[aSz], 32\n\t" - "srli t1, %[aSz], 24\n\t" - "srli t2, %[aSz], 16\n\t" - "srli t3, %[aSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[scratch])\n\t" - "sb x0 , 2(%[scratch])\n\t" - "sb t0 , 3(%[scratch])\n\t" - "sb t1 , 4(%[scratch])\n\t" - "sb t2 , 5(%[scratch])\n\t" - "sb t3 , 6(%[scratch])\n\t" - "sb %[aSz], 7(%[scratch])\n\t" - /* cSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[cSz], %[cSz], 3\n\t" - "srli t0, %[cSz], 32\n\t" - "srli t1, %[cSz], 24\n\t" - "srli t2, %[cSz], 16\n\t" - "srli t3, %[cSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 8(%[scratch])\n\t" - "sb x0 , 10(%[scratch])\n\t" - "sb t0 , 11(%[scratch])\n\t" - "sb t1 , 12(%[scratch])\n\t" - "sb t2 , 13(%[scratch])\n\t" - "sb t3 , 14(%[scratch])\n\t" - "sb %[cSz], 15(%[scratch])\n\t" - #else - "slli t0, %[aSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[scratch])\n\t" - "slli t0, %[cSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 8(%[scratch])\n\t" - #endif - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V2, REG_T0) - VGHSH_VV(REG_V0, REG_V2, REG_V1) - - "mv t1, %[x]\n\t" - VS1R_V(REG_V0, REG_T1) - - : [a] "+r" (a), [c] "+r" (c) , [aSz] "+r" (aSz), [cSz] "+r" (cSz) - : [x] "r" (x), [h] "r" (h), [scratch] "r" (scratch) - : "memory", "t0", "t1", "t2", "t3" - ); - - /* Copy the result into s. */ - XMEMCPY(s, x, sSz); -} - -#define HAVE_GHASH - -#elif defined(WOLFSSL_RISCV_VECTOR_CARRYLESS) - -#define VCLMUL_VV(vd, vs1, vs2) \ - ASM_WORD((0b001100 << 26) | (0b1 << 25) | (0b010 << 12) | \ - (0b1010111 << 0) | (vs2 << 20) | (vs1 << 15) | (vd << 7)) -#define VCLMULH_VV(vd, vs1, vs2) \ - ASM_WORD((0b001101 << 26) | (0b1 << 25) | (0b010 << 12) | \ - (0b1010111 << 0) | (vs2 << 20) | (vs1 << 15) | (vd << 7)) - -/* GMULT, multiply in GF2, x and y into x. - * - * @param [in, out] x On in, value to GMULT. - * On out, result of GMULT. - * @param [in] y Value to GMULT. - */ -static void GMULT(byte* x, byte* y) -{ - static byte red[16] = { - 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) - - /* 0x87 into both 64-bit elements of v7. */ - "mv t1, %[red]\n\t" - VL1RE64_V(REG_V8, REG_T1) - - "mv t1, %[x]\n\t" - VL1RE64_V(REG_V0, REG_T1) - "mv t0, %[y]\n\t" - VL1RE64_V(REG_V1, REG_T0) - /* Reverse x and y. */ -#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VBREV8(REG_V0, REG_V0) - VBREV8(REG_V1, REG_V1) -#else - VSETIVLI(REG_X0, 16, 0, 0, 0b000, 0b000) - - /* Swap odd/even bits. */ - "li t0, 0x55\n\t" - VMV_V_X(REG_V4, REG_T0) - VSRL_VI(REG_V2, REG_V0, 1) - VSRL_VI(REG_V3, REG_V1, 1) - VAND_VV(REG_V0, REG_V0, REG_V4) - VAND_VV(REG_V1, REG_V1, REG_V4) - VAND_VV(REG_V2, REG_V2, REG_V4) - VAND_VV(REG_V3, REG_V3, REG_V4) - VSLL_VI(REG_V0, REG_V0, 1) - VSLL_VI(REG_V1, REG_V1, 1) - VOR_VV(REG_V0, REG_V0, REG_V2) - VOR_VV(REG_V1, REG_V1, REG_V3) - /* Swap pairs of bits. */ - "li t0, 0x33\n\t" - VMV_V_X(REG_V4, REG_T0) - VSRL_VI(REG_V2, REG_V0, 2) - VSRL_VI(REG_V3, REG_V1, 2) - VAND_VV(REG_V0, REG_V0, REG_V4) - VAND_VV(REG_V1, REG_V1, REG_V4) - VAND_VV(REG_V2, REG_V2, REG_V4) - VAND_VV(REG_V3, REG_V3, REG_V4) - VSLL_VI(REG_V0, REG_V0, 2) - VSLL_VI(REG_V1, REG_V1, 2) - VOR_VV(REG_V0, REG_V0, REG_V2) - VOR_VV(REG_V1, REG_V1, REG_V3) - /* Swap nibbles. */ - "li t0, 0x0f\n\t" - VMV_V_X(REG_V4, REG_T0) - VSRL_VI(REG_V2, REG_V0, 4) - VSRL_VI(REG_V3, REG_V1, 4) - VAND_VV(REG_V0, REG_V0, REG_V4) - VAND_VV(REG_V1, REG_V1, REG_V4) - VAND_VV(REG_V2, REG_V2, REG_V4) - VAND_VV(REG_V3, REG_V3, REG_V4) - VSLL_VI(REG_V0, REG_V0, 4) - VSLL_VI(REG_V1, REG_V1, 4) - VOR_VV(REG_V0, REG_V0, REG_V2) - VOR_VV(REG_V1, REG_V1, REG_V3) - - VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) -#endif - - /* v2 = (x[1] * y[1])[0] | (x[0] * y[0])[0] */ - VCLMUL_VV(REG_V2, REG_V0, REG_V1) - /* v3 = (x[1] * y[1])[1] | (x[0] * y[0])[1] */ - VCLMULH_VV(REG_V3, REG_V0, REG_V1) - /* V2 = R[2] | R[0], V3 = R[3] | R[1] */ - - /* SWAP 64-bit values from V1 into V6. V6 = V1[0] | V1[1] */ - VSLIDEDOWN_VI(REG_V6, REG_V1, 1) - VSLIDEUP_VI(REG_V6, REG_V1, 1) - /* (x[1] * y[0])[0] | (x[0] * y[1])[0] */ - VCLMUL_VV(REG_V4, REG_V0, REG_V6) - /* (x[1] * y[0])[1] | (x[0] * y[1])[1] */ - VCLMULH_VV(REG_V5, REG_V0, REG_V6) - /* V4 = R[1] | R[1], V5 = R[2] | R[2] */ - - VMV_V_V(REG_V1, REG_V3) - VSLIDEDOWN_VI(REG_V0, REG_V2, 1) - VSLIDEUP_VI(REG_V1, REG_V0, 1) - /* V2 = ---- | R[0], V3 = R[3] | ----, V1 = R[2] | R[1] */ - - VMV_V_V(REG_V6, REG_V4) - /* V7 = ---- | ----, V6 = ---- | R[1] */ - VSLIDEDOWN_VI(REG_V7, REG_V4, 1) - /* V7 = ---- | R[1], V6 = ---- | R[1] */ - VSLIDEUP_VI(REG_V6, REG_V5, 1) - /* V7 = ---- | R[1], V6 = R[2] | R[1] */ - VSLIDEDOWN_VI(REG_V0, REG_V5, 1) - VSLIDEUP_VI(REG_V7, REG_V0, 1) - /* V7 = R[2] | R[1], V6 = R[2] | R[1] */ - VXOR_VV(REG_V1, REG_V1, REG_V6) - VXOR_VV(REG_V1, REG_V1, REG_V7) - /* V2 = ---- | R[0], V3 = R[3] | ----, V1 = R[2] | R[1] */ - VSLIDEUP_VI(REG_V2, REG_V1, 1) - VSLIDEDOWN_VI(REG_V5, REG_V3, 1) - VSLIDEDOWN_VI(REG_V3, REG_V1, 1) - VSLIDEUP_VI(REG_V3, REG_V5, 1) - /* V2 = R[1] | R[0], V3 = R[3] | R[2] */ - - /* Reduce */ - /* v0 = (R[3] * 0x87)[0] | (R[2] * 0x87)[0] */ - VCLMUL_VV(REG_V0, REG_V3, REG_V8) - /* v1 = (R[3] * 0x87)[1] | (R[2] * 0x87)[1] */ - VCLMULH_VV(REG_V1, REG_V3, REG_V8) - /* V0 = r[1] | r[0], V1 = r[2] | r[1] */ - VXOR_VV(REG_V4, REG_V4, REG_V4) - VXOR_VV(REG_V2, REG_V2, REG_V0) - VSLIDEUP_VI(REG_V4, REG_V1, 1) - VXOR_VV(REG_V2, REG_V2, REG_V4) - VSLIDEDOWN_VI(REG_V3, REG_V1, 1) - /* v0 = ---- | (r[2] * 0x87)[0] */ - VCLMUL_VV(REG_V0, REG_V3, REG_V8) - /* v1 = ---- | (r[2] * 0x87)[1] */ - VCLMULH_VV(REG_V1, REG_V3, REG_V8) - /* V0 = ---- | r[0] , V1 = ---- | r[1] */ - VSLIDEUP_VI(REG_V0, REG_V1, 1) - /* V1 = R[1] | R[0] */ - VXOR_VV(REG_V2, REG_V2, REG_V0) - - /* Reverse x. */ -#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VBREV8(REG_V2, REG_V2) -#else - VSETIVLI(REG_X0, 16, 0, 0, 0b000, 0b000) - - /* Swap odd/even bits. */ - "li t0, 0x55\n\t" - VMV_V_X(REG_V4, REG_T0) - VSRL_VI(REG_V0, REG_V2, 1) - VAND_VV(REG_V2, REG_V2, REG_V4) - VAND_VV(REG_V0, REG_V0, REG_V4) - VSLL_VI(REG_V2, REG_V2, 1) - VOR_VV(REG_V2, REG_V2, REG_V0) - /* Swap pairs of bits. */ - "li t0, 0x33\n\t" - VMV_V_X(REG_V4, REG_T0) - VSRL_VI(REG_V0, REG_V2, 2) - VAND_VV(REG_V2, REG_V2, REG_V4) - VAND_VV(REG_V0, REG_V0, REG_V4) - VSLL_VI(REG_V2, REG_V2, 2) - VOR_VV(REG_V2, REG_V2, REG_V0) - /* Swap nibbles. */ - "li t0, 0x0f\n\t" - VMV_V_X(REG_V4, REG_T0) - VSRL_VI(REG_V0, REG_V2, 4) - VAND_VV(REG_V2, REG_V2, REG_V4) - VAND_VV(REG_V0, REG_V0, REG_V4) - VSLL_VI(REG_V2, REG_V2, 4) - VOR_VV(REG_V2, REG_V2, REG_V0) - - VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) -#endif - VS1R_V(REG_V2, REG_T1) - : - : [x] "r" (x), [y] "r" (y), [red] "r" (red) - : "memory", "t0", "t1", "t2" - ); -} - -/* GHASH Additional Authentication Data (AAD) and cipher text. - * - * @param [in] gcm GCM object. - * @param [in] a Additional Authentication Data (AAD). - * @param [in] aSz Size of AAD in bytes. - * @param [in] c Cipher text. - * @param [in] cSz Size of cipher text in bytes. - * @param [out] s Hash result. - * @param [in] sSz Number of bytes to put into hash result. - */ -void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, - byte* s, word32 sSz) -{ - ALIGN8 byte x[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - word32 blocks, partial; - byte* h; - - if (gcm == NULL) { - return; - } - - h = gcm->H; - XMEMSET(x, 0, WC_AES_BLOCK_SIZE); - - /* Hash in A, the Additional Authentication Data */ - if (aSz != 0 && a != NULL) { - blocks = aSz / WC_AES_BLOCK_SIZE; - partial = aSz % WC_AES_BLOCK_SIZE; - while (blocks--) { - xorbuf16(x, a); - GMULT(x, h); - a += WC_AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); - XMEMCPY(scratch, a, partial); - xorbuf16(x, scratch); - GMULT(x, h); - } - } - - /* Hash in C, the Ciphertext */ - if (cSz != 0 && c != NULL) { - blocks = cSz / WC_AES_BLOCK_SIZE; - partial = cSz % WC_AES_BLOCK_SIZE; - while (blocks--) { - xorbuf16(x, c); - GMULT(x, h); - c += WC_AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); - XMEMCPY(scratch, c, partial); - xorbuf16(x, scratch); - GMULT(x, h); - } - } - - /* Hash in the lengths of A and C in bits */ - FlattenSzInBits(&scratch[0], aSz); - FlattenSzInBits(&scratch[8], cSz); - xorbuf16(x, scratch); - GMULT(x, h); - - /* Copy the result into s. */ - XMEMCPY(s, x, sSz); -} - -#define HAVE_GHASH - -#elif defined(WOLFSSL_RISCV_CARRYLESS) - -/* Bottom half of carryless-multiplication: rd = (rs1 * rs2)[0..63]. */ -#define CLMUL(rd, rs1, rs2) \ - ASM_WORD(0b00001010000000000001000000110011 | \ - (rd << 7) | (rs1 << 15) | (rs2 << 20)) -/* Top half of carryless-multiplication: rd = (rs1 * rs2)[64..127]. */ -#define CLMULH(rd, rs1, rs2) \ - ASM_WORD(0b00001010000000000011000000110011 | \ - (rd << 7) | (rs1 << 15) | (rs2 << 20)) - -/* GMULT, multiply in GF2, x and y into x. - * - * @param [in, out] x On in, value to GMULT. - * On out, result of GMULT. - * @param [in] y Value to GMULT. - */ -static void GMULT(byte* x, byte* y) -{ - __asm__ __volatile__ ( - "ld t0, 0(%[x])\n\t" - "ld t1, 8(%[x])\n\t" - "ld t2, 0(%[y])\n\t" - "ld t3, 8(%[y])\n\t" - /* Load reduction value into t6 */ - "li t6, 0x87\n\t" - /* Reverse x. y was reversed in wc_AesGcmSetKey. */ -#ifdef WOLFSSL_RISCV_BIT_MANIPULATION - BREV8(REG_T0, REG_T0) - BREV8(REG_T1, REG_T1) -#else - /* Swap odd-even bits. */ - "li a4, 0x5555555555555555\n\t" - "srli a2, t0, 1\n\t" - "srli a3, t1, 1\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 1\n\t" - "slli t1, t1, 1\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap pairs. */ - "li a4, 0x3333333333333333\n\t" - "srli a2, t0, 2\n\t" - "srli a3, t1, 2\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 2\n\t" - "slli t1, t1, 2\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap nibbles. */ - "li a4, 0x0f0f0f0f0f0f0f0f\n\t" - "srli a2, t0, 4\n\t" - "srli a3, t1, 4\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 4\n\t" - "slli t1, t1, 4\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" -#endif - - /* r[0..1] = x[0] * y[0] */ - CLMUL(REG_A2, REG_T0, REG_T2) - CLMULH(REG_A3, REG_T0, REG_T2) - /* r[2..3] = x[1] * y[1] */ - CLMUL(REG_A4, REG_T1, REG_T3) - CLMULH(REG_A5, REG_T1, REG_T3) - /* r[1..2] ^= x[1] * y[0] */ - CLMUL(REG_T4, REG_T1, REG_T2) - CLMULH(REG_T5, REG_T1, REG_T2) - "xor a3, a3, t4\n\t" - "xor a4, a4, t5\n\t" - /* r[1..2] ^= x[0] * y[1] */ - CLMUL(REG_T4, REG_T0, REG_T3) - CLMULH(REG_T5, REG_T0, REG_T3) - "xor a3, a3, t4\n\t" - "xor a4, a4, t5\n\t" - - /* Reduce */ - CLMUL(REG_T4, REG_A5, REG_T6) - CLMULH(REG_T5, REG_A5, REG_T6) - "xor a3, a3, t4\n\t" - "xor a4, a4, t5\n\t" - CLMUL(REG_T4, REG_A4, REG_T6) - CLMULH(REG_T5, REG_A4, REG_T6) - "xor t0, a2, t4\n\t" - "xor t1, a3, t5\n\t" - - /* Reverse x. */ -#ifdef WOLFSSL_RISCV_BIT_MANIPULATION - BREV8(REG_T0, REG_T0) - BREV8(REG_T1, REG_T1) -#else - /* Swap odd-even bits. */ - "li a4, 0x5555555555555555\n\t" - "srli a2, t0, 1\n\t" - "srli a3, t1, 1\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 1\n\t" - "slli t1, t1, 1\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap pairs. */ - "li a4, 0x3333333333333333\n\t" - "srli a2, t0, 2\n\t" - "srli a3, t1, 2\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 2\n\t" - "slli t1, t1, 2\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap nibbles. */ - "li a4, 0x0f0f0f0f0f0f0f0f\n\t" - "srli a2, t0, 4\n\t" - "srli a3, t1, 4\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 4\n\t" - "slli t1, t1, 4\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" -#endif - "sd t0, 0(%[x])\n\t" - "sd t1, 8(%[x])\n\t" - : - : [x] "r" (x), [y] "r" (y) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "a2", "a3", "a4", "a5" - ); -} - -/* GHASH blocks of data. - * - * @param [in, out] x On in, value to GMULT. - * On out, result of GMULT. - * @param [in] y Value to GMULT. - * @param [in] in Blocks of data to GHASH. - * @param [in] blocks Number of blocks to GHASH. - */ -static void ghash_blocks(byte* x, byte* y, const byte* in, word32 blocks) -{ - __asm__ __volatile__ ( - "ld t0, 0(%[x])\n\t" - "ld t1, 8(%[x])\n\t" - "ld t2, 0(%[y])\n\t" - "ld t3, 8(%[y])\n\t" - /* Load reduction value into t6 */ - "li t6, 0x87\n\t" - /* Reverse x. y was reversed in wc_AesGcmSetKey. */ -#ifdef WOLFSSL_RISCV_BIT_MANIPULATION - BREV8(REG_T0, REG_T0) - BREV8(REG_T1, REG_T1) -#else - /* Swap odd-even bits. */ - "li a4, 0x5555555555555555\n\t" - "srli a2, t0, 1\n\t" - "srli a3, t1, 1\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 1\n\t" - "slli t1, t1, 1\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap pairs. */ - "li a4, 0x3333333333333333\n\t" - "srli a2, t0, 2\n\t" - "srli a3, t1, 2\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 2\n\t" - "slli t1, t1, 2\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap nibbles. */ - "li a4, 0x0f0f0f0f0f0f0f0f\n\t" - "srli a2, t0, 4\n\t" - "srli a3, t1, 4\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 4\n\t" - "slli t1, t1, 4\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" -#endif - - "L_ghash_loop:\n\t" - /* Load input block. */ - UNALIGNED_LD2(t5, a5, 0, %[in], t4) - /* Reverse bits to match x. */ -#ifdef WOLFSSL_RISCV_BIT_MANIPULATION - BREV8(REG_T5, REG_T5) - BREV8(REG_A5, REG_A5) -#else - /* Swap odd-even bits. */ - "li a4, 0x5555555555555555\n\t" - "srli a2, t5, 1\n\t" - "srli a3, a5, 1\n\t" - "and t5, t5, a4\n\t" - "and a5, a5, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t5, t5, 1\n\t" - "slli a5, a5, 1\n\t" - "or t5, t5, a2\n\t" - "or a5, a5, a3\n\t" - /* Swap pairs. */ - "li a4, 0x3333333333333333\n\t" - "srli a2, t5, 2\n\t" - "srli a3, a5, 2\n\t" - "and t5, t5, a4\n\t" - "and a5, a5, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t5, t5, 2\n\t" - "slli a5, a5, 2\n\t" - "or t5, t5, a2\n\t" - "or a5, a5, a3\n\t" - /* Swap nibbles. */ - "li a4, 0x0f0f0f0f0f0f0f0f\n\t" - "srli a2, t5, 4\n\t" - "srli a3, a5, 4\n\t" - "and t5, t5, a4\n\t" - "and a5, a5, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t5, t5, 4\n\t" - "slli a5, a5, 4\n\t" - "or t5, t5, a2\n\t" - "or a5, a5, a3\n\t" -#endif - /* XOR input into x. */ - "xor t0, t0, t5\n\t" - "xor t1, t1, a5\n\t" - - /* r[0..1] = x[0] * y[0] */ - CLMUL(REG_A2, REG_T0, REG_T2) - CLMULH(REG_A3, REG_T0, REG_T2) - /* r[2..3] = x[1] * y[1] */ - CLMUL(REG_A4, REG_T1, REG_T3) - CLMULH(REG_A5, REG_T1, REG_T3) - /* r[1..2] ^= x[1] * y[0] */ - CLMUL(REG_T4, REG_T1, REG_T2) - CLMULH(REG_T5, REG_T1, REG_T2) - "xor a3, a3, t4\n\t" - "xor a4, a4, t5\n\t" - /* r[1..2] ^= x[0] * y[1] */ - CLMUL(REG_T4, REG_T0, REG_T3) - CLMULH(REG_T5, REG_T0, REG_T3) - "xor a3, a3, t4\n\t" - "xor a4, a4, t5\n\t" - - /* Reduce */ - CLMUL(REG_T4, REG_A5, REG_T6) - CLMULH(REG_T5, REG_A5, REG_T6) - "xor a3, a3, t4\n\t" - "xor a4, a4, t5\n\t" - CLMUL(REG_T4, REG_A4, REG_T6) - CLMULH(REG_T5, REG_A4, REG_T6) - "xor t0, a2, t4\n\t" - "xor t1, a3, t5\n\t" - - "addi %[in], %[in], 16\n\t" - "addi %[blocks], %[blocks], -1\n\t" - "bnez %[blocks], L_ghash_loop\n\t" - - /* Reverse x. */ -#ifdef WOLFSSL_RISCV_BIT_MANIPULATION - BREV8(REG_T0, REG_T0) - BREV8(REG_T1, REG_T1) -#else - /* Swap odd-even bits. */ - "li a4, 0x5555555555555555\n\t" - "srli a2, t0, 1\n\t" - "srli a3, t1, 1\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 1\n\t" - "slli t1, t1, 1\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap pairs. */ - "li a4, 0x3333333333333333\n\t" - "srli a2, t0, 2\n\t" - "srli a3, t1, 2\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 2\n\t" - "slli t1, t1, 2\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" - /* Swap nibbles. */ - "li a4, 0x0f0f0f0f0f0f0f0f\n\t" - "srli a2, t0, 4\n\t" - "srli a3, t1, 4\n\t" - "and t0, t0, a4\n\t" - "and t1, t1, a4\n\t" - "and a2, a2, a4\n\t" - "and a3, a3, a4\n\t" - "slli t0, t0, 4\n\t" - "slli t1, t1, 4\n\t" - "or t0, t0, a2\n\t" - "or t1, t1, a3\n\t" -#endif - "sd t0, 0(%[x])\n\t" - "sd t1, 8(%[x])\n\t" - : [in] "+r" (in), [blocks] "+r" (blocks) - : [x] "r" (x), [y] "r" (y) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "a2", "a3", "a4", "a5" - ); -} - -/* GHASH Additional Authentication Data (AAD) and cipher text. - * - * @param [in] gcm GCM object. - * @param [in] a Additional Authentication Data (AAD). - * @param [in] aSz Size of AAD in bytes. - * @param [in] c Cipher text. - * @param [in] cSz Size of cipher text in bytes. - * @param [out] s Hash result. - * @param [in] sSz Number of bytes to put into hash result. - */ -void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, - byte* s, word32 sSz) -{ - ALIGN8 byte x[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - word32 blocks, partial; - byte* h = gcm->H; - - XMEMSET(x, 0, WC_AES_BLOCK_SIZE); - - /* Hash in A, the Additional Authentication Data */ - if (aSz != 0 && a != NULL) { - blocks = aSz / WC_AES_BLOCK_SIZE; - partial = aSz % WC_AES_BLOCK_SIZE; - if (blocks > 0) { - ghash_blocks(x, h, a, blocks); - a += blocks * WC_AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); - XMEMCPY(scratch, a, partial); - xorbuf16(x, scratch); - GMULT(x, h); - } - } - - /* Hash in C, the Ciphertext */ - if (cSz != 0 && c != NULL) { - blocks = cSz / WC_AES_BLOCK_SIZE; - partial = cSz % WC_AES_BLOCK_SIZE; - if (blocks > 0) { - ghash_blocks(x, h, c, blocks); - c += blocks * WC_AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); - XMEMCPY(scratch, c, partial); - xorbuf16(x, scratch); - GMULT(x, h); - } - } - - /* Hash in the lengths of A and C in bits */ - FlattenSzInBits(&scratch[0], aSz); - FlattenSzInBits(&scratch[8], cSz); - xorbuf16(x, scratch); - GMULT(x, h); - - /* Copy the result into s. */ - XMEMCPY(s, x, sSz); -} - -#define HAVE_GHASH - -#endif /* !WOLFSSL_RISCV_VECTOR_GCM */ - -#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM -#ifdef WOLFSSL_RISCV_VECTOR_GCM -/* START script replace AES-GCM RISC-V 64 with hardware vector crypto */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION -static const word32 rev_idx[4] = { - 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f -}; -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - -#ifdef WOLFSSL_AES_128 -/* Encrypt data using AES-128-GCM. - * - * @param [in] aes AES object. - * @param [out] out Encrypted data. - * @param [in] in Data to encrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - */ -static void Aes128GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - * Some cases was stack pointer plus offset others was a register containing - * address. To make uniform for passing in to inline assembly code am using - * pointers to the head of each local array. - */ - byte* ctr = counter; - byte* key = (byte*)aes->key; - - XMEMSET(counter, 0, WC_AES_BLOCK_SIZE); - if (nonceSz == GCM_NONCE_MID_SZ) { - XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { -#ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; -#endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); -#ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; -#endif - } - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* X=0, get H */ - VXOR_VV(REG_V18, REG_V18, REG_V18) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V19, REG_T0) - - /* Hash in AAD, the Additional Authentication Data */ - "beqz %[aSz], L_aes_gcm_128_encrypt_ghash_aad_done\n\t" - "beqz %[aad], L_aes_gcm_128_encrypt_ghash_aad_done\n\t" - - "srli t1, %[aSz], 4\n\t" - "beqz t1, L_aes_gcm_128_encrypt_ghash_aad_blocks_done\n\t" - - "L_aes_gcm_128_encrypt_ghash_aad_loop:\n\t" - "mv t0, %[aad]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "addi %[aad], %[aad], 16\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_encrypt_ghash_aad_loop\n\t" - "L_aes_gcm_128_encrypt_ghash_aad_blocks_done:\n\t" - "andi t1, %[aSz], 0xf\n\t" - "beqz t1, L_aes_gcm_128_encrypt_ghash_aad_done\n\t" - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t2, t1\n\t" - "L_aes_gcm_128_encrypt_ghash_aad_load_byte:\n\t" - "lb t0, (%[aad])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[aad], %[aad], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_128_encrypt_ghash_aad_load_byte\n\t" - "sub %[scratch], %[scratch], t1\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "L_aes_gcm_128_encrypt_ghash_aad_done:\n\t" - /* Done Hash in AAD */ - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - "mv t0, %[rev_idx]\n\t" - VL1RE32_V(REG_V15, REG_T0) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - /* Load the counter. */ - "mv t0, %[ctr]\n\t" - VL1RE32_V(REG_V16, REG_T0) -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VSLIDEDOWN_VI(REG_V20, REG_V16, 3) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V21, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V20, REG_V21) -#else - VREV8(REG_V20, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "lw t3, 12(%[ctr])\n\t" - "slli t3, t3, 32\n\t" - REV8(REG_T3, REG_T3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..9]. */ - "addi t0, t0, 128\n\t" - VL2RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V10, REG_T0) - - "beqz %[sz], L_aes_gcm_128_encrypt_blocks_done\n\t" - "srli t4, %[sz], 6\n\t" - "beqz t4, L_aes_gcm_128_encrypt_x4_blocks_done\n\t" - - /* Calculate H^[1-4] - GMULT partials */ - VMV_V_V(REG_V21, REG_V19) - VMV_V_V(REG_V22, REG_V19) - /* Multiply H * H => H^2 */ - VGMUL_VV(REG_V21, REG_V19) - VMV_V_V(REG_V23, REG_V21) - /* Multiply H * H => H^3 */ - VGMUL_VV(REG_V22, REG_V21) - /* Multiply H^2 * H^2 => H^4 */ - VGMUL_VV(REG_V23, REG_V21) - - "L_aes_gcm_128_encrypt_x4_block_loop:\n\t" - /* Calculate next 4 counters (+1-4) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VMV_V_V(REG_V24, REG_V16) - VMV_V_V(REG_V25, REG_V16) - VMV_V_V(REG_V26, REG_V16) - VMV_V_V(REG_V27, REG_V16) - VADD_VI(REG_V28, REG_V20, 1) - VADD_VI(REG_V29, REG_V20, 2) - VADD_VI(REG_V30, REG_V20, 3) - VADD_VI(REG_V20, REG_V20, 4) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V28) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V28, REG_V17) -#else - VREV8(REG_V28, REG_V28) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V29) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V29, REG_V17) -#else - VREV8(REG_V29, REG_V29) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V30) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V30, REG_V17) -#else - VREV8(REG_V30, REG_V30) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V31, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V31, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "addi t0, t3, 1\n\t" - VMV_V_V(REG_V24, REG_V16) - "addi t1, t3, 2\n\t" - VMV_V_V(REG_V25, REG_V16) - "addi t2, t3, 3\n\t" - VMV_V_V(REG_V26, REG_V16) - "slli t0, t0, 32\n\t" - VMV_V_V(REG_V27, REG_V16) - "slli t1, t1, 32\n\t" - "slli t2, t2, 32\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - REV8(REG_T2, REG_T2) - "addi t3, t3, 4\n\t" - VMV_V_X(REG_V28, REG_T0) - "slli t0, t3, 32\n\t" - VMV_V_X(REG_V29, REG_T1) - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V30, REG_T2) - VMV_V_X(REG_V31, REG_T0) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V24, REG_V28, 3) - VSLIDEUP_VI(REG_V25, REG_V29, 3) - VSLIDEUP_VI(REG_V26, REG_V30, 3) - VSLIDEUP_VI(REG_V27, REG_V31, 3) - - VAESZ_VS(REG_V24, REG_V0) - VAESZ_VS(REG_V25, REG_V0) - VAESZ_VS(REG_V26, REG_V0) - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V24, REG_V1) - VAESEM_VS(REG_V24, REG_V2) - VAESEM_VS(REG_V24, REG_V3) - VAESEM_VS(REG_V24, REG_V4) - VAESEM_VS(REG_V24, REG_V5) - VAESEM_VS(REG_V24, REG_V6) - VAESEM_VS(REG_V24, REG_V7) - VAESEM_VS(REG_V24, REG_V8) - VAESEM_VS(REG_V24, REG_V9) - VAESEM_VS(REG_V25, REG_V1) - VAESEM_VS(REG_V25, REG_V2) - VAESEM_VS(REG_V25, REG_V3) - VAESEM_VS(REG_V25, REG_V4) - VAESEM_VS(REG_V25, REG_V5) - VAESEM_VS(REG_V25, REG_V6) - VAESEM_VS(REG_V25, REG_V7) - VAESEM_VS(REG_V25, REG_V8) - VAESEM_VS(REG_V25, REG_V9) - VAESEM_VS(REG_V26, REG_V1) - VAESEM_VS(REG_V26, REG_V2) - VAESEM_VS(REG_V26, REG_V3) - VAESEM_VS(REG_V26, REG_V4) - VAESEM_VS(REG_V26, REG_V5) - VAESEM_VS(REG_V26, REG_V6) - VAESEM_VS(REG_V26, REG_V7) - VAESEM_VS(REG_V26, REG_V8) - VAESEM_VS(REG_V26, REG_V9) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEF_VS(REG_V24, REG_V10) - VAESEF_VS(REG_V25, REG_V10) - VAESEF_VS(REG_V26, REG_V10) - VAESEF_VS(REG_V27, REG_V10) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL4RE32_V(REG_V28, REG_T0) - VXOR_VV(REG_V28, REG_V24, REG_V28) - VXOR_VV(REG_V29, REG_V25, REG_V29) - VXOR_VV(REG_V30, REG_V26, REG_V30) - VXOR_VV(REG_V31, REG_V27, REG_V31) - /* Store output. */ - "mv t0, %[out]\n\t" - VS4R_V(REG_V28, REG_T0) - VGMUL_VV(REG_V28, REG_V23) - VGMUL_VV(REG_V29, REG_V22) - VGMUL_VV(REG_V30, REG_V21) - VGMUL_VV(REG_V31, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V28) - VXOR_VV(REG_V18, REG_V18, REG_V29) - VXOR_VV(REG_V18, REG_V18, REG_V30) - VXOR_VV(REG_V18, REG_V18, REG_V31) - "addi %[in], %[in], 64\n\t" - "addi %[out], %[out], 64\n\t" - /* Loop if more elements to process. */ - "addi t4, t4, -1\n\t" - "bnez t4, L_aes_gcm_128_encrypt_x4_block_loop\n\t" - "andi %[sz], %[sz], 0x3f\n\t" - - "L_aes_gcm_128_encrypt_x4_blocks_done:\n\t" - "srli t2, %[sz], 4\n\t" - "beqz t2, L_aes_gcm_128_encrypt_blocks_done\n\t" - - "L_aes_gcm_128_encrypt_block_loop:\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEF_VS(REG_V27, REG_V10) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - VGHSH_VV(REG_V18, REG_V27, REG_V19) - /* Store output. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V27, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_128_encrypt_block_loop\n\t" - - "L_aes_gcm_128_encrypt_blocks_done:\n\t" - "andi t2, %[sz], 0xf\n\t" - "beqz t2, L_aes_gcm_128_encrypt_done\n\t" - - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_128_encrypt_load_byte:\n\t" - "lb t0, (%[in])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[in], %[in], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_encrypt_load_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - - /* Encrypt counter for partial block. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEF_VS(REG_V27, REG_V10) - - /* Load scratch. */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store scratch. */ - VS1R_V(REG_V27, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_128_encrypt_store_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[out])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[out], %[out], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_encrypt_store_byte\n\t" - "li t1, 16\n\t" - "sub t1, t1, t2\n\t" - "L_aes_gcm_128_encrypt_zero_byte:\n\t" - "sb x0, (%[scratch])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_encrypt_zero_byte\n\t" - "addi %[scratch], %[scratch], -16\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - "L_aes_gcm_128_encrypt_done:\n\t" - - /* Hash in the lengths of A and C in bits */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* aSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[aSz], %[aSz], 3\n\t" - "srli t0, %[aSz], 32\n\t" - "srli t1, %[aSz], 24\n\t" - "srli t2, %[aSz], 16\n\t" - "srli t3, %[aSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[scratch])\n\t" - "sb x0 , 2(%[scratch])\n\t" - "sb t0 , 3(%[scratch])\n\t" - "sb t1 , 4(%[scratch])\n\t" - "sb t2 , 5(%[scratch])\n\t" - "sb t3 , 6(%[scratch])\n\t" - "sb %[aSz], 7(%[scratch])\n\t" - /* sz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[sz], %[sz], 3\n\t" - "srli t0, %[sz], 32\n\t" - "srli t1, %[sz], 24\n\t" - "srli t2, %[sz], 16\n\t" - "srli t3, %[sz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 8(%[scratch])\n\t" - "sb x0 , 10(%[scratch])\n\t" - "sb t0 , 11(%[scratch])\n\t" - "sb t1 , 12(%[scratch])\n\t" - "sb t2 , 13(%[scratch])\n\t" - "sb t3 , 14(%[scratch])\n\t" - "sb %[sz], 15(%[scratch])\n\t" -#else - "slli t0, %[aSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[scratch])\n\t" - "slli t0, %[sz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 8(%[scratch])\n\t" -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - VAESZ_VS(REG_V16, REG_V0) - VAESEM_VS(REG_V16, REG_V1) - VAESEM_VS(REG_V16, REG_V2) - VAESEM_VS(REG_V16, REG_V3) - VAESEM_VS(REG_V16, REG_V4) - VAESEM_VS(REG_V16, REG_V5) - VAESEM_VS(REG_V16, REG_V6) - VAESEM_VS(REG_V16, REG_V7) - VAESEM_VS(REG_V16, REG_V8) - VAESEM_VS(REG_V16, REG_V9) - VAESEF_VS(REG_V16, REG_V10) - VXOR_VV(REG_V18, REG_V18, REG_V16) - - "li t1, 16\n\t" - "blt %[tagSz], t1, L_aes_gcm_128_encrypt_tag_small\n\t" - "mv t0, %[tag]\n\t" - VS1R_V(REG_V18, REG_T0) - "beqz x0, L_aes_gcm_128_encrypt_tag_done\n\t" - "L_aes_gcm_128_encrypt_tag_small:\n\t" - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V18, REG_T0) - "mv t1, %[tagSz]\n\t" - "L_aes_gcm_128_encrypt_store_tag_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[tag])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[tag], %[tag], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_encrypt_store_tag_byte\n\t" - "L_aes_gcm_128_encrypt_tag_done:\n\t" - - : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), - [aSz] "+r" (aadSz), [aad] "+r" (aad), [sz] "+r" (sz) - : [ctr] "r" (ctr), [scratch] "r" (scratch), - [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - , [rev_idx] "r" (rev_idx) -#endif - : "memory", "t0", "t1", "t2", "t3", "t4" - ); - -#ifdef OPENSSL_EXTRA - if ((tag != NULL) && (in != NULL) && (sz != 0)) { - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - } -#endif -} -#endif /* WOLFSSL_AES_128 */ - -#ifdef WOLFSSL_AES_192 -/* Encrypt data using AES-192-GCM. - * - * @param [in] aes AES object. - * @param [out] out Encrypted data. - * @param [in] in Data to encrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - */ -static void Aes192GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - * Some cases was stack pointer plus offset others was a register containing - * address. To make uniform for passing in to inline assembly code am using - * pointers to the head of each local array. - */ - byte* ctr = counter; - byte* key = (byte*)aes->key; - - XMEMSET(counter, 0, WC_AES_BLOCK_SIZE); - if (nonceSz == GCM_NONCE_MID_SZ) { - XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { -#ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; -#endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); -#ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; -#endif - } - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* X=0, get H */ - VXOR_VV(REG_V18, REG_V18, REG_V18) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V19, REG_T0) - - /* Hash in AAD, the Additional Authentication Data */ - "beqz %[aSz], L_aes_gcm_192_encrypt_ghash_aad_done\n\t" - "beqz %[aad], L_aes_gcm_192_encrypt_ghash_aad_done\n\t" - - "srli t1, %[aSz], 4\n\t" - "beqz t1, L_aes_gcm_192_encrypt_ghash_aad_blocks_done\n\t" - - "L_aes_gcm_192_encrypt_ghash_aad_loop:\n\t" - "mv t0, %[aad]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "addi %[aad], %[aad], 16\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_encrypt_ghash_aad_loop\n\t" - "L_aes_gcm_192_encrypt_ghash_aad_blocks_done:\n\t" - "andi t1, %[aSz], 0xf\n\t" - "beqz t1, L_aes_gcm_192_encrypt_ghash_aad_done\n\t" - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t2, t1\n\t" - "L_aes_gcm_192_encrypt_ghash_aad_load_byte:\n\t" - "lb t0, (%[aad])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[aad], %[aad], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_192_encrypt_ghash_aad_load_byte\n\t" - "sub %[scratch], %[scratch], t1\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "L_aes_gcm_192_encrypt_ghash_aad_done:\n\t" - /* Done Hash in AAD */ - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - "mv t0, %[rev_idx]\n\t" - VL1RE32_V(REG_V15, REG_T0) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - /* Load the counter. */ - "mv t0, %[ctr]\n\t" - VL1RE32_V(REG_V16, REG_T0) -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VSLIDEDOWN_VI(REG_V20, REG_V16, 3) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V21, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V20, REG_V21) -#else - VREV8(REG_V20, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "lw t3, 12(%[ctr])\n\t" - "slli t3, t3, 32\n\t" - REV8(REG_T3, REG_T3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V12, REG_T0) - - "beqz %[sz], L_aes_gcm_192_encrypt_blocks_done\n\t" - "srli t4, %[sz], 6\n\t" - "beqz t4, L_aes_gcm_192_encrypt_x4_blocks_done\n\t" - - /* Calculate H^[1-4] - GMULT partials */ - VMV_V_V(REG_V21, REG_V19) - VMV_V_V(REG_V22, REG_V19) - /* Multiply H * H => H^2 */ - VGMUL_VV(REG_V21, REG_V19) - VMV_V_V(REG_V23, REG_V21) - /* Multiply H * H => H^3 */ - VGMUL_VV(REG_V22, REG_V21) - /* Multiply H^2 * H^2 => H^4 */ - VGMUL_VV(REG_V23, REG_V21) - - "L_aes_gcm_192_encrypt_x4_block_loop:\n\t" - /* Calculate next 4 counters (+1-4) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VMV_V_V(REG_V24, REG_V16) - VMV_V_V(REG_V25, REG_V16) - VMV_V_V(REG_V26, REG_V16) - VMV_V_V(REG_V27, REG_V16) - VADD_VI(REG_V28, REG_V20, 1) - VADD_VI(REG_V29, REG_V20, 2) - VADD_VI(REG_V30, REG_V20, 3) - VADD_VI(REG_V20, REG_V20, 4) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V28) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V28, REG_V17) -#else - VREV8(REG_V28, REG_V28) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V29) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V29, REG_V17) -#else - VREV8(REG_V29, REG_V29) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V30) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V30, REG_V17) -#else - VREV8(REG_V30, REG_V30) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V31, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V31, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "addi t0, t3, 1\n\t" - VMV_V_V(REG_V24, REG_V16) - "addi t1, t3, 2\n\t" - VMV_V_V(REG_V25, REG_V16) - "addi t2, t3, 3\n\t" - VMV_V_V(REG_V26, REG_V16) - "slli t0, t0, 32\n\t" - VMV_V_V(REG_V27, REG_V16) - "slli t1, t1, 32\n\t" - "slli t2, t2, 32\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - REV8(REG_T2, REG_T2) - "addi t3, t3, 4\n\t" - VMV_V_X(REG_V28, REG_T0) - "slli t0, t3, 32\n\t" - VMV_V_X(REG_V29, REG_T1) - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V30, REG_T2) - VMV_V_X(REG_V31, REG_T0) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V24, REG_V28, 3) - VSLIDEUP_VI(REG_V25, REG_V29, 3) - VSLIDEUP_VI(REG_V26, REG_V30, 3) - VSLIDEUP_VI(REG_V27, REG_V31, 3) - - VAESZ_VS(REG_V24, REG_V0) - VAESZ_VS(REG_V25, REG_V0) - VAESZ_VS(REG_V26, REG_V0) - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V24, REG_V1) - VAESEM_VS(REG_V24, REG_V2) - VAESEM_VS(REG_V24, REG_V3) - VAESEM_VS(REG_V24, REG_V4) - VAESEM_VS(REG_V24, REG_V5) - VAESEM_VS(REG_V24, REG_V6) - VAESEM_VS(REG_V24, REG_V7) - VAESEM_VS(REG_V24, REG_V8) - VAESEM_VS(REG_V24, REG_V9) - VAESEM_VS(REG_V24, REG_V10) - VAESEM_VS(REG_V24, REG_V11) - VAESEM_VS(REG_V25, REG_V1) - VAESEM_VS(REG_V25, REG_V2) - VAESEM_VS(REG_V25, REG_V3) - VAESEM_VS(REG_V25, REG_V4) - VAESEM_VS(REG_V25, REG_V5) - VAESEM_VS(REG_V25, REG_V6) - VAESEM_VS(REG_V25, REG_V7) - VAESEM_VS(REG_V25, REG_V8) - VAESEM_VS(REG_V25, REG_V9) - VAESEM_VS(REG_V25, REG_V10) - VAESEM_VS(REG_V25, REG_V11) - VAESEM_VS(REG_V26, REG_V1) - VAESEM_VS(REG_V26, REG_V2) - VAESEM_VS(REG_V26, REG_V3) - VAESEM_VS(REG_V26, REG_V4) - VAESEM_VS(REG_V26, REG_V5) - VAESEM_VS(REG_V26, REG_V6) - VAESEM_VS(REG_V26, REG_V7) - VAESEM_VS(REG_V26, REG_V8) - VAESEM_VS(REG_V26, REG_V9) - VAESEM_VS(REG_V26, REG_V10) - VAESEM_VS(REG_V26, REG_V11) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEF_VS(REG_V24, REG_V12) - VAESEF_VS(REG_V25, REG_V12) - VAESEF_VS(REG_V26, REG_V12) - VAESEF_VS(REG_V27, REG_V12) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL4RE32_V(REG_V28, REG_T0) - VXOR_VV(REG_V28, REG_V24, REG_V28) - VXOR_VV(REG_V29, REG_V25, REG_V29) - VXOR_VV(REG_V30, REG_V26, REG_V30) - VXOR_VV(REG_V31, REG_V27, REG_V31) - /* Store output. */ - "mv t0, %[out]\n\t" - VS4R_V(REG_V28, REG_T0) - VGMUL_VV(REG_V28, REG_V23) - VGMUL_VV(REG_V29, REG_V22) - VGMUL_VV(REG_V30, REG_V21) - VGMUL_VV(REG_V31, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V28) - VXOR_VV(REG_V18, REG_V18, REG_V29) - VXOR_VV(REG_V18, REG_V18, REG_V30) - VXOR_VV(REG_V18, REG_V18, REG_V31) - "addi %[in], %[in], 64\n\t" - "addi %[out], %[out], 64\n\t" - /* Loop if more elements to process. */ - "addi t4, t4, -1\n\t" - "bnez t4, L_aes_gcm_192_encrypt_x4_block_loop\n\t" - "andi %[sz], %[sz], 0x3f\n\t" - - "L_aes_gcm_192_encrypt_x4_blocks_done:\n\t" - "srli t2, %[sz], 4\n\t" - "beqz t2, L_aes_gcm_192_encrypt_blocks_done\n\t" - - "L_aes_gcm_192_encrypt_block_loop:\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEF_VS(REG_V27, REG_V12) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - VGHSH_VV(REG_V18, REG_V27, REG_V19) - /* Store output. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V27, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_192_encrypt_block_loop\n\t" - - "L_aes_gcm_192_encrypt_blocks_done:\n\t" - "andi t2, %[sz], 0xf\n\t" - "beqz t2, L_aes_gcm_192_encrypt_done\n\t" - - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_192_encrypt_load_byte:\n\t" - "lb t0, (%[in])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[in], %[in], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_encrypt_load_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - - /* Encrypt counter for partial block. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEF_VS(REG_V27, REG_V12) - - /* Load scratch. */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store scratch. */ - VS1R_V(REG_V27, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_192_encrypt_store_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[out])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[out], %[out], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_encrypt_store_byte\n\t" - "li t1, 16\n\t" - "sub t1, t1, t2\n\t" - "L_aes_gcm_192_encrypt_zero_byte:\n\t" - "sb x0, (%[scratch])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_encrypt_zero_byte\n\t" - "addi %[scratch], %[scratch], -16\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - "L_aes_gcm_192_encrypt_done:\n\t" - - /* Hash in the lengths of A and C in bits */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* aSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[aSz], %[aSz], 3\n\t" - "srli t0, %[aSz], 32\n\t" - "srli t1, %[aSz], 24\n\t" - "srli t2, %[aSz], 16\n\t" - "srli t3, %[aSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[scratch])\n\t" - "sb x0 , 2(%[scratch])\n\t" - "sb t0 , 3(%[scratch])\n\t" - "sb t1 , 4(%[scratch])\n\t" - "sb t2 , 5(%[scratch])\n\t" - "sb t3 , 6(%[scratch])\n\t" - "sb %[aSz], 7(%[scratch])\n\t" - /* sz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[sz], %[sz], 3\n\t" - "srli t0, %[sz], 32\n\t" - "srli t1, %[sz], 24\n\t" - "srli t2, %[sz], 16\n\t" - "srli t3, %[sz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 8(%[scratch])\n\t" - "sb x0 , 10(%[scratch])\n\t" - "sb t0 , 11(%[scratch])\n\t" - "sb t1 , 12(%[scratch])\n\t" - "sb t2 , 13(%[scratch])\n\t" - "sb t3 , 14(%[scratch])\n\t" - "sb %[sz], 15(%[scratch])\n\t" -#else - "slli t0, %[aSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[scratch])\n\t" - "slli t0, %[sz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 8(%[scratch])\n\t" -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - VAESZ_VS(REG_V16, REG_V0) - VAESEM_VS(REG_V16, REG_V1) - VAESEM_VS(REG_V16, REG_V2) - VAESEM_VS(REG_V16, REG_V3) - VAESEM_VS(REG_V16, REG_V4) - VAESEM_VS(REG_V16, REG_V5) - VAESEM_VS(REG_V16, REG_V6) - VAESEM_VS(REG_V16, REG_V7) - VAESEM_VS(REG_V16, REG_V8) - VAESEM_VS(REG_V16, REG_V9) - VAESEM_VS(REG_V16, REG_V10) - VAESEM_VS(REG_V16, REG_V11) - VAESEF_VS(REG_V16, REG_V12) - VXOR_VV(REG_V18, REG_V18, REG_V16) - - "li t1, 16\n\t" - "blt %[tagSz], t1, L_aes_gcm_192_encrypt_tag_small\n\t" - "mv t0, %[tag]\n\t" - VS1R_V(REG_V18, REG_T0) - "beqz x0, L_aes_gcm_192_encrypt_tag_done\n\t" - "L_aes_gcm_192_encrypt_tag_small:\n\t" - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V18, REG_T0) - "mv t1, %[tagSz]\n\t" - "L_aes_gcm_192_encrypt_store_tag_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[tag])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[tag], %[tag], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_encrypt_store_tag_byte\n\t" - "L_aes_gcm_192_encrypt_tag_done:\n\t" - - : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), - [aSz] "+r" (aadSz), [aad] "+r" (aad), [sz] "+r" (sz) - : [ctr] "r" (ctr), [scratch] "r" (scratch), - [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - , [rev_idx] "r" (rev_idx) -#endif - : "memory", "t0", "t1", "t2", "t3", "t4" - ); - -#ifdef OPENSSL_EXTRA - if ((tag != NULL) && (in != NULL) && (sz != 0)) { - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - } -#endif -} -#endif /* WOLFSSL_AES_192 */ - -#ifdef WOLFSSL_AES_256 -/* Encrypt data using AES-256-GCM. - * - * @param [in] aes AES object. - * @param [out] out Encrypted data. - * @param [in] in Data to encrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - */ -static void Aes256GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - * Some cases was stack pointer plus offset others was a register containing - * address. To make uniform for passing in to inline assembly code am using - * pointers to the head of each local array. - */ - byte* ctr = counter; - byte* key = (byte*)aes->key; - - XMEMSET(counter, 0, WC_AES_BLOCK_SIZE); - if (nonceSz == GCM_NONCE_MID_SZ) { - XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { -#ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; -#endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); -#ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; -#endif - } - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* X=0, get H */ - VXOR_VV(REG_V18, REG_V18, REG_V18) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V19, REG_T0) - - /* Hash in AAD, the Additional Authentication Data */ - "beqz %[aSz], L_aes_gcm_256_encrypt_ghash_aad_done\n\t" - "beqz %[aad], L_aes_gcm_256_encrypt_ghash_aad_done\n\t" - - "srli t1, %[aSz], 4\n\t" - "beqz t1, L_aes_gcm_256_encrypt_ghash_aad_blocks_done\n\t" - - "L_aes_gcm_256_encrypt_ghash_aad_loop:\n\t" - "mv t0, %[aad]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "addi %[aad], %[aad], 16\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_encrypt_ghash_aad_loop\n\t" - "L_aes_gcm_256_encrypt_ghash_aad_blocks_done:\n\t" - "andi t1, %[aSz], 0xf\n\t" - "beqz t1, L_aes_gcm_256_encrypt_ghash_aad_done\n\t" - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t2, t1\n\t" - "L_aes_gcm_256_encrypt_ghash_aad_load_byte:\n\t" - "lb t0, (%[aad])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[aad], %[aad], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_256_encrypt_ghash_aad_load_byte\n\t" - "sub %[scratch], %[scratch], t1\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "L_aes_gcm_256_encrypt_ghash_aad_done:\n\t" - /* Done Hash in AAD */ - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - "mv t0, %[rev_idx]\n\t" - VL1RE32_V(REG_V15, REG_T0) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - /* Load the counter. */ - "mv t0, %[ctr]\n\t" - VL1RE32_V(REG_V16, REG_T0) -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VSLIDEDOWN_VI(REG_V20, REG_V16, 3) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V21, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V20, REG_V21) -#else - VREV8(REG_V20, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "lw t3, 12(%[ctr])\n\t" - "slli t3, t3, 32\n\t" - REV8(REG_T3, REG_T3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load key[12..13]. */ - "addi t0, t0, 64\n\t" - VL2RE32_V(REG_V12, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V14, REG_T0) - - "beqz %[sz], L_aes_gcm_256_encrypt_blocks_done\n\t" - "srli t4, %[sz], 6\n\t" - "beqz t4, L_aes_gcm_256_encrypt_x4_blocks_done\n\t" - - /* Calculate H^[1-4] - GMULT partials */ - VMV_V_V(REG_V21, REG_V19) - VMV_V_V(REG_V22, REG_V19) - /* Multiply H * H => H^2 */ - VGMUL_VV(REG_V21, REG_V19) - VMV_V_V(REG_V23, REG_V21) - /* Multiply H * H => H^3 */ - VGMUL_VV(REG_V22, REG_V21) - /* Multiply H^2 * H^2 => H^4 */ - VGMUL_VV(REG_V23, REG_V21) - - "L_aes_gcm_256_encrypt_x4_block_loop:\n\t" - /* Calculate next 4 counters (+1-4) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VMV_V_V(REG_V24, REG_V16) - VMV_V_V(REG_V25, REG_V16) - VMV_V_V(REG_V26, REG_V16) - VMV_V_V(REG_V27, REG_V16) - VADD_VI(REG_V28, REG_V20, 1) - VADD_VI(REG_V29, REG_V20, 2) - VADD_VI(REG_V30, REG_V20, 3) - VADD_VI(REG_V20, REG_V20, 4) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V28) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V28, REG_V17) -#else - VREV8(REG_V28, REG_V28) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V29) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V29, REG_V17) -#else - VREV8(REG_V29, REG_V29) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V30) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V30, REG_V17) -#else - VREV8(REG_V30, REG_V30) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V31, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V31, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "addi t0, t3, 1\n\t" - VMV_V_V(REG_V24, REG_V16) - "addi t1, t3, 2\n\t" - VMV_V_V(REG_V25, REG_V16) - "addi t2, t3, 3\n\t" - VMV_V_V(REG_V26, REG_V16) - "slli t0, t0, 32\n\t" - VMV_V_V(REG_V27, REG_V16) - "slli t1, t1, 32\n\t" - "slli t2, t2, 32\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - REV8(REG_T2, REG_T2) - "addi t3, t3, 4\n\t" - VMV_V_X(REG_V28, REG_T0) - "slli t0, t3, 32\n\t" - VMV_V_X(REG_V29, REG_T1) - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V30, REG_T2) - VMV_V_X(REG_V31, REG_T0) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V24, REG_V28, 3) - VSLIDEUP_VI(REG_V25, REG_V29, 3) - VSLIDEUP_VI(REG_V26, REG_V30, 3) - VSLIDEUP_VI(REG_V27, REG_V31, 3) - - VAESZ_VS(REG_V24, REG_V0) - VAESZ_VS(REG_V25, REG_V0) - VAESZ_VS(REG_V26, REG_V0) - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V24, REG_V1) - VAESEM_VS(REG_V24, REG_V2) - VAESEM_VS(REG_V24, REG_V3) - VAESEM_VS(REG_V24, REG_V4) - VAESEM_VS(REG_V24, REG_V5) - VAESEM_VS(REG_V24, REG_V6) - VAESEM_VS(REG_V24, REG_V7) - VAESEM_VS(REG_V24, REG_V8) - VAESEM_VS(REG_V24, REG_V9) - VAESEM_VS(REG_V24, REG_V10) - VAESEM_VS(REG_V24, REG_V11) - VAESEM_VS(REG_V24, REG_V12) - VAESEM_VS(REG_V24, REG_V13) - VAESEM_VS(REG_V25, REG_V1) - VAESEM_VS(REG_V25, REG_V2) - VAESEM_VS(REG_V25, REG_V3) - VAESEM_VS(REG_V25, REG_V4) - VAESEM_VS(REG_V25, REG_V5) - VAESEM_VS(REG_V25, REG_V6) - VAESEM_VS(REG_V25, REG_V7) - VAESEM_VS(REG_V25, REG_V8) - VAESEM_VS(REG_V25, REG_V9) - VAESEM_VS(REG_V25, REG_V10) - VAESEM_VS(REG_V25, REG_V11) - VAESEM_VS(REG_V25, REG_V12) - VAESEM_VS(REG_V25, REG_V13) - VAESEM_VS(REG_V26, REG_V1) - VAESEM_VS(REG_V26, REG_V2) - VAESEM_VS(REG_V26, REG_V3) - VAESEM_VS(REG_V26, REG_V4) - VAESEM_VS(REG_V26, REG_V5) - VAESEM_VS(REG_V26, REG_V6) - VAESEM_VS(REG_V26, REG_V7) - VAESEM_VS(REG_V26, REG_V8) - VAESEM_VS(REG_V26, REG_V9) - VAESEM_VS(REG_V26, REG_V10) - VAESEM_VS(REG_V26, REG_V11) - VAESEM_VS(REG_V26, REG_V12) - VAESEM_VS(REG_V26, REG_V13) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEM_VS(REG_V27, REG_V12) - VAESEM_VS(REG_V27, REG_V13) - VAESEF_VS(REG_V24, REG_V14) - VAESEF_VS(REG_V25, REG_V14) - VAESEF_VS(REG_V26, REG_V14) - VAESEF_VS(REG_V27, REG_V14) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL4RE32_V(REG_V28, REG_T0) - VXOR_VV(REG_V28, REG_V24, REG_V28) - VXOR_VV(REG_V29, REG_V25, REG_V29) - VXOR_VV(REG_V30, REG_V26, REG_V30) - VXOR_VV(REG_V31, REG_V27, REG_V31) - /* Store output. */ - "mv t0, %[out]\n\t" - VS4R_V(REG_V28, REG_T0) - VGMUL_VV(REG_V28, REG_V23) - VGMUL_VV(REG_V29, REG_V22) - VGMUL_VV(REG_V30, REG_V21) - VGMUL_VV(REG_V31, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V28) - VXOR_VV(REG_V18, REG_V18, REG_V29) - VXOR_VV(REG_V18, REG_V18, REG_V30) - VXOR_VV(REG_V18, REG_V18, REG_V31) - "addi %[in], %[in], 64\n\t" - "addi %[out], %[out], 64\n\t" - /* Loop if more elements to process. */ - "addi t4, t4, -1\n\t" - "bnez t4, L_aes_gcm_256_encrypt_x4_block_loop\n\t" - "andi %[sz], %[sz], 0x3f\n\t" - - "L_aes_gcm_256_encrypt_x4_blocks_done:\n\t" - "srli t2, %[sz], 4\n\t" - "beqz t2, L_aes_gcm_256_encrypt_blocks_done\n\t" - - "L_aes_gcm_256_encrypt_block_loop:\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEM_VS(REG_V27, REG_V12) - VAESEM_VS(REG_V27, REG_V13) - VAESEF_VS(REG_V27, REG_V14) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - VGHSH_VV(REG_V18, REG_V27, REG_V19) - /* Store output. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V27, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_256_encrypt_block_loop\n\t" - - "L_aes_gcm_256_encrypt_blocks_done:\n\t" - "andi t2, %[sz], 0xf\n\t" - "beqz t2, L_aes_gcm_256_encrypt_done\n\t" - - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_256_encrypt_load_byte:\n\t" - "lb t0, (%[in])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[in], %[in], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_encrypt_load_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - - /* Encrypt counter for partial block. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEM_VS(REG_V27, REG_V12) - VAESEM_VS(REG_V27, REG_V13) - VAESEF_VS(REG_V27, REG_V14) - - /* Load scratch. */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store scratch. */ - VS1R_V(REG_V27, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_256_encrypt_store_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[out])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[out], %[out], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_encrypt_store_byte\n\t" - "li t1, 16\n\t" - "sub t1, t1, t2\n\t" - "L_aes_gcm_256_encrypt_zero_byte:\n\t" - "sb x0, (%[scratch])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_encrypt_zero_byte\n\t" - "addi %[scratch], %[scratch], -16\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - "L_aes_gcm_256_encrypt_done:\n\t" - - /* Hash in the lengths of A and C in bits */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* aSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[aSz], %[aSz], 3\n\t" - "srli t0, %[aSz], 32\n\t" - "srli t1, %[aSz], 24\n\t" - "srli t2, %[aSz], 16\n\t" - "srli t3, %[aSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[scratch])\n\t" - "sb x0 , 2(%[scratch])\n\t" - "sb t0 , 3(%[scratch])\n\t" - "sb t1 , 4(%[scratch])\n\t" - "sb t2 , 5(%[scratch])\n\t" - "sb t3 , 6(%[scratch])\n\t" - "sb %[aSz], 7(%[scratch])\n\t" - /* sz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[sz], %[sz], 3\n\t" - "srli t0, %[sz], 32\n\t" - "srli t1, %[sz], 24\n\t" - "srli t2, %[sz], 16\n\t" - "srli t3, %[sz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 8(%[scratch])\n\t" - "sb x0 , 10(%[scratch])\n\t" - "sb t0 , 11(%[scratch])\n\t" - "sb t1 , 12(%[scratch])\n\t" - "sb t2 , 13(%[scratch])\n\t" - "sb t3 , 14(%[scratch])\n\t" - "sb %[sz], 15(%[scratch])\n\t" -#else - "slli t0, %[aSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[scratch])\n\t" - "slli t0, %[sz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 8(%[scratch])\n\t" -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - VAESZ_VS(REG_V16, REG_V0) - VAESEM_VS(REG_V16, REG_V1) - VAESEM_VS(REG_V16, REG_V2) - VAESEM_VS(REG_V16, REG_V3) - VAESEM_VS(REG_V16, REG_V4) - VAESEM_VS(REG_V16, REG_V5) - VAESEM_VS(REG_V16, REG_V6) - VAESEM_VS(REG_V16, REG_V7) - VAESEM_VS(REG_V16, REG_V8) - VAESEM_VS(REG_V16, REG_V9) - VAESEM_VS(REG_V16, REG_V10) - VAESEM_VS(REG_V16, REG_V11) - VAESEM_VS(REG_V16, REG_V12) - VAESEM_VS(REG_V16, REG_V13) - VAESEF_VS(REG_V16, REG_V14) - VXOR_VV(REG_V18, REG_V18, REG_V16) - - "li t1, 16\n\t" - "blt %[tagSz], t1, L_aes_gcm_256_encrypt_tag_small\n\t" - "mv t0, %[tag]\n\t" - VS1R_V(REG_V18, REG_T0) - "beqz x0, L_aes_gcm_256_encrypt_tag_done\n\t" - "L_aes_gcm_256_encrypt_tag_small:\n\t" - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V18, REG_T0) - "mv t1, %[tagSz]\n\t" - "L_aes_gcm_256_encrypt_store_tag_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[tag])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[tag], %[tag], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_encrypt_store_tag_byte\n\t" - "L_aes_gcm_256_encrypt_tag_done:\n\t" - - : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), - [aSz] "+r" (aadSz), [aad] "+r" (aad), [sz] "+r" (sz) - : [ctr] "r" (ctr), [scratch] "r" (scratch), - [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - , [rev_idx] "r" (rev_idx) -#endif - : "memory", "t0", "t1", "t2", "t3", "t4" - ); - -#ifdef OPENSSL_EXTRA - if ((tag != NULL) && (in != NULL) && (sz != 0)) { - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - } -#endif -} -#endif /* WOLFSSL_AES_256 */ - -/* Encrypt data using AES-GCM. - * - * @param [in] aes AES object. - * @param [out] out Encrypted data. - * @param [in] in Data to encrypt. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. - * @return BAD_FUNC_ARG when nonceSz is zero. - * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. - * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or - * greater than WC_AES_BLOCK_SIZE. - * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. - */ -int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, const byte* aad, - word32 aadSz) -{ - int ret = 0; - - /* sanity checks */ - if ((aes == NULL) || (nonce == NULL) || (nonceSz == 0) || (tag == NULL) || - ((aad == NULL) && (aadSz > 0)) || ((sz != 0) && ((in == NULL) || - (out == NULL)))) { - WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); - ret = BAD_FUNC_ARG; - } - - if (ret == 0) - ret = wc_local_AesGcmCheckTagSz(tagSz); - - if (ret == 0) { - switch (aes->rounds) { - #ifdef WOLFSSL_AES_128 - case 10: - Aes128GcmEncrypt(aes, out, in, sz, nonce, nonceSz, tag, tagSz, - aad, aadSz); - break; - #endif - #ifdef WOLFSSL_AES_192 - case 12: - Aes192GcmEncrypt(aes, out, in, sz, nonce, nonceSz, tag, tagSz, - aad, aadSz); - break; - #endif - #ifdef WOLFSSL_AES_256 - case 14: - Aes256GcmEncrypt(aes, out, in, sz, nonce, nonceSz, tag, tagSz, - aad, aadSz); - break; - #endif - default: - WOLFSSL_MSG("AES-GCM invalid round number"); - ret = BAD_FUNC_ARG; - } - } - - return ret; -} - - -#ifdef HAVE_AES_DECRYPT - -#ifdef WOLFSSL_AES_128 -/* Decrypt data using AES-128-GCM. - * - * @param [in] aes AES object. - * @param [out] out Decrypted data. - * @param [in] in Data to decrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - * @return 0 on success. - * @return AES_GCM_AUTH_E when authentication tag computed doesn't match - * tag passed in. - */ -static int Aes128GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - int ret = 0; - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - * Some cases was stack pointer plus offset others was a register containing - * address. To make uniform for passing in to inline assembly code am using - * pointers to the head of each local array. - */ - byte* ctr = counter; - byte* key = (byte*)aes->key; - - XMEMSET(counter, 0, WC_AES_BLOCK_SIZE); - if (nonceSz == GCM_NONCE_MID_SZ) { - XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { -#ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; -#endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); -#ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; -#endif - } - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* X=0, get H */ - VXOR_VV(REG_V18, REG_V18, REG_V18) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V19, REG_T0) - - /* Hash in AAD, the Additional Authentication Data */ - "beqz %[aSz], L_aes_gcm_128_decrypt_ghash_aad_done\n\t" - "beqz %[aad], L_aes_gcm_128_decrypt_ghash_aad_done\n\t" - - "srli t1, %[aSz], 4\n\t" - "beqz t1, L_aes_gcm_128_decrypt_ghash_aad_blocks_done\n\t" - - "L_aes_gcm_128_decrypt_ghash_aad_loop:\n\t" - "mv t0, %[aad]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "addi %[aad], %[aad], 16\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_decrypt_ghash_aad_loop\n\t" - "L_aes_gcm_128_decrypt_ghash_aad_blocks_done:\n\t" - "andi t1, %[aSz], 0xf\n\t" - "beqz t1, L_aes_gcm_128_decrypt_ghash_aad_done\n\t" - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t2, t1\n\t" - "L_aes_gcm_128_decrypt_ghash_aad_load_byte:\n\t" - "lb t0, (%[aad])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[aad], %[aad], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_128_decrypt_ghash_aad_load_byte\n\t" - "sub %[scratch], %[scratch], t1\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "L_aes_gcm_128_decrypt_ghash_aad_done:\n\t" - /* Done Hash in AAD */ - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - "mv t0, %[rev_idx]\n\t" - VL1RE32_V(REG_V15, REG_T0) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - /* Load the counter. */ - "mv t0, %[ctr]\n\t" - VL1RE32_V(REG_V16, REG_T0) -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VSLIDEDOWN_VI(REG_V20, REG_V16, 3) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V21, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V20, REG_V21) -#else - VREV8(REG_V20, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "lw t3, 12(%[ctr])\n\t" - "slli t3, t3, 32\n\t" - REV8(REG_T3, REG_T3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..9]. */ - "addi t0, t0, 128\n\t" - VL2RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V10, REG_T0) - - "beqz %[sz], L_aes_gcm_128_decrypt_blocks_done\n\t" - "srli t4, %[sz], 6\n\t" - "beqz t4, L_aes_gcm_128_decrypt_x4_blocks_done\n\t" - - /* Calculate H^[1-4] - GMULT partials */ - VMV_V_V(REG_V21, REG_V19) - VMV_V_V(REG_V22, REG_V19) - /* Multiply H * H => H^2 */ - VGMUL_VV(REG_V21, REG_V19) - VMV_V_V(REG_V23, REG_V21) - /* Multiply H * H => H^3 */ - VGMUL_VV(REG_V22, REG_V21) - /* Multiply H^2 * H^2 => H^4 */ - VGMUL_VV(REG_V23, REG_V21) - - "L_aes_gcm_128_decrypt_x4_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL4RE32_V(REG_V28, REG_T0) - VMVR_V(REG_V24, REG_V28, 4) - VGMUL_VV(REG_V24, REG_V23) - VGMUL_VV(REG_V25, REG_V22) - VGMUL_VV(REG_V26, REG_V21) - VGMUL_VV(REG_V27, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V24) - VXOR_VV(REG_V18, REG_V18, REG_V25) - VXOR_VV(REG_V18, REG_V18, REG_V26) - VXOR_VV(REG_V18, REG_V18, REG_V27) - /* Calculate next 4 counters (+1-4) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V24, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V24, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V25, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V25, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V26, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V26, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V27, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t0, t3, 1\n\t" - VMV_V_V(REG_V24, REG_V16) - "addi t1, t3, 2\n\t" - VMV_V_V(REG_V25, REG_V16) - "slli t0, t0, 32\n\t" - VMV_V_V(REG_V26, REG_V16) - "slli t1, t1, 32\n\t" - VMV_V_V(REG_V27, REG_V16) - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - VMV_V_X(REG_V20, REG_T0) - "addi t0, t3, 3\n\t" - VSLIDEUP_VI(REG_V24, REG_V20, 3) - "addi t3, t3, 4\n\t" - VMV_V_X(REG_V20, REG_T1) - "slli t0, t0, 32\n\t" - VSLIDEUP_VI(REG_V25, REG_V20, 3) - "slli t1, t3, 32\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - VMV_V_X(REG_V20, REG_T0) - VSLIDEUP_VI(REG_V26, REG_V20, 3) - VMV_V_X(REG_V20, REG_T1) - VSLIDEUP_VI(REG_V27, REG_V20, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V24, REG_V0) - VAESZ_VS(REG_V25, REG_V0) - VAESZ_VS(REG_V26, REG_V0) - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V24, REG_V1) - VAESEM_VS(REG_V24, REG_V2) - VAESEM_VS(REG_V24, REG_V3) - VAESEM_VS(REG_V24, REG_V4) - VAESEM_VS(REG_V24, REG_V5) - VAESEM_VS(REG_V24, REG_V6) - VAESEM_VS(REG_V24, REG_V7) - VAESEM_VS(REG_V24, REG_V8) - VAESEM_VS(REG_V24, REG_V9) - VAESEM_VS(REG_V25, REG_V1) - VAESEM_VS(REG_V25, REG_V2) - VAESEM_VS(REG_V25, REG_V3) - VAESEM_VS(REG_V25, REG_V4) - VAESEM_VS(REG_V25, REG_V5) - VAESEM_VS(REG_V25, REG_V6) - VAESEM_VS(REG_V25, REG_V7) - VAESEM_VS(REG_V25, REG_V8) - VAESEM_VS(REG_V25, REG_V9) - VAESEM_VS(REG_V26, REG_V1) - VAESEM_VS(REG_V26, REG_V2) - VAESEM_VS(REG_V26, REG_V3) - VAESEM_VS(REG_V26, REG_V4) - VAESEM_VS(REG_V26, REG_V5) - VAESEM_VS(REG_V26, REG_V6) - VAESEM_VS(REG_V26, REG_V7) - VAESEM_VS(REG_V26, REG_V8) - VAESEM_VS(REG_V26, REG_V9) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEF_VS(REG_V24, REG_V10) - VAESEF_VS(REG_V25, REG_V10) - VAESEF_VS(REG_V26, REG_V10) - VAESEF_VS(REG_V27, REG_V10) - VXOR_VV(REG_V28, REG_V24, REG_V28) - VXOR_VV(REG_V29, REG_V25, REG_V29) - VXOR_VV(REG_V30, REG_V26, REG_V30) - VXOR_VV(REG_V31, REG_V27, REG_V31) - /* Store output. */ - "mv t0, %[out]\n\t" - VS4R_V(REG_V28, REG_T0) - "addi %[in], %[in], 64\n\t" - "addi %[out], %[out], 64\n\t" - /* Loop if more elements to process. */ - "addi t4, t4, -1\n\t" - "bnez t4, L_aes_gcm_128_decrypt_x4_block_loop\n\t" - "andi %[sz], %[sz], 0x3f\n\t" - - "L_aes_gcm_128_decrypt_x4_blocks_done:\n\t" - "srli t2, %[sz], 4\n\t" - "beqz t2, L_aes_gcm_128_decrypt_blocks_done\n\t" - - "L_aes_gcm_128_decrypt_block_loop:\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEF_VS(REG_V27, REG_V10) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store output. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V27, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_128_decrypt_block_loop\n\t" - - "L_aes_gcm_128_decrypt_blocks_done:\n\t" - "andi t2, %[sz], 0xf\n\t" - "beqz t2, L_aes_gcm_128_decrypt_done\n\t" - - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_128_decrypt_load_byte:\n\t" - "lb t0, (%[in])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[in], %[in], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_decrypt_load_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - /* Encrypt counter for partial block. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEF_VS(REG_V27, REG_V10) - - /* Load scratch. */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store scratch. */ - VS1R_V(REG_V27, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_128_decrypt_store_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[out])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[out], %[out], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_decrypt_store_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - - "L_aes_gcm_128_decrypt_done:\n\t" - - /* Hash in the lengths of A and C in bits */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* aSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[aSz], %[aSz], 3\n\t" - "srli t0, %[aSz], 32\n\t" - "srli t1, %[aSz], 24\n\t" - "srli t2, %[aSz], 16\n\t" - "srli t3, %[aSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[scratch])\n\t" - "sb x0 , 2(%[scratch])\n\t" - "sb t0 , 3(%[scratch])\n\t" - "sb t1 , 4(%[scratch])\n\t" - "sb t2 , 5(%[scratch])\n\t" - "sb t3 , 6(%[scratch])\n\t" - "sb %[aSz], 7(%[scratch])\n\t" - /* sz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[sz], %[sz], 3\n\t" - "srli t0, %[sz], 32\n\t" - "srli t1, %[sz], 24\n\t" - "srli t2, %[sz], 16\n\t" - "srli t3, %[sz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 8(%[scratch])\n\t" - "sb x0 , 10(%[scratch])\n\t" - "sb t0 , 11(%[scratch])\n\t" - "sb t1 , 12(%[scratch])\n\t" - "sb t2 , 13(%[scratch])\n\t" - "sb t3 , 14(%[scratch])\n\t" - "sb %[sz], 15(%[scratch])\n\t" -#else - "slli t0, %[aSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[scratch])\n\t" - "slli t0, %[sz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 8(%[scratch])\n\t" -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - VAESZ_VS(REG_V16, REG_V0) - VAESEM_VS(REG_V16, REG_V1) - VAESEM_VS(REG_V16, REG_V2) - VAESEM_VS(REG_V16, REG_V3) - VAESEM_VS(REG_V16, REG_V4) - VAESEM_VS(REG_V16, REG_V5) - VAESEM_VS(REG_V16, REG_V6) - VAESEM_VS(REG_V16, REG_V7) - VAESEM_VS(REG_V16, REG_V8) - VAESEM_VS(REG_V16, REG_V9) - VAESEF_VS(REG_V16, REG_V10) - VXOR_VV(REG_V18, REG_V18, REG_V16) - - "li t1, 16\n\t" - "blt %[tagSz], t1, L_aes_gcm_128_decrypt_tag_small\n\t" - "mv t0, %[tag]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V19, REG_V19, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V17) - VMSNE_VV(REG_V19, REG_V19, REG_V18) - VCPOP_M(REG_T0, REG_V19) - "beqz x0, L_aes_gcm_128_decrypt_tag_done\n\t" - "L_aes_gcm_128_decrypt_tag_small:\n\t" - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V18, REG_T0) - "mv t1, %[tagSz]\n\t" - "xor t0, t0, t0\n\t" - "L_aes_gcm_128_decrypt_store_tag_byte:\n\t" - "lb t2, (%[scratch])\n\t" - "lb t3, (%[tag])\n\t" - "xor t3, t3, t2\n\t" - "or t0, t0, t3\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[tag], %[tag], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_128_decrypt_store_tag_byte\n\t" - "L_aes_gcm_128_decrypt_tag_done:\n\t" - "negw t0, t0\n\t" - "sraiw t0, t0, 31\n\t" - "andi %[ret], t0, -180\n\t" - - : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), - [aSz] "+r" (aadSz), [aad] "+r" (aad), [ret] "+r" (ret), - [sz] "+r" (sz) - : [ctr] "r" (ctr), [scratch] "r" (scratch), - [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - , [rev_idx] "r" (rev_idx) -#endif - : "memory", "t0", "t1", "t2", "t3", "t4" - ); - -#ifdef OPENSSL_EXTRA - if ((tag != NULL) && (in != NULL) && (sz != 0)) { - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - } -#endif - - return ret; -} -#endif /* WOLFSSL_AES_128 */ - -#ifdef WOLFSSL_AES_192 -/* Decrypt data using AES-192-GCM. - * - * @param [in] aes AES object. - * @param [out] out Decrypted data. - * @param [in] in Data to decrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - * @return 0 on success. - * @return AES_GCM_AUTH_E when authentication tag computed doesn't match - * tag passed in. - */ -static int Aes192GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - int ret = 0; - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - * Some cases was stack pointer plus offset others was a register containing - * address. To make uniform for passing in to inline assembly code am using - * pointers to the head of each local array. - */ - byte* ctr = counter; - byte* key = (byte*)aes->key; - - XMEMSET(counter, 0, WC_AES_BLOCK_SIZE); - if (nonceSz == GCM_NONCE_MID_SZ) { - XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { -#ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; -#endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); -#ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; -#endif - } - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* X=0, get H */ - VXOR_VV(REG_V18, REG_V18, REG_V18) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V19, REG_T0) - - /* Hash in AAD, the Additional Authentication Data */ - "beqz %[aSz], L_aes_gcm_192_decrypt_ghash_aad_done\n\t" - "beqz %[aad], L_aes_gcm_192_decrypt_ghash_aad_done\n\t" - - "srli t1, %[aSz], 4\n\t" - "beqz t1, L_aes_gcm_192_decrypt_ghash_aad_blocks_done\n\t" - - "L_aes_gcm_192_decrypt_ghash_aad_loop:\n\t" - "mv t0, %[aad]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "addi %[aad], %[aad], 16\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_decrypt_ghash_aad_loop\n\t" - "L_aes_gcm_192_decrypt_ghash_aad_blocks_done:\n\t" - "andi t1, %[aSz], 0xf\n\t" - "beqz t1, L_aes_gcm_192_decrypt_ghash_aad_done\n\t" - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t2, t1\n\t" - "L_aes_gcm_192_decrypt_ghash_aad_load_byte:\n\t" - "lb t0, (%[aad])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[aad], %[aad], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_192_decrypt_ghash_aad_load_byte\n\t" - "sub %[scratch], %[scratch], t1\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "L_aes_gcm_192_decrypt_ghash_aad_done:\n\t" - /* Done Hash in AAD */ - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - "mv t0, %[rev_idx]\n\t" - VL1RE32_V(REG_V15, REG_T0) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - /* Load the counter. */ - "mv t0, %[ctr]\n\t" - VL1RE32_V(REG_V16, REG_T0) -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VSLIDEDOWN_VI(REG_V20, REG_V16, 3) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V21, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V20, REG_V21) -#else - VREV8(REG_V20, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "lw t3, 12(%[ctr])\n\t" - "slli t3, t3, 32\n\t" - REV8(REG_T3, REG_T3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V12, REG_T0) - - "beqz %[sz], L_aes_gcm_192_decrypt_blocks_done\n\t" - "srli t4, %[sz], 6\n\t" - "beqz t4, L_aes_gcm_192_decrypt_x4_blocks_done\n\t" - - /* Calculate H^[1-4] - GMULT partials */ - VMV_V_V(REG_V21, REG_V19) - VMV_V_V(REG_V22, REG_V19) - /* Multiply H * H => H^2 */ - VGMUL_VV(REG_V21, REG_V19) - VMV_V_V(REG_V23, REG_V21) - /* Multiply H * H => H^3 */ - VGMUL_VV(REG_V22, REG_V21) - /* Multiply H^2 * H^2 => H^4 */ - VGMUL_VV(REG_V23, REG_V21) - - "L_aes_gcm_192_decrypt_x4_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL4RE32_V(REG_V28, REG_T0) - VMVR_V(REG_V24, REG_V28, 4) - VGMUL_VV(REG_V24, REG_V23) - VGMUL_VV(REG_V25, REG_V22) - VGMUL_VV(REG_V26, REG_V21) - VGMUL_VV(REG_V27, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V24) - VXOR_VV(REG_V18, REG_V18, REG_V25) - VXOR_VV(REG_V18, REG_V18, REG_V26) - VXOR_VV(REG_V18, REG_V18, REG_V27) - /* Calculate next 4 counters (+1-4) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V24, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V24, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V25, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V25, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V26, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V26, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V27, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t0, t3, 1\n\t" - VMV_V_V(REG_V24, REG_V16) - "addi t1, t3, 2\n\t" - VMV_V_V(REG_V25, REG_V16) - "slli t0, t0, 32\n\t" - VMV_V_V(REG_V26, REG_V16) - "slli t1, t1, 32\n\t" - VMV_V_V(REG_V27, REG_V16) - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - VMV_V_X(REG_V20, REG_T0) - "addi t0, t3, 3\n\t" - VSLIDEUP_VI(REG_V24, REG_V20, 3) - "addi t3, t3, 4\n\t" - VMV_V_X(REG_V20, REG_T1) - "slli t0, t0, 32\n\t" - VSLIDEUP_VI(REG_V25, REG_V20, 3) - "slli t1, t3, 32\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - VMV_V_X(REG_V20, REG_T0) - VSLIDEUP_VI(REG_V26, REG_V20, 3) - VMV_V_X(REG_V20, REG_T1) - VSLIDEUP_VI(REG_V27, REG_V20, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V24, REG_V0) - VAESZ_VS(REG_V25, REG_V0) - VAESZ_VS(REG_V26, REG_V0) - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V24, REG_V1) - VAESEM_VS(REG_V24, REG_V2) - VAESEM_VS(REG_V24, REG_V3) - VAESEM_VS(REG_V24, REG_V4) - VAESEM_VS(REG_V24, REG_V5) - VAESEM_VS(REG_V24, REG_V6) - VAESEM_VS(REG_V24, REG_V7) - VAESEM_VS(REG_V24, REG_V8) - VAESEM_VS(REG_V24, REG_V9) - VAESEM_VS(REG_V24, REG_V10) - VAESEM_VS(REG_V24, REG_V11) - VAESEM_VS(REG_V25, REG_V1) - VAESEM_VS(REG_V25, REG_V2) - VAESEM_VS(REG_V25, REG_V3) - VAESEM_VS(REG_V25, REG_V4) - VAESEM_VS(REG_V25, REG_V5) - VAESEM_VS(REG_V25, REG_V6) - VAESEM_VS(REG_V25, REG_V7) - VAESEM_VS(REG_V25, REG_V8) - VAESEM_VS(REG_V25, REG_V9) - VAESEM_VS(REG_V25, REG_V10) - VAESEM_VS(REG_V25, REG_V11) - VAESEM_VS(REG_V26, REG_V1) - VAESEM_VS(REG_V26, REG_V2) - VAESEM_VS(REG_V26, REG_V3) - VAESEM_VS(REG_V26, REG_V4) - VAESEM_VS(REG_V26, REG_V5) - VAESEM_VS(REG_V26, REG_V6) - VAESEM_VS(REG_V26, REG_V7) - VAESEM_VS(REG_V26, REG_V8) - VAESEM_VS(REG_V26, REG_V9) - VAESEM_VS(REG_V26, REG_V10) - VAESEM_VS(REG_V26, REG_V11) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEF_VS(REG_V24, REG_V12) - VAESEF_VS(REG_V25, REG_V12) - VAESEF_VS(REG_V26, REG_V12) - VAESEF_VS(REG_V27, REG_V12) - VXOR_VV(REG_V28, REG_V24, REG_V28) - VXOR_VV(REG_V29, REG_V25, REG_V29) - VXOR_VV(REG_V30, REG_V26, REG_V30) - VXOR_VV(REG_V31, REG_V27, REG_V31) - /* Store output. */ - "mv t0, %[out]\n\t" - VS4R_V(REG_V28, REG_T0) - "addi %[in], %[in], 64\n\t" - "addi %[out], %[out], 64\n\t" - /* Loop if more elements to process. */ - "addi t4, t4, -1\n\t" - "bnez t4, L_aes_gcm_192_decrypt_x4_block_loop\n\t" - "andi %[sz], %[sz], 0x3f\n\t" - - "L_aes_gcm_192_decrypt_x4_blocks_done:\n\t" - "srli t2, %[sz], 4\n\t" - "beqz t2, L_aes_gcm_192_decrypt_blocks_done\n\t" - - "L_aes_gcm_192_decrypt_block_loop:\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEF_VS(REG_V27, REG_V12) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store output. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V27, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_192_decrypt_block_loop\n\t" - - "L_aes_gcm_192_decrypt_blocks_done:\n\t" - "andi t2, %[sz], 0xf\n\t" - "beqz t2, L_aes_gcm_192_decrypt_done\n\t" - - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_192_decrypt_load_byte:\n\t" - "lb t0, (%[in])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[in], %[in], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_decrypt_load_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - /* Encrypt counter for partial block. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEF_VS(REG_V27, REG_V12) - - /* Load scratch. */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store scratch. */ - VS1R_V(REG_V27, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_192_decrypt_store_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[out])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[out], %[out], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_decrypt_store_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - - "L_aes_gcm_192_decrypt_done:\n\t" - - /* Hash in the lengths of A and C in bits */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* aSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[aSz], %[aSz], 3\n\t" - "srli t0, %[aSz], 32\n\t" - "srli t1, %[aSz], 24\n\t" - "srli t2, %[aSz], 16\n\t" - "srli t3, %[aSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[scratch])\n\t" - "sb x0 , 2(%[scratch])\n\t" - "sb t0 , 3(%[scratch])\n\t" - "sb t1 , 4(%[scratch])\n\t" - "sb t2 , 5(%[scratch])\n\t" - "sb t3 , 6(%[scratch])\n\t" - "sb %[aSz], 7(%[scratch])\n\t" - /* sz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[sz], %[sz], 3\n\t" - "srli t0, %[sz], 32\n\t" - "srli t1, %[sz], 24\n\t" - "srli t2, %[sz], 16\n\t" - "srli t3, %[sz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 8(%[scratch])\n\t" - "sb x0 , 10(%[scratch])\n\t" - "sb t0 , 11(%[scratch])\n\t" - "sb t1 , 12(%[scratch])\n\t" - "sb t2 , 13(%[scratch])\n\t" - "sb t3 , 14(%[scratch])\n\t" - "sb %[sz], 15(%[scratch])\n\t" -#else - "slli t0, %[aSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[scratch])\n\t" - "slli t0, %[sz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 8(%[scratch])\n\t" -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - VAESZ_VS(REG_V16, REG_V0) - VAESEM_VS(REG_V16, REG_V1) - VAESEM_VS(REG_V16, REG_V2) - VAESEM_VS(REG_V16, REG_V3) - VAESEM_VS(REG_V16, REG_V4) - VAESEM_VS(REG_V16, REG_V5) - VAESEM_VS(REG_V16, REG_V6) - VAESEM_VS(REG_V16, REG_V7) - VAESEM_VS(REG_V16, REG_V8) - VAESEM_VS(REG_V16, REG_V9) - VAESEM_VS(REG_V16, REG_V10) - VAESEM_VS(REG_V16, REG_V11) - VAESEF_VS(REG_V16, REG_V12) - VXOR_VV(REG_V18, REG_V18, REG_V16) - - "li t1, 16\n\t" - "blt %[tagSz], t1, L_aes_gcm_192_decrypt_tag_small\n\t" - "mv t0, %[tag]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V19, REG_V19, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V17) - VMSNE_VV(REG_V19, REG_V19, REG_V18) - VCPOP_M(REG_T0, REG_V19) - "beqz x0, L_aes_gcm_192_decrypt_tag_done\n\t" - "L_aes_gcm_192_decrypt_tag_small:\n\t" - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V18, REG_T0) - "mv t1, %[tagSz]\n\t" - "xor t0, t0, t0\n\t" - "L_aes_gcm_192_decrypt_store_tag_byte:\n\t" - "lb t2, (%[scratch])\n\t" - "lb t3, (%[tag])\n\t" - "xor t3, t3, t2\n\t" - "or t0, t0, t3\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[tag], %[tag], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_192_decrypt_store_tag_byte\n\t" - "L_aes_gcm_192_decrypt_tag_done:\n\t" - "negw t0, t0\n\t" - "sraiw t0, t0, 31\n\t" - "andi %[ret], t0, -180\n\t" - - : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), - [aSz] "+r" (aadSz), [aad] "+r" (aad), [ret] "+r" (ret), - [sz] "+r" (sz) - : [ctr] "r" (ctr), [scratch] "r" (scratch), - [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - , [rev_idx] "r" (rev_idx) -#endif - : "memory", "t0", "t1", "t2", "t3", "t4" - ); - -#ifdef OPENSSL_EXTRA - if ((tag != NULL) && (in != NULL) && (sz != 0)) { - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - } -#endif - - return ret; -} -#endif /* WOLFSSL_AES_192 */ - -#ifdef WOLFSSL_AES_256 -/* Decrypt data using AES-256-GCM. - * - * @param [in] aes AES object. - * @param [out] out Decrypted data. - * @param [in] in Data to decrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - * @return 0 on success. - * @return AES_GCM_AUTH_E when authentication tag computed doesn't match - * tag passed in. - */ -static int Aes256GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - int ret = 0; - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - * Some cases was stack pointer plus offset others was a register containing - * address. To make uniform for passing in to inline assembly code am using - * pointers to the head of each local array. - */ - byte* ctr = counter; - byte* key = (byte*)aes->key; - - XMEMSET(counter, 0, WC_AES_BLOCK_SIZE); - if (nonceSz == GCM_NONCE_MID_SZ) { - XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { -#ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; -#endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); -#ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; -#endif - } - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - - /* X=0, get H */ - VXOR_VV(REG_V18, REG_V18, REG_V18) - "mv t0, %[h]\n\t" - VL1RE32_V(REG_V19, REG_T0) - - /* Hash in AAD, the Additional Authentication Data */ - "beqz %[aSz], L_aes_gcm_256_decrypt_ghash_aad_done\n\t" - "beqz %[aad], L_aes_gcm_256_decrypt_ghash_aad_done\n\t" - - "srli t1, %[aSz], 4\n\t" - "beqz t1, L_aes_gcm_256_decrypt_ghash_aad_blocks_done\n\t" - - "L_aes_gcm_256_decrypt_ghash_aad_loop:\n\t" - "mv t0, %[aad]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "addi %[aad], %[aad], 16\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_decrypt_ghash_aad_loop\n\t" - "L_aes_gcm_256_decrypt_ghash_aad_blocks_done:\n\t" - "andi t1, %[aSz], 0xf\n\t" - "beqz t1, L_aes_gcm_256_decrypt_ghash_aad_done\n\t" - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t2, t1\n\t" - "L_aes_gcm_256_decrypt_ghash_aad_load_byte:\n\t" - "lb t0, (%[aad])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[aad], %[aad], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_256_decrypt_ghash_aad_load_byte\n\t" - "sub %[scratch], %[scratch], t1\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - "L_aes_gcm_256_decrypt_ghash_aad_done:\n\t" - /* Done Hash in AAD */ - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - "mv t0, %[rev_idx]\n\t" - VL1RE32_V(REG_V15, REG_T0) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - /* Load the counter. */ - "mv t0, %[ctr]\n\t" - VL1RE32_V(REG_V16, REG_T0) -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VSLIDEDOWN_VI(REG_V20, REG_V16, 3) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V21, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - VMV_V_V(REG_V20, REG_V21) -#else - VREV8(REG_V20, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ -#else - "lw t3, 12(%[ctr])\n\t" - "slli t3, t3, 32\n\t" - REV8(REG_T3, REG_T3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - /* Load key[0..7]. */ - "mv t0, %[key]\n\t" - VL8RE32_V(REG_V0, REG_T0) - /* Load key[8..11]. */ - "addi t0, t0, 128\n\t" - VL4RE32_V(REG_V8, REG_T0) - /* Load key[12..13]. */ - "addi t0, t0, 64\n\t" - VL2RE32_V(REG_V12, REG_T0) - /* Load last round's key */ - "addi t0, %[key], 224\n\t" - VL1RE32_V(REG_V14, REG_T0) - - "beqz %[sz], L_aes_gcm_256_decrypt_blocks_done\n\t" - "srli t4, %[sz], 6\n\t" - "beqz t4, L_aes_gcm_256_decrypt_x4_blocks_done\n\t" - - /* Calculate H^[1-4] - GMULT partials */ - VMV_V_V(REG_V21, REG_V19) - VMV_V_V(REG_V22, REG_V19) - /* Multiply H * H => H^2 */ - VGMUL_VV(REG_V21, REG_V19) - VMV_V_V(REG_V23, REG_V21) - /* Multiply H * H => H^3 */ - VGMUL_VV(REG_V22, REG_V21) - /* Multiply H^2 * H^2 => H^4 */ - VGMUL_VV(REG_V23, REG_V21) - - "L_aes_gcm_256_decrypt_x4_block_loop:\n\t" - /* Load input. */ - "mv t0, %[in]\n\t" - VL4RE32_V(REG_V28, REG_T0) - VMVR_V(REG_V24, REG_V28, 4) - VGMUL_VV(REG_V24, REG_V23) - VGMUL_VV(REG_V25, REG_V22) - VGMUL_VV(REG_V26, REG_V21) - VGMUL_VV(REG_V27, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V24) - VXOR_VV(REG_V18, REG_V18, REG_V25) - VXOR_VV(REG_V18, REG_V18, REG_V26) - VXOR_VV(REG_V18, REG_V18, REG_V27) - /* Calculate next 4 counters (+1-4) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V24, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V24, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V25, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V25, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V26, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V26, REG_V17, 3) - VADD_VI(REG_V20, REG_V20, 1) - VMV_V_V(REG_V27, REG_V16) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t0, t3, 1\n\t" - VMV_V_V(REG_V24, REG_V16) - "addi t1, t3, 2\n\t" - VMV_V_V(REG_V25, REG_V16) - "slli t0, t0, 32\n\t" - VMV_V_V(REG_V26, REG_V16) - "slli t1, t1, 32\n\t" - VMV_V_V(REG_V27, REG_V16) - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - VMV_V_X(REG_V20, REG_T0) - "addi t0, t3, 3\n\t" - VSLIDEUP_VI(REG_V24, REG_V20, 3) - "addi t3, t3, 4\n\t" - VMV_V_X(REG_V20, REG_T1) - "slli t0, t0, 32\n\t" - VSLIDEUP_VI(REG_V25, REG_V20, 3) - "slli t1, t3, 32\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - VMV_V_X(REG_V20, REG_T0) - VSLIDEUP_VI(REG_V26, REG_V20, 3) - VMV_V_X(REG_V20, REG_T1) - VSLIDEUP_VI(REG_V27, REG_V20, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V24, REG_V0) - VAESZ_VS(REG_V25, REG_V0) - VAESZ_VS(REG_V26, REG_V0) - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V24, REG_V1) - VAESEM_VS(REG_V24, REG_V2) - VAESEM_VS(REG_V24, REG_V3) - VAESEM_VS(REG_V24, REG_V4) - VAESEM_VS(REG_V24, REG_V5) - VAESEM_VS(REG_V24, REG_V6) - VAESEM_VS(REG_V24, REG_V7) - VAESEM_VS(REG_V24, REG_V8) - VAESEM_VS(REG_V24, REG_V9) - VAESEM_VS(REG_V24, REG_V10) - VAESEM_VS(REG_V24, REG_V11) - VAESEM_VS(REG_V24, REG_V12) - VAESEM_VS(REG_V24, REG_V13) - VAESEM_VS(REG_V25, REG_V1) - VAESEM_VS(REG_V25, REG_V2) - VAESEM_VS(REG_V25, REG_V3) - VAESEM_VS(REG_V25, REG_V4) - VAESEM_VS(REG_V25, REG_V5) - VAESEM_VS(REG_V25, REG_V6) - VAESEM_VS(REG_V25, REG_V7) - VAESEM_VS(REG_V25, REG_V8) - VAESEM_VS(REG_V25, REG_V9) - VAESEM_VS(REG_V25, REG_V10) - VAESEM_VS(REG_V25, REG_V11) - VAESEM_VS(REG_V25, REG_V12) - VAESEM_VS(REG_V25, REG_V13) - VAESEM_VS(REG_V26, REG_V1) - VAESEM_VS(REG_V26, REG_V2) - VAESEM_VS(REG_V26, REG_V3) - VAESEM_VS(REG_V26, REG_V4) - VAESEM_VS(REG_V26, REG_V5) - VAESEM_VS(REG_V26, REG_V6) - VAESEM_VS(REG_V26, REG_V7) - VAESEM_VS(REG_V26, REG_V8) - VAESEM_VS(REG_V26, REG_V9) - VAESEM_VS(REG_V26, REG_V10) - VAESEM_VS(REG_V26, REG_V11) - VAESEM_VS(REG_V26, REG_V12) - VAESEM_VS(REG_V26, REG_V13) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEM_VS(REG_V27, REG_V12) - VAESEM_VS(REG_V27, REG_V13) - VAESEF_VS(REG_V24, REG_V14) - VAESEF_VS(REG_V25, REG_V14) - VAESEF_VS(REG_V26, REG_V14) - VAESEF_VS(REG_V27, REG_V14) - VXOR_VV(REG_V28, REG_V24, REG_V28) - VXOR_VV(REG_V29, REG_V25, REG_V29) - VXOR_VV(REG_V30, REG_V26, REG_V30) - VXOR_VV(REG_V31, REG_V27, REG_V31) - /* Store output. */ - "mv t0, %[out]\n\t" - VS4R_V(REG_V28, REG_T0) - "addi %[in], %[in], 64\n\t" - "addi %[out], %[out], 64\n\t" - /* Loop if more elements to process. */ - "addi t4, t4, -1\n\t" - "bnez t4, L_aes_gcm_256_decrypt_x4_block_loop\n\t" - "andi %[sz], %[sz], 0x3f\n\t" - - "L_aes_gcm_256_decrypt_x4_blocks_done:\n\t" - "srli t2, %[sz], 4\n\t" - "beqz t2, L_aes_gcm_256_decrypt_blocks_done\n\t" - - "L_aes_gcm_256_decrypt_block_loop:\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEM_VS(REG_V27, REG_V12) - VAESEM_VS(REG_V27, REG_V13) - VAESEF_VS(REG_V27, REG_V14) - - /* Load input. */ - "mv t0, %[in]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store output. */ - "mv t0, %[out]\n\t" - VS1R_V(REG_V27, REG_T0) - - "addi %[in], %[in], 16\n\t" - "addi %[out], %[out], 16\n\t" - /* Loop if more elements to process. */ - "addi t2, t2, -1\n\t" - "bnez t2, L_aes_gcm_256_decrypt_block_loop\n\t" - - "L_aes_gcm_256_decrypt_blocks_done:\n\t" - "andi t2, %[sz], 0xf\n\t" - "beqz t2, L_aes_gcm_256_decrypt_done\n\t" - - VXOR_VV(REG_V17, REG_V17, REG_V17) - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V17, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_256_decrypt_load_byte:\n\t" - "lb t0, (%[in])\n\t" - "sb t0, (%[scratch])\n\t" - "addi %[in], %[in], 1\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_decrypt_load_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - /* Encrypt counter for partial block. */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - VADD_VI(REG_V20, REG_V20, 1) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) - VRGATHER_VV(REG_V17, REG_V15, REG_V20) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) -#else - VREV8(REG_V17, REG_V20) -#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#else - "addi t3, t3, 1\n\t" - "slli t0, t3, 32\n\t" - REV8(REG_T0, REG_T0) - VMV_V_X(REG_V17, REG_T0) - VMV_V_V(REG_V27, REG_V16) - VSLIDEUP_VI(REG_V27, REG_V17, 3) -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - - VAESZ_VS(REG_V27, REG_V0) - VAESEM_VS(REG_V27, REG_V1) - VAESEM_VS(REG_V27, REG_V2) - VAESEM_VS(REG_V27, REG_V3) - VAESEM_VS(REG_V27, REG_V4) - VAESEM_VS(REG_V27, REG_V5) - VAESEM_VS(REG_V27, REG_V6) - VAESEM_VS(REG_V27, REG_V7) - VAESEM_VS(REG_V27, REG_V8) - VAESEM_VS(REG_V27, REG_V9) - VAESEM_VS(REG_V27, REG_V10) - VAESEM_VS(REG_V27, REG_V11) - VAESEM_VS(REG_V27, REG_V12) - VAESEM_VS(REG_V27, REG_V13) - VAESEF_VS(REG_V27, REG_V14) - - /* Load scratch. */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V27, REG_V27, REG_V17) - /* Store scratch. */ - VS1R_V(REG_V27, REG_T0) - "mv t1, t2\n\t" - "L_aes_gcm_256_decrypt_store_byte:\n\t" - "lb t0, (%[scratch])\n\t" - "sb t0, (%[out])\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[out], %[out], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_decrypt_store_byte\n\t" - "sub %[scratch], %[scratch], t2\n\t" - - "L_aes_gcm_256_decrypt_done:\n\t" - - /* Hash in the lengths of A and C in bits */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - /* aSz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[aSz], %[aSz], 3\n\t" - "srli t0, %[aSz], 32\n\t" - "srli t1, %[aSz], 24\n\t" - "srli t2, %[aSz], 16\n\t" - "srli t3, %[aSz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 0(%[scratch])\n\t" - "sb x0 , 2(%[scratch])\n\t" - "sb t0 , 3(%[scratch])\n\t" - "sb t1 , 4(%[scratch])\n\t" - "sb t2 , 5(%[scratch])\n\t" - "sb t3 , 6(%[scratch])\n\t" - "sb %[aSz], 7(%[scratch])\n\t" - /* sz is only 32-bits */ - /* Multiply by 8 do get size in bits. */ - "slli %[sz], %[sz], 3\n\t" - "srli t0, %[sz], 32\n\t" - "srli t1, %[sz], 24\n\t" - "srli t2, %[sz], 16\n\t" - "srli t3, %[sz], 8\n\t" - /* Top 3 bytes are 0. */ - "sh x0 , 8(%[scratch])\n\t" - "sb x0 , 10(%[scratch])\n\t" - "sb t0 , 11(%[scratch])\n\t" - "sb t1 , 12(%[scratch])\n\t" - "sb t2 , 13(%[scratch])\n\t" - "sb t3 , 14(%[scratch])\n\t" - "sb %[sz], 15(%[scratch])\n\t" -#else - "slli t0, %[aSz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 0(%[scratch])\n\t" - "slli t0, %[sz], 3\n\t" - REV8(REG_T0, REG_T0) - "sd t0, 8(%[scratch])\n\t" -#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ - "mv t0, %[scratch]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VGHSH_VV(REG_V18, REG_V17, REG_V19) - - VAESZ_VS(REG_V16, REG_V0) - VAESEM_VS(REG_V16, REG_V1) - VAESEM_VS(REG_V16, REG_V2) - VAESEM_VS(REG_V16, REG_V3) - VAESEM_VS(REG_V16, REG_V4) - VAESEM_VS(REG_V16, REG_V5) - VAESEM_VS(REG_V16, REG_V6) - VAESEM_VS(REG_V16, REG_V7) - VAESEM_VS(REG_V16, REG_V8) - VAESEM_VS(REG_V16, REG_V9) - VAESEM_VS(REG_V16, REG_V10) - VAESEM_VS(REG_V16, REG_V11) - VAESEM_VS(REG_V16, REG_V12) - VAESEM_VS(REG_V16, REG_V13) - VAESEF_VS(REG_V16, REG_V14) - VXOR_VV(REG_V18, REG_V18, REG_V16) - - "li t1, 16\n\t" - "blt %[tagSz], t1, L_aes_gcm_256_decrypt_tag_small\n\t" - "mv t0, %[tag]\n\t" - VL1RE32_V(REG_V17, REG_T0) - VXOR_VV(REG_V19, REG_V19, REG_V19) - VXOR_VV(REG_V18, REG_V18, REG_V17) - VMSNE_VV(REG_V19, REG_V19, REG_V18) - VCPOP_M(REG_T0, REG_V19) - "beqz x0, L_aes_gcm_256_decrypt_tag_done\n\t" - "L_aes_gcm_256_decrypt_tag_small:\n\t" - "mv t0, %[scratch]\n\t" - VS1R_V(REG_V18, REG_T0) - "mv t1, %[tagSz]\n\t" - "xor t0, t0, t0\n\t" - "L_aes_gcm_256_decrypt_store_tag_byte:\n\t" - "lb t2, (%[scratch])\n\t" - "lb t3, (%[tag])\n\t" - "xor t3, t3, t2\n\t" - "or t0, t0, t3\n\t" - "addi %[scratch], %[scratch], 1\n\t" - "addi %[tag], %[tag], 1\n\t" - "addi t1, t1, -1\n\t" - "bnez t1, L_aes_gcm_256_decrypt_store_tag_byte\n\t" - "L_aes_gcm_256_decrypt_tag_done:\n\t" - "negw t0, t0\n\t" - "sraiw t0, t0, 31\n\t" - "andi %[ret], t0, -180\n\t" - - : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), - [aSz] "+r" (aadSz), [aad] "+r" (aad), [ret] "+r" (ret), - [sz] "+r" (sz) - : [ctr] "r" (ctr), [scratch] "r" (scratch), - [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - , [rev_idx] "r" (rev_idx) -#endif - : "memory", "t0", "t1", "t2", "t3", "t4" - ); - -#ifdef OPENSSL_EXTRA - if ((tag != NULL) && (in != NULL) && (sz != 0)) { - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - } -#endif - - return ret; -} -#endif /* WOLFSSL_AES_256 */ - -/* Decrypt data using AES-GCM. - * - * @param [in] aes AES object. - * @param [out] out Decrypted data. - * @param [in] in Data to decrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. - * @return BAD_FUNC_ARG when nonceSz is zero. - * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. - * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or - * greater than WC_AES_BLOCK_SIZE. - * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. - * @return AES_GCM_AUTH_E when authentication tag computed doesn't match - * tag passed in. - */ -int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - int ret = 0; - - /* sanity checks */ - if ((aes == NULL) || (nonce == NULL) || (tag == NULL) || - ((aad == NULL) && (aadSz > 0)) || (nonceSz == 0) || - ((sz != 0) && ((in == NULL) || (out == NULL)))) { - WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); - return BAD_FUNC_ARG; - } - - if (ret == 0) - ret = wc_local_AesGcmCheckTagSz(tagSz); - - if (ret == 0) { - switch (aes->rounds) { - #ifdef WOLFSSL_AES_128 - case 10: - ret = Aes128GcmDecrypt(aes, out, in, sz, nonce, nonceSz, tag, - tagSz, aad, aadSz); - break; - #endif - #ifdef WOLFSSL_AES_192 - case 12: - ret = Aes192GcmDecrypt(aes, out, in, sz, nonce, nonceSz, tag, - tagSz, aad, aadSz); - break; - #endif - #ifdef WOLFSSL_AES_256 - case 14: - ret = Aes256GcmDecrypt(aes, out, in, sz, nonce, nonceSz, tag, - tagSz, aad, aadSz); - break; - #endif - default: - WOLFSSL_MSG("AES-GCM invalid round number"); - ret = BAD_FUNC_ARG; - } - } - - return ret; - -} - -#endif /* HAVE_AES_DECRYPT */ - -/* END script replace AES-GCM RISC-V 64 with hardware vector crypto */ - -#define HAVE_AES_GCM_ENC_DEC - -#endif /* !WOLFSSL_RISCV_VECTOR_GCM */ - -#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ - -/* Implement GHASH if we haven't already. */ -#ifndef HAVE_GHASH -/* Remainder values. */ -static const word16 R[32] = { - 0x0000, 0x201c, 0x4038, 0x6024, - 0x8070, 0xa06c, 0xc048, 0xe054, - 0x00e1, 0x20fd, 0x40d9, 0x60c5, - 0x8091, 0xa08d, 0xc0a9, 0xe0b5, - - 0x0000, 0xc201, 0x8403, 0x4602, - 0x0807, 0xca06, 0x8c04, 0x4e05, - 0x100e, 0xd20f, 0x940d, 0x560c, - 0x1809, 0xda08, 0x9c0a, 0x5e0b, -}; - -/* GMULT, multiply in GF2, x and y into x. - * - * @param [in, out] x On in, value to GMULT. - * On out, result of GMULT. - * @param [in] y Value to GMULT. - */ -static WC_INLINE void GMULT(byte *x, byte m[32][WC_AES_BLOCK_SIZE]) -{ - int i; - word64 z8[2] = {0, 0}; - byte a; - word64* x8 = (word64*)x; - word64* m8; - word64 n0, n1, n2, n3; - byte xi; - - for (i = 15; i > 0; i--) { - xi = x[i]; - - /* XOR in (msn * H) */ - m8 = (word64*)m[xi & 0xf]; - z8[0] ^= m8[0]; - z8[1] ^= m8[1]; - - /* Cache top byte for remainder calculations - lost in rotate. */ - a = (byte)(z8[1] >> 56); - - /* Rotate Z by 8-bits */ - z8[1] = (z8[0] >> 56) | (z8[1] << 8); - z8[0] <<= 8; - - /* XOR in (next significant nibble * H) [pre-rotated by 4 bits] */ - m8 = (word64*)m[16 + (xi >> 4)]; - z8[0] ^= m8[0]; - z8[1] ^= m8[1]; - - /* XOR in (msn * remainder) [pre-rotated by 4 bits] */ - z8[0] ^= (word64)R[16 + (a & 0xf)]; - /* XOR in next significant nibble (XORed with H) * remainder */ - m8 = (word64*)m[xi >> 4]; - a ^= (byte)(m8[1] >> 52); - z8[0] ^= (word64)R[a >> 4]; - } - - xi = x[0]; - - /* XOR in most significant nibble * H */ - m8 = (word64*)m[xi & 0xf]; - z8[0] ^= m8[0]; - z8[1] ^= m8[1]; - - /* Cache top byte for remainder calculations - lost in rotate. */ - a = (z8[1] >> 56) & 0xf; - - /* Rotate z by 4-bits */ - n3 = z8[1] & W64LIT(0xf0f0f0f0f0f0f0f0); - n2 = z8[1] & W64LIT(0x0f0f0f0f0f0f0f0f); - n1 = z8[0] & W64LIT(0xf0f0f0f0f0f0f0f0); - n0 = z8[0] & W64LIT(0x0f0f0f0f0f0f0f0f); - z8[1] = (n3 >> 4) | (n2 << 12) | (n0 >> 52); - z8[0] = (n1 >> 4) | (n0 << 12); - - /* XOR in next significant nibble * H */ - m8 = (word64*)m[xi >> 4]; - z8[0] ^= m8[0]; - z8[1] ^= m8[1]; - /* XOR in most significant nibble * remainder */ - z8[0] ^= (word64)R[a]; - - /* Write back result. */ - x8[0] = z8[0]; - x8[1] = z8[1]; -} - -/* GHASH Additional Authentication Data (AAD) and cipher text. - * - * @param [in] gcm GCM object. - * @param [in] a Additional Authentication Data (AAD). - * @param [in] aSz Size of AAD in bytes. - * @param [in] c Cipher text. - * @param [in] cSz Size of cipher text in bytes. - * @param [out] s Hash result. - * @param [in] sSz Number of bytes to put into hash result. - */ -void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, - byte* s, word32 sSz) -{ - ALIGN8 byte x[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - word32 blocks, partial; - - XMEMSET(x, 0, WC_AES_BLOCK_SIZE); - - /* Hash in A, the Additional Authentication Data */ - if (aSz != 0 && a != NULL) { - blocks = aSz / WC_AES_BLOCK_SIZE; - partial = aSz % WC_AES_BLOCK_SIZE; - while (blocks--) { - xorbuf16(x, a); - GMULT(x, gcm->M0); - a += WC_AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); - XMEMCPY(scratch, a, partial); - xorbuf16(x, scratch); - GMULT(x, gcm->M0); - } - } - - /* Hash in C, the Ciphertext */ - if (cSz != 0 && c != NULL) { - blocks = cSz / WC_AES_BLOCK_SIZE; - partial = cSz % WC_AES_BLOCK_SIZE; - while (blocks--) { - xorbuf16(x, c); - GMULT(x, gcm->M0); - c += WC_AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, WC_AES_BLOCK_SIZE); - XMEMCPY(scratch, c, partial); - xorbuf16(x, scratch); - GMULT(x, gcm->M0); - } - } - - /* Hash in the lengths of A and C in bits */ - FlattenSzInBits(&scratch[0], aSz); - FlattenSzInBits(&scratch[8], cSz); - xorbuf16(x, scratch); - GMULT(x, gcm->M0); - - /* Copy the result into s. */ - XMEMCPY(s, x, sSz); -} -#endif /* !HAVE_GHASH */ - -#ifndef HAVE_AES_GCM_ENC_DEC -/* Increment AES-GCM counter. - * - * Big-endian byte ordering. - * - * @param [in, out] inOutCtr Counter value to be incremented. - */ -static WC_INLINE void IncrementGcmCounter(byte* inOutCtr) -{ - int i; - - /* Big-endian array - start at last element and move back. */ - for (i = WC_AES_BLOCK_SIZE - 1; i >= WC_AES_BLOCK_SIZE - CTR_SZ; i--) { - /* Result not zero means no carry. */ - if ((++inOutCtr[i]) != 0) { - return; - } - } -} - -/* Encrypt data using AES-GCM. - * - * @param [in] aes AES object. - * @param [out] out Encrypted data. - * @param [in] in Data to encrypt. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. - * @return BAD_FUNC_ARG when nonceSz is zero. - * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. - * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or - * greater than WC_AES_BLOCK_SIZE. - * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. - */ -int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - int ret = 0; - word32 blocks = sz / WC_AES_BLOCK_SIZE; - word32 partial = sz % WC_AES_BLOCK_SIZE; - const byte* p = in; - byte* c = out; - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte initialCounter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - - /* Validate parameters. */ - if ((aes == NULL) || (nonce == NULL) || (nonceSz == 0) || (tag == NULL) || - ((aad == NULL) && (aadSz > 0)) || ((sz != 0) && ((in == NULL) || - (out == NULL)))) { - WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); - ret = BAD_FUNC_ARG; - } - - if (ret == 0) - ret = wc_local_AesGcmCheckTagSz(tagSz); - - if (ret == 0) { - if (nonceSz == GCM_NONCE_MID_SZ) { - /* Counter is IV with bottom 4 bytes set to: 0x00,0x00,0x00,0x01. */ - XMEMCPY(counter, nonce, nonceSz); - XMEMSET(counter + GCM_NONCE_MID_SZ, 0, - WC_AES_BLOCK_SIZE - GCM_NONCE_MID_SZ - 1); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { - /* Counter is GHASH of IV. */ - #ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; - #endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); - #ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; - #endif - } - memcpy16(initialCounter, counter); - - while (blocks--) { - IncrementGcmCounter(counter); - wc_AesEncrypt(aes, counter, scratch); - xorbufout16(c, scratch, p); - p += WC_AES_BLOCK_SIZE; - c += WC_AES_BLOCK_SIZE; - } - - if (partial != 0) { - IncrementGcmCounter(counter); - wc_AesEncrypt(aes, counter, scratch); - xorbufout(c, scratch, p, partial); - } - if (tag) { - GHASH(&aes->gcm, aad, aadSz, out, sz, tag, tagSz); - wc_AesEncrypt(aes, initialCounter, scratch); - xorbuf(tag, scratch, tagSz); - #ifdef OPENSSL_EXTRA - if (!in && !sz) - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - #endif - } - } - - return ret; -} - -#ifdef HAVE_AES_DECRYPT -/* Decrypt data using AES-GCM. - * - * @param [in] aes AES object. - * @param [out] out Decrypted data. - * @param [in] in Data to decrypt and GHASH. - * @param [in] sz Number of bytes of data. - * @param [in] nonce Nonce used to calculate first IV. - * @param [in] nonceSz Length of nonce in bytes. - * @param [out] tag Authentication tag. - * @param [in] tagSz Length of authentication tag in bytes. - * @param [in] aad Additional Authentication Data (AAD). - * @param [in] aadSz Length of AAD in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. - * @return BAD_FUNC_ARG when nonceSz is zero. - * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. - * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or - * greater than WC_AES_BLOCK_SIZE. - * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. - * @return AES_GCM_AUTH_E when authentication tag computed doesn't match - * tag passed in. - */ -int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, - const byte* aad, word32 aadSz) -{ - int ret = 0; - word32 blocks = sz / WC_AES_BLOCK_SIZE; - word32 partial = sz % WC_AES_BLOCK_SIZE; - const byte* c = in; - byte* p = out; - ALIGN8 byte counter[WC_AES_BLOCK_SIZE]; - ALIGN8 byte scratch[WC_AES_BLOCK_SIZE]; - ALIGN8 byte Tprime[WC_AES_BLOCK_SIZE]; - ALIGN8 byte EKY0[WC_AES_BLOCK_SIZE]; - sword32 res; - - /* Validate parameters. */ - if ((aes == NULL) || (nonce == NULL) || (tag == NULL) || - ((aad == NULL) && (aadSz > 0)) || (nonceSz == 0) || - ((sz != 0) && ((in == NULL) || (out == NULL)))) { - WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); - ret = BAD_FUNC_ARG; - } - - if (ret == 0) - ret = wc_local_AesGcmCheckTagSz(tagSz); - - if (ret == 0) { - if (nonceSz == GCM_NONCE_MID_SZ) { - /* Counter is IV with bottom 4 bytes set to: 0x00,0x00,0x00,0x01. */ - XMEMCPY(counter, nonce, nonceSz); - XMEMSET(counter + GCM_NONCE_MID_SZ, 0, - WC_AES_BLOCK_SIZE - GCM_NONCE_MID_SZ - 1); - counter[WC_AES_BLOCK_SIZE - 1] = 1; - } - else { - /* Counter is GHASH of IV. */ - #ifdef OPENSSL_EXTRA - word32 aadTemp = aes->gcm.aadLen; - aes->gcm.aadLen = 0; - #endif - GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, WC_AES_BLOCK_SIZE); - #ifdef OPENSSL_EXTRA - aes->gcm.aadLen = aadTemp; - #endif - } - - /* Calc the tag again using received auth data and the cipher text */ - GHASH(&aes->gcm, aad, aadSz, in, sz, Tprime, sizeof(Tprime)); - wc_AesEncrypt(aes, counter, EKY0); - xorbuf(Tprime, EKY0, sizeof(Tprime)); - #ifdef WC_AES_GCM_DEC_AUTH_EARLY - /* ConstantCompare returns the cumulative bitwise or of the bitwise xor - * of the pairwise bytes in the strings. - */ - res = ConstantCompare(tag, Tprime, tagSz); - /* convert positive retval from ConstantCompare() to all-1s word, in - * constant time. - */ - res = 0 - (sword32)(((word32)(0 - res)) >> 31U); - ret = res & AES_GCM_AUTH_E; - } - if (ret == 0) { - #endif - - #ifdef OPENSSL_EXTRA - if (!out) { - /* authenticated, non-confidential data */ - /* store AAD size for next call */ - aes->gcm.aadLen = aadSz; - } - #endif - - while (blocks--) { - IncrementGcmCounter(counter); - wc_AesEncrypt(aes, counter, scratch); - xorbufout16(p, scratch, c); - p += WC_AES_BLOCK_SIZE; - c += WC_AES_BLOCK_SIZE; - } - - if (partial != 0) { - IncrementGcmCounter(counter); - wc_AesEncrypt(aes, counter, scratch); - xorbuf(scratch, c, partial); - XMEMCPY(p, scratch, partial); - } - - #ifndef WC_AES_GCM_DEC_AUTH_EARLY - /* ConstantCompare returns the cumulative bitwise or of the bitwise xor - * of the pairwise bytes in the strings. - */ - res = ConstantCompare(tag, Tprime, (int)tagSz); - /* convert positive retval from ConstantCompare() to all-1s word, in - * constant time. - */ - res = 0 - (sword32)(((word32)(0 - res)) >> 31U); - /* now use res as a mask for constant time return of ret, unless tag - * mismatch, whereupon AES_GCM_AUTH_E is returned. - */ - ret = (ret & ~res) | (res & AES_GCM_AUTH_E); - #endif - } - - return ret; -} -#endif /* HAVE_AES_DECRYPT */ -#endif /* !HAVE_AES_GCM_ENC_DEC */ - -#endif /* HAVE_AESGCM */ - -#ifdef HAVE_AESCCM - -static void roll_x(Aes* aes, const byte* in, word32 inSz, byte* out) -{ - /* process the bulk of the data */ - while (inSz >= WC_AES_BLOCK_SIZE) { - xorbuf16(out, in); - in += WC_AES_BLOCK_SIZE; - inSz -= WC_AES_BLOCK_SIZE; - - wc_AesEncrypt(aes, out, out); - } - - /* process remainder of the data */ - if (inSz > 0) { - xorbuf(out, in, inSz); - wc_AesEncrypt(aes, out, out); - } -} - - -static void roll_auth(Aes* aes, const byte* in, word32 inSz, byte* out) -{ - word32 authLenSz; - word32 remainder; - - /* encode the length in */ - if (inSz <= 0xFEFF) { - authLenSz = 2; - out[0] ^= ((inSz & 0xFF00) >> 8); - out[1] ^= (inSz & 0x00FF); - } - else { - authLenSz = 6; - out[0] ^= 0xFF; out[1] ^= 0xFE; - out[2] ^= ((inSz & 0xFF000000) >> 24); - out[3] ^= ((inSz & 0x00FF0000) >> 16); - out[4] ^= ((inSz & 0x0000FF00) >> 8); - out[5] ^= (inSz & 0x000000FF); - } - /* Note, the protocol handles auth data up to 2^64, but we are - * using 32-bit sizes right now, so the bigger data isn't handled. - */ - - /* start fill out the rest of the first block */ - remainder = WC_AES_BLOCK_SIZE - authLenSz; - if (inSz >= remainder) { - /* plenty of bulk data to fill the remainder of this block */ - xorbuf(out + authLenSz, in, remainder); - inSz -= remainder; - in += remainder; - } - else { - /* not enough bulk data, copy what is available, and pad zero */ - xorbuf(out + authLenSz, in, inSz); - inSz = 0; - } - wc_AesEncrypt(aes, out, out); - - if (inSz > 0) - roll_x(aes, in, inSz, out); -} - - -static WC_INLINE void AesCcmCtrInc(byte* B, word32 lenSz) -{ - word32 i; - - for (i = 0; i < lenSz; i++) { - if (++B[WC_AES_BLOCK_SIZE - 1 - i] != 0) return; - } -} - -/* return 0 on success */ -int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) -{ - int ret = 0; - byte lenSz = 0; - - /* sanity check on arguments */ - if ((aes == NULL) || ((inSz != 0) && ((in == NULL) || (out == NULL))) || - ((authInSz > 0) && (authIn == NULL)) || - (nonce == NULL) || (authTag == NULL) || (nonceSz < 7) || - (nonceSz > 13)) { - ret = BAD_FUNC_ARG; - } - /* The block cipher helpers are void here so they cannot report an - * unusable key schedule; match the generic wc_AesEncrypt (aes.c) - * check. */ - if ((ret == 0) && - (((aes->rounds >> 1) > 7) || ((aes->rounds >> 1) == 0))) { - ret = KEYUSAGE_E; - } - - if ((ret == 0) && (wc_AesCcmCheckTagSize(authTagSz) != 0)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - lenSz = WC_AES_BLOCK_SIZE - 1 - (byte)nonceSz; - - /* With a large nonce, B[] runs out of room to represent inSz, and beyond - * that, the counter itself can wrap. - */ - if ((lenSz < sizeof(inSz)) && - (inSz >= ((word32)1 << (lenSz * 8)))) - { - ret = AES_CCM_OVERFLOW_E; - } - } - - if (ret == 0) { - byte A[WC_AES_BLOCK_SIZE]; - byte B[WC_AES_BLOCK_SIZE]; - byte i; - - XMEMCPY(B+1, nonce, nonceSz); - - B[0] = (authInSz > 0 ? 64 : 0) - + (8 * (((byte)authTagSz - 2) / 2)) - + (lenSz - 1); - for (i = 0; (i < lenSz) && (i < (byte)sizeof(word32)); i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = inSz >> (8 * i); - } - for (; i < lenSz; i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = 0; - } - - wc_AesEncrypt(aes, B, A); - - if (authInSz > 0) { - roll_auth(aes, authIn, authInSz, A); - } - if (inSz > 0) { - roll_x(aes, in, inSz, A); - } - XMEMCPY(authTag, A, authTagSz); - - B[0] = lenSz - 1; - for (i = 0; i < lenSz; i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = 0; - } - wc_AesEncrypt(aes, B, A); - xorbuf(authTag, A, authTagSz); - - B[15] = 1; - while (inSz >= WC_AES_BLOCK_SIZE) { - wc_AesEncrypt(aes, B, A); - xorbuf16(A, in); - memcpy16(out, A); - - AesCcmCtrInc(B, lenSz); - inSz -= WC_AES_BLOCK_SIZE; - in += WC_AES_BLOCK_SIZE; - out += WC_AES_BLOCK_SIZE; - } - if (inSz > 0) { - wc_AesEncrypt(aes, B, A); - xorbuf(A, in, inSz); - XMEMCPY(out, A, inSz); - } - - ForceZero(A, WC_AES_BLOCK_SIZE); - ForceZero(B, WC_AES_BLOCK_SIZE); - } - - return ret; -} - -#ifdef HAVE_AES_DECRYPT -int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) -{ - int ret = 0; - byte lenSz = 0; - - /* sanity check on arguments */ - if ((aes == NULL) || ((inSz != 0) && ((in == NULL) || (out == NULL))) || - ((authInSz > 0) && (authIn == NULL)) || - (nonce == NULL) || (authTag == NULL) || (nonceSz < 7) || - (nonceSz > 13)) { - ret = BAD_FUNC_ARG; - } - /* The block cipher helpers are void here so they cannot report an - * unusable key schedule; match the generic wc_AesEncrypt (aes.c) - * check. */ - if ((ret == 0) && - (((aes->rounds >> 1) > 7) || ((aes->rounds >> 1) == 0))) { - ret = KEYUSAGE_E; - } - - if ((ret == 0) && (wc_AesCcmCheckTagSize(authTagSz) != 0)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - lenSz = WC_AES_BLOCK_SIZE - 1 - (byte)nonceSz; - - /* With a large nonce, B[] runs out of room to represent inSz, and beyond - * that, the counter itself can wrap. - */ - if ((lenSz < sizeof(inSz)) && - (inSz >= ((word32)1 << (lenSz * 8)))) - { - ret = AES_CCM_OVERFLOW_E; - } - } - - if (ret == 0) { - byte A[WC_AES_BLOCK_SIZE]; - byte B[WC_AES_BLOCK_SIZE]; - byte i; - byte* o = out; - word32 oSz = inSz; - - XMEMCPY(B+1, nonce, nonceSz); - - B[0] = lenSz - 1; - for (i = 0; i < lenSz; i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = 0; - } - B[15] = 1; - - while (oSz >= WC_AES_BLOCK_SIZE) { - wc_AesEncrypt(aes, B, A); - xorbuf16(A, in); - memcpy16(o, A); - - AesCcmCtrInc(B, lenSz); - oSz -= WC_AES_BLOCK_SIZE; - in += WC_AES_BLOCK_SIZE; - o += WC_AES_BLOCK_SIZE; - } - if (inSz > 0) { - wc_AesEncrypt(aes, B, A); - xorbuf(A, in, oSz); - XMEMCPY(o, A, oSz); - } - - for (i = 0; i < lenSz; i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = 0; - } - wc_AesEncrypt(aes, B, A); - - B[0] = (authInSz > 0 ? 64 : 0) - + (8 * (((byte)authTagSz - 2) / 2)) - + (lenSz - 1); - for (i = 0; (i < lenSz) && (i < (byte)sizeof(word32)); i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = inSz >> (8 * i); - } - for (; i < lenSz; i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = 0; - } - - wc_AesEncrypt(aes, B, A); - - if (authInSz > 0) { - roll_auth(aes, authIn, authInSz, A); - } - if (inSz > 0) { - roll_x(aes, out, inSz, A); - } - - B[0] = lenSz - 1; - for (i = 0; i < lenSz; i++) { - B[WC_AES_BLOCK_SIZE - 1 - i] = 0; - } - wc_AesEncrypt(aes, B, B); - xorbuf(A, B, authTagSz); - - if (ConstantCompare(A, authTag, authTagSz) != 0) { - /* If the authTag check fails, don't keep the decrypted data. - * Unfortunately, you need the decrypted data to calculate the - * check value. */ - XMEMSET(out, 0, inSz); - ret = AES_CCM_AUTH_E; - } - - ForceZero(A, WC_AES_BLOCK_SIZE); - ForceZero(B, WC_AES_BLOCK_SIZE); - o = NULL; - } - - return ret; -} -#endif /* HAVE_AES_DECRYPT */ -#endif /* HAVE_AESCCM */ - -#endif /* WOLFSSL_RISCV_ASM */ - -#endif /* !NO_AES */ - diff --git a/wolfcrypt/src/port/riscv/riscv-64-chacha.c b/wolfcrypt/src/port/riscv/riscv-64-chacha.c deleted file mode 100644 index ba0a8b21d30..00000000000 --- a/wolfcrypt/src/port/riscv/riscv-64-chacha.c +++ /dev/null @@ -1,2335 +0,0 @@ -/* riscv-64-chacha.c - * - * Copyright (C) 2006-2026 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 3 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 - */ - -#include - -/* The paper NEON crypto by Daniel J. Bernstein and Peter Schwabe was used to - * optimize for ARM: - * https://cryptojedi.org/papers/veccrypto-20120320.pdf - */ - -#include - -#ifdef WOLFSSL_RISCV_ASM -#ifdef HAVE_CHACHA - -#include -#include -#ifdef NO_INLINE - #include -#else - #define WOLFSSL_MISC_INCLUDED - #include -#endif - -#ifdef CHACHA_AEAD_TEST - #include -#endif - -#ifdef CHACHA_TEST - #include -#endif - -/* Number of rounds */ -#define ROUNDS 20 - -#define U32C(v) (v##U) -#define U32V(v) ((word32)(v) & U32C(0xFFFFFFFF)) -#define U8TO32_LITTLE(p) (((word32*)(p))[0]) - -#define PLUS(v,w) (U32V((v) + (w))) -#define PLUSONE(v) (PLUS((v),1)) - -#define ARM_SIMD_LEN_BYTES 16 - -/** - * Set up iv(nonce). Earlier versions used 64 bits instead of 96, this version - * uses the typical AEAD 96 bit nonce and can do record sizes of 256 GB. - */ -int wc_Chacha_SetIV(ChaCha* ctx, const byte* inIv, word32 counter) -{ - word32 temp[CHACHA_IV_WORDS];/* used for alignment of memory */ - - if (ctx == NULL) - return BAD_FUNC_ARG; - - XMEMCPY(temp, inIv, CHACHA_IV_BYTES); - - ctx->left = 0; - ctx->X[CHACHA_IV_BYTES+0] = counter; /* block counter */ - ctx->X[CHACHA_IV_BYTES+1] = temp[0]; /* fixed variable from nonce */ - ctx->X[CHACHA_IV_BYTES+2] = temp[1]; /* counter from nonce */ - ctx->X[CHACHA_IV_BYTES+3] = temp[2]; /* counter from nonce */ - - return 0; -} - -/* "expand 32-byte k" as unsigned 32 byte */ -static const word32 sigma[4] = {0x61707865, 0x3320646e, 0x79622d32, 0x6b206574}; -/* "expand 16-byte k" as unsigned 16 byte */ -static const word32 tau[4] = {0x61707865, 0x3120646e, 0x79622d36, 0x6b206574}; - -/** - * Key setup. 8 word iv (nonce) - */ -int wc_Chacha_SetKey(ChaCha* ctx, const byte* key, word32 keySz) -{ - const word32* constants; - const byte* k; - -#ifdef XSTREAM_ALIGN - word32 alignKey[8]; -#endif - - if (ctx == NULL) - return BAD_FUNC_ARG; - - if (keySz != (CHACHA_MAX_KEY_SZ/2) && keySz != CHACHA_MAX_KEY_SZ) - return BAD_FUNC_ARG; - -#ifdef XSTREAM_ALIGN - if ((wc_ptr_t)key % 4) { - WOLFSSL_MSG("wc_ChachaSetKey unaligned key"); - XMEMCPY(alignKey, key, keySz); - k = (byte*)alignKey; - } - else { - k = key; - } -#else - k = key; -#endif /* XSTREAM_ALIGN */ - - ctx->X[4] = U8TO32_LITTLE(k + 0); - ctx->X[5] = U8TO32_LITTLE(k + 4); - ctx->X[6] = U8TO32_LITTLE(k + 8); - ctx->X[7] = U8TO32_LITTLE(k + 12); - if (keySz == CHACHA_MAX_KEY_SZ) { - k += 16; - constants = sigma; - } - else { - constants = tau; - } - ctx->X[ 8] = U8TO32_LITTLE(k + 0); - ctx->X[ 9] = U8TO32_LITTLE(k + 4); - ctx->X[10] = U8TO32_LITTLE(k + 8); - ctx->X[11] = U8TO32_LITTLE(k + 12); - ctx->X[ 0] = constants[0]; - ctx->X[ 1] = constants[1]; - ctx->X[ 2] = constants[2]; - ctx->X[ 3] = constants[3]; - ctx->left = 0; - - return 0; -} - - -#define CC_A0 "a4" -#define CC_A1 "a5" -#define CC_A2 "a6" -#define CC_A3 "a7" -#define CC_B0 "t3" -#define CC_B1 "t4" -#define CC_B2 "t5" -#define CC_B3 "t6" -#define CC_C0 "s2" -#define CC_C1 "s3" -#define CC_C2 "s4" -#define CC_C3 "s5" -#define CC_D0 "s6" -#define CC_D1 "s7" -#define CC_D2 "s8" -#define CC_D3 "s9" -#define CC_T0 "t0" -#define CC_T1 "t1" -#define CC_T2 "t2" -#define CC_T3 "s1" - -#if defined(WOLFSSL_RISCV_VECTOR) - -static const word32 L_chacha20_vec_inc_first_word[] = { - 0x1, - 0x0, - 0x0, - 0x0, -}; - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - -#define PART_ROUND_ODD_ABD_5(s, sr) \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V12, REG_V12, REG_V13) \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V16, REG_V16, REG_V17) \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - VXOR_VV(REG_V15, REG_V15, REG_V12) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - VXOR_VV(REG_V19, REG_V19, REG_V16) \ - VSLL_VI(REG_V20, REG_V3, s) \ - "slli " CC_T0 ", " CC_D0 ", " #s "\n\t" \ - VSLL_VI(REG_V21, REG_V7, s) \ - "slli " CC_T1 ", " CC_D1 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V11, s) \ - "slli " CC_T2 ", " CC_D2 ", " #s "\n\t" \ - VSLL_VI(REG_V23, REG_V15, s) \ - "slli " CC_T3 ", " CC_D3 ", " #s "\n\t" \ - VSLL_VI(REG_V24, REG_V19, s) \ - VSRL_VI(REG_V3, REG_V3, sr) \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - VSRL_VI(REG_V7, REG_V7, sr) \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - VSRL_VI(REG_V11, REG_V11, sr) \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - VSRL_VI(REG_V15, REG_V15, sr) \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - VSRL_VI(REG_V19, REG_V19, sr) \ - VOR_VV(REG_V3, REG_V3, REG_V20) \ - "or " CC_D0 ", " CC_D0 ", " CC_T0 "\n\t" \ - VOR_VV(REG_V7, REG_V7, REG_V21) \ - "or " CC_D1 ", " CC_D1 ", " CC_T1 "\n\t" \ - VOR_VV(REG_V11, REG_V11, REG_V22) \ - "or " CC_D2 ", " CC_D2 ", " CC_T2 "\n\t" \ - VOR_VV(REG_V15, REG_V15, REG_V23) \ - "or " CC_D3 ", " CC_D3 ", " CC_T3 "\n\t" \ - VOR_VV(REG_V19, REG_V19, REG_V24) - -#define PART_ROUND_ODD_CDB_5(s, sr) \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V14, REG_V14, REG_V15) \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V18, REG_V18, REG_V19) \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V13, REG_V13, REG_V14) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V17, REG_V17, REG_V18) \ - VSLL_VI(REG_V20, REG_V1, s) \ - "slli " CC_T0 ", " CC_B0 ", " #s "\n\t" \ - VSLL_VI(REG_V21, REG_V5, s) \ - "slli " CC_T1 ", " CC_B1 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V9, s) \ - "slli " CC_T2 ", " CC_B2 ", " #s "\n\t" \ - VSLL_VI(REG_V23, REG_V13, s) \ - "slli " CC_T3 ", " CC_B3 ", " #s "\n\t" \ - VSLL_VI(REG_V24, REG_V17, s) \ - VSRL_VI(REG_V1, REG_V1, sr) \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - VSRL_VI(REG_V5, REG_V5, sr) \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - VSRL_VI(REG_V9, REG_V9, sr) \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - VSRL_VI(REG_V13, REG_V13, sr) \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - VSRL_VI(REG_V17, REG_V17, sr) \ - VOR_VV(REG_V1, REG_V1, REG_V20) \ - "or " CC_B0 ", " CC_B0 ", " CC_T0 "\n\t" \ - VOR_VV(REG_V5, REG_V5, REG_V21) \ - "or " CC_B1 ", " CC_B1 ", " CC_T1 "\n\t" \ - VOR_VV(REG_V9, REG_V9, REG_V22) \ - "or " CC_B2 ", " CC_B2 ", " CC_T2 "\n\t" \ - VOR_VV(REG_V13, REG_V13, REG_V23) \ - "or " CC_B3 ", " CC_B3 ", " CC_T3 "\n\t" \ - VOR_VV(REG_V17, REG_V17, REG_V24) - -#define PART_ROUND_EVEN_ABD_5(s, sr) \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V12, REG_V12, REG_V13) \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V16, REG_V16, REG_V17) \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - VXOR_VV(REG_V15, REG_V15, REG_V12) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - VXOR_VV(REG_V19, REG_V19, REG_V16) \ - VSLL_VI(REG_V20, REG_V3, s) \ - "slli " CC_T0 ", " CC_D3 ", " #s "\n\t" \ - VSLL_VI(REG_V21, REG_V7, s) \ - "slli " CC_T1 ", " CC_D0 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V11, s) \ - "slli " CC_T2 ", " CC_D1 ", " #s "\n\t" \ - VSLL_VI(REG_V23, REG_V15, s) \ - "slli " CC_T3 ", " CC_D2 ", " #s "\n\t" \ - VSLL_VI(REG_V24, REG_V19, s) \ - VSRL_VI(REG_V3, REG_V3, sr) \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - VSRL_VI(REG_V7, REG_V7, sr) \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - VSRL_VI(REG_V11, REG_V11, sr) \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - VSRL_VI(REG_V15, REG_V15, sr) \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - VSRL_VI(REG_V19, REG_V19, sr) \ - VOR_VV(REG_V3, REG_V3, REG_V20) \ - "or " CC_D3 ", " CC_D3 ", " CC_T0 "\n\t" \ - VOR_VV(REG_V7, REG_V7, REG_V21) \ - "or " CC_D0 ", " CC_D0 ", " CC_T1 "\n\t" \ - VOR_VV(REG_V11, REG_V11, REG_V22) \ - "or " CC_D1 ", " CC_D1 ", " CC_T2 "\n\t" \ - VOR_VV(REG_V15, REG_V15, REG_V23) \ - "or " CC_D2 ", " CC_D2 ", " CC_T3 "\n\t" \ - VOR_VV(REG_V19, REG_V19, REG_V24) - -#define PART_ROUND_EVEN_CDB_5(s, sr) \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V14, REG_V14, REG_V15) \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V18, REG_V18, REG_V19) \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V13, REG_V13, REG_V14) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V17, REG_V17, REG_V18) \ - VSLL_VI(REG_V20, REG_V1, s) \ - "slli " CC_T0 ", " CC_B1 ", " #s "\n\t" \ - VSLL_VI(REG_V21, REG_V5, s) \ - "slli " CC_T1 ", " CC_B2 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V9, s) \ - "slli " CC_T2 ", " CC_B3 ", " #s "\n\t" \ - VSLL_VI(REG_V23, REG_V13, s) \ - "slli " CC_T3 ", " CC_B0 ", " #s "\n\t" \ - VSLL_VI(REG_V24, REG_V17, s) \ - VSRL_VI(REG_V1, REG_V1, sr) \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - VSRL_VI(REG_V5, REG_V5, sr) \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - VSRL_VI(REG_V9, REG_V9, sr) \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - VSRL_VI(REG_V13, REG_V13, sr) \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - VSRL_VI(REG_V17, REG_V17, sr) \ - VOR_VV(REG_V1, REG_V1, REG_V20) \ - "or " CC_B1 ", " CC_B1 ", " CC_T0 "\n\t" \ - VOR_VV(REG_V5, REG_V5, REG_V21) \ - "or " CC_B2 ", " CC_B2 ", " CC_T1 "\n\t" \ - VOR_VV(REG_V9, REG_V9, REG_V22) \ - "or " CC_B3 ", " CC_B3 ", " CC_T2 "\n\t" \ - VOR_VV(REG_V13, REG_V13, REG_V23) \ - "or " CC_B0 ", " CC_B0 ", " CC_T3 "\n\t" \ - VOR_VV(REG_V17, REG_V17, REG_V24) - -#elif !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION ) - -#define PART_ROUND_ODD_ABD_5(s, sr) \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V12, REG_V12, REG_V13) \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V16, REG_V16, REG_V17) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - VXOR_VV(REG_V15, REG_V15, REG_V12) \ - "slli " CC_T0 ", " CC_D0 ", " #s "\n\t" \ - VXOR_VV(REG_V19, REG_V19, REG_V16) \ - "slli " CC_T1 ", " CC_D1 ", " #s "\n\t" \ - VROR_VI(REG_V3, sr, REG_V3) \ - "slli " CC_T2 ", " CC_D2 ", " #s "\n\t" \ - VROR_VI(REG_V7, sr, REG_V7) \ - "slli " CC_T3 ", " CC_D3 ", " #s "\n\t" \ - VROR_VI(REG_V11, sr, REG_V11) \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - VROR_VI(REG_V15, sr, REG_V15) \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - VROR_VI(REG_V19, sr, REG_V19) \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T0 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T1 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T2 "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T3 "\n\t" - -#define PART_ROUND_ODD_CDB_5(s, sr) \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V14, REG_V14, REG_V15) \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V18, REG_V18, REG_V19) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V13, REG_V13, REG_V14) \ - "slli " CC_T0 ", " CC_B0 ", " #s "\n\t" \ - VXOR_VV(REG_V17, REG_V17, REG_V18) \ - "slli " CC_T1 ", " CC_B1 ", " #s "\n\t" \ - VROR_VI(REG_V1, sr, REG_V1) \ - "slli " CC_T2 ", " CC_B2 ", " #s "\n\t" \ - VROR_VI(REG_V5, sr, REG_V5) \ - "slli " CC_T3 ", " CC_B3 ", " #s "\n\t" \ - VROR_VI(REG_V9, sr, REG_V9) \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - VROR_VI(REG_V13, sr, REG_V13) \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - VROR_VI(REG_V17, sr, REG_V17) \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T0 "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T1 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T2 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_ABD_5(s, sr) \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V12, REG_V12, REG_V13) \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V16, REG_V16, REG_V17) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - VXOR_VV(REG_V15, REG_V15, REG_V12) \ - "slli " CC_T0 ", " CC_D3 ", " #s "\n\t" \ - VXOR_VV(REG_V19, REG_V19, REG_V16) \ - "slli " CC_T1 ", " CC_D0 ", " #s "\n\t" \ - VROR_VI(REG_V3, sr, REG_V3) \ - "slli " CC_T2 ", " CC_D1 ", " #s "\n\t" \ - VROR_VI(REG_V7, sr, REG_V7) \ - "slli " CC_T3 ", " CC_D2 ", " #s "\n\t" \ - VROR_VI(REG_V11, sr, REG_V11) \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - VROR_VI(REG_V15, sr, REG_V15) \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - VROR_VI(REG_V19, sr, REG_V19) \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T0 "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T1 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T2 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_CDB_5(s, sr) \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V14, REG_V14, REG_V15) \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V18, REG_V18, REG_V19) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V13, REG_V13, REG_V14) \ - "slli " CC_T0 ", " CC_B1 ", " #s "\n\t" \ - VXOR_VV(REG_V17, REG_V17, REG_V18) \ - "slli " CC_T1 ", " CC_B2 ", " #s "\n\t" \ - VROR_VI(REG_V1, sr, REG_V1) \ - "slli " CC_T2 ", " CC_B3 ", " #s "\n\t" \ - VROR_VI(REG_V5, sr, REG_V5) \ - "slli " CC_T3 ", " CC_B0 ", " #s "\n\t" \ - VROR_VI(REG_V9, sr, REG_V9) \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - VROR_VI(REG_V13, sr, REG_V13) \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - VROR_VI(REG_V17, sr, REG_V17) \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T0 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T1 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T2 "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T3 "\n\t" - -#else - -#define PART_ROUND_ODD_ABD_5(s, sr) \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V12, REG_V12, REG_V13) \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V16, REG_V16, REG_V17) \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - VXOR_VV(REG_V15, REG_V15, REG_V12) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - VXOR_VV(REG_V19, REG_V19, REG_V16) \ - VROR_VI(REG_V3, sr, REG_V3) \ - RORIW(REG_S6, REG_S6, sr) \ - VROR_VI(REG_V7, sr, REG_V7) \ - RORIW(REG_S7, REG_S7, sr) \ - VROR_VI(REG_V11, sr, REG_V11) \ - RORIW(REG_S8, REG_S8, sr) \ - VROR_VI(REG_V15, sr, REG_V15) \ - RORIW(REG_S9, REG_S9, sr) \ - VROR_VI(REG_V19, sr, REG_V19) - -#define PART_ROUND_ODD_CDB_5(s, sr) \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V14, REG_V14, REG_V15) \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V18, REG_V18, REG_V19) \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V13, REG_V13, REG_V14) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V17, REG_V17, REG_V18) \ - VROR_VI(REG_V1, sr, REG_V1) \ - RORIW(REG_T3, REG_T3, sr) \ - VROR_VI(REG_V5, sr, REG_V5) \ - RORIW(REG_T4, REG_T4, sr) \ - VROR_VI(REG_V9, sr, REG_V9) \ - RORIW(REG_T5, REG_T5, sr) \ - VROR_VI(REG_V13, sr, REG_V13) \ - RORIW(REG_T6, REG_T6, sr) \ - VROR_VI(REG_V17, sr, REG_V17) - -#define PART_ROUND_EVEN_ABD_5(s, sr) \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V12, REG_V12, REG_V13) \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V16, REG_V16, REG_V17) \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - VXOR_VV(REG_V15, REG_V15, REG_V12) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - VXOR_VV(REG_V19, REG_V19, REG_V16) \ - VROR_VI(REG_V3, sr, REG_V3) \ - RORIW(REG_S9, REG_S9, sr) \ - VROR_VI(REG_V7, sr, REG_V7) \ - RORIW(REG_S6, REG_S6, sr) \ - VROR_VI(REG_V11, sr, REG_V11) \ - RORIW(REG_S7, REG_S7, sr) \ - VROR_VI(REG_V15, sr, REG_V15) \ - RORIW(REG_S8, REG_S8, sr) \ - VROR_VI(REG_V19, sr, REG_V19) - -#define PART_ROUND_EVEN_CDB_5(s, sr) \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V14, REG_V14, REG_V15) \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V18, REG_V18, REG_V19) \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V13, REG_V13, REG_V14) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V17, REG_V17, REG_V18) \ - VROR_VI(REG_V1, sr, REG_V1) \ - RORIW(REG_T4, REG_T4, sr) \ - VROR_VI(REG_V5, sr, REG_V5) \ - RORIW(REG_T5, REG_T5, sr) \ - VROR_VI(REG_V9, sr, REG_V9) \ - RORIW(REG_T6, REG_T6, sr) \ - VROR_VI(REG_V13, sr, REG_V13) \ - RORIW(REG_T3, REG_T3, sr) \ - VROR_VI(REG_V17, sr, REG_V17) - -#endif - -#define QUARTER_ROUND_ODD_5() \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND_ODD_ABD_5(16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND_ODD_CDB_5(12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND_ODD_ABD_5( 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND_ODD_CDB_5( 7, 25) - -#define QUARTER_ROUND_EVEN_5() \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND_EVEN_ABD_5(16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND_EVEN_CDB_5(12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND_EVEN_ABD_5( 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND_EVEN_CDB_5( 7, 25) - -#define SHUFFLE_5(r, t, i) \ - VRGATHER_VV(t + 0, i, r + 0) \ - VRGATHER_VV(t + 1, i, r + 4) \ - VRGATHER_VV(t + 2, i, r + 8) \ - VRGATHER_VV(t + 3, i, r + 12) \ - VRGATHER_VV(t + 4, i, r + 16) \ - VMV_V_V(r + 0, t + 0) \ - VMV_V_V(r + 4, t + 1) \ - VMV_V_V(r + 8, t + 2) \ - VMV_V_V(r + 12, t + 3) \ - VMV_V_V(r + 16, t + 4) - -#define ODD_SHUFFLE_5() \ - /* a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 \ - * => a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 */ \ - SHUFFLE_5(REG_V3, REG_V20, REG_V27) \ - SHUFFLE_5(REG_V1, REG_V20, REG_V25) \ - SHUFFLE_5(REG_V2, REG_V20, REG_V26) - -#define EVEN_SHUFFLE_5() \ - /* a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 \ - * => a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 */ \ - SHUFFLE_5(REG_V3, REG_V20, REG_V25) \ - SHUFFLE_5(REG_V1, REG_V20, REG_V27) \ - SHUFFLE_5(REG_V2, REG_V20, REG_V26) - -static WC_INLINE void wc_chacha_encrypt_384(const word32* input, const byte* m, - byte* c, word32 bytes) -{ - word64 bytes64 = (word64)bytes; - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - /* The layout of used vector registers is: - * v0-v3 - first block - * v4-v7 - second block - * v8-v11 - third block - * v12-v15 - fourth block - * v16-v19 - fifth block - * v20-v24 - temp/message - * v25-v27 - indices for rotating words in vector - * v28-v31 - input - * - * v0 0 1 2 3 - * v1 4 5 6 7 - * v2 8 9 10 11 - * v3 12 13 14 15 - * load CHACHA state with indices placed as shown above - */ - - /* Load state to encrypt */ - "mv t2, %[input]\n\t" - VL4RE32_V(REG_V28, REG_T2) - VID_V(REG_V20) - VSLIDEDOWN_VI(REG_V25, REG_V20, 1) - VSLIDEUP_VI(REG_V25, REG_V20, 3) - VSLIDEDOWN_VI(REG_V26, REG_V20, 2) - VSLIDEUP_VI(REG_V26, REG_V20, 2) - VSLIDEDOWN_VI(REG_V27, REG_V20, 3) - VSLIDEUP_VI(REG_V27, REG_V20, 1) - "\n" - "L_chacha20_riscv_384_outer:\n\t" - /* Move state into regular registers */ - "ld a4, 0(%[input])\n\t" - "ld a6, 8(%[input])\n\t" - "ld t3, 16(%[input])\n\t" - "ld t5, 24(%[input])\n\t" - "ld s2, 32(%[input])\n\t" - "ld s4, 40(%[input])\n\t" - "lw s7, 52(%[input])\n\t" - "ld s8, 56(%[input])\n\t" - "srli a5, a4, 32\n\t" - "srli a7, a6, 32\n\t" - "srli t4, t3, 32\n\t" - "srli t6, t5, 32\n\t" - "srli s3, s2, 32\n\t" - "srli s5, s4, 32\n\t" - "srli s9, s8, 32\n\t" - VMV_X_S(REG_S6, REG_V31) - /* Move state into vector registers */ - VMVR_V(REG_V0, REG_V28, 4) - VMVR_V(REG_V4, REG_V28, 4) - VMVR_V(REG_V8, REG_V28, 4) - VMVR_V(REG_V12, REG_V28, 4) - VMVR_V(REG_V16, REG_V28, 4) - /* Set counter word */ - "addi t1, s6, 1\n\t" - VMV_S_X(REG_V7, REG_T1) - "addi t1, s6, 2\n\t" - VMV_S_X(REG_V11, REG_T1) - "addi t1, s6, 3\n\t" - VMV_S_X(REG_V15, REG_T1) - "addi t1, s6, 4\n\t" - VMV_S_X(REG_V19, REG_T1) - "addi s6, s6, 5\n\t" - /* Set number of odd+even rounds to perform */ - "li a3, 10\n\t" - "\n" - "L_chacha20_riscv_384_loop:\n\t" - /* Odd Round */ - QUARTER_ROUND_ODD_5() - ODD_SHUFFLE_5() - /* Even Round */ - QUARTER_ROUND_EVEN_5() - EVEN_SHUFFLE_5() - "addi a3, a3, -1\n\t" - "bnez a3, L_chacha20_riscv_384_loop\n\t" - /* Load message */ - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V20, REG_T2) - "addi %[m], %[m], 64\n\t" - /* Add back state, XOR in message and store (load next block) */ - /* BLOCK 1 */ - VADD_VV(REG_V0, REG_V0, REG_V28) - VADD_VV(REG_V1, REG_V1, REG_V29) - VADD_VV(REG_V2, REG_V2, REG_V30) - VADD_VV(REG_V3, REG_V3, REG_V31) - VXOR_VV(REG_V0, REG_V0, REG_V20) - VXOR_VV(REG_V1, REG_V1, REG_V21) - VXOR_VV(REG_V2, REG_V2, REG_V22) - VXOR_VV(REG_V3, REG_V3, REG_V23) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V20, REG_T2) - "addi %[m], %[m], 64\n\t" - VMV_X_S(REG_T0, REG_V31) - "mv t2, %[c]\n\t" - VS4R_V(REG_V0, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 2 */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V31, REG_T0) - VADD_VV(REG_V4, REG_V4, REG_V28) - VADD_VV(REG_V5, REG_V5, REG_V29) - VADD_VV(REG_V6, REG_V6, REG_V30) - VADD_VV(REG_V7, REG_V7, REG_V31) - VXOR_VV(REG_V4, REG_V4, REG_V20) - VXOR_VV(REG_V5, REG_V5, REG_V21) - VXOR_VV(REG_V6, REG_V6, REG_V22) - VXOR_VV(REG_V7, REG_V7, REG_V23) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V20, REG_T2) - "addi %[m], %[m], 64\n\t" - "mv t2, %[c]\n\t" - VS4R_V(REG_V4, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 3 */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V31, REG_T0) - VADD_VV(REG_V8, REG_V8, REG_V28) - VADD_VV(REG_V9, REG_V9, REG_V29) - VADD_VV(REG_V10, REG_V10, REG_V30) - VADD_VV(REG_V11, REG_V11, REG_V31) - VXOR_VV(REG_V8, REG_V8, REG_V20) - VXOR_VV(REG_V9, REG_V9, REG_V21) - VXOR_VV(REG_V10, REG_V10, REG_V22) - VXOR_VV(REG_V11, REG_V11, REG_V23) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V20, REG_T2) - "addi %[m], %[m], 64\n\t" - "mv t2, %[c]\n\t" - VS4R_V(REG_V8, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 4 */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V31, REG_T0) - VADD_VV(REG_V12, REG_V12, REG_V28) - VADD_VV(REG_V13, REG_V13, REG_V29) - VADD_VV(REG_V14, REG_V14, REG_V30) - VADD_VV(REG_V15, REG_V15, REG_V31) - VXOR_VV(REG_V12, REG_V12, REG_V20) - VXOR_VV(REG_V13, REG_V13, REG_V21) - VXOR_VV(REG_V14, REG_V14, REG_V22) - VXOR_VV(REG_V15, REG_V15, REG_V23) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V20, REG_T2) - "addi %[m], %[m], 64\n\t" - "mv t2, %[c]\n\t" - VS4R_V(REG_V12, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 5 */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V31, REG_T0) - VADD_VV(REG_V16, REG_V16, REG_V28) - VADD_VV(REG_V17, REG_V17, REG_V29) - VADD_VV(REG_V18, REG_V18, REG_V30) - VADD_VV(REG_V19, REG_V19, REG_V31) - VXOR_VV(REG_V16, REG_V16, REG_V20) - VXOR_VV(REG_V17, REG_V17, REG_V21) - VXOR_VV(REG_V18, REG_V18, REG_V22) - VXOR_VV(REG_V19, REG_V19, REG_V23) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V20, REG_T2) - "addi %[m], %[m], 64\n\t" - "mv t2, %[c]\n\t" - VS4R_V(REG_V16, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 6 */ - /* Move regular registers into vector registers for adding and xor */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V0, REG_A4) - VMV_S_X(REG_V1, REG_T3) - VMV_S_X(REG_V2, REG_S2) - VMV_S_X(REG_V3, REG_S6) - VMV_S_X(REG_V4, REG_A5) - VMV_S_X(REG_V5, REG_T4) - VMV_S_X(REG_V6, REG_S3) - VMV_S_X(REG_V7, REG_S7) - VSLIDEUP_VI(REG_V0, REG_V4, 1) - VSLIDEUP_VI(REG_V1, REG_V5, 1) - VSLIDEUP_VI(REG_V2, REG_V6, 1) - VSLIDEUP_VI(REG_V3, REG_V7, 1) - VMV_S_X(REG_V4, REG_A6) - VMV_S_X(REG_V5, REG_T5) - VMV_S_X(REG_V6, REG_S4) - VMV_S_X(REG_V7, REG_S8) - VSLIDEUP_VI(REG_V0, REG_V4, 2) - VSLIDEUP_VI(REG_V1, REG_V5, 2) - VSLIDEUP_VI(REG_V2, REG_V6, 2) - VSLIDEUP_VI(REG_V3, REG_V7, 2) - VMV_S_X(REG_V4, REG_A7) - VMV_S_X(REG_V5, REG_T6) - VMV_S_X(REG_V6, REG_S5) - VMV_S_X(REG_V7, REG_S9) - VSLIDEUP_VI(REG_V0, REG_V4, 3) - VSLIDEUP_VI(REG_V1, REG_V5, 3) - VSLIDEUP_VI(REG_V2, REG_V6, 3) - VSLIDEUP_VI(REG_V3, REG_V7, 3) - VMV_S_X(REG_V31, REG_T0) - /* Add back state, XOR in message and store */ - VADD_VV(REG_V0, REG_V0, REG_V28) - VADD_VV(REG_V1, REG_V1, REG_V29) - VADD_VV(REG_V2, REG_V2, REG_V30) - VADD_VV(REG_V3, REG_V3, REG_V31) - VXOR_VV(REG_V0, REG_V0, REG_V20) - VXOR_VV(REG_V1, REG_V1, REG_V21) - VXOR_VV(REG_V2, REG_V2, REG_V22) - VXOR_VV(REG_V3, REG_V3, REG_V23) - "mv t2, %[c]\n\t" - VS4R_V(REG_V0, REG_T2) - "addi %[c], %[c], 64\n\t" - "addi %[bytes], %[bytes], -384\n\t" - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V31, REG_T0) - "bnez %[bytes], L_chacha20_riscv_384_outer\n\t" - : [m] "+r" (m), [c] "+r" (c), [bytes] "+r" (bytes64) - : [input] "r" (input) - : "memory", "t0", "t1", "t2", "s1", "a3", - "t3", "t4", "t5", "t6", - "a4", "a5", "a6", "a7", - "s2", "s3", "s4", "s5", - "s6", "s7", "s8", "s9" - ); -} - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - -#define PART_ROUND_ODD_ABD(s, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - VSLL_VI(REG_V20, REG_V3, s) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - VSLL_VI(REG_V21, REG_V7, s) \ - "slli " CC_T0 ", " CC_D0 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V11, s) \ - "slli " CC_T1 ", " CC_D1 ", " #s "\n\t" \ - VSRL_VI(REG_V3, REG_V3, sr) \ - "slli " CC_T2 ", " CC_D2 ", " #s "\n\t" \ - VSRL_VI(REG_V7, REG_V7, sr) \ - "slli " CC_T3 ", " CC_D3 ", " #s "\n\t" \ - VSRL_VI(REG_V11, REG_V11, sr) \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - VOR_VV(REG_V3, REG_V3, REG_V20) \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - VOR_VV(REG_V7, REG_V7, REG_V21) \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - VOR_VV(REG_V11, REG_V11, REG_V22) \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T0 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T1 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T2 "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T3 "\n\t" - -#define PART_ROUND_ODD_CDB(s, sr) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - VSLL_VI(REG_V20, REG_V1, s) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - VSLL_VI(REG_V21, REG_V5, s) \ - "slli " CC_T0 ", " CC_B0 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V9, s) \ - "slli " CC_T1 ", " CC_B1 ", " #s "\n\t" \ - VSRL_VI(REG_V1, REG_V1, sr) \ - "slli " CC_T2 ", " CC_B2 ", " #s "\n\t" \ - VSRL_VI(REG_V5, REG_V5, sr) \ - "slli " CC_T3 ", " CC_B3 ", " #s "\n\t" \ - VSRL_VI(REG_V9, REG_V9, sr) \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - VOR_VV(REG_V1, REG_V1, REG_V20) \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - VOR_VV(REG_V5, REG_V5, REG_V21) \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - VOR_VV(REG_V9, REG_V9, REG_V22) \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T0 "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T1 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T2 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_ABD(s, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - VSLL_VI(REG_V20, REG_V3, s) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - VSLL_VI(REG_V21, REG_V7, s) \ - "slli " CC_T0 ", " CC_D3 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V11, s) \ - "slli " CC_T1 ", " CC_D0 ", " #s "\n\t" \ - VSRL_VI(REG_V3, REG_V3, sr) \ - "slli " CC_T2 ", " CC_D1 ", " #s "\n\t" \ - VSRL_VI(REG_V7, REG_V7, sr) \ - "slli " CC_T3 ", " CC_D2 ", " #s "\n\t" \ - VSRL_VI(REG_V11, REG_V11, sr) \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - VOR_VV(REG_V3, REG_V3, REG_V20) \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - VOR_VV(REG_V7, REG_V7, REG_V21) \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - VOR_VV(REG_V11, REG_V11, REG_V22) \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T0 "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T1 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T2 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_CDB(s, sr) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - VSLL_VI(REG_V20, REG_V1, s) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - VSLL_VI(REG_V21, REG_V5, s) \ - "slli " CC_T0 ", " CC_B1 ", " #s "\n\t" \ - VSLL_VI(REG_V22, REG_V9, s) \ - "slli " CC_T1 ", " CC_B2 ", " #s "\n\t" \ - VSRL_VI(REG_V1, REG_V1, sr) \ - "slli " CC_T2 ", " CC_B3 ", " #s "\n\t" \ - VSRL_VI(REG_V5, REG_V5, sr) \ - "slli " CC_T3 ", " CC_B0 ", " #s "\n\t" \ - VSRL_VI(REG_V9, REG_V9, sr) \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - VOR_VV(REG_V1, REG_V1, REG_V20) \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - VOR_VV(REG_V5, REG_V5, REG_V21) \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - VOR_VV(REG_V9, REG_V9, REG_V22) \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T0 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T1 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T2 "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T3 "\n\t" - -#elif !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION ) - -#define PART_ROUND_ODD_ABD(s, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - VROR_VI(REG_V3, sr, REG_V3) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - VROR_VI(REG_V7, sr, REG_V7) \ - "slli " CC_T0 ", " CC_D0 ", " #s "\n\t" \ - VROR_VI(REG_V11, sr, REG_V11) \ - "slli " CC_T1 ", " CC_D1 ", " #s "\n\t" \ - "slli " CC_T2 ", " CC_D2 ", " #s "\n\t" \ - "slli " CC_T3 ", " CC_D3 ", " #s "\n\t" \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T0 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T1 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T2 "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T3 "\n\t" - -#define PART_ROUND_ODD_CDB(s, sr) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - VROR_VI(REG_V1, sr, REG_V1) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - VROR_VI(REG_V5, sr, REG_V5) \ - "slli " CC_T0 ", " CC_B0 ", " #s "\n\t" \ - VROR_VI(REG_V9, sr, REG_V9) \ - "slli " CC_T1 ", " CC_B1 ", " #s "\n\t" \ - "slli " CC_T2 ", " CC_B2 ", " #s "\n\t" \ - "slli " CC_T3 ", " CC_B3 ", " #s "\n\t" \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T0 "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T1 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T2 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_ABD(s, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - VROR_VI(REG_V3, sr, REG_V3) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - VROR_VI(REG_V7, sr, REG_V7) \ - "slli " CC_T0 ", " CC_D3 ", " #s "\n\t" \ - VROR_VI(REG_V11, sr, REG_V11) \ - "slli " CC_T1 ", " CC_D0 ", " #s "\n\t" \ - "slli " CC_T2 ", " CC_D1 ", " #s "\n\t" \ - "slli " CC_T3 ", " CC_D2 ", " #s "\n\t" \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T0 "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T1 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T2 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_CDB(s, sr) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - VROR_VI(REG_V1, sr, REG_V1) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - VROR_VI(REG_V5, sr, REG_V5) \ - "slli " CC_T0 ", " CC_B1 ", " #s "\n\t" \ - VROR_VI(REG_V9, sr, REG_V9) \ - "slli " CC_T1 ", " CC_B2 ", " #s "\n\t" \ - "slli " CC_T2 ", " CC_B3 ", " #s "\n\t" \ - "slli " CC_T3 ", " CC_B0 ", " #s "\n\t" \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T0 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T1 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T2 "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T3 "\n\t" - -#else - -#define PART_ROUND_ODD_ABD(s, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - VROR_VI(REG_V3, sr, REG_V3) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - VROR_VI(REG_V7, sr, REG_V7) \ - RORIW(REG_S6, REG_S6, sr) \ - VROR_VI(REG_V11, sr, REG_V11) \ - RORIW(REG_S7, REG_S7, sr) \ - RORIW(REG_S8, REG_S8, sr) \ - RORIW(REG_S9, REG_S9, sr) - -#define PART_ROUND_ODD_CDB(s, sr) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - VROR_VI(REG_V1, sr, REG_V1) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - VROR_VI(REG_V5, sr, REG_V5) \ - RORIW(REG_T3, REG_T3, sr) \ - VROR_VI(REG_V9, sr, REG_V9) \ - RORIW(REG_T4, REG_T4, sr) \ - RORIW(REG_T5, REG_T5, sr) \ - RORIW(REG_T6, REG_T6, sr) - -#define PART_ROUND_EVEN_ABD(s, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - VADD_VV(REG_V0, REG_V0, REG_V1) \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - VADD_VV(REG_V4, REG_V4, REG_V5) \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - VADD_VV(REG_V8, REG_V8, REG_V9) \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - VXOR_VV(REG_V3, REG_V3, REG_V0) \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - VXOR_VV(REG_V7, REG_V7, REG_V4) \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - VXOR_VV(REG_V11, REG_V11, REG_V8) \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - VROR_VI(REG_V3, sr, REG_V3) \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - VROR_VI(REG_V7, sr, REG_V7) \ - RORIW(REG_S9, REG_S9, sr) \ - VROR_VI(REG_V11, sr, REG_V11) \ - RORIW(REG_S6, REG_S6, sr) \ - RORIW(REG_S7, REG_S7, sr) \ - RORIW(REG_S8, REG_S8, sr) - -#define PART_ROUND_EVEN_CDB(s, sr) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - VADD_VV(REG_V2, REG_V2, REG_V3) \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - VADD_VV(REG_V6, REG_V6, REG_V7) \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - VADD_VV(REG_V10, REG_V10, REG_V11) \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - VXOR_VV(REG_V1, REG_V1, REG_V2) \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - VXOR_VV(REG_V5, REG_V5, REG_V6) \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - VXOR_VV(REG_V9, REG_V9, REG_V10) \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - VROR_VI(REG_V1, sr, REG_V1) \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - VROR_VI(REG_V5, sr, REG_V5) \ - "slli " CC_T0 ", " CC_B1 ", " #s "\n\t" \ - RORIW(REG_T4, REG_T4, sr) \ - VROR_VI(REG_V9, sr, REG_V9) \ - RORIW(REG_T5, REG_T5, sr) \ - RORIW(REG_T6, REG_T6, sr) \ - RORIW(REG_T3, REG_T3, sr) - -#endif - -#define QUARTER_ROUND_ODD_4() \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND_ODD_ABD(16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND_ODD_CDB(12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND_ODD_ABD( 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND_ODD_CDB( 7, 25) - -#define QUARTER_ROUND_EVEN_4() \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND_EVEN_ABD(16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND_EVEN_CDB(12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND_EVEN_ABD( 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND_EVEN_CDB( 7, 25) - -#define SHUFFLE_4(r, t, i) \ - VRGATHER_VV(t + 0, i, r + 0) \ - VRGATHER_VV(t + 1, i, r + 4) \ - VRGATHER_VV(t + 2, i, r + 8) \ - VMV_V_V(r + 0, t + 0) \ - VMV_V_V(r + 4, t + 1) \ - VMV_V_V(r + 8, t + 2) - -#define ODD_SHUFFLE_4() \ - /* a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 \ - * => a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 */ \ - SHUFFLE_4(REG_V3, REG_V20, REG_V25) \ - SHUFFLE_4(REG_V1, REG_V20, REG_V23) \ - SHUFFLE_4(REG_V2, REG_V20, REG_V24) - -#define EVEN_SHUFFLE_4() \ - /* a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 \ - * => a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 */ \ - SHUFFLE_4(REG_V3, REG_V20, REG_V23) \ - SHUFFLE_4(REG_V1, REG_V20, REG_V25) \ - SHUFFLE_4(REG_V2, REG_V20, REG_V24) - -/** - * Converts word into bytes with rotations having been done. - */ -static WC_INLINE int wc_chacha_encrypt_256(const word32* input, const byte* m, - byte* c) -{ - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - /* The layout of used vector registers is: - * v0-v3 - first block - * v4-v7 - second block - * v8-v11 - third block - * v12-v15 - message - * v16-v19 - input - * v20-v22 - temp - * v23-v25 - indices for rotating words in vector - * - * v0 0 1 2 3 - * v1 4 5 6 7 - * v2 8 9 10 11 - * v3 12 13 14 15 - * load CHACHA state with indices placed as shown above - */ - - /* Load state to encrypt */ - "mv t2, %[input]\n\t" - VL4RE32_V(REG_V16, REG_T2) - VID_V(REG_V20) - VSLIDEDOWN_VI(REG_V23, REG_V20, 1) - VSLIDEUP_VI(REG_V23, REG_V20, 3) - VSLIDEDOWN_VI(REG_V24, REG_V20, 2) - VSLIDEUP_VI(REG_V24, REG_V20, 2) - VSLIDEDOWN_VI(REG_V25, REG_V20, 3) - VSLIDEUP_VI(REG_V25, REG_V20, 1) - /* Move state into regular registers */ - "ld a4, 0(%[input])\n\t" - "ld a6, 8(%[input])\n\t" - "ld t3, 16(%[input])\n\t" - "ld t5, 24(%[input])\n\t" - "ld s2, 32(%[input])\n\t" - "ld s4, 40(%[input])\n\t" - "ld s6, 48(%[input])\n\t" - "ld s8, 56(%[input])\n\t" - "srli a5, a4, 32\n\t" - "srli a7, a6, 32\n\t" - "srli t4, t3, 32\n\t" - "srli t6, t5, 32\n\t" - "srli s3, s2, 32\n\t" - "srli s5, s4, 32\n\t" - "srli s7, s6, 32\n\t" - "srli s9, s8, 32\n\t" - /* Move state into vector registers */ - VMVR_V(REG_V0, REG_V16, 4) - "addi t0, s6, 1\n\t" - VMVR_V(REG_V4, REG_V16, 4) - "addi t1, s6, 2\n\t" - VMVR_V(REG_V8, REG_V16, 4) - "addi s6, s6, 3\n\t" - /* Set counter word */ - VMV_S_X(REG_V7, REG_T0) - VMV_S_X(REG_V11, REG_T1) - /* Set number of odd+even rounds to perform */ - "li a3, 10\n\t" - "\n" - "L_chacha20_riscv_256_loop:\n\t" - /* Odd Round */ - QUARTER_ROUND_ODD_4() - ODD_SHUFFLE_4() - "addi a3, a3, -1\n\t" - /* Even Round */ - QUARTER_ROUND_EVEN_4() - EVEN_SHUFFLE_4() - "bnez a3, L_chacha20_riscv_256_loop\n\t" - /* Load message */ - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V12, REG_T2) - "addi %[m], %[m], 64\n\t" - /* Add back state, XOR in message and store (load next block) */ - /* BLOCK 1 */ - VADD_VV(REG_V0, REG_V0, REG_V16) - VADD_VV(REG_V1, REG_V1, REG_V17) - VADD_VV(REG_V2, REG_V2, REG_V18) - VADD_VV(REG_V3, REG_V3, REG_V19) - VXOR_VV(REG_V0, REG_V0, REG_V12) - VXOR_VV(REG_V1, REG_V1, REG_V13) - VXOR_VV(REG_V2, REG_V2, REG_V14) - VXOR_VV(REG_V3, REG_V3, REG_V15) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V12, REG_T2) - "addi %[m], %[m], 64\n\t" - VMV_X_S(REG_T0, REG_V19) - "mv t2, %[c]\n\t" - VS4R_V(REG_V0, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 2 */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V19, REG_T0) - VADD_VV(REG_V4, REG_V4, REG_V16) - VADD_VV(REG_V5, REG_V5, REG_V17) - VADD_VV(REG_V6, REG_V6, REG_V18) - VADD_VV(REG_V7, REG_V7, REG_V19) - VXOR_VV(REG_V4, REG_V4, REG_V12) - VXOR_VV(REG_V5, REG_V5, REG_V13) - VXOR_VV(REG_V6, REG_V6, REG_V14) - VXOR_VV(REG_V7, REG_V7, REG_V15) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V12, REG_T2) - "addi %[m], %[m], 64\n\t" - "mv t2, %[c]\n\t" - VS4R_V(REG_V4, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 3 */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V19, REG_T0) - VADD_VV(REG_V8, REG_V8, REG_V16) - VADD_VV(REG_V9, REG_V9, REG_V17) - VADD_VV(REG_V10, REG_V10, REG_V18) - VADD_VV(REG_V11, REG_V11, REG_V19) - VXOR_VV(REG_V8, REG_V8, REG_V12) - VXOR_VV(REG_V9, REG_V9, REG_V13) - VXOR_VV(REG_V10, REG_V10, REG_V14) - VXOR_VV(REG_V11, REG_V11, REG_V15) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V12, REG_T2) - "mv t2, %[c]\n\t" - VS4R_V(REG_V8, REG_T2) - "addi %[c], %[c], 64\n\t" - /* BLOCK 4 */ - /* Move regular registers into vector registers for adding and xor */ - "addi t0, t0, 1\n\t" - VMV_S_X(REG_V0, REG_A4) - VMV_S_X(REG_V1, REG_T3) - VMV_S_X(REG_V2, REG_S2) - VMV_S_X(REG_V3, REG_S6) - VMV_S_X(REG_V4, REG_A5) - VMV_S_X(REG_V5, REG_T4) - VMV_S_X(REG_V6, REG_S3) - VMV_S_X(REG_V7, REG_S7) - VSLIDEUP_VI(REG_V0, REG_V4, 1) - VSLIDEUP_VI(REG_V1, REG_V5, 1) - VSLIDEUP_VI(REG_V2, REG_V6, 1) - VSLIDEUP_VI(REG_V3, REG_V7, 1) - VMV_S_X(REG_V4, REG_A6) - VMV_S_X(REG_V5, REG_T5) - VMV_S_X(REG_V6, REG_S4) - VMV_S_X(REG_V7, REG_S8) - VSLIDEUP_VI(REG_V0, REG_V4, 2) - VSLIDEUP_VI(REG_V1, REG_V5, 2) - VSLIDEUP_VI(REG_V2, REG_V6, 2) - VSLIDEUP_VI(REG_V3, REG_V7, 2) - VMV_S_X(REG_V4, REG_A7) - VMV_S_X(REG_V5, REG_T6) - VMV_S_X(REG_V6, REG_S5) - VMV_S_X(REG_V7, REG_S9) - VSLIDEUP_VI(REG_V0, REG_V4, 3) - VSLIDEUP_VI(REG_V1, REG_V5, 3) - VSLIDEUP_VI(REG_V2, REG_V6, 3) - VSLIDEUP_VI(REG_V3, REG_V7, 3) - VMV_S_X(REG_V19, REG_T0) - /* Add back state, XOR in message and store */ - VADD_VV(REG_V0, REG_V0, REG_V16) - VADD_VV(REG_V1, REG_V1, REG_V17) - VADD_VV(REG_V2, REG_V2, REG_V18) - VADD_VV(REG_V3, REG_V3, REG_V19) - VXOR_VV(REG_V0, REG_V0, REG_V12) - VXOR_VV(REG_V1, REG_V1, REG_V13) - VXOR_VV(REG_V2, REG_V2, REG_V14) - VXOR_VV(REG_V3, REG_V3, REG_V15) - "mv t2, %[c]\n\t" - VS4R_V(REG_V0, REG_T2) - : [m] "+r" (m), [c] "+r" (c) - : [input] "r" (input) - : "memory", "t0", "t1", "t2", "s1", "a3", - "t3", "t4", "t5", "t6", - "a4", "a5", "a6", "a7", - "s2", "s3", "s4", "s5", - "s6", "s7", "s8", "s9" - ); - return CHACHA_CHUNK_BYTES * 4; -} - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - -#define PART_ROUND_2(a, b, d, t, a2, b2, d2, t2, sl, sr) \ - VADD_VV(a, a, b) \ - VADD_VV(a2, a2, b2) \ - VXOR_VV(d, d, a) \ - VXOR_VV(d2, d2, a2) \ - VSLL_VI(t, d, sl) \ - VSLL_VI(t2, d2, sl) \ - VSRL_VI(d, d, sr) \ - VSRL_VI(d2, d2, sr) \ - VOR_VV(d, d, t) \ - VOR_VV(d2, d2, t2) - -#else - -#define PART_ROUND_2(a, b, d, t, a2, b2, d2, t2, sl, sr) \ - VADD_VV(a, a, b) \ - VADD_VV(a2, a2, b2) \ - VXOR_VV(d, d, a) \ - VXOR_VV(d2, d2, a2) \ - VROR_VI(d, sr, d) \ - VROR_VI(d2, sr, d2) - -#endif - -#define QUARTER_ROUND_2(a, b, c, d, t, a2, b2, c2, d2, t2) \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND_2(a, b, d, t, a2, b2, d2, t2, 16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND_2(c, d, b, t, c2, d2, b2, t2, 12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND_2(a, b, d, t, a2, b2, d2, t2, 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND_2(c, d, b, t, c2, d2, b2, t2, 7, 25) - -#define ODD_SHUFFLE_2(b, c, d, t, b2, c2, d2, t2) \ - /* a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 \ - * => a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 */ \ - VRGATHER_VV(t, REG_V25, d) \ - VRGATHER_VV(t2, REG_V25, d2) \ - VMV_V_V(d, t) \ - VMV_V_V(d2, t2) \ - VRGATHER_VV(t, REG_V23, b) \ - VRGATHER_VV(t2, REG_V23, b2) \ - VMV_V_V(b, t) \ - VMV_V_V(b2, t2) \ - VRGATHER_VV(t, REG_V24, c) \ - VRGATHER_VV(t2, REG_V24, c2) \ - VMV_V_V(c, t) \ - VMV_V_V(c2, t2) - -#define EVEN_SHUFFLE_2(b, c, d, t, b2, c2, d2, t2) \ - /* a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 \ - * => a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 */ \ - VRGATHER_VV(t, REG_V23, d) \ - VRGATHER_VV(t2, REG_V23, d2) \ - VMV_V_V(d, t) \ - VMV_V_V(d2, t2) \ - VRGATHER_VV(t, REG_V25, b) \ - VRGATHER_VV(t2, REG_V25, b2) \ - VMV_V_V(b, t) \ - VMV_V_V(b2, t2) \ - VRGATHER_VV(t, REG_V24, c) \ - VRGATHER_VV(t2, REG_V24, c2) \ - VMV_V_V(c, t) \ - VMV_V_V(c2, t2) - - -static WC_INLINE int wc_chacha_encrypt_128(const word32* input, const byte* m, - byte* c) -{ - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - /* The layout of used vector registers is: - * v0-v3 - first block - * v4-v7 - second block - * v12-v15 - message - * v16-v19 - input - * v20-v22 - temp - * v23-v25 - indices for rotating words in vector - * - * v0 0 1 2 3 - * v1 4 5 6 7 - * v2 8 9 10 11 - * v3 12 13 14 15 - * load CHACHA state with indices placed as shown above - */ - - /* Load incrementer register to modify counter */ - "mv t2, %[L_chacha20_vec_inc_first_word]\n\t" - VL1RE32_V(REG_V22, REG_T2) - VID_V(REG_V20) - VSLIDEDOWN_VI(REG_V23, REG_V20, 1) - VSLIDEUP_VI(REG_V23, REG_V20, 3) - VSLIDEDOWN_VI(REG_V24, REG_V20, 2) - VSLIDEUP_VI(REG_V24, REG_V20, 2) - VSLIDEDOWN_VI(REG_V25, REG_V20, 3) - VSLIDEUP_VI(REG_V25, REG_V20, 1) - /* Load state to encrypt */ - "mv t2, %[input]\n\t" - VL4RE32_V(REG_V16, REG_T2) - /* Load message */ - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V12, REG_T2) - "addi %[m], %[m], 64\n\t" - /* Move state into vector registers */ - VMVR_V(REG_V0, REG_V16, 4) - VMVR_V(REG_V4, REG_V16, 4) - /* Add counter word */ - VADD_VV(REG_V7, REG_V7, REG_V22) - /* Set number of odd+even rounds to perform */ - "li t0, 10\n\t" - "\n" - "L_chacha20_riscv_128_loop:\n\t" - QUARTER_ROUND_2(REG_V0, REG_V1, REG_V2, REG_V3, REG_V20, - REG_V4, REG_V5, REG_V6, REG_V7, REG_V21) - ODD_SHUFFLE_2(REG_V1, REG_V2, REG_V3, REG_V20, - REG_V5, REG_V6, REG_V7, REG_V21) - QUARTER_ROUND_2(REG_V0, REG_V1, REG_V2, REG_V3, REG_V20, - REG_V4, REG_V5, REG_V6, REG_V7, REG_V21) - EVEN_SHUFFLE_2(REG_V1, REG_V2, REG_V3, REG_V20, - REG_V5, REG_V6, REG_V7, REG_V21) - "addi t0, t0, -1\n\t" - "bnez t0, L_chacha20_riscv_128_loop\n\t" - /* Add back state, XOR in message and store (load next block) */ - VADD_VV(REG_V0, REG_V0, REG_V16) - VADD_VV(REG_V1, REG_V1, REG_V17) - VADD_VV(REG_V2, REG_V2, REG_V18) - VADD_VV(REG_V3, REG_V3, REG_V19) - VXOR_VV(REG_V0, REG_V0, REG_V12) - VXOR_VV(REG_V1, REG_V1, REG_V13) - VXOR_VV(REG_V2, REG_V2, REG_V14) - VXOR_VV(REG_V3, REG_V3, REG_V15) - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V12, REG_T2) - "mv t2, %[c]\n\t" - VS4R_V(REG_V0, REG_T2) - "addi %[c], %[c], 64\n\t" - VADD_VV(REG_V19, REG_V19, REG_V22) - VADD_VV(REG_V4, REG_V4, REG_V16) - VADD_VV(REG_V5, REG_V5, REG_V17) - VADD_VV(REG_V6, REG_V6, REG_V18) - VADD_VV(REG_V7, REG_V7, REG_V19) - VXOR_VV(REG_V4, REG_V4, REG_V12) - VXOR_VV(REG_V5, REG_V5, REG_V13) - VXOR_VV(REG_V6, REG_V6, REG_V14) - VXOR_VV(REG_V7, REG_V7, REG_V15) - "mv t2, %[c]\n\t" - VS4R_V(REG_V4, REG_T2) - : [m] "+r" (m), [c] "+r" (c) - : [input] "r" (input), - [L_chacha20_vec_inc_first_word] "r" (L_chacha20_vec_inc_first_word) - : "memory", "t0", "t1", "t2" - ); - return CHACHA_CHUNK_BYTES * 2; -} - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - -#define PART_ROUND(a, b, d, t, sl, sr) \ - VADD_VV(a, a, b) \ - VXOR_VV(d, d, a) \ - VSLL_VI(t, d, sl) \ - VSRL_VI(d, d, sr) \ - VOR_VV(d, d, t) - -#else - -#define PART_ROUND(a, b, d, t, sl, sr) \ - VADD_VV(a, a, b) \ - VXOR_VV(d, d, a) \ - VROR_VI(d, sr, d) - -#endif - -#define QUARTER_ROUND(a, b, c, d, t) \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND(a, b, d, t, 16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND(c, d, b, t, 12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND(a, b, d, t, 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND(c, d, b, t, 7, 25) - -#define ODD_SHUFFLE(b, c, d, t) \ - /* a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 \ - * => a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 */ \ - VSLIDEDOWN_VI(t, d, 3) \ - VSLIDEUP_VI(t, d, 1) \ - VMV_V_V(d, t) \ - VSLIDEDOWN_VI(t, b, 1) \ - VSLIDEUP_VI(t, b, 3) \ - VMV_V_V(b, t) \ - VSLIDEDOWN_VI(t, c, 2) \ - VSLIDEUP_VI(t, c, 2) \ - VMV_V_V(c, t) - -#define EVEN_SHUFFLE(b, c, d, t) \ - /* a=0,1,2,3; b=5,6,7,4; c=10,11,8,9; d=15,12,13,14 \ - * => a=0,1,2,3; b=4,5,6,7; c=8,9,10,11; d=12,13,14,15 */ \ - VSLIDEDOWN_VI(t, d, 1) \ - VSLIDEUP_VI(t, d, 3) \ - VMV_V_V(d, t) \ - VSLIDEDOWN_VI(t, b, 3) \ - VSLIDEUP_VI(t, b, 1) \ - VMV_V_V(b, t) \ - VSLIDEDOWN_VI(t, c, 2) \ - VSLIDEUP_VI(t, c, 2) \ - VMV_V_V(c, t) - -#define EIGHT_QUARTER_ROUNDS(a, b, c, d, t) \ - /* Odd Round */ \ - QUARTER_ROUND(a, b, c, d, t) \ - ODD_SHUFFLE(b, c, d, t) \ - /* Even Round */ \ - QUARTER_ROUND(a, b, c, d, t) \ - EVEN_SHUFFLE(b, c, d, t) - -static WC_INLINE void wc_chacha_encrypt_64(const word32* input, const byte* m, - byte* c, word32 bytes, byte* over) -{ - word64 bytes64 = (word64)bytes; - - __asm__ __volatile__ ( - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - /* The layout of used vector registers is: - * v0-v3 - block - * v4-v7 - message - * v8-v11 - input - * v12 - temp - * - * v0 0 1 2 3 - * v1 4 5 6 7 - * v2 8 9 10 11 - * v3 12 13 14 15 - * load CHACHA state with indices placed as shown above - */ - - /* Load incrementer register to modify counter */ - "mv t2, %[L_chacha20_vec_inc_first_word]\n\t" - VL1RE32_V(REG_V13, REG_T2) - /* Load state to encrypt */ - "mv t2, %[input]\n\t" - VL4RE32_V(REG_V8, REG_T2) - "\n" - "L_chacha20_riscv_64_loop:\n\t" - /* Move state into vector registers */ - VMVR_V(REG_V0, REG_V8, 4) - /* Add counter word */ - /* Odd Round */ - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - EIGHT_QUARTER_ROUNDS(REG_V0, REG_V1, REG_V2, REG_V3, REG_V12) - "addi t1, %[bytes], -64\n\t" - /* Add back state */ - VADD_VV(REG_V0, REG_V0, REG_V8) - VADD_VV(REG_V1, REG_V1, REG_V9) - VADD_VV(REG_V2, REG_V2, REG_V10) - VADD_VV(REG_V3, REG_V3, REG_V11) - "bltz t1, L_chacha20_riscv_64_lt_64\n\t" - "mv t2, %[m]\n\t" - VL4RE32_V(REG_V4, REG_T2) - VXOR_VV(REG_V4, REG_V4, REG_V0) - VXOR_VV(REG_V5, REG_V5, REG_V1) - VXOR_VV(REG_V6, REG_V6, REG_V2) - VXOR_VV(REG_V7, REG_V7, REG_V3) - "mv t2, %[c]\n\t" - VS4R_V(REG_V4, REG_T2) - "addi %[bytes], %[bytes], -64\n\t" - "addi %[c], %[c], 64\n\t" - "addi %[m], %[m], 64\n\t" - VADD_VV(REG_V11, REG_V11, REG_V13) - "bnez %[bytes], L_chacha20_riscv_64_loop\n\t" - "beqz %[bytes], L_chacha20_riscv_64_done\n\t" - "\n" - "L_chacha20_riscv_64_lt_64:\n\t" - "mv t2, %[over]\n\t" - "addi t1, %[bytes], -32\n\t" - VS4R_V(REG_V0, REG_T2) - - "bltz t1, L_chacha20_riscv_64_lt_32\n\t" - "mv t2, %[m]\n\t" - VL2RE32_V(REG_V4, REG_T2) - VXOR_VV(REG_V4, REG_V4, REG_V0) - VXOR_VV(REG_V5, REG_V5, REG_V1) - "mv t2, %[c]\n\t" - VS2R_V(REG_V4, REG_T2) - "addi %[bytes], %[bytes], -32\n\t" - "addi %[c], %[c], 32\n\t" - "addi %[m], %[m], 32\n\t" - "beqz %[bytes], L_chacha20_riscv_64_done\n\t" - VMVR_V(REG_V0, REG_V2, 2) - "\n" - "L_chacha20_riscv_64_lt_32:\n\t" - "addi t1, %[bytes], -16\n\t" - "bltz t1, L_chacha20_riscv_64_lt_16\n\t" - "mv t2, %[m]\n\t" - VL1RE32_V(REG_V4, REG_T2) - VXOR_VV(REG_V4, REG_V4, REG_V0) - "mv t2, %[c]\n\t" - VS1R_V(REG_V4, REG_T2) - "addi %[bytes], %[bytes], -16\n\t" - "addi %[c], %[c], 16\n\t" - "addi %[m], %[m], 16\n\t" - "beqz %[bytes], L_chacha20_riscv_64_done\n\t" - VMV_V_V(REG_V0, REG_V1) - "\n" - "L_chacha20_riscv_64_lt_16:\n\t" - "addi t1, %[bytes], -8\n\t" - "bltz t1, L_chacha20_riscv_64_lt_8\n\t" - VSETIVLI(REG_X0, 2, 1, 1, 0b011, 0b000) - VMV_X_S(REG_T0, REG_V0) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - UNALIGNED_LD(t1, 0, %[m], t2) - "xor t1, t1, t0\n\t" - UNALIGNED_SD(t1, 0, %[c], t2) - "addi %[bytes], %[bytes], -8\n\t" - "addi %[c], %[c], 8\n\t" - "addi %[m], %[m], 8\n\t" - "beqz %[bytes], L_chacha20_riscv_64_done\n\t" - VSLIDEDOWN_VI(REG_V0, REG_V0, 2) - "\n" - "L_chacha20_riscv_64_lt_8:\n\t" - "addi %[bytes], %[bytes], -1\n\t" - VSETIVLI(REG_X0, 2, 1, 1, 0b011, 0b000) - VMV_X_S(REG_T0, REG_V0) - VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) - "\n" - "L_chacha20_riscv_64_loop_lt_8:\n\t" - "addi %[bytes], %[bytes], -1\n\t" - "lb t1, (%[m])\n\t" - "addi %[m], %[m], 1\n\t" - "xor t1, t1, t0\n\t" - "sb t1, (%[c])\n\t" - "addi %[c], %[c], 1\n\t" - "srli t0, t0, 8\n\t" - "bgez %[bytes], L_chacha20_riscv_64_loop_lt_8\n\t" - "\n" - "L_chacha20_riscv_64_done:\n\t" - : [m] "+r" (m), [c] "+r" (c), [bytes] "+r" (bytes64) - : [input] "r" (input), [over] "r" (over), - [L_chacha20_vec_inc_first_word] "r" (L_chacha20_vec_inc_first_word) - : "memory", "t0", "t1", "t2" - ); -} - -/** - * Encrypt a stream of bytes - */ -static void wc_chacha_encrypt_bytes(ChaCha* ctx, const byte* m, byte* c, - word32 bytes) -{ - int processed; - - if (bytes >= CHACHA_CHUNK_BYTES * 6) { - processed = (bytes / (CHACHA_CHUNK_BYTES * 6)) * CHACHA_CHUNK_BYTES * 6; - wc_chacha_encrypt_384(ctx->X, m, c, processed); - - bytes -= processed; - c += processed; - m += processed; - ctx->X[CHACHA_IV_BYTES] = PLUS(ctx->X[CHACHA_IV_BYTES], - processed / CHACHA_CHUNK_BYTES); - } - if (bytes >= CHACHA_CHUNK_BYTES * 4) { - processed = wc_chacha_encrypt_256(ctx->X, m, c); - - bytes -= processed; - c += processed; - m += processed; - ctx->X[CHACHA_IV_BYTES] = PLUS(ctx->X[CHACHA_IV_BYTES], - processed / CHACHA_CHUNK_BYTES); - } - if (bytes >= CHACHA_CHUNK_BYTES * 2) { - processed = wc_chacha_encrypt_128(ctx->X, m, c); - - bytes -= processed; - c += processed; - m += processed; - ctx->X[CHACHA_IV_BYTES] = PLUS(ctx->X[CHACHA_IV_BYTES], - processed / CHACHA_CHUNK_BYTES); - } - if (bytes > 0) { - wc_chacha_encrypt_64(ctx->X, m, c, bytes, (byte*)ctx->over); - if (bytes > CHACHA_CHUNK_BYTES) - ctx->X[CHACHA_IV_BYTES] = PLUSONE(ctx->X[CHACHA_IV_BYTES]); - ctx->left = CHACHA_CHUNK_BYTES - (bytes & (CHACHA_CHUNK_BYTES - 1)); - ctx->left &= CHACHA_CHUNK_BYTES - 1; - ctx->X[CHACHA_IV_BYTES] = PLUSONE(ctx->X[CHACHA_IV_BYTES]); - } -} - -#else - -#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) - -#define PART_ROUND_ODD_ABD(sl, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - "slli " CC_T0 ", " CC_D0 ", " #sl "\n\t" \ - "slli " CC_T1 ", " CC_D1 ", " #sl "\n\t" \ - "slli " CC_T2 ", " CC_D2 ", " #sl "\n\t" \ - "slli " CC_T3 ", " CC_D3 ", " #sl "\n\t" \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T0 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T1 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T2 "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T3 "\n\t" - -#define PART_ROUND_ODD_CDB(sl, sr) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - "slli " CC_T0 ", " CC_B0 ", " #sl "\n\t" \ - "slli " CC_T1 ", " CC_B1 ", " #sl "\n\t" \ - "slli " CC_T2 ", " CC_B2 ", " #sl "\n\t" \ - "slli " CC_T3 ", " CC_B3 ", " #sl "\n\t" \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T0 "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T1 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T2 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_ABD(sl, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - "slli " CC_T0 ", " CC_D3 ", " #sl "\n\t" \ - "slli " CC_T1 ", " CC_D0 ", " #sl "\n\t" \ - "slli " CC_T2 ", " CC_D1 ", " #sl "\n\t" \ - "slli " CC_T3 ", " CC_D2 ", " #sl "\n\t" \ - "srliw " CC_D3 ", " CC_D3 ", " #sr "\n\t" \ - "srliw " CC_D0 ", " CC_D0 ", " #sr "\n\t" \ - "srliw " CC_D1 ", " CC_D1 ", " #sr "\n\t" \ - "srliw " CC_D2 ", " CC_D2 ", " #sr "\n\t" \ - "or " CC_D3 ", " CC_D3 ", " CC_T0 "\n\t" \ - "or " CC_D0 ", " CC_D0 ", " CC_T1 "\n\t" \ - "or " CC_D1 ", " CC_D1 ", " CC_T2 "\n\t" \ - "or " CC_D2 ", " CC_D2 ", " CC_T3 "\n\t" - -#define PART_ROUND_EVEN_CDB(sl, sr) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - "slli " CC_T0 ", " CC_B1 ", " #sl "\n\t" \ - "slli " CC_T1 ", " CC_B2 ", " #sl "\n\t" \ - "slli " CC_T2 ", " CC_B3 ", " #sl "\n\t" \ - "slli " CC_T3 ", " CC_B0 ", " #sl "\n\t" \ - "srliw " CC_B1 ", " CC_B1 ", " #sr "\n\t" \ - "srliw " CC_B2 ", " CC_B2 ", " #sr "\n\t" \ - "srliw " CC_B3 ", " CC_B3 ", " #sr "\n\t" \ - "srliw " CC_B0 ", " CC_B0 ", " #sr "\n\t" \ - "or " CC_B1 ", " CC_B1 ", " CC_T0 "\n\t" \ - "or " CC_B2 ", " CC_B2 ", " CC_T1 "\n\t" \ - "or " CC_B3 ", " CC_B3 ", " CC_T2 "\n\t" \ - "or " CC_B0 ", " CC_B0 ", " CC_T3 "\n\t" - -#else - -#define PART_ROUND_ODD_ABD(sl, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B0 "\n\t" \ - "add " CC_A1 ", " CC_A1 ", " CC_B1 "\n\t" \ - "add " CC_A2 ", " CC_A2 ", " CC_B2 "\n\t" \ - "add " CC_A3 ", " CC_A3 ", " CC_B3 "\n\t" \ - "xor " CC_D0 ", " CC_D0 ", " CC_A0 "\n\t" \ - "xor " CC_D1 ", " CC_D1 ", " CC_A1 "\n\t" \ - "xor " CC_D2 ", " CC_D2 ", " CC_A2 "\n\t" \ - "xor " CC_D3 ", " CC_D3 ", " CC_A3 "\n\t" \ - RORIW(REG_S6, REG_S6, sr) \ - RORIW(REG_S7, REG_S7, sr) \ - RORIW(REG_S8, REG_S8, sr) \ - RORIW(REG_S9, REG_S9, sr) - -#define PART_ROUND_ODD_CDB(sl, sr) \ - "add " CC_C0 ", " CC_C0 ", " CC_D0 "\n\t" \ - "add " CC_C1 ", " CC_C1 ", " CC_D1 "\n\t" \ - "add " CC_C2 ", " CC_C2 ", " CC_D2 "\n\t" \ - "add " CC_C3 ", " CC_C3 ", " CC_D3 "\n\t" \ - "xor " CC_B0 ", " CC_B0 ", " CC_C0 "\n\t" \ - "xor " CC_B1 ", " CC_B1 ", " CC_C1 "\n\t" \ - "xor " CC_B2 ", " CC_B2 ", " CC_C2 "\n\t" \ - "xor " CC_B3 ", " CC_B3 ", " CC_C3 "\n\t" \ - RORIW(REG_T3, REG_T3, sr) \ - RORIW(REG_T4, REG_T4, sr) \ - RORIW(REG_T5, REG_T5, sr) \ - RORIW(REG_T6, REG_T6, sr) - -#define PART_ROUND_EVEN_ABD(sl, sr) \ - "add " CC_A0 ", " CC_A0 ", " CC_B1 "\n\t" \ - "add " CC_A1 ", " CC_A1 ", " CC_B2 "\n\t" \ - "add " CC_A2 ", " CC_A2 ", " CC_B3 "\n\t" \ - "add " CC_A3 ", " CC_A3 ", " CC_B0 "\n\t" \ - "xor " CC_D3 ", " CC_D3 ", " CC_A0 "\n\t" \ - "xor " CC_D0 ", " CC_D0 ", " CC_A1 "\n\t" \ - "xor " CC_D1 ", " CC_D1 ", " CC_A2 "\n\t" \ - "xor " CC_D2 ", " CC_D2 ", " CC_A3 "\n\t" \ - RORIW(REG_S9, REG_S9, sr) \ - RORIW(REG_S6, REG_S6, sr) \ - RORIW(REG_S7, REG_S7, sr) \ - RORIW(REG_S8, REG_S8, sr) - -#define PART_ROUND_EVEN_CDB(sl, sr) \ - "add " CC_C2 ", " CC_C2 ", " CC_D3 "\n\t" \ - "add " CC_C3 ", " CC_C3 ", " CC_D0 "\n\t" \ - "add " CC_C0 ", " CC_C0 ", " CC_D1 "\n\t" \ - "add " CC_C1 ", " CC_C1 ", " CC_D2 "\n\t" \ - "xor " CC_B1 ", " CC_B1 ", " CC_C2 "\n\t" \ - "xor " CC_B2 ", " CC_B2 ", " CC_C3 "\n\t" \ - "xor " CC_B3 ", " CC_B3 ", " CC_C0 "\n\t" \ - "xor " CC_B0 ", " CC_B0 ", " CC_C1 "\n\t" \ - RORIW(REG_T4, REG_T4, sr) \ - RORIW(REG_T5, REG_T5, sr) \ - RORIW(REG_T6, REG_T6, sr) \ - RORIW(REG_T3, REG_T3, sr) - -#endif - -#define QUARTER_ROUND_ODD() \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND_ODD_ABD(16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND_ODD_CDB(12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND_ODD_ABD( 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND_ODD_CDB( 7, 25) - -#define QUARTER_ROUND_EVEN() \ - /* a += b; d ^= a; d <<<= 16; */ \ - PART_ROUND_EVEN_ABD(16, 16) \ - /* c += d; b ^= c; b <<<= 12; */ \ - PART_ROUND_EVEN_CDB(12, 20) \ - /* a += b; d ^= a; d <<<= 8; */ \ - PART_ROUND_EVEN_ABD( 8, 24) \ - /* c += d; b ^= c; b <<<= 7; */ \ - PART_ROUND_EVEN_CDB( 7, 25) - - -static WC_INLINE void wc_chacha_encrypt(const word32* input, const byte* m, - byte* c, word32 bytes, word32* over) -{ - __asm__ __volatile__ ( - /* Ensure 64-bit bytes has top bits clear. */ - "slli %[bytes], %[bytes], 32\n\t" - "srli %[bytes], %[bytes], 32\n\t" - - "L_chacha20_riscv_outer:\n\t" - /* Move state into regular registers */ - "ld a4, 0(%[input])\n\t" - "ld a6, 8(%[input])\n\t" - "ld t3, 16(%[input])\n\t" - "ld t5, 24(%[input])\n\t" - "ld s2, 32(%[input])\n\t" - "ld s4, 40(%[input])\n\t" - "ld s6, 48(%[input])\n\t" - "ld s8, 56(%[input])\n\t" - "srli a5, a4, 32\n\t" - "srli a7, a6, 32\n\t" - "srli t4, t3, 32\n\t" - "srli t6, t5, 32\n\t" - "srli s3, s2, 32\n\t" - "srli s5, s4, 32\n\t" - "srli s7, s6, 32\n\t" - "srli s9, s8, 32\n\t" - - /* Set number of odd+even rounds to perform */ - "li a3, 10\n\t" - "\n" - "L_chacha20_riscv_loop:\n\t" - /* Odd Round */ - QUARTER_ROUND_ODD() - "addi a3, a3, -1\n\t" - /* Even Round */ - QUARTER_ROUND_EVEN() - "bnez a3, L_chacha20_riscv_loop\n\t" - - "addi %[bytes], %[bytes], -64\n\t" - - "ld t0, 0(%[input])\n\t" - "ld t1, 8(%[input])\n\t" - "ld t2, 16(%[input])\n\t" - "ld s1, 24(%[input])\n\t" - "add a4, a4, t0\n\t" - "add a6, a6, t1\n\t" - "add t3, t3, t2\n\t" - "add t5, t5, s1\n\t" - "srli t0, t0, 32\n\t" - "srli t1, t1, 32\n\t" - "srli t2, t2, 32\n\t" - "srli s1, s1, 32\n\t" - "add a5, a5, t0\n\t" - "add a7, a7, t1\n\t" - "add t4, t4, t2\n\t" - "add t6, t6, s1\n\t" - "ld t0, 32(%[input])\n\t" - "ld t1, 40(%[input])\n\t" - "ld t2, 48(%[input])\n\t" - "ld s1, 56(%[input])\n\t" - "add s2, s2, t0\n\t" - "add s4, s4, t1\n\t" - "add s6, s6, t2\n\t" - "addi t2, t2, 1\n\t" - "add s8, s8, s1\n\t" - "srli t0, t0, 32\n\t" - "srli t1, t1, 32\n\t" - "sw t2, 48(%[input])\n\t" - "srli t2, t2, 32\n\t" - "srli s1, s1, 32\n\t" - "add s3, s3, t0\n\t" - "add s5, s5, t1\n\t" - "add s7, s7, t2\n\t" - "add s9, s9, s1\n\t" - - "bltz %[bytes], L_chacha20_riscv_over\n\t" - -#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) - UNALIGNED_LD4(t0, t1, t2, s1, 0, %[m], a3) - "xor a4, a4, t0\n\t" - "xor a6, a6, t1\n\t" - "xor t3, t3, t2\n\t" - "xor t5, t5, s1\n\t" - "srli t0, t0, 32\n\t" - "srli t1, t1, 32\n\t" - "srli t2, t2, 32\n\t" - "srli s1, s1, 32\n\t" - "xor a5, a5, t0\n\t" - "xor a7, a7, t1\n\t" - "xor t4, t4, t2\n\t" - "xor t6, t6, s1\n\t" - UNALIGNED_LD4(t0, t1, t2, s1, 32, %[m], a3) - "xor s2, s2, t0\n\t" - "xor s4, s4, t1\n\t" - "xor s6, s6, t2\n\t" - "xor s8, s8, s1\n\t" - "srli t0, t0, 32\n\t" - "srli t1, t1, 32\n\t" - "srli t2, t2, 32\n\t" - "srli s1, s1, 32\n\t" - "xor s3, s3, t0\n\t" - "xor s5, s5, t1\n\t" - "xor s7, s7, t2\n\t" - "xor s9, s9, s1\n\t" - UNALIGNED_SW8(a4, a5, a6, a7, t3, t4, t5, t6, 0, %[c], t0) - UNALIGNED_SW8(s2, s3, s4, s5, s6, s7, s8, s9, 32, %[c], t0) -#else - PACK(REG_A4, REG_A4, REG_A5) - PACK(REG_A6, REG_A6, REG_A7) - PACK(REG_T3, REG_T3, REG_T4) - PACK(REG_T5, REG_T5, REG_T6) - PACK(REG_S2, REG_S2, REG_S3) - PACK(REG_S4, REG_S4, REG_S5) - PACK(REG_S6, REG_S6, REG_S7) - PACK(REG_S8, REG_S8, REG_S9) - UNALIGNED_LD8(a5, a7, t4, t6, s3, s5, s7, s9, 0, %[m], t0) - "xor a4, a4, a5\n\t" - "xor a6, a6, a7\n\t" - "xor t3, t3, t4\n\t" - "xor t5, t5, t6\n\t" - "xor s2, s2, s3\n\t" - "xor s4, s4, s5\n\t" - "xor s6, s6, s7\n\t" - "xor s8, s8, s9\n\t" - UNALIGNED_SD8(a4, a6, t3, t5, s2, s4, s6, s8, 0, %[c], t0) -#endif - - "addi %[m], %[m], 64\n\t" - "addi %[c], %[c], 64\n\t" - - "bnez %[bytes], L_chacha20_riscv_outer\n\t" - "beqz %[bytes], L_chacha20_riscv_done\n\t" - - "L_chacha20_riscv_over:\n\t" - "addi a3, %[bytes], 64\n\t" - - "sw a4, 0(%[over])\n\t" - "sw a5, 4(%[over])\n\t" - "sw a6, 8(%[over])\n\t" - "sw a7, 12(%[over])\n\t" - "sw t3, 16(%[over])\n\t" - "sw t4, 20(%[over])\n\t" - "sw t5, 24(%[over])\n\t" - "sw t6, 28(%[over])\n\t" - "sw s2, 32(%[over])\n\t" - "sw s3, 36(%[over])\n\t" - "sw s4, 40(%[over])\n\t" - "sw s5, 44(%[over])\n\t" - "sw s6, 48(%[over])\n\t" - "sw s7, 52(%[over])\n\t" - "sw s8, 56(%[over])\n\t" - "sw s9, 60(%[over])\n\t" - - "addi t0, a3, -8\n\t" - "bltz t0, L_chacha20_riscv_32bit\n\t" - "addi a3, a3, -1\n\t" - "L_chacha20_riscv_64bit_loop:\n\t" - UNALIGNED_LD(t0, 0, %[m], t2) - "ld t1, (%[over])\n\t" - "xor t0, t0, t1\n\t" - UNALIGNED_SD(t0, 0, %[c], t2) - "addi %[m], %[m], 8\n\t" - "addi %[c], %[c], 8\n\t" - "addi %[over], %[over], 8\n\t" - "addi a3, a3, -8\n\t" - "bgez a3, L_chacha20_riscv_64bit_loop\n\t" - "addi a3, a3, 1\n\t" - - "L_chacha20_riscv_32bit:\n\t" - "addi t0, a3, -4\n\t" - "bltz t0, L_chacha20_riscv_16bit\n\t" - UNALIGNED_LW(t0, 0, %[m], t2) - "lw t1, (%[over])\n\t" - "xor t0, t0, t1\n\t" - UNALIGNED_SW(t0, 0, %[c], t2) - "addi %[m], %[m], 4\n\t" - "addi %[c], %[c], 4\n\t" - "addi %[over], %[over], 4\n\t" - - "L_chacha20_riscv_16bit:\n\t" - "addi t0, a3, -2\n\t" - "bltz t0, L_chacha20_riscv_8bit\n\t" - UNALIGNED_LH(t0, 0, %[m], t2) - "lh t1, (%[over])\n\t" - "xor t0, t0, t1\n\t" - UNALIGNED_SH(t0, 0, %[c], t2) - "addi %[m], %[m], 2\n\t" - "addi %[c], %[c], 2\n\t" - "addi %[over], %[over], 2\n\t" - - "L_chacha20_riscv_8bit:\n\t" - "addi t0, a3, -1\n\t" - "bltz t0, L_chacha20_riscv_done\n\t\n\t" - "lb t0, (%[m])\n\t" - "lb t1, (%[over])\n\t" - "xor t0, t0, t1\n\t" - "sb t0, (%[c])\n\t" - "bltz %[bytes], L_chacha20_riscv_done\n\t" - - "L_chacha20_riscv_done:\n\t" - : [m] "+r" (m), [c] "+r" (c), [bytes] "+r" (bytes), [over] "+r" (over) - : [input] "r" (input) - : "memory", "t0", "t1", "t2", "s1", "a3", - "t3", "t4", "t5", "t6", - "a4", "a5", "a6", "a7", - "s2", "s3", "s4", "s5", - "s6", "s7", "s8", "s9" - ); -} - -/** - * Encrypt a stream of bytes - */ -static WC_INLINE void wc_chacha_encrypt_bytes(ChaCha* ctx, const byte* m, - byte* c, word32 bytes) -{ - wc_chacha_encrypt(ctx->X, m, c, bytes, ctx->over); - ctx->left = (CHACHA_CHUNK_BYTES - (bytes & (CHACHA_CHUNK_BYTES - 1))) & - (CHACHA_CHUNK_BYTES - 1); -} -#endif - -/** - * API to encrypt/decrypt a message of any size. - */ -int wc_Chacha_Process(ChaCha* ctx, byte* output, const byte* input, - word32 msglen) -{ - int ret = 0; - - if ((ctx == NULL) || (output == NULL) || (input == NULL)) { - ret = BAD_FUNC_ARG; - } - else if (msglen > 0) { - if (ctx->left > 0) { - word32 processed = min(msglen, ctx->left); - byte* out = (byte*)ctx->over + CHACHA_CHUNK_BYTES - ctx->left; - - xorbufout(output, input, out, processed); - - ctx->left -= processed; - msglen -= processed; - output += processed; - input += processed; - } - - if (msglen > 0) { - wc_chacha_encrypt_bytes(ctx, input, output, msglen); - } - } - - return ret; -} - -#endif /* HAVE_CHACHA */ -#endif /* WOLFSSL_ARMASM && !WOLFSSL_ARMASM_NO_NEON */ diff --git a/wolfcrypt/src/port/riscv/riscv-64-poly1305.c b/wolfcrypt/src/port/riscv/riscv-64-poly1305.c deleted file mode 100644 index 5733b75bc77..00000000000 --- a/wolfcrypt/src/port/riscv/riscv-64-poly1305.c +++ /dev/null @@ -1,656 +0,0 @@ -/* riscv-64-poly1305.c - * - * Copyright (C) 2006-2026 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 3 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 - */ - -#include - -/* - * Based on the public domain implementations by Andrew Moon - * and Daniel J. Bernstein - */ - -#include - -#ifdef WOLFSSL_RISCV_ASM - -#ifdef HAVE_POLY1305 -#include -#include -#ifdef NO_INLINE - #include -#else - #define WOLFSSL_MISC_INCLUDED - #include -#endif -#ifdef CHACHA_AEAD_TEST - #include -#endif - - -#ifndef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY - -#define SPLIT_130(r0, r1, r2, a0, a1, a2, t) \ - "srli " #r1 ", " #a0 ", (64-12)\n\t" \ - "and " #r0 ", " #a0 ", a6\n\t" \ - "slli " #t ", " #a1 ", (2*12)\n\t" \ - "slli " #r2 ", " #a2 ", (2*12)\n\t" \ - "srli " #a1 ", " #a1 ", (64-2*12)\n\t" \ - "srli " #t ", " #t ", 12\n\t" \ - "or " #r2 ", " #a1 ", " #r2 "\n\t" \ - "or " #r1 ", " #r1 ", " #t "\n\t" - -#define SPLIT_128(r0, r1, r2, a0, a1, t) \ - "slli " #t ", " #a1 ", (2*12)\n\t" \ - "srli " #r1 ", " #a0 ", (64-12)\n\t" \ - "and " #r0 ", " #a0 ", a6\n\t" \ - "srli " #t ", " #t ", 12\n\t" \ - "srli " #r2 ", " #a1 ", (64-2*12)\n\t" \ - "or " #r1 ", " #r1 ", " #t "\n\t" - -#define REDIST(l, h, t) \ - "srli " #t ", " #l ", 52\n\t" \ - "slli " #h ", " #h ", 12\n\t" \ - "and " #l ", " #l ", a6\n\t" \ - "or " #h ", " #h ", " #t "\n\t" - -#define REDIST_HI(l, h, h2, t) \ - "srli " #h2 ", " #h ", 28\n\t" \ - "slli " #h ", " #h ", 24\n\t" \ - "srli " #t ", " #l ", 40\n\t" \ - "slli " #l ", " #l ", 12\n\t" \ - "and " #h ", " #h ", a6\n\t" \ - "and " #l ", " #l ", a6\n\t" \ - "or " #h ", " #h ", " #t "\n\t" - -#define REDIST_HI_26(l, h, t) \ - "srli " #t ", " #l ", 40\n\t" \ - "slli " #l ", " #l ", 12\n\t" \ - "slli " #h ", " #h ", 24\n\t" \ - "and " #l ", " #l ", a6\n\t" \ - "or " #h ", " #h ", " #t "\n\t" - -#else - -#define SPLIT_130(r0, r1, r2, a0, a1, a2, t) \ - "and " #r0 ", " #a0 ", a6\n\t" \ - FSRI(r1, a1, a0, 52) \ - FSRI(r2, a2, a1, 40) \ - "and " #r1 ", " #r1 ", a6\n\t" \ - "and " #r2 ", " #r2 ", a6\n\t" - -#define SPLIT_128(r0, r1, r2, a0, a1, t) \ - "srli " #r2 ", " #a1 ", 40\n\t" \ - FSRI(r1, a1, a0, 52) \ - "and " #r0 ", " #a0 ", a6\n\t" \ - "and " #r1 ", " #r1 ", a6\n\t" - -#define REDIST(l, h, t) \ - FSRI(h, h, l, 52) \ - "and " #l ", " #l ", a4\n\t" - -#define REDIST_HI(l, h, h2, t) \ - "srli " #h2 ", " #h ", 28\n\t" \ - FSRI(h, h, l, 40) \ - "slli " #l ", " #l ", 12\n\t" \ - "and " #h ", " #h ", a6\n\t" \ - "and " #l ", " #l ", a6\n\t" - -#define REDIST_HI_26(l, h, t) \ - FSRI(h, h, l, 40) \ - "slli " #l ", " #l ", 12\n\t" \ - "and " #l ", " #l ", a6\n\t" - -#endif - -#define RECALC(l, h, t) \ - "srli " #t ", " #l ", 52\n\t" \ - "and " #l ", " #l ", a6\n\t" \ - "add " #h ", " #h ", " #t "\n\t" - -static WC_INLINE void poly1305_blocks_riscv64_16(Poly1305* ctx, - const unsigned char *m, size_t bytes, int notLast) -{ - __asm__ __volatile__ ( - "addi %[bytes], %[bytes], -16\n\t" - "bltz %[bytes], L_poly1305_riscv64_16_64_done_%=\n\t" - - "li a4, 0xffffffc000000\n\t" - "li a5, 0x3ffffff\n\t" - "li a6, 0xfffffffffffff\n\t" - - /* Load r and h */ - "ld s8, %[ctx_r_0]\n\t" - "ld s9, %[ctx_r_1]\n\t" - - "ld s3, %[ctx_h_0]\n\t" - "ld s4, %[ctx_h_1]\n\t" - "ld s5, %[ctx_h_2]\n\t" - - "L_poly1305_riscv64_16_64_loop_%=:\n\t" - /* Load m */ - UNALIGNED_LD2(t0, t1, 0, %[m], t5) - /* Split m into 26, 52, 52 */ - SPLIT_130(t2, t3, t4, t0, t1, %[notLast], t5) - - "add s3, s3, t2\n\t" - "add s4, s4, t3\n\t" - "add s5, s5, t4\n\t" - - /* r[0] * h[0] = [0, 1] */ - "mul t0, s8, s3\n\t" - "mulhu t1, s8, s3\n\t" - REDIST(t0, t1, s6) - /* r[0] * h[1] = [1, 2] */ - "mul t3, s8, s4\n\t" - "mulhu t2, s8, s4\n\t" - REDIST(t3, t2, s6) - "add t1, t1, t3\n\t" - /* r[1] * h[0] = [1, 2] */ - "mul t4, s9, s3\n\t" - "mulhu t5, s9, s3\n\t" - REDIST_HI(t4, t5, t3, s6) - "add t1, t1, t4\n\t" - "add t2, t2, t5\n\t" - /* r[0] * h[2] = [2, 3] */ - "mul t4, s8, s5\n\t" - "mulhu t5, s8, s5\n\t" - REDIST(t4, t5, s6) - "add t2, t2, t4\n\t" - "add t3, t3, t5\n\t" - /* r[1] * h[1] = [2, 3] */ - "mul t5, s9, s4\n\t" - "mulhu t6, s9, s4\n\t" - REDIST_HI(t5, t6, t4, s6) - "add t2, t2, t5\n\t" - "add t3, t3, t6\n\t" - /* r[1] * h[2] = [3, 4] */ - "mul t5, s9, s5\n\t" - "mulhu t6, s9, s5\n\t" - REDIST_HI_26(t5, t6, s6) - "add t3, t3, t5\n\t" - "add t4, t4, t6\n\t" - - RECALC(t1, t2, s6) - RECALC(t2, t3, s6) - RECALC(t3, t4, s6) - - /* h[0..4] % (2^130 - 5) */ - "slli s3, t3, 26\n\t" - "slli s4, t4, 26\n\t" - "and s3, s3, a4\n\t" - "and s4, s4, a4\n\t" - "srli t5, t2, 26\n\t" - "and t2, t2, a5\n\t" - "srli t3, t3, 26\n\t" - "srli t4, t4, 26\n\t" - "add t5, t5, s3\n\t" - "add t3, t3, s4\n\t" - - "slli s5, t5, 2\n\t" - "slli s3, t3, 2\n\t" - "slli s4, t4, 2\n\t" - "add t5, t5, s5\n\t" - "add t3, t3, s3\n\t" - "add t4, t4, s4\n\t" - - "add s3, t0, t5\n\t" - "add s4, t1, t3\n\t" - "add s5, t2, t4\n\t" - - /* h[0..2] % (2^130 - 5) */ - "and t5, s5, a4\n\t" - "and s5, s5, a5\n\t" - "srli t6, t5, 24\n\t" - "srli t5, t5, 26\n\t" - "add t5, t5, t6\n\t" - "add s3, s3, t5\n\t" - - "addi %[bytes], %[bytes], -16\n\t" - "addi %[m], %[m], 16\n\t" - "bgez %[bytes], L_poly1305_riscv64_16_64_loop_%=\n\t" - - "sd s3, %[ctx_h_0]\n\t" - "sd s4, %[ctx_h_1]\n\t" - "sd s5, %[ctx_h_2]\n\t" - "\n" - "L_poly1305_riscv64_16_64_done_%=:\n\t" - : [bytes] "+r" (bytes), [m] "+r" (m) - : [ctx_h_0] "m" (ctx->h[0]), [ctx_h_1] "m" (ctx->h[1]), - [ctx_h_2] "m" (ctx->h[2]), [ctx_r_0] "m" (ctx->r[0]), - [ctx_r_1] "m" (ctx->r[1]), [notLast] "r" ((word64)notLast) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s6", - "a4", "a5", "a6", /* Constants */ - "s3", "s4", "s5", /* h */ - "s8", "s9" /* r */ - ); -} - -#ifdef WOLFSSL_RISCV_VECTOR - -#define MUL_RES_REDIS(l, h, t) \ - VSRL_VX(t, l, REG_A7) \ - VSLL_VI(h, h, 12) \ - VAND_VX(l, l, REG_A6) \ - VOR_VV(h, h, t) - -#endif - -void poly1305_blocks_riscv64(Poly1305* ctx, const unsigned char *m, - size_t bytes) -{ -#ifdef WOLFSSL_RISCV_VECTOR - __asm__ __volatile__ ( - "addi %[bytes], %[bytes], -32\n\t" - "bltz %[bytes], L_poly1305_riscv64_vec_done_%=\n\t" - - VSETIVLI(REG_ZERO, 2, 1, 1, 0b011, 0b000) - - "li a4, 0xffffffc000000\n\t" - "li a5, 0x3ffffff\n\t" - "li a6, 0xfffffffffffff\n\t" - "li a7, 52\n\t" - - /* Load r and r^2 */ - "mv t0, %[r2]\n\t" - VL2RE64_V(REG_V2, REG_T0) - "addi t0, %[r2], 32\n\t" - VL1RE64_V(REG_V4, REG_T0) - - /* Load h */ - "ld t0, 0(%[h])\n\t" - "ld t1, 8(%[h])\n\t" - "ld t2, 16(%[h])\n\t" - - VMV_S_X(REG_V8, REG_T0) - VMV_S_X(REG_V9, REG_T1) - VMV_S_X(REG_V10, REG_T2) - - "L_poly1305_riscv64_vec_loop_%=:\n\t" - /* m0 + nfin */ - UNALIGNED_LD2(t0, t1, 0, %[m], t5) - "li t6, 1\n\t" - /* Split m into 24, 52, 52 */ - SPLIT_130(t2, t3, t4, t0, t1, t6, t5) - VMV_S_X(REG_V11, REG_T2) - VMV_S_X(REG_V12, REG_T3) - VMV_S_X(REG_V13, REG_T4) - /* m1+ nfin */ - UNALIGNED_LD2(t0, t1, 16, %[m], t5) - /* Split m into 24, 52, 52 */ - SPLIT_130(t2, t3, t4, t0, t1, t6, t5) - VMV_S_X(REG_V14, REG_T2) - VMV_S_X(REG_V15, REG_T3) - VMV_S_X(REG_V16, REG_T4) - /* h += m0 + nfin */ - VADD_VV(REG_V8, REG_V8, REG_V11) - VADD_VV(REG_V9, REG_V9, REG_V12) - VADD_VV(REG_V10, REG_V10, REG_V13) - /* h[0]|m1[0], h[1]|m1[1], h[2]|m1[2] */ - VSLIDEUP_VI(REG_V8, REG_V14, 1) - VSLIDEUP_VI(REG_V9, REG_V15, 1) - VSLIDEUP_VI(REG_V10, REG_V16, 1) - - /* hm[0] * r2r[0] */ - VMUL_VV(REG_V11, REG_V8, REG_V2) - VMULHU_VV(REG_V12, REG_V8, REG_V2) - MUL_RES_REDIS(REG_V11, REG_V12, REG_V18) - - /* + hm[0] * r2r[1] */ - VMUL_VV(REG_V14, REG_V8, REG_V3) - VMULHU_VV(REG_V13, REG_V8, REG_V3) - MUL_RES_REDIS(REG_V14, REG_V13, REG_V18) - VADD_VV(REG_V12, REG_V12, REG_V14) - /* + hm[1] * r2r[0] */ - VMUL_VV(REG_V14, REG_V9, REG_V2) - VMULHU_VV(REG_V15, REG_V9, REG_V2) - MUL_RES_REDIS(REG_V14, REG_V15, REG_V18) - VADD_VV(REG_V12, REG_V12, REG_V14) - VADD_VV(REG_V13, REG_V13, REG_V15) - - /* + hm[0] * r2r[2] */ - VMUL_VV(REG_V15, REG_V8, REG_V4) - VMULHU_VV(REG_V14, REG_V8, REG_V4) - MUL_RES_REDIS(REG_V15, REG_V14, REG_V18) - VADD_VV(REG_V13, REG_V13, REG_V15) - /* + hm[1] * r2r[1] */ - VMUL_VV(REG_V15, REG_V9, REG_V3) - VMULHU_VV(REG_V16, REG_V9, REG_V3) - MUL_RES_REDIS(REG_V15, REG_V16, REG_V18) - VADD_VV(REG_V13, REG_V13, REG_V15) - VADD_VV(REG_V14, REG_V14, REG_V16) - /* + hm[2] * r2r[0] */ - VMUL_VV(REG_V15, REG_V10, REG_V2) - VMULHU_VV(REG_V16, REG_V10, REG_V2) - MUL_RES_REDIS(REG_V15, REG_V16, REG_V18) - VADD_VV(REG_V13, REG_V13, REG_V15) - VADD_VV(REG_V14, REG_V14, REG_V16) - - /* + hm[1] * r2r[2] */ - VMUL_VV(REG_V16, REG_V9, REG_V4) - VMULHU_VV(REG_V15, REG_V9, REG_V4) - MUL_RES_REDIS(REG_V16, REG_V15, REG_V18) - VADD_VV(REG_V14, REG_V14, REG_V16) - /* + hm[2] * r2r[1] */ - VMUL_VV(REG_V16, REG_V10, REG_V3) - VMULHU_VV(REG_V17, REG_V10, REG_V3) - MUL_RES_REDIS(REG_V16, REG_V17, REG_V18) - VADD_VV(REG_V14, REG_V14, REG_V16) - VADD_VV(REG_V15, REG_V15, REG_V17) - - /* + hm[2] * r2r[2] */ - VMUL_VV(REG_V17, REG_V10, REG_V4) - VADD_VV(REG_V15, REG_V15, REG_V17) - - /* Get m1 * r down */ - VSLIDEDOWN_VI(REG_V18, REG_V11, 1) - VSLIDEDOWN_VI(REG_V19, REG_V12, 1) - VSLIDEDOWN_VI(REG_V20, REG_V13, 1) - VSLIDEDOWN_VI(REG_V21, REG_V14, 1) - VSLIDEDOWN_VI(REG_V22, REG_V15, 1) - - /* Add (h + m0) * r^2 + m1 * r */ - VADD_VV(REG_V11, REG_V11, REG_V18) - VADD_VV(REG_V12, REG_V12, REG_V19) - VADD_VV(REG_V13, REG_V13, REG_V20) - VADD_VV(REG_V14, REG_V14, REG_V21) - VADD_VV(REG_V15, REG_V15, REG_V22) - - /* h' % 2^130-5 */ - VSLL_VI(REG_V8, REG_V14, 26) - VSLL_VI(REG_V9, REG_V15, 26) - VAND_VX(REG_V8, REG_V8, REG_A4) - VAND_VX(REG_V9, REG_V9, REG_A4) - VSRL_VI(REG_V10, REG_V13, 26) - VAND_VX(REG_V13, REG_V13, REG_A5) - VSRL_VI(REG_V14, REG_V14, 26) - VSRL_VI(REG_V15, REG_V15, 26) - VADD_VV(REG_V10, REG_V10, REG_V8) - VADD_VV(REG_V14, REG_V14, REG_V9) - - VSLL_VI(REG_V16, REG_V10, 2) - VSLL_VI(REG_V17, REG_V14, 2) - VSLL_VI(REG_V18, REG_V15, 2) - VADD_VV(REG_V10, REG_V10, REG_V16) - VADD_VV(REG_V14, REG_V14, REG_V17) - VADD_VV(REG_V15, REG_V15, REG_V18) - - VADD_VV(REG_V8, REG_V11, REG_V10) - VADD_VV(REG_V9, REG_V12, REG_V14) - VADD_VV(REG_V10, REG_V13, REG_V15) - - /* h'' % 2^130-5 */ - VAND_VX(REG_V11, REG_V10, REG_A4) - VAND_VX(REG_V10, REG_V10, REG_A5) - VSRL_VI(REG_V12, REG_V11, 24) - VSRL_VI(REG_V11, REG_V11, 26) - VADD_VV(REG_V11, REG_V11, REG_V12) - VADD_VV(REG_V8, REG_V8, REG_V11) - - "addi %[bytes], %[bytes], -32\n\t" - "addi %[m], %[m], 32\n\t" - "bgez %[bytes], L_poly1305_riscv64_vec_loop_%=\n\t" - - VMV_X_S(REG_S3, REG_V8) - VMV_X_S(REG_S4, REG_V9) - VMV_X_S(REG_S5, REG_V10) - - "sd s3, 0(%[h])\n\t" - "sd s4, 8(%[h])\n\t" - "sd s5, 16(%[h])\n\t" - - "\n" - "L_poly1305_riscv64_vec_done_%=:\n\t" - "addi %[bytes], %[bytes], 32\n\t" - : [bytes] "+r" (bytes), [m] "+r" (m) - : [r2] "r" (ctx->r2), [h] "r" (ctx->h) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "s3", "s4", "s5", "a4", "a5", "a6", "a7" - ); -#endif - poly1305_blocks_riscv64_16(ctx, m, bytes, 1); -} - -void poly1305_block_riscv64(Poly1305* ctx, const unsigned char *m) -{ - poly1305_blocks_riscv64_16(ctx, m, POLY1305_BLOCK_SIZE, 1); -} - -#if defined(POLY130564) -static word64 clamp[] = { - 0x0ffffffc0fffffff, - 0x0ffffffc0ffffffc, -}; -#endif /* POLY130564 */ - - -int wc_Poly1305SetKey(Poly1305* ctx, const byte* key, word32 keySz) -{ - if (key == NULL) - return BAD_FUNC_ARG; - -#ifdef CHACHA_AEAD_TEST - word32 k; - printf("Poly key used:\n"); - for (k = 0; k < keySz; k++) { - printf("%02x", key[k]); - if ((k+1) % 8 == 0) - printf("\n"); - } - printf("\n"); -#endif - - if (keySz != 32 || ctx == NULL) - return BAD_FUNC_ARG; - - __asm__ __volatile__ ( - /* Load key material */ - UNALIGNED_LD4(t0, t1, t2, t3, 0, %[key], t4) - /* Load clamp */ - "ld t4, 0(%[clamp])\n\t" - "ld t5, 8(%[clamp])\n\t" - /* Save pad for later */ - "sd t2, 0(%[ctx_pad])\n\t" - "sd t3, 8(%[ctx_pad])\n\t" - /* Apply clamp */ - /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ - "and t0, t0, t4\n\t" - "and t1, t1, t5\n\t" - /* Store r */ - "sd t0, 0(%[ctx_r])\n\t" - "sd t1, 8(%[ctx_r])\n\t" - -#ifdef WOLFSSL_RISCV_VECTOR - "li a6, 0xfffffffffffff\n\t" - /* Split r into parts less than 64 */ - SPLIT_128(t2, t3, t4, t0, t1, t5) - /* Store r */ - "sd t2, 8(%[ctx_r2])\n\t" - "sd t3, 24(%[ctx_r2])\n\t" - "sd t4, 40(%[ctx_r2])\n\t" - - /* r * r */ - /* r[0] * r[0] - 0, 1 */ - "mul t2, t0, t0\n\t" - "mulhu t3, t0, t0\n\t" - /* + r[0] * r[1] - 1, 2 */ - "mul t5, t1, t0\n\t" - "mulhu t6, t1, t0\n\t" - "add t3, t3, t5\n\t" - "sltu s1, t3, t5\n\t" - "add t4, t6, s1\n\t" - /* + r[1] * r[0] - 1, 2 */ - "add t3, t3, t5\n\t" - "sltu s1, t3, t5\n\t" - "add t4, t4, s1\n\t" - "add t4, t4, t6\n\t" - "sltu t5, t4, t6\n\t" - /* + r[1] * r[1] - 2, 3 */ - "mul s1, t1, t1\n\t" - "mulhu t6, t1, t1\n\t" - "add t4, t4, s1\n\t" - "sltu s1, t4, s1\n\t" - "add t5, t5, t6\n\t" - "add t5, t5, s1\n\t" - /* (r * r) % (2 ^ 130 - 5) */ - "andi t6, t4, -4\n\t" - "andi t4, t4, 3\n\t" - /* r[0..129] + r[130-191] * 4 */ - "add t2, t2, t6\n\t" - "sltu s1, t2, t6\n\t" - "add t3, t3, s1\n\t" - "sltu s1, t3, s1\n\t" - "add t4, t4, s1\n\t" - /* r[0..129] + r[130-193] */ - "srli t6, t6, 2\n\t" - "slli s1, t5, 62\n\t" - "or t6, t6, s1\n\t" - "add t2, t2, t6\n\t" - "sltu s1, t2, t6\n\t" - "add t3, t3, s1\n\t" - "sltu s1, t3, s1\n\t" - "add t4, t4, s1\n\t" - /* r[64..129] + r[194-253] * 4 */ - "add t3, t3, t5\n\t" - "sltu s1, t3, t5\n\t" - "add t4, t4, s1\n\t" - /* r[64..129] + r[194-253] */ - "srli t5, t5, 2\n\t" - "add t3, t3, t5\n\t" - "sltu s1, t3, t5\n\t" - "add t4, t4, s1\n\t" - /* Split r^2 into parts less than 64 */ - SPLIT_130(t0, t1, t2, t2, t3, t4, t5) - /* Store r^2 */ - "sd t0, 0(%[ctx_r2])\n\t" - "sd t1, 16(%[ctx_r2])\n\t" - "sd t2, 32(%[ctx_r2])\n\t" -#endif - - /* h (accumulator) = 0 */ - "sd x0, 0(%[ctx_h])\n\t" - "sd x0, 8(%[ctx_h])\n\t" - "sd x0, 16(%[ctx_h])\n\t" - /* Zero leftover */ - "sd x0, (%[ctx_leftover])\n\t" - : - : [clamp] "r" (clamp), [key] "r" (key), [ctx_r] "r" (ctx->r), -#ifdef WOLFSSL_RISCV_VECTOR - [ctx_r2] "r" (ctx->r2), -#endif - [ctx_h] "r" (ctx->h), [ctx_pad] "r" (ctx->pad), - [ctx_leftover] "r" (&ctx->leftover) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1" -#ifdef WOLFSSL_RISCV_VECTOR - , "a6" -#endif - ); - - return 0; -} - - -int wc_Poly1305Final(Poly1305* ctx, byte* mac) -{ - - if (ctx == NULL) - return BAD_FUNC_ARG; - - /* process the remaining block */ - if (ctx->leftover) { - size_t i = ctx->leftover; - ctx->buffer[i++] = 1; - for (; i < POLY1305_BLOCK_SIZE; i++) - ctx->buffer[i] = 0; - poly1305_blocks_riscv64_16(ctx, ctx->buffer, POLY1305_BLOCK_SIZE, 0); - } - - __asm__ __volatile__ ( - /* Load raw h and padding. */ - "ld t0, %[ctx_h_0]\n\t" - "ld t1, %[ctx_h_1]\n\t" - "ld t2, %[ctx_h_2]\n\t" - "ld t3, %[ctx_pad_0]\n\t" - "ld t4, %[ctx_pad_1]\n\t" - - /* Shrink h to 2,64,64. */ - "slli t5, t1, 52\n\t" - "slli t6, t2, 40\n\t" - "srli t1, t1, 12\n\t" - "srli t2, t2, 24\n\t" - "add t1, t1, t6\n\t" - "sltu t6, t1, t6\n\t" - "add t2, t2, t6\n\t" - "add t0, t0, t5\n\t" - "sltu t5, t0, t5\n\t" - "add t1, t1, t5\n\t" - "sltu t5, t1, t5\n\t" - "add t2, t2, t5\n\t" - - /* Add padding to h */ - "add t0, t0, t3\n\t" - "sltu t3, t0, t3\n\t" - "add t1, t1, t3\n\t" - "sltu t3, t1, t3\n\t" - "add t2, t2, t3\n\t" - "add t1, t1, t4\n\t" - "sltu t4, t1, t4\n\t" - "add t2, t2, t4\n\t" - - /* Check if h is larger than p */ - "addi t3, t0, 5\n\t" - "sltiu t3, t3, 5\n\t" - "add t4, t1, t3\n\t" - "sltu t3, t4, t3\n\t" - "add t4, t2, t3\n\t" - /* Check if h+5 is larger than 2^130 */ - "addi t4, t4, -4\n\t" - "srli t4, t4, 63\n\t" - "addi t4, t4, -1\n\t" - "andi t4, t4, 5\n\t" - "add t0, t0, t4\n\t" - "sltu t3, t0, t4\n\t" - "add t1, t1, t3\n\t" - "sltu t3, t1, t3\n\t" - "add t2, t2, t3\n\t" - "andi t2, t2, 3\n\t" - UNALIGNED_SD2(t0, t1, 0, %[mac], t2) - /* Zero out h. */ - "sd x0, %[ctx_h_0]\n\t" - "sd x0, %[ctx_h_1]\n\t" - "sd x0, %[ctx_h_2]\n\t" - /* Zero out r. */ - "sd x0, %[ctx_r_0]\n\t" - "sd x0, %[ctx_r_1]\n\t" - /* Zero out pad. */ - "ld t3, %[ctx_pad_0]\n\t" - "ld t4, %[ctx_pad_1]\n\t" - : [mac] "+r" (mac) - : [ctx_pad_0] "m" (ctx->pad[0]), [ctx_pad_1] "m" (ctx->pad[1]), - [ctx_h_0] "m" (ctx->h[0]), [ctx_h_1] "m" (ctx->h[1]), - [ctx_h_2] "m" (ctx->h[2]), - [ctx_r_0] "m" (ctx->r[0]), [ctx_r_1] "m" (ctx->r[1]) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" - ); - - return 0; -} - -#endif /* HAVE_POLY1305 */ -#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv/riscv-64-sha256.c b/wolfcrypt/src/port/riscv/riscv-64-sha256.c deleted file mode 100644 index f672db2739c..00000000000 --- a/wolfcrypt/src/port/riscv/riscv-64-sha256.c +++ /dev/null @@ -1,1395 +0,0 @@ -/* riscv-sha256.c - * - * Copyright (C) 2006-2026 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 3 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 - */ - -#include - -#ifdef WOLFSSL_RISCV_ASM -#if !defined(NO_SHA256) || defined(WOLFSSL_SHA224) - -#if FIPS_VERSION3_LT(6,0,0) && defined(HAVE_FIPS) - #undef HAVE_FIPS -#else - #if defined(HAVE_FIPS) && FIPS_VERSION3_GE(6,0,0) - /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ - #define FIPS_NO_WRAPPERS - #endif -#endif - -#include -#if FIPS_VERSION3_GE(6,0,0) - const unsigned int wolfCrypt_FIPS_sha256_ro_sanity[2] = - { 0x1a2b3c4d, 0x00000014 }; - int wolfCrypt_FIPS_SHA256_sanity(void) - { - return 0; - } -#endif - -#include - -#ifdef NO_INLINE - #include -#else - #define WOLFSSL_MISC_INCLUDED - #include -#endif - -/* Constants to add in each round. */ -static const FLASH_QUALIFIER ALIGN32 word32 K[64] = { - 0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL, - 0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L, - 0x243185BEL, 0x550C7DC3L, 0x72BE5D74L, 0x80DEB1FEL, 0x9BDC06A7L, - 0xC19BF174L, 0xE49B69C1L, 0xEFBE4786L, 0x0FC19DC6L, 0x240CA1CCL, - 0x2DE92C6FL, 0x4A7484AAL, 0x5CB0A9DCL, 0x76F988DAL, 0x983E5152L, - 0xA831C66DL, 0xB00327C8L, 0xBF597FC7L, 0xC6E00BF3L, 0xD5A79147L, - 0x06CA6351L, 0x14292967L, 0x27B70A85L, 0x2E1B2138L, 0x4D2C6DFCL, - 0x53380D13L, 0x650A7354L, 0x766A0ABBL, 0x81C2C92EL, 0x92722C85L, - 0xA2BFE8A1L, 0xA81A664BL, 0xC24B8B70L, 0xC76C51A3L, 0xD192E819L, - 0xD6990624L, 0xF40E3585L, 0x106AA070L, 0x19A4C116L, 0x1E376C08L, - 0x2748774CL, 0x34B0BCB5L, 0x391C0CB3L, 0x4ED8AA4AL, 0x5B9CCA4FL, - 0x682E6FF3L, 0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L, - 0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L -}; - -/* Initialize SHA-256 object for hashing. - * - * @param [in, out] sha256 SHA-256 object. - */ -static void InitSha256(wc_Sha256* sha256) -{ - /* Set initial hash values. */ -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha256->digest[0] = 0x6A09E667L; - sha256->digest[1] = 0xBB67AE85L; - sha256->digest[2] = 0x3C6EF372L; - sha256->digest[3] = 0xA54FF53AL; - sha256->digest[4] = 0x510E527FL; - sha256->digest[5] = 0x9B05688CL; - sha256->digest[6] = 0x1F83D9ABL; - sha256->digest[7] = 0x5BE0CD19L; -#else - /* f, e, b, a, h, g, d, c */ - sha256->digest[0] = 0x9B05688CL; - sha256->digest[1] = 0x510E527FL; - sha256->digest[2] = 0xBB67AE85L; - sha256->digest[3] = 0x6A09E667L; - sha256->digest[4] = 0x5BE0CD19L; - sha256->digest[5] = 0x1F83D9ABL; - sha256->digest[6] = 0xA54FF53AL; - sha256->digest[7] = 0x3C6EF372L; -#endif - - /* No hashed data. */ - sha256->buffLen = 0; - /* No data hashed. */ - sha256->loLen = 0; - sha256->hiLen = 0; - -#ifdef WOLFSSL_HASH_FLAGS - sha256->flags = 0; -#endif -} - -/* More data hashed, add length to 64-bit cumulative total. - * - * @param [in, out] sha256 SHA-256 object. Assumed not NULL. - * @param [in] len Length to add. - */ -static WC_INLINE void AddLength(wc_Sha256* sha256, word32 len) -{ - word32 tmp = sha256->loLen; - if ((sha256->loLen += len) < tmp) - sha256->hiLen++; /* carry low to high */ -} - -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - -/* Load a word with bytes reversed. */ -#define LOAD_WORD_REV(r, o, p, t0, t1, t2) \ - "lbu " #t0 ", " #o "(" #p ")\n\t" \ - "lbu " #t1 ", " #o "+1(" #p ")\n\t" \ - "lbu " #t2 ", " #o "+2(" #p ")\n\t" \ - "lbu " #r ", " #o "+3(" #p ")\n\t" \ - "slli " #t0 ", " #t0 ", 24\n\t" \ - "slli " #t1 ", " #t1 ", 16\n\t" \ - "slli " #t2 ", " #t2 ", 8\n\t" \ - "or " #r ", " #r ", " #t0 "\n\t" \ - "or " #r ", " #r ", " #t1 "\n\t" \ - "or " #r ", " #r ", " #t2 "\n\t" - -/* Load a word with bytes reversed. */ -#define LOAD_DWORD_REV(r, o, p, t0, t1, t2, t3) \ - "lbu " #t0 ", " #o "(" #p ")\n\t" \ - "lbu " #t1 ", " #o "+1(" #p ")\n\t" \ - "lbu " #t2 ", " #o "+2(" #p ")\n\t" \ - "lbu " #r ", " #o "+3(" #p ")\n\t" \ - "slli " #t0 ", " #t0 ", 24\n\t" \ - "slli " #t1 ", " #t1 ", 16\n\t" \ - "slli " #t2 ", " #t2 ", 8\n\t" \ - "or " #r ", " #r ", " #t0 "\n\t" \ - "or " #r ", " #r ", " #t1 "\n\t" \ - "or " #r ", " #r ", " #t2 "\n\t" \ - "lbu " #t0 ", " #o "+4(" #p ")\n\t" \ - "lbu " #t1 ", " #o "+5(" #p ")\n\t" \ - "lbu " #t2 ", " #o "+6(" #p ")\n\t" \ - "lbu " #t3 ", " #o "+7(" #p ")\n\t" \ - "slli " #t0 ", " #t0 ", 56\n\t" \ - "slli " #t1 ", " #t1 ", 48\n\t" \ - "slli " #t2 ", " #t2 ", 40\n\t" \ - "slli " #t3 ", " #t3 ", 32\n\t" \ - "or " #r ", " #r ", " #t0 "\n\t" \ - "or " #r ", " #r ", " #t1 "\n\t" \ - "or " #r ", " #r ", " #t2 "\n\t" \ - "or " #r ", " #r ", " #t3 "\n\t" - -#define PACK_BB(rd, rs1, rs2, rrd, rrs1, rrs2) \ - "slli " #rd ", " #rs1 ", 32\n\t" \ - "slli " #rs2 ", " #rs2 ", 32\n\t" \ - "srli " #rd ", " #rs1 ", 32\n\t" \ - "or " #rd ", " #rd ", " #rs2 "\n\t" - -#else - -#define PACK_BB(rd, rs1, rs2, rrd, rrs1, rrs2) \ - PACK(rrd, rrs1, rrs2) - -#endif - -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - -#ifdef WOLFSSL_RISCV_SCALAR_CRYPTO_ASM - -/* SHA-256 SUM0 operation. */ -#define SHA256SUM0(rd, rs1) \ - ASM_WORD((0b000100000000 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) -/* SHA-256 SUM1 operation. */ -#define SHA256SUM1(rd, rs1) \ - ASM_WORD((0b000100000001 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) -/* SHA-256 SIGMA0 operation. */ -#define SHA256SIG0(rd, rs1) \ - ASM_WORD((0b000100000010 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) -/* SHA-256 SIGMA1 operation. */ -#define SHA256SIG1(rd, rs1) \ - ASM_WORD((0b000100000011 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) - -/* One round of compression. */ -#define RND(a, b, c, d, e, f, g, h, w, k) \ - /* Get e and a */ \ - "mv a4, " #e "\n\t" \ - "mv a5, " #a "\n\t" \ - /* Sigma1(e) */ \ - SHA256SUM1(REG_A4, REG_A4) \ - /* Sigma0(a) */ \ - SHA256SUM0(REG_A5, REG_A5) \ - /* Maj(a, b, c) = t5 */ \ - /* Ch(e, f, g) = t6 */ \ - /* f ^ g */ \ - "xor t6, " #f ", " #g "\n\t" \ - /* a ^ b */ \ - "xor t4, " #a ", " #b "\n\t" \ - /* b ^ c */ \ - "xor t5, " #b ", " #c "\n\t" \ - /* (f ^ g) & e */ \ - "and t6, t6, " #e "\n\t" \ - /* h + sigma1 */ \ - "addw " #h ", " #h ", a4\n\t" \ - /* (a^b) & (b^c) */ \ - "and t5, t5, t4\n\t" \ - /* ((f ^ g) & e) ^ g */ \ - "xor t6, t6, " #g "\n\t" \ - /* K + W */ \ - "addw t4, " #k ", " #w "\n\t" \ - /* ((a^b) & (b^c)) ^ b */ \ - "xor t5, t5, " #b "\n\t" \ - /* h + sigma1 + Ch */ \ - "addw " #h ", " #h ", t6\n\t" \ - /* 't0' = h + sigma1 + Ch + K + W */ \ - "addw " #h ", " #h ", t4\n\t" \ - /* Sigma0(a) + Maj = 't1' */ \ - "addw t5, a5, t5\n\t" \ - /* d += 't0' */ \ - "addw " #d ", " #d ", " #h "\n\t" \ - /* 't0' += 't1' */ \ - "addw " #h ", " #h ", t5\n\t" - -/* Two message schedule updates. */ -#define W_UPDATE_2(w0, w1, w4, w5, w7, reg_w0, reg_w1, reg_w7) \ - /* W[i-15] = W[1] */ \ - "srli t4, " #w0 ", 32\n\t" \ - /* W[i-7] = W[9] */ \ - "srli t6, " #w4 ", 32\n\t" \ - /* Gamma0(W[1]) */ \ - SHA256SIG0(REG_A4, REG_T4) \ - /* Gamma1(W[i-2]) = Gamma1(W[14]) */ \ - SHA256SIG1(REG_A5, reg_w7) \ - /* Gamma1(W[14]) + W[9] */ \ - "addw a5, a5, t6\n\t" \ - /* Gamma0(W[1]) + W[i-16] = Gamma0(W[1]) + W[0] */ \ - "addw " #w0 ", " #w0 ", a4\n\t" \ - /* W[i+1-2] = W[15] */ \ - "srli t5, " #w7 ", 32\n\t" \ - /* W[0] = Gamma1(W[14]) + W[9] + Gamma0(W[1]) + W[0] */ \ - "addw " #w0 ", a5, " #w0 "\n\t" \ - \ - /* W[i+1-16] = W[1] = t4 */ \ - /* Gamma0(W[i+1-15]) = Gamma0(W[2]) */ \ - SHA256SIG0(REG_A6, reg_w1) \ - /* Gamma1(W[i+1-2]) = Gamma1(W[15]) */ \ - SHA256SIG1(REG_A7, REG_T5) \ - /* Gamma1(W[15]) + W[i+1-7] = Gamma1(W[15]) + W[10] */ \ - "addw a7, a7, " #w5 "\n\t" \ - /* Gamma0(W[2]) + W[i+1-16] = Gamma0(W[2]) + W[1] */ \ - "addw t5, a6, t4\n\t" \ - /* Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16] */ \ - "addw a7, a7, t5\n\t" \ - /* Place in W[i+1-16] = W[1] */ \ - PACK_BB(w0, w0, a7, reg_w0, reg_w0, REG_A7) - -#else - -/* SHA-256 SIGMA1 operation. */ -#define SHA256SIG1(rd, rs1) \ - "slliw t6, " #rs1 ", 15\n\t" \ - "srliw t5, " #rs1 ", 17\n\t" \ - "slliw t4, " #rs1 ", 13\n\t" \ - "srliw " #rd ", " #rs1 ", 19\n\t" \ - "or t6, t6, t5\n\t" \ - "srliw t5, " #rs1 ", 10\n\t" \ - "xor " #rd ", "#rd ", t4\n\t" \ - "xor t6, t6, t5\n\t" \ - "xor " #rd ", " #rd ", t6\n\t" \ - -/* One round of compression. */ -#define RND(a, b, c, d, e, f, g, h, w, k) \ - /* a4 = Sigma1(e) */ \ - "slliw t5, " #e ", 26\n\t" \ - "srliw t4, " #e ", 6\n\t" \ - "slliw t6, " #e ", 21\n\t" \ - "srliw a4, " #e ", 11\n\t" \ - "slliw a5, " #e ", 7\n\t" \ - "or t4, t4, t5\n\t" \ - "xor a4, a4, t6\n\t" \ - "srliw t5, " #e ", 25\n\t" \ - "xor t4, t4, a5\n\t" \ - "xor a4, a4, t5\n\t" \ - /* a5 = Sigma0(a) */ \ - "slliw t5, " #a ", 30\n\t" \ - "xor a4, a4, t4\n\t" \ - "srliw t4, " #a ", 2\n\t" \ - "slliw t6, " #a ", 19\n\t" \ - /* h + sigma1 */ \ - "addw " #h ", " #h ", a4\n\t" \ - "srliw a5, " #a ", 13\n\t" \ - "slliw a4, " #a ", 10\n\t" \ - "or t4, t4, t5\n\t" \ - "xor a5, a5, t6\n\t" \ - "srliw t6, " #a ", 22\n\t" \ - "xor t4, t4, a4\n\t" \ - "xor a5, a5, t6\n\t" \ - /* Maj(a, b, c) = t5 */ \ - /* Ch(e, f, g) = t6 */ \ - /* f ^ g */ \ - "xor t6, " #f ", " #g "\n\t" \ - /* a ^ b */ \ - "xor t5, " #a ", " #b "\n\t" \ - /* b ^ c */ \ - "xor a4, " #b ", " #c "\n\t" \ - "xor a5, a5, t4\n\t" \ - /* (f ^ g) & e */ \ - "and t6, t6, " #e "\n\t" \ - /* (a^b) & (b^c) */ \ - "and t5, t5, a4\n\t" \ - /* ((f ^ g) & e) ^ g */ \ - "xor t6, t6, " #g "\n\t" \ - /* K + W */ \ - "addw a4, " #k ", " #w "\n\t" \ - /* h + sigma1 + Ch */ \ - "addw " #h ", " #h ", t6\n\t" \ - /* ((a^b) & (b^c)) ^ b */ \ - "xor t5, t5, " #b "\n\t" \ - /* 't0' = h + sigma1 + Ch + K + W */ \ - "addw " #h ", " #h ", a4\n\t" \ - /* 't1' = Sigma0(a) + Maj */ \ - "addw t5, a5, t5\n\t" \ - /* d += 't0' */ \ - "addw " #d ", " #d ", " #h "\n\t" \ - /* h = 't0' + 't1' */ \ - "addw " #h ", " #h ", t5\n\t" - -/* Two message schedule updates. */ -#define W_UPDATE_2(w0, w1, w4, w5, w7, reg_w0, reg_w1, reg_w7) \ - /* W[i-15] = W[1] */ \ - "srli a7, " #w0 ", 32\n\t" \ - /* W[i-7] = W[9] */ \ - "srli a6, " #w4 ", 32\n\t" \ - /* Gamma0(W[1]) */ \ - "slliw t4, a7, 25\n\t" \ - "srliw t5, a7, 7\n\t" \ - "slliw t6, a7, 14\n\t" \ - "srliw a4, a7, 18\n\t" \ - "or t4, t4, t5\n\t" \ - "srliw t5, a7, 3\n\t" \ - "xor a4, a4, t6\n\t" \ - "xor t4, t4, t5\n\t" \ - /* Gamma1(W[i-2]) = Gamma1(W[14]) */ \ - "slliw t6, " #w7 ", 15\n\t" \ - "srliw t5, " #w7 ", 17\n\t" \ - "xor a4, a4, t4\n\t" \ - "slliw t4, " #w7 ", 13\n\t" \ - "srliw a5, " #w7 ", 19\n\t" \ - "or t6, t6, t5\n\t" \ - "srliw t5, " #w7 ", 10\n\t" \ - "xor a5, a5, t4\n\t" \ - "xor t6, t6, t5\n\t" \ - "xor a5, a5, t6\n\t" \ - /* Gamma0(W[1]) + W[i-16] = Gamma0(W[1]) + W[0] */ \ - "addw " #w0 ", " #w0 ", a4\n\t" \ - /* Gamma1(W[14]) + W[9] */ \ - "addw a5, a5, a6\n\t" \ - /* W[0] = Gamma1(W[14]) + W[9] + Gamma0(W[1]) + W[0] */ \ - "addw " #w0 ", a5, " #w0 "\n\t" \ - \ - /* W[i+1-16] = W[1] = a7 */ \ - /* W[i+1-2] = W[15] */ \ - "srli a4, " #w7 ", 32\n\t" \ - /* Gamma0(W[i+1-15]) = Gamma0(W[2]) */ \ - "slliw t4, " #w1 ", 25\n\t" \ - "srliw t5, " #w1 ", 7\n\t" \ - "slliw t6, " #w1 ", 14\n\t" \ - "srliw a6, " #w1 ", 18\n\t" \ - "or t4, t4, t5\n\t" \ - "srliw t5, " #w1 ", 3\n\t" \ - "xor a6, a6, t6\n\t" \ - "xor t4, t4, t5\n\t" \ - /* Gamma1(W[i+1-2]) = Gamma1(W[15]) */ \ - "slliw t6, a4, 15\n\t" \ - "srliw t5, a4, 17\n\t" \ - "xor a6, a6, t4\n\t" \ - "slliw t4, a4, 13\n\t" \ - "srliw a5, a4, 19\n\t" \ - "or t6, t6, t5\n\t" \ - "srliw t5, a4, 10\n\t" \ - "xor a5, a5, t4\n\t" \ - "xor t6, t6, t5\n\t" \ - "xor a5, a5, t6\n\t" \ - /* Gamma0(W[2]) + W[i+1-16] = Gamma0(W[2]) + W[1] */ \ - "addw t5, a6, a7\n\t" \ - /* Gamma1(W[15]) + W[i+1-7] = Gamma1(W[15]) + W[10] */ \ - "addw a5, a5, " #w5 "\n\t" \ - /* Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16] */ \ - "addw a5, a5, t5\n\t" \ - /* Place in W[i+1-16] = W[1] */ \ - PACK_BB(w0, w0, a5, reg_w0, reg_w0, REG_A5) - -#endif /* WOLFSSL_RISCV_SCALAR_CRYPTO_ASM */ - -/* Two rounds of compression. */ -#define RND2(a, b, c, d, e, f, g, h, w, o) \ - /* Get k[i], k[i+1] */ \ - "ld a6, " #o "(%[k])\n\t" \ - RND(a, b, c, d, e, f, g, h, w, a6) \ - /* Move k[i+1] down */ \ - "srli a6, a6, 32\n\t" \ - /* Move W[i] down */ \ - "srli a7, " #w ", 32\n\t" \ - RND(h, a, b, c, d, e, f, g, a7, a6) - -/* Sixteen rounds of compression with message scheduling. */ -#define RND16() \ - RND2(t0, t1, t2, t3, s8, s9, s10, s11, s0, 0) \ - W_UPDATE_2(s0, s1, s4, s5, s7, REG_S0, REG_S1, REG_S7) \ - RND2(s10, s11, t0, t1, t2, t3, s8, s9, s1, 8) \ - W_UPDATE_2(s1, s2, s5, s6, s0, REG_S1, REG_S2, REG_S0) \ - RND2(s8, s9, s10, s11, t0, t1, t2, t3, s2, 16) \ - W_UPDATE_2(s2, s3, s6, s7, s1, REG_S2, REG_S3, REG_S1) \ - RND2(t2, t3, s8, s9, s10, s11, t0, t1, s3, 24) \ - W_UPDATE_2(s3, s4, s7, s0, s2, REG_S3, REG_S4, REG_S2) \ - RND2(t0, t1, t2, t3, s8, s9, s10, s11, s4, 32) \ - W_UPDATE_2(s4, s5, s0, s1, s3, REG_S4, REG_S5, REG_S3) \ - RND2(s10, s11, t0, t1, t2, t3, s8, s9, s5, 40) \ - W_UPDATE_2(s5, s6, s1, s2, s4, REG_S5, REG_S6, REG_S4) \ - RND2(s8, s9, s10, s11, t0, t1, t2, t3, s6, 48) \ - W_UPDATE_2(s6, s7, s2, s3, s5, REG_S6, REG_S7, REG_S5) \ - RND2(t2, t3, s8, s9, s10, s11, t0, t1, s7, 56) \ - W_UPDATE_2(s7, s0, s3, s4, s6, REG_S7, REG_S0, REG_S6) - -/* Sixteen rounds of compression only. */ -#define RND16_LAST() \ - RND2(t0, t1, t2, t3, s8, s9, s10, s11, s0, 0) \ - RND2(s10, s11, t0, t1, t2, t3, s8, s9, s1, 8) \ - RND2(s8, s9, s10, s11, t0, t1, t2, t3, s2, 16) \ - RND2(t2, t3, s8, s9, s10, s11, t0, t1, s3, 24) \ - RND2(t0, t1, t2, t3, s8, s9, s10, s11, s4, 32) \ - RND2(s10, s11, t0, t1, t2, t3, s8, s9, s5, 40) \ - RND2(s8, s9, s10, s11, t0, t1, t2, t3, s6, 48) \ - RND2(t2, t3, s8, s9, s10, s11, t0, t1, s7, 56) - -/* Transform the message data. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] data Buffer of data to hash. - * @param [in] blocks Number of blocks of data to hash. - */ -static WC_OMIT_FRAME_POINTER WC_INLINE void Sha256Transform(wc_Sha256* sha256, - const byte* data, word32 blocks) -{ - word32* k = (word32*)K; - - __asm__ __volatile__ ( - /* Load digest. */ - "ld t0, 0(%[digest])\n\t" - "ld t2, 8(%[digest])\n\t" - "ld s8, 16(%[digest])\n\t" - "ld s10, 24(%[digest])\n\t" - "srli t1, t0, 32\n\t" - "srli t3, t2, 32\n\t" - "srli s9, s8, 32\n\t" - "srli s11, s10, 32\n\t" - - /* 4 rounds of 16 per block. */ - "slli %[blocks], %[blocks], 2\n\t" - - "\n1:\n\t" - /* beginning of SHA256 block operation */ - /* Load W */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - LOAD_DWORD_REV(s0, 0, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s1, 8, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s2, 16, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s3, 24, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s4, 32, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s5, 40, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s6, 48, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s7, 56, %[data], a4, a5, a6, a7) -#else - UNALIGNED_LWU8(a4, s0, a5, s1, a6, s2, a7, s3, 0, %[data], t4) - PACK_BB(s0, s0, a4, REG_S0, REG_S0, REG_A4) - PACK_BB(s1, s1, a5, REG_S1, REG_S1, REG_A5) - PACK_BB(s2, s2, a6, REG_S2, REG_S2, REG_A6) - PACK_BB(s3, s3, a7, REG_S3, REG_S3, REG_A7) - REV8(REG_S0, REG_S0) - REV8(REG_S1, REG_S1) - REV8(REG_S2, REG_S2) - REV8(REG_S3, REG_S3) - UNALIGNED_LWU8(a4, s4, a5, s5, a6, s6, a7, s7, 32, %[data], t4) - PACK_BB(s4, s4, a4, REG_S4, REG_S4, REG_A4) - PACK_BB(s5, s5, a5, REG_S5, REG_S5, REG_A5) - PACK_BB(s6, s6, a6, REG_S6, REG_S6, REG_A6) - PACK_BB(s7, s7, a7, REG_S7, REG_S7, REG_A7) - REV8(REG_S4, REG_S4) - REV8(REG_S5, REG_S5) - REV8(REG_S6, REG_S6) - REV8(REG_S7, REG_S7) -#endif - - /* Subtract one as there are only 3 loops. */ - "addi %[blocks], %[blocks], -1\n\t" - "\n2:\n\t" - RND16() - "addi %[blocks], %[blocks], -1\n\t" - "add %[k], %[k], 64\n\t" - "andi a4, %[blocks], 3\n\t" - "bnez a4, 2b \n\t" - RND16_LAST() - "addi %[k], %[k], -192\n\t" - - "# Add working vars back into digest state.\n\t" - "ld a4, 0(%[digest])\n\t" - "ld a5, 8(%[digest])\n\t" - "ld a6, 16(%[digest])\n\t" - "ld a7, 24(%[digest])\n\t" - "addw t0, t0, a4\n\t" - "addw t2, t2, a5\n\t" - "addw s8, s8, a6\n\t" - "addw s10, s10, a7\n\t" - "srli a4, a4, 32\n\t" - "srli a5, a5, 32\n\t" - "srli a6, a6, 32\n\t" - "srli a7, a7, 32\n\t" - "addw t1, t1, a4\n\t" - "addw t3, t3, a5\n\t" - "addw s9, s9, a6\n\t" - "addw s11, s11, a7\n\t" - - /* Store digest. */ - "sw t0, 0(%[digest])\n\t" - "sw t1, 4(%[digest])\n\t" - "sw t2, 8(%[digest])\n\t" - "sw t3, 12(%[digest])\n\t" - "sw s8, 16(%[digest])\n\t" - "sw s9, 20(%[digest])\n\t" - "sw s10, 24(%[digest])\n\t" - "sw s11, 28(%[digest])\n\t" - - "add %[data], %[data], 64\n\t" - "bnez %[blocks], 1b \n\t" - - : [blocks] "+r" (blocks), [data] "+r" (data), [k] "+r" (k) - : [digest] "r" (sha256->digest) - : "cc", "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "a4", "a5", "a6", "a7", - "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", - "s11" - ); - -} - -#else - -/* Two rounds of compression using low two 32-bit W values. - * Assumes K has been added into W values. - */ -#define VSHA2CL_VV(vd, vs1, vs2) \ - ASM_WORD((0b101111 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (vd << 7) | (vs1 << 15) | (vs2 << 20)) - -/* Two rounds of compression using upper two 32-bit W values. - * Assumes K has been added into W values. - */ -#define VSHA2CH_VV(vd, vs1, vs2) \ - ASM_WORD((0b101110 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (vd << 7) | (vs1 << 15) | (vs2 << 20)) - -/* Update 4 W values - message scheduling. */ -#define VSHA2MS_VV(vd, vs1, vs2) \ - ASM_WORD((0b101101 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (vd << 7) | (vs1 << 15) | (vs2 << 20)) - -#define RND4(w0, w1, w2, w3, k) \ - /* Four rounds of compression. */ \ - VADD_VV(REG_V7, w0, k) \ - VMV_X_S(REG_T1, w1) \ - VSHA2CL_VV(REG_V5, REG_V7, REG_V4) \ - VMV_V_V(REG_V6, w2) \ - VSHA2CH_VV(REG_V4, REG_V7, REG_V5) \ - /* Update 4 W values - message schedule. */ \ - VMV_S_X(REG_V6, REG_T1) \ - VSHA2MS_VV(w0, w3, REG_V6) - -#define RND4_LAST(w, k) \ - /* Four rounds of compression. */ \ - VADD_VV(REG_V7, w, k) \ - VSHA2CL_VV(REG_V5, REG_V7, REG_V4) \ - VSHA2CH_VV(REG_V4, REG_V7, REG_V5) - -#define RND16(k) \ - RND4(REG_V0, REG_V1, REG_V2, REG_V3, (k + 0)) \ - RND4(REG_V1, REG_V2, REG_V3, REG_V0, (k + 1)) \ - RND4(REG_V2, REG_V3, REG_V0, REG_V1, (k + 2)) \ - RND4(REG_V3, REG_V0, REG_V1, REG_V2, (k + 3)) - -#define RND16_LAST(k) \ - RND4_LAST(REG_V0, (k + 0)) \ - RND4_LAST(REG_V1, (k + 1)) \ - RND4_LAST(REG_V2, (k + 2)) \ - RND4_LAST(REG_V3, (k + 3)) - -/* Transform the message data. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] data Buffer of data to hash. - * @param [in] blocks Number of blocks of data to hash. - */ -static void Sha256Transform(wc_Sha256* sha256, const byte* data, - word32 blocks) -{ - word32* k = (word32*)K; - - __asm__ __volatile__ ( - VSETIVLI(REG_ZERO, 4, 1, 1, 0b010, 0b000) - - /* Load: a|b|e|f, c|d|g|h - * 3 2 1 0 3 2 1 0 - */ - "mv t0, %[digest]\n\t" - VL2RE32_V(REG_V4, REG_T0) - - "mv t0, %[k]\n\t" - VL8RE32_V(REG_V8, REG_T0) - "addi t0, %[k], 128\n\t" - VL8RE32_V(REG_V16, REG_T0) - - "\n1:\n\t" - VMV_V_V(REG_V30, REG_V4) - VMV_V_V(REG_V31, REG_V5) - - /* Load 16 W into 4 vectors of 4 32-bit words. */ - "mv t0, %[data]\n\t" - VL4RE32_V(REG_V0, REG_T0) - VREV8(REG_V0, REG_V0) - VREV8(REG_V1, REG_V1) - VREV8(REG_V2, REG_V2) - VREV8(REG_V3, REG_V3) - - RND16(REG_V8) - RND16(REG_V12) - RND16(REG_V16) - RND16_LAST(REG_V20) - - VADD_VV(REG_V4, REG_V4, REG_V30) - VADD_VV(REG_V5, REG_V5, REG_V31) - - "addi %[blocks], %[blocks], -1\n\t" - "add %[data], %[data], 64\n\t" - "bnez %[blocks], 1b \n\t" - - "mv t0, %[digest]\n\t" - VS2R_V(REG_V4, REG_T0) - - : [blocks] "+r" (blocks), [data] "+r" (data), [k] "+r" (k) - : [digest] "r" (sha256->digest) - : "cc", "memory", "t0", "t1" - ); -} - -#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ - -/* Update the hash with data. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] data Buffer of data to hash. - * @param [in] len Number of bytes in buffer to hash. - * @return 0 on success. - */ -static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, - word32 len) -{ - word32 add; - word32 blocks; - - /* only perform actions if a buffer is passed in */ - if (len > 0) { - AddLength(sha256, len); - - if (sha256->buffLen > 0) { - /* fill leftover buffer with data */ - add = min(len, WC_SHA256_BLOCK_SIZE - sha256->buffLen); - XMEMCPY((byte*)(sha256->buffer) + sha256->buffLen, data, add); - sha256->buffLen += add; - data += add; - len -= add; - if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) { - Sha256Transform(sha256, (byte*)sha256->buffer, 1); - sha256->buffLen = 0; - } - } - - /* number of blocks in a row to complete */ - blocks = len / WC_SHA256_BLOCK_SIZE; - - if (blocks > 0) { - Sha256Transform(sha256, data, blocks); - data += blocks * WC_SHA256_BLOCK_SIZE; - len -= blocks * WC_SHA256_BLOCK_SIZE; - } - - if (len > 0) { - /* copy over any remaining data leftover */ - XMEMCPY(sha256->buffer, data, len); - sha256->buffLen = len; - } - } - - /* account for possibility of not used if len = 0 */ - (void)add; - (void)blocks; - - return 0; -} - -/* Finalize the hash and put into buffer. - * - * @param [in, out] sha256 SHA-256 object. - * @param [out] hash Buffer to hold hash result. - */ -static WC_INLINE void Sha256Final(wc_Sha256* sha256, byte* hash) -{ - byte* local; - - local = (byte*)sha256->buffer; - local[sha256->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (sha256->buffLen > WC_SHA256_PAD_SIZE) { - XMEMSET(&local[sha256->buffLen], 0, - WC_SHA256_BLOCK_SIZE - sha256->buffLen); - Sha256Transform(sha256, (byte*)sha256->buffer, 1); - sha256->buffLen = 0; - } - XMEMSET(&local[sha256->buffLen], 0, WC_SHA256_PAD_SIZE - sha256->buffLen); - - /* put lengths in bits */ - sha256->hiLen = (sha256->loLen >> (8*sizeof(sha256->loLen) - 3)) + - (sha256->hiLen << 3); - sha256->loLen = sha256->loLen << 3; - - XMEMCPY(&local[WC_SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32)); - XMEMCPY(&local[WC_SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen, - sizeof(word32)); - - /* store lengths */ - __asm__ __volatile__ ( - /* Reverse byte order of 32-bit words. */ -#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) - "ld t1, 56(%[buff])\n\t" - REV8(REG_T1, REG_T1) - "srli t0, t1, 32\n\t" - "sw t0, 56(%[buff])\n\t" - "sw t1, 60(%[buff])\n\t" -#else - LOAD_WORD_REV(t0, 56, %[buff], t2, t3, t4) - LOAD_WORD_REV(t1, 60, %[buff], t2, t3, t4) - "sw t0, 56(%[buff])\n\t" - "sw t1, 60(%[buff])\n\t" -#endif - : - : [buff] "r" (sha256->buffer) - : "cc", "memory", "t0", "t1", "t2", "t3", "t4" - ); - - Sha256Transform(sha256, (byte*)sha256->buffer, 1); - - __asm__ __volatile__ ( - /* Reverse byte order of 32-bit words. */ -#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) - VSETIVLI(REG_ZERO, 4, 1, 1, 0b010, 0b000) - "mv t0, %[digest]\n\t" - VL2RE32_V(REG_V8, REG_T0) - VREV8(REG_V8, REG_V8) - VREV8(REG_V9, REG_V9) - /* a|b|e|f, c|d|g|h - * 3 2 1 0 3 2 1 0 */ - VSLIDEDOWN_VI(REG_V0, REG_V8, 3) /* a */ - VSLIDEDOWN_VI(REG_V2, REG_V8, 2) /* b */ - VSLIDEDOWN_VI(REG_V1, REG_V8, 1) /* e */ - VSLIDEDOWN_VI(REG_V3, REG_V9, 3) /* c */ - VSLIDEDOWN_VI(REG_V4, REG_V9, 2) /* d */ - VSLIDEDOWN_VI(REG_V5, REG_V9, 1) /* g */ - /* -|-|-|a, -|-|-|e */ - VSLIDEUP_VI(REG_V0, REG_V2, 1) - /* -|-|b|a, -|-|-|e */ - VSLIDEUP_VI(REG_V0, REG_V3, 2) - /* -|c|b|a, -|-|-|e */ - VSLIDEUP_VI(REG_V0, REG_V4, 3) - /* d|c|b|a, -|-|-|e */ - VSLIDEUP_VI(REG_V1, REG_V8, 1) - /* d|c|b|a, -|-|f|e */ - VSLIDEUP_VI(REG_V1, REG_V5, 2) - /* d|c|b|a, -|g|f|e */ - VSLIDEUP_VI(REG_V1, REG_V9, 3) - /* d|c|b|a, h|g|f|e */ - "mv t0, %[hash]\n\t" - VS2R_V(REG_V0, REG_T0) -#elif defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) - VSETIVLI(REG_ZERO, 4, 1, 1, 0b010, 0b000) - "mv t0, %[digest]\n\t" - VL2RE32_V(REG_V0, REG_T0) - VREV8(REG_V0, REG_V0) - VREV8(REG_V1, REG_V1) - "mv t0, %[hash]\n\t" - VS2R_V(REG_V0, REG_T0) -#elif defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) - "ld t1, 0(%[digest])\n\t" - "ld t3, 8(%[digest])\n\t" - "ld a5, 16(%[digest])\n\t" - "ld a7, 24(%[digest])\n\t" - REV8(REG_T1, REG_T1) - REV8(REG_T3, REG_T3) - REV8(REG_A5, REG_A5) - REV8(REG_A7, REG_A7) - "srli t0, t1, 32\n\t" - "srli t2, t3, 32\n\t" - "srli a4, a5, 32\n\t" - "srli a6, a7, 32\n\t" - UNALIGNED_SW8(t0, t1, t2, t3, a4, a5, a6, a7, 0, %[hash], t4) -#else - LOAD_WORD_REV(t0, 0, %[digest], t2, t3, t4) - LOAD_WORD_REV(t1, 4, %[digest], t2, t3, t4) - LOAD_WORD_REV(a4, 8, %[digest], t2, t3, t4) - LOAD_WORD_REV(a5, 12, %[digest], t2, t3, t4) - UNALIGNED_SW4(t0, t1, a4, a5, 0, %[hash], t2) - LOAD_WORD_REV(t0, 16, %[digest], t2, t3, t4) - LOAD_WORD_REV(t1, 20, %[digest], t2, t3, t4) - LOAD_WORD_REV(a4, 24, %[digest], t2, t3, t4) - LOAD_WORD_REV(a5, 28, %[digest], t2, t3, t4) - UNALIGNED_SW4(t0, t1, a4, a5, 16, %[hash], t2) -#endif - : - : [digest] "r" (sha256->digest), [hash] "r" (hash) - : "cc", "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "a4", "a5", "a6", "a7" - ); -} - - -#ifndef NO_SHA256 - -/* Initialize SHA-256 object for hashing. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] heap Dynamic memory hint. - * @param [in] devId Device Id. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 is NULL. - */ -int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId) -{ - int ret = 0; - - /* Validate parameters. */ - if (sha256 == NULL) { - ret = BAD_FUNC_ARG; - } - else { - sha256->heap = heap; - #ifdef WOLF_CRYPTO_CB - sha256->devId = devId; - #endif - (void)devId; - - InitSha256(sha256); - } - - return ret; -} - -/* Initialize SHA-256 object for hashing. - * - * @param [in, out] sha256 SHA-256 object. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 is NULL. - */ -int wc_InitSha256(wc_Sha256* sha256) -{ - return wc_InitSha256_ex(sha256, NULL, INVALID_DEVID); -} - -/* Free the SHA-256 hash. - * - * @param [in] sha256 SHA-256 object. - */ -void wc_Sha256Free(wc_Sha256* sha256) -{ - /* No dynamic memory allocated. */ - (void)sha256; -} - -/* Update the hash with data. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] data Buffer of data to hash. - * @param [in] len Number of bytes in buffer to hash. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 is NULL. - * @return BAD_FUNC_ARG when data is NULL but len is not 0. - */ -int wc_Sha256Update(wc_Sha256* sha256, const byte* data, word32 len) -{ - int ret; - - /* Validate parameters. */ - if ((sha256 == NULL) || ((data == NULL) && (len != 0))) { - ret = BAD_FUNC_ARG; - } - else { - ret = Sha256Update(sha256, data, len); - } - - return ret; -} - -/* Put the current hash into buffer. - * - * @param [in, out] sha256 SHA-256 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 or hash is NULL. - */ -int wc_Sha256FinalRaw(wc_Sha256* sha256, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha256 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - word32 digest[WC_SHA256_DIGEST_SIZE / sizeof(word32)]; - - #ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - ByteReverseWords((word32*)digest, (word32*)sha256->digest, - WC_SHA256_DIGEST_SIZE); - #else - /* f, e, b, a, h, g, d, c */ - digest[0] = ByteReverseWord32(sha256->digest[3]); - digest[1] = ByteReverseWord32(sha256->digest[2]); - digest[2] = ByteReverseWord32(sha256->digest[7]); - digest[3] = ByteReverseWord32(sha256->digest[6]); - digest[4] = ByteReverseWord32(sha256->digest[1]); - digest[5] = ByteReverseWord32(sha256->digest[0]); - digest[6] = ByteReverseWord32(sha256->digest[5]); - digest[7] = ByteReverseWord32(sha256->digest[4]); - #endif - - XMEMCPY(hash, digest, WC_SHA256_DIGEST_SIZE); - } - - return ret; -} - -/* Finalize the hash and put into buffer. - * - * @param [in, out] sha256 SHA-256 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 or hash is NULL. - */ -int wc_Sha256Final(wc_Sha256* sha256, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha256 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - /* Finalize hash. */ - Sha256Final(sha256, hash); - /* Restart SHA-256 object for next hash. */ - InitSha256(sha256); - } - - return ret; -} - -/* Finalize the hash and put into buffer but don't modify state. - * - * @param [in, out] sha256 SHA-256 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 or hash is NULL. - */ -int wc_Sha256GetHash(wc_Sha256* sha256, byte* hash) -{ - int ret; - - /* Validate parameters. */ - if ((sha256 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - wc_Sha256 tmpSha256; - XMEMSET(&tmpSha256, 0, sizeof(tmpSha256)); - /* Create a copy of the hash to finalize. */ - ret = wc_Sha256Copy(sha256, &tmpSha256); - if (ret == 0) { - /* Finalize copy. */ - Sha256Final(&tmpSha256, hash); - } - } - - return ret; -} - -#ifdef WOLFSSL_HASH_FLAGS -/* Set flags of SHA-256 object. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] flags Flags to set. - * @return 0 on success. - */ -int wc_Sha256SetFlags(wc_Sha256* sha256, word32 flags) -{ - /* Check we have an object to use. */ - if (sha256 != NULL) { - sha256->flags = flags; - } - return 0; -} -/* Get flags of SHA-256 object. - * - * @param [in] sha256 SHA-256 object. - * @param [out] flags Flags from SHA-256 object. - * @return 0 on success. - */ -int wc_Sha256GetFlags(wc_Sha256* sha256, word32* flags) -{ - /* Check we have an object and return parameter to use. */ - if ((sha256 != NULL) && (flags != NULL)) { - *flags = sha256->flags; - } - return 0; -} -#endif - -/* Deep copy the SHA-256 object. - * - * @param [in] src SHA-256 object to copy. - * @param [out] dst SHA-256 object to fill. - * @return 0 on success. - * @return BAD_FUNC_ARG when src or dst is NULL. - */ -int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst) -{ - int ret = 0; - - /* Validate parameters. */ - if ((src == NULL) || (dst == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - XMEMCPY(dst, src, sizeof(wc_Sha256)); - } - - return ret; -} - -#ifdef OPENSSL_EXTRA -/* Update the hash with one block of data. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] data Buffer of data to hash. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 or data is NULL. - */ -int wc_Sha256Transform(wc_Sha256* sha256, const unsigned char* data) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha256 == NULL) || (data == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - #ifdef LITTLE_ENDIAN_ORDER - ByteReverseWords(sha256->buffer, (word32*)data, WC_SHA256_BLOCK_SIZE); - #else - XMEMCPY(sha256->buffer, data, WC_SHA256_BLOCK_SIZE); - #endif - Sha256Transform(sha256, (byte*)sha256->buffer, 1); - } - - return ret; -} -#endif - -#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH) -/* Update the hash with one block of data and optionally get hash. - * - * @param [in, out] sha256 SHA-256 object. - * @param [in] data Buffer of data to hash. - * @param [out] hash Buffer to hold hash. May be NULL. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha256 or data is NULL. - */ -int wc_Sha256HashBlock(wc_Sha256* sha256, const unsigned char* data, - unsigned char* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha256 == NULL) || (data == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - /* Hash block. */ - Sha256Transform(sha256, data, 1); - - if (hash != NULL) { - /* Reverse bytes in digest. */ - #ifdef LITTLE_ENDIAN_ORDER - word32* hash32 = (word32*)hash; - word32* digest = (word32*)sha256->digest; - hash32[0] = ByteReverseWord32(digest[0]); - hash32[1] = ByteReverseWord32(digest[1]); - hash32[2] = ByteReverseWord32(digest[2]); - hash32[3] = ByteReverseWord32(digest[3]); - hash32[4] = ByteReverseWord32(digest[4]); - hash32[5] = ByteReverseWord32(digest[5]); - hash32[6] = ByteReverseWord32(digest[6]); - hash32[7] = ByteReverseWord32(digest[7]); - #else - XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE); - #endif - /* Reset state. */ - #ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha256->digest[0] = 0x6A09E667L; - sha256->digest[1] = 0xBB67AE85L; - sha256->digest[2] = 0x3C6EF372L; - sha256->digest[3] = 0xA54FF53AL; - sha256->digest[4] = 0x510E527FL; - sha256->digest[5] = 0x9B05688CL; - sha256->digest[6] = 0x1F83D9ABL; - sha256->digest[7] = 0x5BE0CD19L; - #else - /* f, e, b, a, h, g, d, c */ - sha256->digest[0] = 0x9B05688CL; - sha256->digest[1] = 0x510E527FL; - sha256->digest[2] = 0xBB67AE85L; - sha256->digest[3] = 0x6A09E667L; - sha256->digest[4] = 0x5BE0CD19L; - sha256->digest[5] = 0x1F83D9ABL; - sha256->digest[6] = 0xA54FF53AL; - sha256->digest[7] = 0x3C6EF372L; - #endif - } - } - - return ret; -} -#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_FULL_HASH */ - -#endif /* !NO_SHA256 */ - - -#ifdef WOLFSSL_SHA224 - -/* Initialize SHA-224 object for hashing. - * - * @param [in, out] sha224 SHA-224 object. - */ -static void InitSha224(wc_Sha224* sha224) -{ - /* Set initial hash values. */ -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha224->digest[0] = 0xc1059ed8; - sha224->digest[1] = 0x367cd507; - sha224->digest[2] = 0x3070dd17; - sha224->digest[3] = 0xf70e5939; - sha224->digest[4] = 0xffc00b31; - sha224->digest[5] = 0x68581511; - sha224->digest[6] = 0x64f98fa7; - sha224->digest[7] = 0xbefa4fa4; -#else - /* f, e, b, a, h, g, d, c */ - sha224->digest[0] = 0x68581511; - sha224->digest[1] = 0xffc00b31; - sha224->digest[2] = 0x367cd507; - sha224->digest[3] = 0xc1059ed8; - sha224->digest[4] = 0xbefa4fa4; - sha224->digest[5] = 0x64f98fa7; - sha224->digest[6] = 0xf70e5939; - sha224->digest[7] = 0x3070dd17; -#endif - - /* No hashed data. */ - sha224->buffLen = 0; - /* No data hashed. */ - sha224->loLen = 0; - sha224->hiLen = 0; - -#ifdef WOLFSSL_HASH_FLAGS - sha224->flags = 0; -#endif -} - -/* Initialize SHA-224 object for hashing. - * - * @param [in, out] sha224 SHA-224 object. - * @param [in] heap Dynamic memory hint. - * @param [in] devId Device Id. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha224 is NULL. - */ -int wc_InitSha224_ex(wc_Sha224* sha224, void* heap, int devId) -{ - int ret = 0; - - /* Validate parameters. */ - if (sha224 == NULL) { - ret = BAD_FUNC_ARG; - } - else { - sha224->heap = heap; - (void)devId; - - InitSha224(sha224); - } - - return ret; -} - -/* Initialize SHA-224 object for hashing. - * - * @param [in, out] sha224 SHA-224 object. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha224 is NULL. - */ -int wc_InitSha224(wc_Sha224* sha224) -{ - return wc_InitSha224_ex(sha224, NULL, INVALID_DEVID); -} - -/* Update the hash with data. - * - * @param [in, out] sha224 SHA-224 object. - * @param [in] data Buffer of data to hash. - * @param [in] len Number of bytes in buffer to hash. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha224 is NULL. - * @return BAD_FUNC_ARG when data is NULL but len is not 0. - */ -int wc_Sha224Update(wc_Sha224* sha224, const byte* data, word32 len) -{ - int ret; - - /* Validate parameters. */ - if ((sha224 == NULL) || ((data == NULL) && (len > 0))) { - ret = BAD_FUNC_ARG; - } - else { - ret = Sha256Update((wc_Sha256 *)sha224, data, len); - } - - return ret; -} - -/* Finalize the hash and put into buffer. - * - * @param [in, out] sha224 SHA-224 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha224 or hash is NULL. - */ -int wc_Sha224Final(wc_Sha224* sha224, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha224 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - word32 hashTmp[WC_SHA256_DIGEST_SIZE/sizeof(word32)]; - /* Finalize hash. */ - Sha256Final((wc_Sha256*)sha224, (byte*)hashTmp); - /* Return only 224 bits. */ - XMEMCPY(hash, hashTmp, WC_SHA224_DIGEST_SIZE); - /* Restart SHA-256 object for next hash. */ - InitSha224(sha224); - } - - return ret; -} - -/* Free the SHA-224 hash. - * - * @param [in] sha224 SHA-224 object. - */ -void wc_Sha224Free(wc_Sha224* sha224) -{ - /* No dynamic memory allocated. */ - (void)sha224; -} - -/* Finalize the hash and put into buffer but don't modify state. - * - * @param [in, out] sha224 SHA-224 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha224 or hash is NULL. - */ -int wc_Sha224GetHash(wc_Sha224* sha224, byte* hash) -{ - int ret; - - /* Validate parameters. */ - if ((sha224 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - wc_Sha224 tmpSha224; - XMEMSET(&tmpSha224, 0, sizeof(tmpSha224)); - /* Create a copy of the hash to finalize. */ - ret = wc_Sha224Copy(sha224, &tmpSha224); - if (ret == 0) { - /* Finalize copy. */ - ret = wc_Sha224Final(&tmpSha224, hash); - } - } - - return ret; -} - -#ifdef WOLFSSL_HASH_FLAGS -/* Set flags of SHA-224 object. - * - * @param [in, out] sha224 SHA-224 object. - * @param [in] flags Flags to set. - * @return 0 on success. - */ -int wc_Sha224SetFlags(wc_Sha224* sha224, word32 flags) -{ - /* Check we have an object to use. */ - if (sha224 != NULL) { - sha224->flags = flags; - } - return 0; -} -/* Get flags of SHA-224 object. - * - * @param [in] sha224 SHA-224 object. - * @param [out] flags Flags from SHA-224 object. - * @return 0 on success. - */ -int wc_Sha224GetFlags(wc_Sha224* sha224, word32* flags) -{ - /* Check we have an object and return parameter to use. */ - if ((sha224 != NULL) && (flags != NULL)) { - *flags = sha224->flags; - } - return 0; -} -#endif - -/* Deep copy the SHA-224 object. - * - * @param [in] src SHA-224 object to copy. - * @param [out] dst SHA-224 object to fill. - * @return 0 on success. - * @return BAD_FUNC_ARG when src or dst is NULL. - */ -int wc_Sha224Copy(wc_Sha224* src, wc_Sha224* dst) -{ - int ret = 0; - - /* Validate parameters. */ - if ((src == NULL) || (dst == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - XMEMCPY(dst, src, sizeof(wc_Sha224)); - } - - return ret; -} - -#endif /* WOLFSSL_SHA224 */ - -#endif /* !NO_SHA256 || WOLFSSL_SHA224 */ -#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv/riscv-64-sha3.c b/wolfcrypt/src/port/riscv/riscv-64-sha3.c deleted file mode 100644 index 3ecb68d0659..00000000000 --- a/wolfcrypt/src/port/riscv/riscv-64-sha3.c +++ /dev/null @@ -1,859 +0,0 @@ -/* riscv-64-sha3.c - * - * Copyright (C) 2006-2026 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 3 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 - */ - -#include - -#include - -#ifdef WOLFSSL_RISCV_ASM -#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_XILINX_CRYPT) && \ - !defined(WOLFSSL_AFALG_XILINX_SHA3) - -#if FIPS_VERSION3_GE(2,0,0) - /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ - #define FIPS_NO_WRAPPERS - - #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$n") - #pragma const_seg(".fipsB$n") - #endif -#endif - -#include - -static const word64 hash_keccak_r[24] = -{ - 0x0000000000000001UL, 0x0000000000008082UL, - 0x800000000000808aUL, 0x8000000080008000UL, - 0x000000000000808bUL, 0x0000000080000001UL, - 0x8000000080008081UL, 0x8000000000008009UL, - 0x000000000000008aUL, 0x0000000000000088UL, - 0x0000000080008009UL, 0x000000008000000aUL, - 0x000000008000808bUL, 0x800000000000008bUL, - 0x8000000000008089UL, 0x8000000000008003UL, - 0x8000000000008002UL, 0x8000000000000080UL, - 0x000000000000800aUL, 0x800000008000000aUL, - 0x8000000080008081UL, 0x8000000000008080UL, - 0x0000000080000001UL, 0x8000000080008008UL -}; - -#ifndef WOLFSSL_RISCV_VECTOR - -#define S0_0 "a1" -#define S0_1 "a2" -#define S0_2 "a3" -#define S0_3 "a4" -#define S0_4 "a5" -#define S1_0 "s1" -#define S1_1 "s2" -#define S1_2 "s3" -#define S1_3 "s4" -#define S1_4 "s5" -#define S2_0 "s6" -#define S2_1 "s7" -#define S2_2 "s8" -#define S2_3 "s9" -#define S2_4 "s10" -#define S3_0 "t0" -#define S3_1 "t1" -#define S3_2 "t2" -#define S3_3 "t3" -#define S3_4 "t4" - -#define T_0 "a6" -#define T_1 "a7" -#define T_2 "t5" -#define T_3 "t6" -#define T_4 "s11" - -#define SR0_0 REG_A1 -#define SR0_1 REG_A2 -#define SR0_2 REG_A3 -#define SR0_3 REG_A4 -#define SR0_4 REG_A5 -#define SR1_0 REG_S1 -#define SR1_1 REG_S2 -#define SR1_2 REG_S3 -#define SR1_3 REG_S4 -#define SR1_4 REG_S5 -#define SR2_0 REG_S6 -#define SR2_1 REG_S7 -#define SR2_2 REG_S8 -#define SR2_3 REG_S9 -#define SR2_4 REG_S10 -#define SR3_0 REG_T0 -#define SR3_1 REG_T1 -#define SR3_2 REG_T2 -#define SR3_3 REG_T3 -#define SR3_4 REG_T4 - -#define TR_0 REG_A6 -#define TR_1 REG_A7 -#define TR_2 REG_T5 -#define TR_3 REG_T6 -#define TR_4 REG_S11 - -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - -#define SWAP_ROTL(t0, tr0, t1, s, sr, rr, rl) \ - "mv " t1 ", " s "\n\t" \ - "srli " s ", " t0 ", " #rr "\n\t" \ - "slli " t0 ", " t0 ", " #rl "\n\t" \ - "or " s ", " s ", " t0 "\n\t" - -#define SWAP_ROTL_MEM(t0, tr0, t1, t2, s, rr, rl) \ - "ld " t1 ", " #s "(%[s])\n\t" \ - "srli " t2 ", " t0 ", " #rr "\n\t" \ - "slli " t0 ", " t0 ", " #rl "\n\t" \ - "or " t0 ", " t0 ", " t2 "\n\t" \ - "sd " t0 ", " #s "(%[s])\n\t" - -#else - -#define SWAP_ROTL(t0, tr0, t1, s, sr, rr, rl) \ - "mv " t1 ", " s "\n\t" \ - RORI(sr, tr0, rr) - -#define SWAP_ROTL_MEM(t0, tr0, t1, t2, s, rr, rl) \ - "ld " t1 ", " #s "(%[s])\n\t" \ - RORI(tr0, tr0, rr) \ - "sd " t0 ", " #s "(%[s])\n\t" - -#endif - -WC_OMIT_FRAME_POINTER void BlockSha3(word64* s) -{ - const word64* r = hash_keccak_r; - - __asm__ __volatile__ ( - "addi sp, sp, -24\n\t" - "li " T_4 ", 24\n\t" - "ld " S0_0 ", 0(%[s])\n\t" - "ld " S0_1 ", 8(%[s])\n\t" - "ld " S0_2 ", 16(%[s])\n\t" - "ld " S0_3 ", 24(%[s])\n\t" - "ld " S0_4 ", 32(%[s])\n\t" - "ld " S1_0 ", 40(%[s])\n\t" - "ld " S1_1 ", 48(%[s])\n\t" - "ld " S1_2 ", 56(%[s])\n\t" - "ld " S1_3 ", 64(%[s])\n\t" - "ld " S1_4 ", 72(%[s])\n\t" - "ld " S2_0 ", 80(%[s])\n\t" - "ld " S2_1 ", 88(%[s])\n\t" - "ld " S2_2 ", 96(%[s])\n\t" - "ld " S2_3 ", 104(%[s])\n\t" - "ld " S2_4 ", 112(%[s])\n\t" - "ld " S3_0 ", 120(%[s])\n\t" - "ld " S3_1 ", 128(%[s])\n\t" - "ld " S3_2 ", 136(%[s])\n\t" - "ld " S3_3 ", 144(%[s])\n\t" - "ld " S3_4 ", 152(%[s])\n\t" - "ld " T_0 ", 160(%[s])\n\t" - "ld " T_1 ", 168(%[s])\n\t" - "ld " T_2 ", 176(%[s])\n\t" - "\n" - "L_riscv_64_block_sha3_loop:\n\t" - "sd " T_4 ", 16(sp)\n\t" - - /* COLUMN MIX */ - /* Calc b[0], b[1], b[2], b[3], b[4] */ - "ld " T_3 ", 184(%[s])\n\t" - "ld " T_4 ", 192(%[s])\n\t" - "xor " T_0 ", " T_0 ", " S0_0 "\n\t" - "xor " T_1 ", " T_1 ", " S0_1 "\n\t" - "xor " T_2 ", " T_2 ", " S0_2 "\n\t" - "xor " T_3 ", " T_3 ", " S0_3 "\n\t" - "xor " T_4 ", " T_4 ", " S0_4 "\n\t" - "xor " T_0 ", " T_0 ", " S1_0 "\n\t" - "xor " T_1 ", " T_1 ", " S1_1 "\n\t" - "xor " T_2 ", " T_2 ", " S1_2 "\n\t" - "xor " T_3 ", " T_3 ", " S1_3 "\n\t" - "xor " T_4 ", " T_4 ", " S1_4 "\n\t" - "xor " T_0 ", " T_0 ", " S2_0 "\n\t" - "xor " T_1 ", " T_1 ", " S2_1 "\n\t" - "xor " T_2 ", " T_2 ", " S2_2 "\n\t" - "xor " T_3 ", " T_3 ", " S2_3 "\n\t" - "xor " T_4 ", " T_4 ", " S2_4 "\n\t" - "xor " T_0 ", " T_0 ", " S3_0 "\n\t" - "xor " T_1 ", " T_1 ", " S3_1 "\n\t" - "xor " T_2 ", " T_2 ", " S3_2 "\n\t" - "xor " T_3 ", " T_3 ", " S3_3 "\n\t" - "xor " T_4 ", " T_4 ", " S3_4 "\n\t" - "sd " T_1 ", 0(sp)\n\t" - "sd " T_3 ", 8(sp)\n\t" - /* T_0, T_1, T_2, T_3, T_4 */ - - /* s[0],s[5],s[10],s[15],s[20] ^= b[4] ^ ROTL(b[1], 1) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "srli " T_3 ", " T_1 ", 63\n\t" - "slli " T_1 ", " T_1 ", 1\n\t" - "or " T_1 ", " T_1 ", " T_3 "\n\t" -#else - RORI(TR_1, TR_1, 63) -#endif - "ld " T_3 ", 160(%[s])\n\t" - "xor " T_1 ", " T_1 ", " T_4 "\n\t" - "xor " S0_0 ", " S0_0 ", " T_1 "\n\t" - "xor " S1_0 ", " S1_0 ", " T_1 "\n\t" - "xor " T_3 ", " T_3 ", " T_1 "\n\t" - "xor " S2_0 ", " S2_0 ", " T_1 "\n\t" - "xor " S3_0 ", " S3_0 ", " T_1 "\n\t" - "sd " T_3 ", 160(%[s])\n\t" - /* T_0, T_2, T_4 */ - - /* s[1],s[6],s[11],s[16],s[21] ^= b[0] ^ ROTL(b[2], 1)*/ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "srli " T_3 ", " T_2 ", 63\n\t" - "slli " T_1 ", " T_2 ", 1\n\t" - "or " T_1 ", " T_1 ", " T_3 "\n\t" -#else - RORI(TR_1, TR_2, 63) -#endif - "ld " T_3 ", 168(%[s])\n\t" - "xor " T_1 ", " T_1 ", " T_0 "\n\t" - "xor " S0_1 ", " S0_1 ", " T_1 "\n\t" - "xor " S1_1 ", " S1_1 ", " T_1 "\n\t" - "xor " T_3 ", " T_3 ", " T_1 "\n\t" - "xor " S2_1 ", " S2_1 ", " T_1 "\n\t" - "xor " S3_1 ", " S3_1 ", " T_1 "\n\t" - "sd " T_3 ", 168(%[s])\n\t" - /* T_0, T_2, T_4 */ - - /* s[3],s[8],s[13],s[18],s[23] ^= b[2] ^ ROTL(b[4], 1) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "srli " T_3 ", " T_4 ", 63\n\t" - "slli " T_4 ", " T_4 ", 1\n\t" - "or " T_4 ", " T_4 ", " T_3 "\n\t" -#else - RORI(TR_4, TR_4, 63) -#endif - "ld " T_3 ", 184(%[s])\n\t" - "xor " T_4 ", " T_4 ", " T_2 "\n\t" - "xor " S0_3 ", " S0_3 ", " T_4 "\n\t" - "xor " S1_3 ", " S1_3 ", " T_4 "\n\t" - "xor " T_3 ", " T_3 ", " T_4 "\n\t" - "xor " S2_3 ", " S2_3 ", " T_4 "\n\t" - "xor " S3_3 ", " S3_3 ", " T_4 "\n\t" - "sd " T_3 ", 184(%[s])\n\t" - /* T_0, T_2 */ - - "ld " T_3 ", 8(sp)\n\t" - /* s[4],s[9],s[14],s[19],s[24] ^= b[3] ^ ROTL(b[0], 1) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "srli " T_2 ", " T_0 ", 63\n\t" - "slli " T_0 ", " T_0 ", 1\n\t" - "or " T_0 ", " T_0 ", " T_2 "\n\t" -#else - RORI(TR_0, TR_0, 63) -#endif - "ld " T_4 ", 192(%[s])\n\t" - "xor " T_0 ", " T_0 ", " T_3 "\n\t" - "xor " S0_4 ", " S0_4 ", " T_0 "\n\t" - "xor " S1_4 ", " S1_4 ", " T_0 "\n\t" - "xor " T_4 ", " T_4 ", " T_0 "\n\t" - "xor " S2_4 ", " S2_4 ", " T_0 "\n\t" - "xor " S3_4 ", " S3_4 ", " T_0 "\n\t" - /* T_3 */ - - "ld " T_1 ", 0(sp)\n\t" - /* s[2],s[7],s[12],s[17],s[22] ^= b[1] ^ ROTL(b[3], 1) */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "srli " T_2 ", " T_3 ", 63\n\t" - "slli " T_3 ", " T_3 ", 1\n\t" - "or " T_3 ", " T_3 ", " T_2 "\n\t" -#else - RORI(TR_3, TR_3, 63) -#endif - "ld " T_2 ", 176(%[s])\n\t" - "xor " T_3 ", " T_3 ", " T_1 "\n\t" - "xor " S0_2 ", " S0_2 ", " T_3 "\n\t" - "xor " S1_2 ", " S1_2 ", " T_3 "\n\t" - "xor " T_2 ", " T_2 ", " T_3 "\n\t" - "xor " S2_2 ", " S2_2 ", " T_3 "\n\t" - "xor " S3_2 ", " S3_2 ", " T_3 "\n\t" - - /* SWAP ROTL */ - /* t0 = s[10], s[10] = s[1] >>> 63 */ - "mv " T_0 ", " S2_0 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "srli " T_1 ", " S0_1 ", 63\n\t" - "slli " S2_0 ", " S0_1 ", 1\n\t" - "or " S2_0 ", " S2_0 ", " T_1 "\n\t" -#else - RORI(SR2_0, SR0_1, 63) -#endif - /* t1 = s[ 7], s[ 7] = t0 >>> 61 */ - SWAP_ROTL(T_0, TR_0, T_1, S1_2, SR1_2, 61, 3) - /* t0 = s[11], s[11] = t1 >>> 58 */ - SWAP_ROTL(T_1, TR_1, T_0, S2_1, SR2_1, 58, 6) - /* t1 = s[17], s[17] = t0 >>> 54 */ - SWAP_ROTL(T_0, TR_0, T_1, S3_2, SR3_2, 54, 10) - /* t0 = s[18], s[18] = t1 >>> 49 */ - SWAP_ROTL(T_1, TR_1, T_0, S3_3, SR3_3, 49, 15) - /* t1 = s[ 3], s[ 3] = t0 >>> 43 */ - SWAP_ROTL(T_0, TR_0, T_1, S0_3, SR0_3, 43, 21) - /* t0 = s[ 5], s[ 5] = t1 >>> 36 */ - SWAP_ROTL(T_1, TR_1, T_0, S1_0, SR1_0, 36, 28) - /* t1 = s[16], s[16] = t0 >>> 28 */ - SWAP_ROTL(T_0, TR_0, T_1, S3_1, SR3_1, 28, 36) - /* t0 = s[ 8], s[ 8] = t1 >>> 19 */ - SWAP_ROTL(T_1, TR_1, T_0, S1_3, SR1_3, 19, 45) - /* t1 = s[21], s[21] = t0 >>> 9 */ - SWAP_ROTL_MEM(T_0, TR_0, T_1, T_3, 168, 9, 55) - /* t0 = s[24], s[24] = t1 >>> 62 */ - SWAP_ROTL(T_1, TR_1, T_0, T_4, TR_4, 62, 2) - /* t1 = s[ 4], s[ 4] = t0 >>> 50 */ - SWAP_ROTL(T_0, TR_0, T_1, S0_4, SR0_4, 50, 14) - /* t0 = s[15], s[15] = t1 >>> 37 */ - SWAP_ROTL(T_1, TR_1, T_0, S3_0, SR3_0, 37, 27) - /* t1 = s[23], s[23] = t0 >>> 23 */ - SWAP_ROTL_MEM(T_0, TR_0, T_1, T_3, 184, 23, 41) - /* t0 = s[19], s[19] = t1 >>> 8 */ - SWAP_ROTL(T_1, TR_1, T_0, S3_4, SR3_4, 8, 56) - /* t1 = s[13], s[13] = t0 >>> 56 */ - SWAP_ROTL(T_0, TR_0, T_1, S2_3, SR2_3, 56, 8) - /* t0 = s[12], s[12] = t1 >>> 39 */ - SWAP_ROTL(T_1, TR_1, T_0, S2_2, SR2_2, 39, 25) - /* t1 = s[ 2], s[ 2] = t0 >>> 21 */ - SWAP_ROTL(T_0, TR_0, T_1, S0_2, SR0_2, 21, 43) - /* t0 = s[20], s[20] = t1 >>> 2 */ - SWAP_ROTL_MEM(T_1, TR_1, T_0, T_3, 160, 2, 62) - /* t1 = s[14], s[14] = t0 >>> 46 */ - SWAP_ROTL(T_0, TR_0, T_1, S2_4, SR2_4, 46, 18) - /* t0 = s[22], s[22] = t1 >>> 25 */ - SWAP_ROTL(T_1, TR_1, T_0, T_2, TR_2, 25, 39) - /* t1 = s[ 9], s[ 9] = t0 >>> 3 */ - SWAP_ROTL(T_0, TR_0, T_1, S1_4, SR1_4, 3, 61) - /* t0 = s[ 6], s[ 6] = t1 >>> 44 */ - SWAP_ROTL(T_1, TR_1, T_0, S1_1, SR1_1, 44, 20) - /* s[ 1] = t0 >>> 20 */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "srli " S0_1 ", " T_0 ", 20\n\t" - "slli " T_0 ", " T_0 ", 44\n\t" - "or " S0_1 ", " S0_1 ", " T_0 "\n\t" -#else - RORI(SR0_1, TR_0, 20) -#endif - - /* ROW MIX */ - /* s[0] */ - "mv " T_0 ", " S0_0 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S0_1 "\n\t" - "and " T_3 ", " T_3 ", " S0_2 "\n\t" -#else - ANDN(TR_3, SR0_2, SR0_1) -#endif - "xor " S0_0 ", " S0_0 ", " T_3 "\n\t" - /* s[1] */ - "mv " T_1 ", " S0_1 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S0_2 "\n\t" - "and " T_3 ", " T_3 ", " S0_3 "\n\t" -#else - ANDN(TR_3, SR0_3, SR0_2) -#endif - "xor " S0_1 ", " S0_1 ", " T_3 "\n\t" - /* s[2] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S0_3 "\n\t" - "and " T_3 ", " T_3 ", " S0_4 "\n\t" -#else - ANDN(TR_3, SR0_4, SR0_3) -#endif - "xor " S0_2 ", " S0_2 ", " T_3 "\n\t" - /* s[3] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S0_4 "\n\t" - "and " T_3 ", " T_3 ", " T_0 "\n\t" -#else - ANDN(TR_3, TR_0, SR0_4) -#endif - "xor " S0_3 ", " S0_3 ", " T_3 "\n\t" - /* s[4] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " T_0 "\n\t" - "and " T_3 ", " T_3 ", " T_1 "\n\t" -#else - ANDN(TR_3, TR_1, TR_0) -#endif - "xor " S0_4 ", " S0_4 ", " T_3 "\n\t" - - /* s[5] */ - "mv " T_0 ", " S1_0 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S1_1 "\n\t" - "and " T_3 ", " T_3 ", " S1_2 "\n\t" -#else - ANDN(TR_3, SR1_2, SR1_1) -#endif - "xor " S1_0 ", " S1_0 ", " T_3 "\n\t" - /* s[6] */ - "mv " T_1 ", " S1_1 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S1_2 "\n\t" - "and " T_3 ", " T_3 ", " S1_3 "\n\t" -#else - ANDN(TR_3, SR1_3, SR1_2) -#endif - "xor " S1_1 ", " S1_1 ", " T_3 "\n\t" - /* s[7] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S1_3 "\n\t" - "and " T_3 ", " T_3 ", " S1_4 "\n\t" -#else - ANDN(TR_3, SR1_4, SR1_3) -#endif - "xor " S1_2 ", " S1_2 ", " T_3 "\n\t" - /* s[8] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S1_4 "\n\t" - "and " T_3 ", " T_3 ", " T_0 "\n\t" -#else - ANDN(TR_3, TR_0, SR1_4) -#endif - "xor " S1_3 ", " S1_3 ", " T_3 "\n\t" - /* s[9] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " T_0 "\n\t" - "and " T_3 ", " T_3 ", " T_1 "\n\t" -#else - ANDN(TR_3, TR_1, TR_0) -#endif - "xor " S1_4 ", " S1_4 ", " T_3 "\n\t" - - /* s[10] */ - "mv " T_0 ", " S2_0 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S2_1 "\n\t" - "and " T_3 ", " T_3 ", " S2_2 "\n\t" -#else - ANDN(TR_3, SR2_2, SR2_1) -#endif - "xor " S2_0 ", " S2_0 ", " T_3 "\n\t" - /* s[11] */ - "mv " T_1 ", " S2_1 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S2_2 "\n\t" - "and " T_3 ", " T_3 ", " S2_3 "\n\t" -#else - ANDN(TR_3, SR2_3, SR2_2) -#endif - "xor " S2_1 ", " S2_1 ", " T_3 "\n\t" - /* s[12] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S2_3 "\n\t" - "and " T_3 ", " T_3 ", " S2_4 "\n\t" -#else - ANDN(TR_3, SR2_4, SR2_3) -#endif - "xor " S2_2 ", " S2_2 ", " T_3 "\n\t" - /* s[13] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S2_4 "\n\t" - "and " T_3 ", " T_3 ", " T_0 "\n\t" -#else - ANDN(TR_3, TR_0, SR2_4) -#endif - "xor " S2_3 ", " S2_3 ", " T_3 "\n\t" - /* s[14] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " T_0 "\n\t" - "and " T_3 ", " T_3 ", " T_1 "\n\t" -#else - ANDN(TR_3, TR_1, TR_0) -#endif - "xor " S2_4 ", " S2_4 ", " T_3 "\n\t" - - /* s[15] */ - "mv " T_0 ", " S3_0 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S3_1 "\n\t" - "and " T_3 ", " T_3 ", " S3_2 "\n\t" -#else - ANDN(TR_3, SR3_2, SR3_1) -#endif - "xor " S3_0 ", " S3_0 ", " T_3 "\n\t" - /* s[16] */ - "mv " T_1 ", " S3_1 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S3_2 "\n\t" - "and " T_3 ", " T_3 ", " S3_3 "\n\t" -#else - ANDN(TR_3, SR3_3, SR3_2) -#endif - "xor " S3_1 ", " S3_1 ", " T_3 "\n\t" - /* s[17] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S3_3 "\n\t" - "and " T_3 ", " T_3 ", " S3_4 "\n\t" -#else - ANDN(TR_3, SR3_4, SR3_3) -#endif - "xor " S3_2 ", " S3_2 ", " T_3 "\n\t" - /* s[18] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " S3_4 "\n\t" - "and " T_3 ", " T_3 ", " T_0 "\n\t" -#else - ANDN(TR_3, TR_0, SR3_4) -#endif - "xor " S3_3 ", " S3_3 ", " T_3 "\n\t" - /* s[19] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " T_3 ", " T_0 "\n\t" - "and " T_3 ", " T_3 ", " T_1 "\n\t" -#else - ANDN(TR_3, TR_1, TR_0) -#endif - "xor " S3_4 ", " S3_4 ", " T_3 "\n\t" - - "sd " S3_0 ", 120(%[s])\n\t" - "sd " S3_1 ", 128(%[s])\n\t" - "sd " S3_2 ", 136(%[s])\n\t" - "ld " T_0 ", 160(%[s])\n\t" - "ld " T_1 ", 168(%[s])\n\t" - "ld " T_3 ", 184(%[s])\n\t" - - /* s[20] */ - "mv " S3_0 ", " T_0 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " S3_2 ", " T_1 "\n\t" - "and " S3_2 ", " S3_2 ", " T_2 "\n\t" -#else - ANDN(SR3_2, TR_2, TR_1) -#endif - "xor " T_0 ", " T_0 ", " S3_2 "\n\t" - /* s[21] */ - "mv " S3_1 ", " T_1 "\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " S3_2 ", " T_2 "\n\t" - "and " S3_2 ", " S3_2 ", " T_3 "\n\t" -#else - ANDN(SR3_2, TR_3, TR_2) -#endif - "xor " T_1 ", " T_1 ", " S3_2 "\n\t" - /* s[22] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " S3_2 ", " T_3 "\n\t" - "and " S3_2 ", " S3_2 ", " T_4 "\n\t" -#else - ANDN(SR3_2, TR_4, TR_3) -#endif - "xor " T_2 ", " T_2 ", " S3_2 "\n\t" - /* s[23] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " S3_2 ", " T_4 "\n\t" - "and " S3_2 ", " S3_2 ", " S3_0 "\n\t" -#else - ANDN(SR3_2, SR3_0, TR_4) -#endif - "xor " T_3 ", " T_3 ", " S3_2 "\n\t" - /* s[24] */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - "not " S3_2 ", " S3_0 "\n\t" - "and " S3_2 ", " S3_2 ", " S3_1 "\n\t" -#else - ANDN(SR3_2, SR3_1, SR3_0) -#endif - "xor " T_4 ", " T_4 ", " S3_2 "\n\t" - - "ld " S3_0 ", 120(%[s])\n\t" - "ld " S3_1 ", 128(%[s])\n\t" - "ld " S3_2 ", 136(%[s])\n\t" - "sd " T_0 ", 160(%[s])\n\t" - "sd " T_1 ", 168(%[s])\n\t" - "sd " T_2 ", 176(%[s])\n\t" - "sd " T_3 ", 184(%[s])\n\t" - "sd " T_4 ", 192(%[s])\n\t" - - "ld " T_4 ", 16(sp)\n\t" - "ld " T_3 ", 0(%[r])\n\t" - "addi %[r], %[r], 8\n\t" - "addi " T_4 ", " T_4 ", -1\n\t" - "xor " S0_0 ", " S0_0 ", " T_3 "\n\t" - "bnez " T_4 ", L_riscv_64_block_sha3_loop\n\t" - - "sd " S0_0 ", 0(%[s])\n\t" - "sd " S0_1 ", 8(%[s])\n\t" - "sd " S0_2 ", 16(%[s])\n\t" - "sd " S0_3 ", 24(%[s])\n\t" - "sd " S0_4 ", 32(%[s])\n\t" - "sd " S1_0 ", 40(%[s])\n\t" - "sd " S1_1 ", 48(%[s])\n\t" - "sd " S1_2 ", 56(%[s])\n\t" - "sd " S1_3 ", 64(%[s])\n\t" - "sd " S1_4 ", 72(%[s])\n\t" - "sd " S2_0 ", 80(%[s])\n\t" - "sd " S2_1 ", 88(%[s])\n\t" - "sd " S2_2 ", 96(%[s])\n\t" - "sd " S2_3 ", 104(%[s])\n\t" - "sd " S2_4 ", 112(%[s])\n\t" - "sd " S3_0 ", 120(%[s])\n\t" - "sd " S3_1 ", 128(%[s])\n\t" - "sd " S3_2 ", 136(%[s])\n\t" - "sd " S3_3 ", 144(%[s])\n\t" - "sd " S3_4 ", 152(%[s])\n\t" - - "addi sp, sp, 24\n\t" - - : [r] "+r" (r) - : [s] "r" (s) - : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "a1", "a2", "a3", "a4", "a5", "a6", "a7", - "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11" - ); -} - -#else - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - -#define COL_MIX(r, b1, b4) \ - VSLL_VI(REG_V31, b1, 1) \ - VSRL_VX(REG_V30, b1, REG_T1) \ - VXOR_VV(REG_V31, REG_V31, b4) \ - VXOR_VV(REG_V31, REG_V31, REG_V30) \ - VXOR_VV((r + 0), (r + 0), REG_V31) \ - VXOR_VV((r + 5), (r + 5), REG_V31) \ - VXOR_VV((r + 10), (r + 10), REG_V31) \ - VXOR_VV((r + 15), (r + 15), REG_V31) \ - VXOR_VV((r + 20), (r + 20), REG_V31) - -#define SWAP_ROTL_LO(vr, vt0, vt1, sl) \ - VMV_V_V(vt0, vr) \ - "li t1, 64 - " #sl "\n\t" \ - VSLL_VI(vr, vt1, sl) \ - VSRL_VX(vt1, vt1, REG_T1) \ - VOR_VV(vr, vr, vt1) - -#define SWAP_ROTL_HI(vr, vt0, vt1, sl) \ - VMV_V_V(vt0, vr) \ - "li t1, " #sl "\n\t" \ - VSRL_VI(vr, vt1, (64 - sl)) \ - VSLL_VX(vt1, vt1, REG_T1) \ - VOR_VV(vr, vr, vt1) - -#define ROW_MIX(r) \ - VMV_V_V(REG_V25, (r + 0)) \ - VMV_V_V(REG_V26, (r + 1)) \ - VNOT_V(REG_V30, (r + 1)) \ - VNOT_V(REG_V31, (r + 2)) \ - VAND_VV(REG_V30, REG_V30, (r + 2)) \ - VAND_VV(REG_V31, REG_V31, (r + 3)) \ - VXOR_VV((r + 0), REG_V30, (r + 0)) \ - VXOR_VV((r + 1), REG_V31, (r + 1)) \ - VNOT_V(REG_V30, (r + 3)) \ - VNOT_V(REG_V31, (r + 4)) \ - VAND_VV(REG_V30, REG_V30, (r + 4)) \ - VAND_VV(REG_V31, REG_V31, REG_V25) \ - VNOT_V(REG_V25, REG_V25) \ - VXOR_VV((r + 2), REG_V30, (r + 2)) \ - VAND_VV(REG_V25, REG_V25, REG_V26) \ - VXOR_VV((r + 3), REG_V31, (r + 3)) \ - VXOR_VV((r + 4), REG_V25, (r + 4)) - -#else - -#define COL_MIX(r, t) \ - VXOR_VV((r + 0), (r + 0), t) \ - VXOR_VV((r + 5), (r + 5), t) \ - VXOR_VV((r + 10), (r + 10), t) \ - VXOR_VV((r + 15), (r + 15), t) \ - VXOR_VV((r + 20), (r + 20), t) - -#define SWAP_ROTL(vr, vt0, vt1, sl) \ - VMV_V_V(vt0, vr) \ - VROR_VI(vr, (64 - sl), vt1) - -#define SWAP_ROTL_LO SWAP_ROTL -#define SWAP_ROTL_HI SWAP_ROTL - -#define ROW_MIX(r) \ - VMV_V_V(REG_V25, (r + 0)) \ - VMV_V_V(REG_V26, (r + 1)) \ - VANDN_VV(REG_V30, (r + 1), (r + 2)) \ - VANDN_VV(REG_V31, (r + 2), (r + 3)) \ - VXOR_VV((r + 0), REG_V30, (r + 0)) \ - VXOR_VV((r + 1), REG_V31, (r + 1)) \ - VANDN_VV(REG_V30, (r + 3), (r + 4)) \ - VANDN_VV(REG_V31, (r + 4), REG_V25) \ - VANDN_VV(REG_V25, REG_V25, REG_V26) \ - VXOR_VV((r + 2), REG_V30, (r + 2)) \ - VXOR_VV((r + 3), REG_V31, (r + 3)) \ - VXOR_VV((r + 4), REG_V25, (r + 4)) - -#endif - - -void BlockSha3(word64* s) -{ - __asm__ __volatile__ ( - /* 1 x 64-bit */ - VSETIVLI(REG_X0, 1, 0, 1, 0b011, 0b000) - - "li t2, 24\n\t" - "mv t0, %[r]\n\t" - "mv t1, %[s]\n\t" - VLSEG8E64_V(REG_V0, REG_T1) - "addi t1, %[s], 64\n\t" - VLSEG8E64_V(REG_V8, REG_T1) - "addi t1, %[s], 128\n\t" - VLSEG8E64_V(REG_V16, REG_T1) - "addi t1, %[s], 192\n\t" - VLSEG1E64_V(REG_V24, REG_T1) - - "\n" - "L_riscv_64_block_sha3_loop:\n\t" - - /* COLUMN MIX */ - VXOR_VV(REG_V25, REG_V0, REG_V5) - VXOR_VV(REG_V26, REG_V1, REG_V6) - VXOR_VV(REG_V27, REG_V2, REG_V7) - VXOR_VV(REG_V28, REG_V3, REG_V8) - VXOR_VV(REG_V29, REG_V4, REG_V9) - VXOR_VV(REG_V25, REG_V25, REG_V10) - VXOR_VV(REG_V26, REG_V26, REG_V11) - VXOR_VV(REG_V27, REG_V27, REG_V12) - VXOR_VV(REG_V28, REG_V28, REG_V13) - VXOR_VV(REG_V29, REG_V29, REG_V14) - VXOR_VV(REG_V25, REG_V25, REG_V15) - VXOR_VV(REG_V26, REG_V26, REG_V16) - VXOR_VV(REG_V27, REG_V27, REG_V17) - VXOR_VV(REG_V28, REG_V28, REG_V18) - VXOR_VV(REG_V29, REG_V29, REG_V19) - VXOR_VV(REG_V25, REG_V25, REG_V20) - VXOR_VV(REG_V26, REG_V26, REG_V21) - VXOR_VV(REG_V27, REG_V27, REG_V22) - VXOR_VV(REG_V28, REG_V28, REG_V23) - VXOR_VV(REG_V29, REG_V29, REG_V24) - -#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION - "li t1, 63\n\t" - COL_MIX(REG_V0, REG_V26, REG_V29) - COL_MIX(REG_V1, REG_V27, REG_V25) - COL_MIX(REG_V2, REG_V28, REG_V26) - COL_MIX(REG_V3, REG_V29, REG_V27) - COL_MIX(REG_V4, REG_V25, REG_V28) -#else - VROR_VI(REG_V30, 63, REG_V26) - VROR_VI(REG_V31, 63, REG_V27) - VXOR_VV(REG_V30, REG_V30, REG_V29) - VXOR_VV(REG_V31, REG_V31, REG_V25) - COL_MIX(REG_V0, REG_V30) - COL_MIX(REG_V1, REG_V31) - - VROR_VI(REG_V30, 63, REG_V28) - VROR_VI(REG_V31, 63, REG_V29) - VROR_VI(REG_V25, 63, REG_V25) - VXOR_VV(REG_V30, REG_V30, REG_V26) - VXOR_VV(REG_V31, REG_V31, REG_V27) - VXOR_VV(REG_V25, REG_V25, REG_V28) - COL_MIX(REG_V2, REG_V30) - COL_MIX(REG_V3, REG_V31) - COL_MIX(REG_V4, REG_V25) -#endif - /* SWAP ROTL */ - /* t1 = s[ 1] */ - VMV_V_V(REG_V26, REG_V1) - /* t0 = s[10], s[10] = t1 <<< 1 */ - SWAP_ROTL_LO(REG_V10, REG_V25, REG_V26, 1) - /* t1 = s[ 7], s[ 7] = t0 <<< 3 */ - SWAP_ROTL_LO(REG_V7 , REG_V26, REG_V25, 3) - /* t0 = s[11], s[11] = t1 <<< 6 */ - SWAP_ROTL_LO(REG_V11, REG_V25, REG_V26, 6) - /* t1 = s[17], s[17] = t0 <<< 10 */ - SWAP_ROTL_LO(REG_V17, REG_V26, REG_V25, 10) - /* t0 = s[18], s[18] = t1 <<< 15 */ - SWAP_ROTL_LO(REG_V18, REG_V25, REG_V26, 15) - /* t1 = s[ 3], s[ 3] = t0 <<< 21 */ - SWAP_ROTL_LO(REG_V3 , REG_V26, REG_V25, 21) - /* t0 = s[ 5], s[ 5] = t1 <<< 28 */ - SWAP_ROTL_LO(REG_V5 , REG_V25, REG_V26, 28) - /* t1 = s[16], s[16] = t0 <<< 36 */ - SWAP_ROTL_HI(REG_V16, REG_V26, REG_V25, 36) - /* t0 = s[ 8], s[ 8] = t1 <<< 45 */ - SWAP_ROTL_HI(REG_V8 , REG_V25, REG_V26, 45) - /* t1 = s[21], s[21] = t0 <<< 55 */ - SWAP_ROTL_HI(REG_V21, REG_V26, REG_V25, 55) - /* t0 = s[24], s[24] = t1 <<< 2 */ - SWAP_ROTL_LO(REG_V24, REG_V25, REG_V26, 2) - /* t1 = s[ 4], s[ 4] = t0 <<< 14 */ - SWAP_ROTL_LO(REG_V4 , REG_V26, REG_V25, 14) - /* t0 = s[15], s[15] = t1 <<< 27 */ - SWAP_ROTL_LO(REG_V15, REG_V25, REG_V26, 27) - /* t1 = s[23], s[23] = t0 <<< 41 */ - SWAP_ROTL_HI(REG_V23, REG_V26, REG_V25, 41) - /* t0 = s[19], s[19] = t1 <<< 56 */ - SWAP_ROTL_HI(REG_V19, REG_V25, REG_V26, 56) - /* t1 = s[13], s[13] = t0 <<< 8 */ - SWAP_ROTL_LO(REG_V13, REG_V26, REG_V25, 8) - /* t0 = s[12], s[12] = t1 <<< 25 */ - SWAP_ROTL_LO(REG_V12, REG_V25, REG_V26, 25) - /* t1 = s[ 2], s[ 2] = t0 <<< 43 */ - SWAP_ROTL_HI(REG_V2 , REG_V26, REG_V25, 43) - /* t0 = s[20], s[20] = t1 <<< 62 */ - SWAP_ROTL_HI(REG_V20, REG_V25, REG_V26, 62) - /* t1 = s[14], s[14] = t0 <<< 18 */ - SWAP_ROTL_LO(REG_V14, REG_V26, REG_V25, 18) - /* t0 = s[22], s[22] = t1 <<< 39 */ - SWAP_ROTL_HI(REG_V22, REG_V25, REG_V26, 39) - /* t1 = s[ 9], s[ 9] = t0 <<< 61 */ - SWAP_ROTL_HI(REG_V9 , REG_V26, REG_V25, 61) - /* t0 = s[ 6], s[ 6] = t1 <<< 20 */ - SWAP_ROTL_LO(REG_V6 , REG_V25, REG_V26, 20) - /* s[ 1] = t0 <<< 44 */ - "li t1, 44\n\t" - VSRL_VI(REG_V1, REG_V25, (64 - 44)) - VSLL_VX(REG_V25, REG_V25, REG_T1) - VOR_VV(REG_V1, REG_V1, REG_V25) - - /* ROW MIX */ - ROW_MIX(REG_V0) - ROW_MIX(REG_V5) - ROW_MIX(REG_V10) - ROW_MIX(REG_V15) - ROW_MIX(REG_V20) - - VL1RE64_V(REG_V25, REG_T0) - "addi t0, t0, 8\n\t" - "addi t2, t2, -1\n\t" - VXOR_VV(REG_V0, REG_V0, REG_V25) - "bnez t2, L_riscv_64_block_sha3_loop\n\t" - - "mv t1, %[s]\n\t" - VSSEG8E64_V(REG_V0, REG_T1) - "addi t1, %[s], 64\n\t" - VSSEG8E64_V(REG_V8, REG_T1) - "addi t1, %[s], 128\n\t" - VSSEG8E64_V(REG_V16, REG_T1) - "addi t1, %[s], 192\n\t" - VSSEG1E64_V(REG_V24, REG_T1) - - : - : [s] "r" (s), [r] "r" (hash_keccak_r) - : "memory", "t0", "t1", "t2" - ); -} - -#endif /* WOLFSSL_RISCV_VECTOR */ -#endif /* WOLFSSL_SHA3 && !XILINX */ -#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv/riscv-64-sha512.c b/wolfcrypt/src/port/riscv/riscv-64-sha512.c deleted file mode 100644 index 8a2fd23e263..00000000000 --- a/wolfcrypt/src/port/riscv/riscv-64-sha512.c +++ /dev/null @@ -1,1733 +0,0 @@ -/* riscv-sha512.c - * - * Copyright (C) 2006-2026 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 3 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 - */ - -#include - -#ifdef WOLFSSL_RISCV_ASM -#if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) - -#if FIPS_VERSION3_LT(6,0,0) && defined(HAVE_FIPS) - #undef HAVE_FIPS -#else - #if defined(HAVE_FIPS) && FIPS_VERSION3_GE(6,0,0) - /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ - #define FIPS_NO_WRAPPERS - #endif -#endif - -#include -#if FIPS_VERSION3_GE(6,0,0) - const unsigned int wolfCrypt_FIPS_sha512_ro_sanity[2] = - { 0x1a2b3c4d, 0x00000014 }; - int wolfCrypt_FIPS_SHA512_sanity(void) - { - return 0; - } -#endif - -#include - -#ifdef NO_INLINE - #include -#else - #define WOLFSSL_MISC_INCLUDED - #include -#endif - -/* Constants to add in each round. */ -static const word64 K512[80] = { - W64LIT(0x428a2f98d728ae22), W64LIT(0x7137449123ef65cd), - W64LIT(0xb5c0fbcfec4d3b2f), W64LIT(0xe9b5dba58189dbbc), - W64LIT(0x3956c25bf348b538), W64LIT(0x59f111f1b605d019), - W64LIT(0x923f82a4af194f9b), W64LIT(0xab1c5ed5da6d8118), - W64LIT(0xd807aa98a3030242), W64LIT(0x12835b0145706fbe), - W64LIT(0x243185be4ee4b28c), W64LIT(0x550c7dc3d5ffb4e2), - W64LIT(0x72be5d74f27b896f), W64LIT(0x80deb1fe3b1696b1), - W64LIT(0x9bdc06a725c71235), W64LIT(0xc19bf174cf692694), - W64LIT(0xe49b69c19ef14ad2), W64LIT(0xefbe4786384f25e3), - W64LIT(0x0fc19dc68b8cd5b5), W64LIT(0x240ca1cc77ac9c65), - W64LIT(0x2de92c6f592b0275), W64LIT(0x4a7484aa6ea6e483), - W64LIT(0x5cb0a9dcbd41fbd4), W64LIT(0x76f988da831153b5), - W64LIT(0x983e5152ee66dfab), W64LIT(0xa831c66d2db43210), - W64LIT(0xb00327c898fb213f), W64LIT(0xbf597fc7beef0ee4), - W64LIT(0xc6e00bf33da88fc2), W64LIT(0xd5a79147930aa725), - W64LIT(0x06ca6351e003826f), W64LIT(0x142929670a0e6e70), - W64LIT(0x27b70a8546d22ffc), W64LIT(0x2e1b21385c26c926), - W64LIT(0x4d2c6dfc5ac42aed), W64LIT(0x53380d139d95b3df), - W64LIT(0x650a73548baf63de), W64LIT(0x766a0abb3c77b2a8), - W64LIT(0x81c2c92e47edaee6), W64LIT(0x92722c851482353b), - W64LIT(0xa2bfe8a14cf10364), W64LIT(0xa81a664bbc423001), - W64LIT(0xc24b8b70d0f89791), W64LIT(0xc76c51a30654be30), - W64LIT(0xd192e819d6ef5218), W64LIT(0xd69906245565a910), - W64LIT(0xf40e35855771202a), W64LIT(0x106aa07032bbd1b8), - W64LIT(0x19a4c116b8d2d0c8), W64LIT(0x1e376c085141ab53), - W64LIT(0x2748774cdf8eeb99), W64LIT(0x34b0bcb5e19b48a8), - W64LIT(0x391c0cb3c5c95a63), W64LIT(0x4ed8aa4ae3418acb), - W64LIT(0x5b9cca4f7763e373), W64LIT(0x682e6ff3d6b2b8a3), - W64LIT(0x748f82ee5defb2fc), W64LIT(0x78a5636f43172f60), - W64LIT(0x84c87814a1f0ab72), W64LIT(0x8cc702081a6439ec), - W64LIT(0x90befffa23631e28), W64LIT(0xa4506cebde82bde9), - W64LIT(0xbef9a3f7b2c67915), W64LIT(0xc67178f2e372532b), - W64LIT(0xca273eceea26619c), W64LIT(0xd186b8c721c0c207), - W64LIT(0xeada7dd6cde0eb1e), W64LIT(0xf57d4f7fee6ed178), - W64LIT(0x06f067aa72176fba), W64LIT(0x0a637dc5a2c898a6), - W64LIT(0x113f9804bef90dae), W64LIT(0x1b710b35131c471b), - W64LIT(0x28db77f523047d84), W64LIT(0x32caab7b40c72493), - W64LIT(0x3c9ebe0a15c9bebc), W64LIT(0x431d67c49c100d4c), - W64LIT(0x4cc5d4becb3e42b6), W64LIT(0x597f299cfc657e2a), - W64LIT(0x5fcb6fab3ad6faec), W64LIT(0x6c44198c4a475817) -}; - -static int InitSha512(wc_Sha512* sha512, void* heap, int devId) -{ - int ret = 0; - - if (sha512 == NULL) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - sha512->heap = heap; - #ifdef WOLF_CRYPTO_CB - sha512->devId = devId; - #endif - (void)devId; - #ifdef WOLFSSL_SMALL_STACK_CACHE - sha512->W = NULL; - #endif - - #ifdef WOLFSSL_HASH_FLAGS - sha512->flags = 0; - #endif - } - - return ret; -} - -/* Initialize SHA-512 object for hashing. - * - * @param [in, out] sha512 SHA-512 object. - */ -static void InitSha512_State(wc_Sha512* sha512) -{ - /* Set initial hash values. */ -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha512->digest[0] = W64LIT(0x6a09e667f3bcc908); - sha512->digest[1] = W64LIT(0xbb67ae8584caa73b); - sha512->digest[2] = W64LIT(0x3c6ef372fe94f82b); - sha512->digest[3] = W64LIT(0xa54ff53a5f1d36f1); - sha512->digest[4] = W64LIT(0x510e527fade682d1); - sha512->digest[5] = W64LIT(0x9b05688c2b3e6c1f); - sha512->digest[6] = W64LIT(0x1f83d9abfb41bd6b); - sha512->digest[7] = W64LIT(0x5be0cd19137e2179); -#else - /* f, e, b, a, h, g, d, c */ - sha512->digest[0] = W64LIT(0x9b05688c2b3e6c1f); - sha512->digest[1] = W64LIT(0x510e527fade682d1); - sha512->digest[2] = W64LIT(0xbb67ae8584caa73b); - sha512->digest[3] = W64LIT(0x6a09e667f3bcc908); - sha512->digest[4] = W64LIT(0x5be0cd19137e2179); - sha512->digest[5] = W64LIT(0x1f83d9abfb41bd6b); - sha512->digest[6] = W64LIT(0xa54ff53a5f1d36f1); - sha512->digest[7] = W64LIT(0x3c6ef372fe94f82b); -#endif - - /* No hashed data. */ - sha512->buffLen = 0; - /* No data hashed. */ - sha512->loLen = 0; - sha512->hiLen = 0; -} - -#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) -#if !defined(WOLFSSL_NOSHA512_224) -/** - * Initialize given wc_Sha512 structure with value specific to sha512/224. - * Note that sha512/224 has different initial hash value from sha512. - * The initial hash value consists of eight 64bit words. They are given - * in FIPS180-4. - */ -static void InitSha512_224_State(wc_Sha512* sha512) -{ -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha512->digest[0] = W64LIT(0x8c3d37c819544da2); - sha512->digest[1] = W64LIT(0x73e1996689dcd4d6); - sha512->digest[2] = W64LIT(0x1dfab7ae32ff9c82); - sha512->digest[3] = W64LIT(0x679dd514582f9fcf); - sha512->digest[4] = W64LIT(0x0f6d2b697bd44da8); - sha512->digest[5] = W64LIT(0x77e36f7304c48942); - sha512->digest[6] = W64LIT(0x3f9d85a86a1d36c8); - sha512->digest[7] = W64LIT(0x1112e6ad91d692a1); -#else - /* f, e, b, a, h, g, d, c */ - sha512->digest[0] = W64LIT(0x77e36f7304c48942); - sha512->digest[1] = W64LIT(0x0f6d2b697bd44da8); - sha512->digest[2] = W64LIT(0x73e1996689dcd4d6); - sha512->digest[3] = W64LIT(0x8c3d37c819544da2); - sha512->digest[4] = W64LIT(0x1112e6ad91d692a1); - sha512->digest[5] = W64LIT(0x3f9d85a86a1d36c8); - sha512->digest[6] = W64LIT(0x679dd514582f9fcf); - sha512->digest[7] = W64LIT(0x1dfab7ae32ff9c82); -#endif - - /* No hashed data. */ - sha512->buffLen = 0; - /* No data hashed. */ - sha512->loLen = 0; - sha512->hiLen = 0; -} -#endif /* !WOLFSSL_NOSHA512_224 */ -#endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - -#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) -#if !defined(WOLFSSL_NOSHA512_256) -/** - * Initialize given wc_Sha512 structure with value specific to sha512/256. - * Note that sha512/256 has different initial hash value from sha512. - * The initial hash value consists of eight 64bit words. They are given - * in FIPS180-4. - */ -static void InitSha512_256_State(wc_Sha512* sha512) -{ -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha512->digest[0] = W64LIT(0x22312194fc2bf72c); - sha512->digest[1] = W64LIT(0x9f555fa3c84c64c2); - sha512->digest[2] = W64LIT(0x2393b86b6f53b151); - sha512->digest[3] = W64LIT(0x963877195940eabd); - sha512->digest[4] = W64LIT(0x96283ee2a88effe3); - sha512->digest[5] = W64LIT(0xbe5e1e2553863992); - sha512->digest[6] = W64LIT(0x2b0199fc2c85b8aa); - sha512->digest[7] = W64LIT(0x0eb72ddc81c52ca2); -#else - /* f, e, b, a, h, g, d, c */ - sha512->digest[0] = W64LIT(0xbe5e1e2553863992); - sha512->digest[1] = W64LIT(0x96283ee2a88effe3); - sha512->digest[2] = W64LIT(0x9f555fa3c84c64c2); - sha512->digest[3] = W64LIT(0x22312194fc2bf72c); - sha512->digest[4] = W64LIT(0x0eb72ddc81c52ca2); - sha512->digest[5] = W64LIT(0x2b0199fc2c85b8aa); - sha512->digest[6] = W64LIT(0x963877195940eabd); - sha512->digest[7] = W64LIT(0x2393b86b6f53b151); -#endif - - /* No hashed data. */ - sha512->buffLen = 0; - /* No data hashed. */ - sha512->loLen = 0; - sha512->hiLen = 0; -} -#endif /* !WOLFSSL_NOSHA512_256 */ -#endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - -/* More data hashed, add length to 64-bit cumulative total. - * - * @param [in, out] sha512 SHA-512 object. Assumed not NULL. - * @param [in] len Length to add. - */ -static WC_INLINE void AddLength(wc_Sha512* sha512, word32 len) -{ - word32 tmp = sha512->loLen; - if ((sha512->loLen += len) < tmp) - sha512->hiLen++; /* carry low to high */ -} - -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - -/* Load a word with bytes reversed. */ -#define LOAD_DWORD_REV(r, o, p, t0, t1, t2, t3) \ - "lbu " #t0 ", " #o "+4(" #p ")\n\t" \ - "lbu " #t1 ", " #o "+5(" #p ")\n\t" \ - "lbu " #t2 ", " #o "+6(" #p ")\n\t" \ - "lbu " #r ", " #o "+7(" #p ")\n\t" \ - "slli " #t0 ", " #t0 ", 24\n\t" \ - "slli " #t1 ", " #t1 ", 16\n\t" \ - "slli " #t2 ", " #t2 ", 8\n\t" \ - "or " #r ", " #r ", " #t0 "\n\t" \ - "or " #r ", " #r ", " #t1 "\n\t" \ - "or " #r ", " #r ", " #t2 "\n\t" \ - "lbu " #t0 ", " #o "+0(" #p ")\n\t" \ - "lbu " #t1 ", " #o "+1(" #p ")\n\t" \ - "lbu " #t2 ", " #o "+2(" #p ")\n\t" \ - "lbu " #t3 ", " #o "+3(" #p ")\n\t" \ - "slli " #t0 ", " #t0 ", 56\n\t" \ - "slli " #t1 ", " #t1 ", 48\n\t" \ - "slli " #t2 ", " #t2 ", 40\n\t" \ - "slli " #t3 ", " #t3 ", 32\n\t" \ - "or " #r ", " #r ", " #t0 "\n\t" \ - "or " #r ", " #r ", " #t1 "\n\t" \ - "or " #r ", " #r ", " #t2 "\n\t" \ - "or " #r ", " #r ", " #t3 "\n\t" - -#endif - -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - -#ifdef WOLFSSL_RISCV_SCALAR_CRYPTO_ASM - -/* SHA-512 SUM0 operation. */ -#define SHA512SUM0(rd, rs1) \ - ASM_WORD((0b000100000100 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) -/* SHA-512 SUM1 operation. */ -#define SHA512SUM1(rd, rs1) \ - ASM_WORD((0b000100000101 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) -/* SHA-512 SIGMA0 operation. */ -#define SHA512SIG0(rd, rs1) \ - ASM_WORD((0b000100000110 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) -/* SHA-512 SIGMA1 operation. */ -#define SHA512SIG1(rd, rs1) \ - ASM_WORD((0b000100000111 << 20) | (0b001 << 12) | 0b0010011 | \ - (rs1 << 15) | (rd << 7)) - -/* One round of compression. */ -#define RND(a, b, c, d, e, f, g, h, w, k) \ - /* Get e and a */ \ - "mv a4, " #e "\n\t" \ - "mv a5, " #a "\n\t" \ - /* Sigma1(e) */ \ - SHA512SUM1(REG_A4, REG_A4) \ - /* Sigma0(a) */ \ - SHA512SUM0(REG_A5, REG_A5) \ - /* Maj(a, b, c) = t5 */ \ - /* Ch(e, f, g) = t6 */ \ - /* a ^ b */ \ - "xor t4, " #a ", " #b "\n\t" \ - /* f ^ g */ \ - "xor t6, " #f ", " #g "\n\t" \ - /* b ^ c */ \ - "xor t5, " #b ", " #c "\n\t" \ - /* (f ^ g) & e */ \ - "and t6, t6, " #e "\n\t" \ - /* (a^b) & (b^c) */ \ - "and t5, t5, t4\n\t" \ - /* ((f ^ g) & e) ^ g */ \ - "xor t6, t6, " #g "\n\t" \ - /* ((a^b) & (b^c)) ^ b */ \ - "xor t5, t5, " #b "\n\t" \ - /* sigma1 + Ch */ \ - "add t4, a4, t6\n\t" \ - /* K + W */ \ - "add t6, " #k ", " #w "\n\t" \ - /* sigma1 + Ch + K + W = 't0'-h */ \ - "add t4, t4, t6\n\t" \ - /* h + sigma1 + Ch + K + W = 't0' = h */ \ - "add " #h ", " #h ", t4\n\t" \ - /* Sigma0(a) + Maj = 't1' */ \ - "add t5, a5, t5\n\t" \ - /* d += 't0' */ \ - "add " #d ", " #d ", " #h "\n\t" \ - /* h += 't1' */ \ - "add " #h ", " #h ", t5\n\t" - -#define W_UPDATE(w0, w1, w9, w14, reg_w0, reg_w1, reg_w9, reg_w14) \ - /* Gamma0(W[1]) */ \ - SHA512SIG0(REG_A4, reg_w1) \ - /* Gamma1(W[i-2]) = Gamma1(W[14]) */ \ - SHA512SIG1(REG_A5, reg_w14) \ - /* Gamma1(W[14]) + W[9] */ \ - "add a5, a5, " #w9 "\n\t" \ - /* Gamma0(W[1]) + W[i-16] = Gamma0(W[1]) + W[0] */ \ - "add " #w0 ", " #w0 ", a4\n\t" \ - /* W[0] = Gamma1(W[14]) + W[9] + Gamma0(W[1]) + W[0] */ \ - "add " #w0 ", a5, " #w0 "\n\t" - -#else - -/* SHA-512 SUM0 operation. */ -#define SHA512SUM0(rd, rs1) \ - "slli t5, " #rs1 ", 36\n\t" \ - "srli t4, " #rs1 ", 28\n\t" \ - "slli t6, " #rs1 ", 30\n\t" \ - "or t4, t4, t5\n\t" \ - "srli t5, " #rs1 ", 34\n\t" \ - "xor t4, t4, t6\n\t" \ - "slli t6, " #rs1 ", 25\n\t" \ - "xor t4, t4, t5\n\t" \ - "srli " #rd ", " #rs1 ", 39\n\t" \ - "xor t4, t4, t6\n\t" \ - "xor " #rd ", " #rd ", t4\n\t" - -/* SHA-512 SUM1 operation. */ -#define SHA512SUM1(rd, rs1) \ - "slli t5, " #rs1 ", 50\n\t" \ - "srli t4, " #rs1 ", 14\n\t" \ - "slli t6, " #rs1 ", 46\n\t" \ - "or t4, t4, t5\n\t" \ - "srli t5, " #rs1 ", 18\n\t" \ - "xor t4, t4, t6\n\t" \ - "slli t6, " #rs1 ", 23\n\t" \ - "xor t4, t4, t5\n\t" \ - "srli " #rd ", " #rs1 ", 41\n\t" \ - "xor t4, t4, t6\n\t" \ - "xor " #rd ", " #rd ", t4\n\t" - -/* SHA-512 SIGMA0 operation. */ -#define SHA512SIG0(rd, rs1) \ - "slli t5, " #rs1 ", 63\n\t" \ - "srli t6, " #rs1 ", 1\n\t" \ - "slli t4, " #rs1 ", 56\n\t" \ - "or t6, t6, t5\n\t" \ - "srli t5, " #rs1 ", 8\n\t" \ - "xor t6, t6, t4\n\t" \ - "srli " #rd ", " #rs1 ", 7\n\t" \ - "xor t6, t6, t5\n\t" \ - "xor " #rd ", " #rd ", t6\n\t" - -/* SHA-512 SIGMA1 operation. */ -#define SHA512SIG1(rd, rs1) \ - "slli t5, " #rs1 ", 45\n\t" \ - "srli t6, " #rs1 ", 19\n\t" \ - "slli t4, " #rs1 ", 3\n\t" \ - "or t6, t6, t5\n\t" \ - "srli t5, " #rs1 ", 61\n\t" \ - "xor t6, t6, t4\n\t" \ - "srli " #rd ", " #rs1 ", 6\n\t" \ - "xor t6, t6, t5\n\t" \ - "xor " #rd ", " #rd ", t6\n\t" - -/* One round of compression. */ -#define RND(a, b, c, d, e, f, g, h, w, k) \ - /* Sigma1(e) */ \ - SHA512SUM1(a4, e) \ - /* Sigma0(a) */ \ - SHA512SUM0(a5, a) \ - /* Maj(a, b, c) = t5 */ \ - /* Ch(e, f, g) = t6 */ \ - /* a ^ b */ \ - "xor t4, " #a ", " #b "\n\t" \ - /* f ^ g */ \ - "xor t6, " #f ", " #g "\n\t" \ - /* b ^ c */ \ - "xor t5, " #b ", " #c "\n\t" \ - /* (f ^ g) & e */ \ - "and t6, t6, " #e "\n\t" \ - /* (a^b) & (b^c) */ \ - "and t5, t5, t4\n\t" \ - /* ((f ^ g) & e) ^ g */ \ - "xor t6, t6, " #g "\n\t" \ - /* ((a^b) & (b^c)) ^ b */ \ - "xor t5, t5, " #b "\n\t" \ - /* sigma1 + Ch */ \ - "add t4, a4, t6\n\t" \ - /* K + W */ \ - "add t6, " #k ", " #w "\n\t" \ - /* sigma1 + Ch + K + W = 't0'-h */ \ - "add t4, t4, t6\n\t" \ - /* h + sigma1 + Ch + K + W = 't0' = h */ \ - "add " #h ", " #h ", t4\n\t" \ - /* Sigma0(a) + Maj = 't1' */ \ - "add t5, a5, t5\n\t" \ - /* d += 't0' */ \ - "add " #d ", " #d ", " #h "\n\t" \ - /* h += 't1' */ \ - "add " #h ", " #h ", t5\n\t" - -/* Two message schedule updates. */ -#define W_UPDATE(w0, w1, w9, w14, reg_w0, reg_w1, reg_w9, reg_14) \ - /* Gamma0(W[1]) */ \ - SHA512SIG0(a4, w1) \ - /* Gamma1(W[i-2]) = Gamma1(W[14]) */ \ - SHA512SIG1(a5, w14) \ - /* Gamma1(W[14]) + W[9] */ \ - "add a5, a5, " #w9 "\n\t" \ - /* Gamma0(W[1]) + W[i-16] = Gamma0(W[1]) + W[0] */ \ - "add " #w0 ", " #w0 ", a4\n\t" \ - /* W[0] = Gamma1(W[14]) + W[9] + Gamma0(W[1]) + W[0] */ \ - "add " #w0 ", a5, " #w0 "\n\t" - - -#endif /* WOLFSSL_RISCV_SCALAR_CRYPTO_ASM */ - -#define RND2_W(a, b, c, d, e, f, g, h, o, w2o, w9o, w10o) \ - /* Get k[i] */ \ - "ld a6, " #o "(%[k])\n\t" \ - /* Get k[i+1] */ \ - "ld a7, " #o "+8(%[k])\n\t" \ - RND(a, b, c, d, e, f, g, h, s1, a6) \ - /* Get W[1] */ \ - "ld s2, " #o "+8(sp)\n\t" \ - /* Get W[9] */ \ - "ld s3, " #w9o "(sp)\n\t" \ - W_UPDATE(s1, s2, s3, s4, REG_S1, REG_S2, REG_S3, REG_S4) \ - RND(h, a, b, c, d, e, f, g, s2, a7) \ - "mv s4, s1\n\t" \ - /* Get W[2] */ \ - "ld s1, " #w2o "(sp)\n\t" \ - /* Get W[10] */ \ - "ld s3, " #w10o "(sp)\n\t" \ - W_UPDATE(s2, s1, s3, s5, REG_S2, REG_S1, REG_S3, REG_S5) \ - "sd s4, " #o "(sp)\n\t" \ - "mv s5, s2\n\t" \ - "sd s2, " #o "+8(sp)\n\t" - -/* Sixteen rounds of compression with message scheduling. */ -#define RND16() \ - RND2_W(t0, t1, t2, t3, s8, s9, s10, s11, 0, 16, 72, 80) \ - RND2_W(s10, s11, t0, t1, t2, t3, s8, s9, 16, 32, 88, 96) \ - RND2_W(s8, s9, s10, s11, t0, t1, t2, t3, 32, 48, 104, 112) \ - RND2_W(t2, t3, s8, s9, s10, s11, t0, t1, 48, 64, 120, 0) \ - RND2_W(t0, t1, t2, t3, s8, s9, s10, s11, 64, 80, 8, 16) \ - RND2_W(s10, s11, t0, t1, t2, t3, s8, s9, 80, 96, 24, 32) \ - RND2_W(s8, s9, s10, s11, t0, t1, t2, t3, 96, 112, 40, 48) \ - RND2_W(t2, t3, s8, s9, s10, s11, t0, t1, 112, 0, 56, 64) - -#define RND2(a, b, c, d, e, f, g, h, o) \ - /* Get k[i] */ \ - "ld a6, " #o "(%[k])\n\t" \ - /* Get W[0] */ \ - "ld s1, " #o "(sp)\n\t" \ - RND(a, b, c, d, e, f, g, h, s1, a6) \ - /* Get k[i] */ \ - "ld a6, " #o "+8(%[k])\n\t" \ - /* Get W[1] */ \ - "ld s1, " #o "+8(sp)\n\t" \ - RND(h, a, b, c, d, e, f, g, s1, a6) - -/* Sixteen rounds of compression only. */ -#define RND16_LAST() \ - RND2(t0, t1, t2, t3, s8, s9, s10, s11, 0) \ - RND2(s10, s11, t0, t1, t2, t3, s8, s9, 16) \ - RND2(s8, s9, s10, s11, t0, t1, t2, t3, 32) \ - RND2(t2, t3, s8, s9, s10, s11, t0, t1, 48) \ - RND2(t0, t1, t2, t3, s8, s9, s10, s11, 64) \ - RND2(s10, s11, t0, t1, t2, t3, s8, s9, 80) \ - RND2(s8, s9, s10, s11, t0, t1, t2, t3, 96) \ - RND2(t2, t3, s8, s9, s10, s11, t0, t1, 112) - -/* Transform the message data. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] data Buffer of data to hash. - * @param [in] blocks Number of blocks of data to hash. - */ -static WC_INLINE void Sha512Transform(wc_Sha512* sha512, const byte* data, - word32 blocks) -{ - word64* k = (word64*)K512; - - __asm__ __volatile__ ( - "addi sp, sp, -128\n\t" - - /* Load digest. */ - "ld t0, 0(%[digest])\n\t" - "ld t1, 8(%[digest])\n\t" - "ld t2, 16(%[digest])\n\t" - "ld t3, 24(%[digest])\n\t" - "ld s8, 32(%[digest])\n\t" - "ld s9, 40(%[digest])\n\t" - "ld s10, 48(%[digest])\n\t" - "ld s11, 56(%[digest])\n\t" - - /* 5 rounds of 16 per block - 4 loops of 16 and 1 final 16. */ - "slli %[blocks], %[blocks], 2\n\t" - - "\n1:\n\t" - /* beginning of SHA512 block operation */ - /* Load W */ -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - LOAD_DWORD_REV(t4, 0, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s1, 8, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s2, 16, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s3, 24, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s4, 32, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s5, 40, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s6, 48, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s7, 56, %[data], a4, a5, a6, a7) -#else - UNALIGNED_LD8(t4, s1, s2, s3, s4, s5, s6, s7, 0, %[data], t5) - REV8(REG_T4, REG_T4) - REV8(REG_S1, REG_S1) - REV8(REG_S2, REG_S2) - REV8(REG_S3, REG_S3) - REV8(REG_S4, REG_S4) - REV8(REG_S5, REG_S5) - REV8(REG_S6, REG_S6) - REV8(REG_S7, REG_S7) -#endif - "sd t4, 0(sp)\n\t" - "sd s1, 8(sp)\n\t" - "sd s2, 16(sp)\n\t" - "sd s3, 24(sp)\n\t" - "sd s4, 32(sp)\n\t" - "sd s5, 40(sp)\n\t" - "sd s6, 48(sp)\n\t" - "sd s7, 56(sp)\n\t" -#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION - LOAD_DWORD_REV(t4, 64, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s1, 72, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s2, 80, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s3, 88, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s4, 96, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s5, 104, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s6, 112, %[data], a4, a5, a6, a7) - LOAD_DWORD_REV(s7, 120, %[data], a4, a5, a6, a7) -#else - "ld t4, 64(%[data])\n\t" - "ld s1, 72(%[data])\n\t" - "ld s2, 80(%[data])\n\t" - "ld s3, 88(%[data])\n\t" - "ld s4, 96(%[data])\n\t" - "ld s5, 104(%[data])\n\t" - "ld s6, 112(%[data])\n\t" - "ld s7, 120(%[data])\n\t" - REV8(REG_T4, REG_T4) - REV8(REG_S1, REG_S1) - REV8(REG_S2, REG_S2) - REV8(REG_S3, REG_S3) - REV8(REG_S4, REG_S4) - REV8(REG_S5, REG_S5) - REV8(REG_S6, REG_S6) - REV8(REG_S7, REG_S7) -#endif - "sd t4, 64(sp)\n\t" - "sd s1, 72(sp)\n\t" - "sd s2, 80(sp)\n\t" - "sd s3, 88(sp)\n\t" - "sd s4, 96(sp)\n\t" - "sd s5, 104(sp)\n\t" - "sd s6, 112(sp)\n\t" - "sd s7, 120(sp)\n\t" - - "\n2:\n\t" - /* Get W[0] */ - "ld s1, 0(sp)\n\t" - /* Get W[14] */ - "ld s4, 112(sp)\n\t" - /* Get W[15] */ - "ld s5, 120(sp)\n\t" - "addi %[blocks], %[blocks], -1\n\t" - RND16() - "andi a4, %[blocks], 3\n\t" - "add %[k], %[k], 128\n\t" - "bnez a4, 2b \n\t" - RND16_LAST() - "addi %[k], %[k], -512\n\t" - - "# Add working vars back into digest state.\n\t" - "ld t4, 0(%[digest])\n\t" - "ld s1, 8(%[digest])\n\t" - "ld s2, 16(%[digest])\n\t" - "ld s3, 24(%[digest])\n\t" - "ld s4, 32(%[digest])\n\t" - "ld s5, 40(%[digest])\n\t" - "ld s6, 48(%[digest])\n\t" - "ld s7, 56(%[digest])\n\t" - "add t0, t0, t4\n\t" - "add t1, t1, s1\n\t" - "add t2, t2, s2\n\t" - "add t3, t3, s3\n\t" - "add s8, s8, s4\n\t" - "add s9, s9, s5\n\t" - "add s10, s10, s6\n\t" - "add s11, s11, s7\n\t" - - /* Store digest. */ - "sd t0, 0(%[digest])\n\t" - "sd t1, 8(%[digest])\n\t" - "sd t2, 16(%[digest])\n\t" - "sd t3, 24(%[digest])\n\t" - "sd s8, 32(%[digest])\n\t" - "sd s9, 40(%[digest])\n\t" - "sd s10, 48(%[digest])\n\t" - "sd s11, 56(%[digest])\n\t" - - "add %[data], %[data], 128\n\t" - "bnez %[blocks], 1b \n\t" - - "addi sp, sp, 128\n\t" - - : [blocks] "+r" (blocks), [data] "+r" (data), [k] "+r" (k) - : [digest] "r" (sha512->digest) - : "cc", "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "a4", "a5", "a6", "a7", - "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", - "s11" - ); -} - -#else - -/* Two rounds of compression using low two W values. - * Assumes K has been added into W values. - */ -#define VSHA2CL_VV(vd, vs1, vs2) \ - ASM_WORD((0b101111 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (vd << 7) | (vs1 << 15) | (vs2 << 20)) - -/* Two rounds of compression using upper two W values. - * Assumes K has been added into W values. - */ -#define VSHA2CH_VV(vd, vs1, vs2) \ - ASM_WORD((0b101110 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (vd << 7) | (vs1 << 15) | (vs2 << 20)) - -/* Update 4 W values - message scheduling. */ -#define VSHA2MS_VV(vd, vs1, vs2) \ - ASM_WORD((0b101101 << 26) | (0b1 << 25) | \ - (0b010 << 12) | (0b1110111 << 0) | \ - (vd << 7) | (vs1 << 15) | (vs2 << 20)) - -#define RND4(w0, w2, w4, w6, k) \ - /* Four rounds of compression. */ \ - VADD_VV(REG_V14, w0, k) \ - VMV_X_S(REG_T1, w2) \ - VSHA2CL_VV(REG_V10, REG_V14, REG_V8) \ - VMV_V_V(REG_V12, w4) \ - VSHA2CH_VV(REG_V8, REG_V14, REG_V10) \ - /* Update 4 W values - message schedule. */ \ - VMV_S_X(REG_V12, REG_T1) \ - VSHA2MS_VV(w0, w6, REG_V12) - -#define RND4_LAST(w, k) \ - /* Four rounds of compression. */ \ - VADD_VV(REG_V14, w, k) \ - VSHA2CL_VV(REG_V10, REG_V14, REG_V8) \ - VSHA2CH_VV(REG_V8, REG_V14, REG_V10) - -#define RND16(k) \ - RND4(REG_V0, REG_V2, REG_V4, REG_V6, (k + 0)) \ - RND4(REG_V2, REG_V4, REG_V6, REG_V0, (k + 2)) \ - RND4(REG_V4, REG_V6, REG_V0, REG_V2, (k + 4)) \ - RND4(REG_V6, REG_V0, REG_V2, REG_V4, (k + 6)) - -#define RND16_LAST(k) \ - RND4_LAST(REG_V0, (k + 0)) \ - RND4_LAST(REG_V2, (k + 2)) \ - RND4_LAST(REG_V4, (k + 4)) \ - RND4_LAST(REG_V6, (k + 6)) - -/* Transform the message data. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] data Buffer of data to hash. - * @param [in] blocks Number of blocks of data to hash. - */ -static void Sha512Transform(wc_Sha512* sha512, const byte* data, - word32 blocks) -{ - word64* k = (word64*)K512; - - __asm__ __volatile__ ( - VSETIVLI(REG_ZERO, 4, 1, 1, 0b011, 0b001) - - /* Load: a|b|e|f, c|d|g|h - * 3 2 1 0 3 2 1 0 - */ - "mv t0, %[digest]\n\t" - VL4RE64_V(REG_V8, REG_T0) - - "\n1:\n\t" - VMVR_V(REG_V28, REG_V8, 4) - - /* Load 16 W into 8 vectors of 2 64-bit words. */ - "mv t0, %[data]\n\t" - VL8RE64_V(REG_V0, REG_T0) - VREV8(REG_V0, REG_V0) - VREV8(REG_V2, REG_V2) - VREV8(REG_V4, REG_V4) - VREV8(REG_V6, REG_V6) - - "mv t0, %[k]\n\t" - VL8RE64_V(REG_V16, REG_T0) - RND16(REG_V16) - "addi t0, %[k], 128\n\t" - VL8RE64_V(REG_V16, REG_T0) - RND16(REG_V16) - "addi t0, %[k], 256\n\t" - VL8RE64_V(REG_V16, REG_T0) - RND16(REG_V16) - "addi t0, %[k], 384\n\t" - VL8RE64_V(REG_V16, REG_T0) - RND16(REG_V16) - "addi t0, %[k], 512\n\t" - VL8RE64_V(REG_V16, REG_T0) - RND16_LAST(REG_V16) - - VADD_VV(REG_V8, REG_V8, REG_V28) - VADD_VV(REG_V10, REG_V10, REG_V30) - - "addi %[blocks], %[blocks], -1\n\t" - "add %[data], %[data], 128\n\t" - "bnez %[blocks], 1b \n\t" - - "mv t0, %[digest]\n\t" - VS4R_V(REG_V8, REG_T0) - - : [blocks] "+r" (blocks), [data] "+r" (data), [k] "+r" (k) - : [digest] "r" (sha512->digest) - : "cc", "memory", "t0", "t1" - ); -} - -#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ - -/* Update the hash with data. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] data Buffer of data to hash. - * @param [in] len Number of bytes in buffer to hash. - * @return 0 on success. - */ -static WC_INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, - word32 len) -{ - word32 add; - word32 blocks; - - /* only perform actions if a buffer is passed in */ - if (len > 0) { - AddLength(sha512, len); - - if (sha512->buffLen > 0) { - /* fill leftover buffer with data */ - add = min(len, WC_SHA512_BLOCK_SIZE - sha512->buffLen); - XMEMCPY((byte*)(sha512->buffer) + sha512->buffLen, data, add); - sha512->buffLen += add; - data += add; - len -= add; - if (sha512->buffLen == WC_SHA512_BLOCK_SIZE) { - Sha512Transform(sha512, (byte*)sha512->buffer, 1); - sha512->buffLen = 0; - } - } - - /* number of blocks in a row to complete */ - blocks = len / WC_SHA512_BLOCK_SIZE; - - if (blocks > 0) { - Sha512Transform(sha512, data, blocks); - data += blocks * WC_SHA512_BLOCK_SIZE; - len -= blocks * WC_SHA512_BLOCK_SIZE; - } - - if (len > 0) { - /* copy over any remaining data leftover */ - XMEMCPY(sha512->buffer, data, len); - sha512->buffLen = len; - } - } - - /* account for possibility of not used if len = 0 */ - (void)add; - (void)blocks; - - return 0; -} - -/* Finalize the hash and put into buffer. - * - * @param [in, out] sha512 SHA-512 object. - * @param [out] hash Buffer to hold hash result. - * @param [in] hashLen Length of hash to write out. - */ -static WC_INLINE void Sha512Final(wc_Sha512* sha512, byte* hash, int hashLen) -{ - byte* local; - byte hashBuf[WC_SHA512_DIGEST_SIZE]; - byte* hashRes = hash; - - if (hashLen < WC_SHA512_DIGEST_SIZE) { - hashRes = hashBuf; - } - - local = (byte*)sha512->buffer; - local[sha512->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (sha512->buffLen > WC_SHA512_PAD_SIZE) { - XMEMSET(&local[sha512->buffLen], 0, - WC_SHA512_BLOCK_SIZE - sha512->buffLen); - Sha512Transform(sha512, (byte*)sha512->buffer, 1); - sha512->buffLen = 0; - } - XMEMSET(&local[sha512->buffLen], 0, WC_SHA512_PAD_SIZE - sha512->buffLen); - - /* put lengths in bits */ - sha512->hiLen = (sha512->loLen >> (8*sizeof(sha512->loLen) - 3)) + - (sha512->hiLen << 3); - sha512->loLen = sha512->loLen << 3; - - sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2] = sha512->hiLen; - sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 1] = sha512->loLen; - - /* store lengths */ - __asm__ __volatile__ ( - /* Reverse byte order of 64-bit words. */ -#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) - "ld t0, 112(%[buff])\n\t" - "ld t1, 120(%[buff])\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) -#else - LOAD_DWORD_REV(t0, 112, %[buff], t2, t3, t4, t5) - LOAD_DWORD_REV(t1, 120, %[buff], t2, t3, t4, t5) -#endif - "sd t0, 112(%[buff])\n\t" - "sd t1, 120(%[buff])\n\t" - : - : [buff] "r" (sha512->buffer) - : "cc", "memory", "t0", "t1", "t2", "t3", "t4", "t5" - ); - - Sha512Transform(sha512, (byte*)sha512->buffer, 1); - - __asm__ __volatile__ ( - /* Reverse byte order of 64-bit words. */ -#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) - VSETIVLI(REG_ZERO, 4, 1, 1, 0b011, 0b001) - "mv t0, %[digest]\n\t" - VL4RE64_V(REG_V4, REG_T0) - VREV8(REG_V4, REG_V4) - VREV8(REG_V6, REG_V6) - VSETIVLI(REG_ZERO, 2, 1, 1, 0b011, 0b000) - /* e|f, a|b, g|h, c|d - * 1 0 1 0 1 0 1 0 */ - VSLIDEDOWN_VI(REG_V0, REG_V5, 1) /* a */ - VSLIDEDOWN_VI(REG_V1, REG_V7, 1) /* c */ - VSLIDEDOWN_VI(REG_V2, REG_V4, 1) /* e */ - VSLIDEDOWN_VI(REG_V3, REG_V6, 1) /* g */ - VSLIDEUP_VI(REG_V0, REG_V5, 1) - VSLIDEUP_VI(REG_V1, REG_V7, 1) - VSLIDEUP_VI(REG_V2, REG_V4, 1) - VSLIDEUP_VI(REG_V3, REG_V6, 1) - "mv t0, %[hash]\n\t" - VS4R_V(REG_V0, REG_T0) -#elif defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) - VSETIVLI(REG_ZERO, 4, 1, 1, 0b011, 0b001) - "mv t0, %[digest]\n\t" - VL4RE64_V(REG_V0, REG_T0) - VREV8(REG_V0, REG_V0) - VREV8(REG_V2, REG_V2) - "mv t0, %[hash]\n\t" - VS4R_V(REG_V0, REG_T0) -#elif defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) - "ld t0, 0(%[digest])\n\t" - "ld t1, 8(%[digest])\n\t" - "ld t2, 16(%[digest])\n\t" - "ld t3, 24(%[digest])\n\t" - "ld s8, 32(%[digest])\n\t" - "ld s9, 40(%[digest])\n\t" - "ld s10, 48(%[digest])\n\t" - "ld s11, 56(%[digest])\n\t" - REV8(REG_T0, REG_T0) - REV8(REG_T1, REG_T1) - REV8(REG_T2, REG_T2) - REV8(REG_T3, REG_T3) - REV8(REG_S8, REG_S8) - REV8(REG_S9, REG_S9) - REV8(REG_S10, REG_S10) - REV8(REG_S11, REG_S11) - UNALIGNED_SD8(t0, t1, t2, t3, s8, s9, s10, s11, 0, %[hash], t4) -#else - LOAD_DWORD_REV(t0, 0, %[digest], a4, a5, a6, a7) - LOAD_DWORD_REV(t1, 8, %[digest], a4, a5, a6, a7) - LOAD_DWORD_REV(t2, 16, %[digest], a4, a5, a6, a7) - LOAD_DWORD_REV(t3, 24, %[digest], a4, a5, a6, a7) - LOAD_DWORD_REV(s8, 32, %[digest], a4, a5, a6, a7) - LOAD_DWORD_REV(s9, 40, %[digest], a4, a5, a6, a7) - LOAD_DWORD_REV(s10, 48, %[digest], a4, a5, a6, a7) - LOAD_DWORD_REV(s11, 56, %[digest], a4, a5, a6, a7) - UNALIGNED_SD8(t0, t1, t2, t3, s8, s9, s10, s11, 0, %[hash], t4) -#endif - : - : [digest] "r" (sha512->digest), [hash] "r" (hashRes) - : "cc", "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", - "s8", "s9", "s10", "s11", "a4", "a5", "a6", "a7" - ); - - if (hashRes == hashBuf) { - XMEMCPY(hash, hashBuf, hashLen); - } -} - - -#ifdef WOLFSSL_SHA512 - -/* Initialize SHA-512 object for hashing. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] heap Dynamic memory hint. - * @param [in] devId Device Id. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 is NULL. - */ -int wc_InitSha512_ex(wc_Sha512* sha512, void* heap, int devId) -{ - int ret = InitSha512(sha512, heap, devId); - if (ret == 0) { - InitSha512_State(sha512); -#if defined(WOLFSSL_SHA512_HASHTYPE) - sha512->hashType = WC_HASH_TYPE_SHA512; -#endif - } - return ret; -} - -/* Initialize SHA-512 object for hashing. - * - * @param [in, out] sha512 SHA-512 object. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 is NULL. - */ -int wc_InitSha512(wc_Sha512* sha512) -{ - return wc_InitSha512_ex(sha512, NULL, INVALID_DEVID); -} - -/* Free the SHA-512 hash. - * - * @param [in] sha512 SHA-512 object. - */ -void wc_Sha512Free(wc_Sha512* sha512) -{ - /* No dynamic memory allocated. */ - (void)sha512; -} - -/* Update the hash with data. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] data Buffer of data to hash. - * @param [in] len Number of bytes in buffer to hash. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 is NULL. - * @return BAD_FUNC_ARG when data is NULL but len is not 0. - */ -int wc_Sha512Update(wc_Sha512* sha512, const byte* data, word32 len) -{ - int ret; - - /* Validate parameters. */ - if ((sha512 == NULL) || ((data == NULL) && (len != 0))) { - ret = BAD_FUNC_ARG; - } - else { - ret = Sha512Update(sha512, data, len); - } - - return ret; -} - -/* Put the current hash into buffer. - * - * @param [in, out] sha512 SHA-512 object. - * @param [out] hash Buffer to hold hash result. - * @param [in] hashLen Length of hash to write out. - */ -static void Sha512FinalRaw(wc_Sha512* sha512, byte* hash, int hashLen) -{ - word64 digest[WC_SHA512_DIGEST_SIZE / sizeof(word64)]; - -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - ByteReverseWords64((word64*)digest, (word64*)sha512->digest, - WC_SHA512_DIGEST_SIZE); -#else - /* f, e, b, a, h, g, d, c */ - digest[0] = ByteReverseWord64(sha512->digest[3]); - digest[1] = ByteReverseWord64(sha512->digest[2]); - digest[2] = ByteReverseWord64(sha512->digest[7]); - digest[3] = ByteReverseWord64(sha512->digest[6]); - digest[4] = ByteReverseWord64(sha512->digest[1]); - digest[5] = ByteReverseWord64(sha512->digest[0]); - digest[6] = ByteReverseWord64(sha512->digest[5]); - digest[7] = ByteReverseWord64(sha512->digest[4]); -#endif - - XMEMCPY(hash, digest, hashLen); -} - -/* Put the current hash into buffer. - * - * @param [in, out] sha512 SHA-512 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 or hash is NULL. - */ -int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - Sha512FinalRaw(sha512, hash, WC_SHA512_DIGEST_SIZE); - } - - return ret; -} - -/* Finalize the hash and put into buffer. - * - * @param [in, out] sha512 SHA-512 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 or hash is NULL. - */ -int wc_Sha512Final(wc_Sha512* sha512, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - /* Finalize hash. */ - Sha512Final(sha512, hash, WC_SHA512_DIGEST_SIZE); - /* Restart SHA-512 object for next hash. */ - InitSha512_State(sha512); - } - - return ret; -} - -/* Finalize the hash and put into buffer but don't modify state. - * - * @param [in, out] sha512 SHA-512 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 or hash is NULL. - */ -int wc_Sha512GetHash(wc_Sha512* sha512, byte* hash) -{ - int ret; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - wc_Sha512 tmpSha512; - XMEMSET(&tmpSha512, 0, sizeof(tmpSha512)); - /* Create a copy of the hash to finalize. */ - ret = wc_Sha512Copy(sha512, &tmpSha512); - if (ret == 0) { - /* Finalize copy. */ - Sha512Final(&tmpSha512, hash, WC_SHA512_DIGEST_SIZE); - wc_Sha512Free(&tmpSha512); - } - } - - return ret; -} - -#ifdef WOLFSSL_HASH_FLAGS -/* Set flags of SHA-512 object. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] flags Flags to set. - * @return 0 on success. - */ -int wc_Sha512SetFlags(wc_Sha512* sha512, word32 flags) -{ - /* Check we have an object to use. */ - if (sha512 != NULL) { - sha512->flags = flags; - } - return 0; -} -/* Get flags of SHA-512 object. - * - * @param [in] sha512 SHA-512 object. - * @param [out] flags Flags from SHA-512 object. - * @return 0 on success. - */ -int wc_Sha512GetFlags(wc_Sha512* sha512, word32* flags) -{ - /* Check we have an object and return parameter to use. */ - if ((sha512 != NULL) && (flags != NULL)) { - *flags = sha512->flags; - } - return 0; -} -#endif - -/* Deep copy the SHA-512 object. - * - * @param [in] src SHA-512 object to copy. - * @param [out] dst SHA-512 object to fill. - * @return 0 on success. - * @return BAD_FUNC_ARG when src or dst is NULL. - */ -int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst) -{ - int ret = 0; - - /* Validate parameters. */ - if ((src == NULL) || (dst == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - XMEMCPY(dst, src, sizeof(wc_Sha512)); - } - - return ret; -} - -#ifdef OPENSSL_EXTRA -/* Update the hash with one block of data. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] data Buffer of data to hash. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 or data is NULL. - */ -int wc_Sha512Transform(wc_Sha512* sha512, const unsigned char* data) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (data == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - ByteReverseWords((word32*)sha512->buffer, (word32*)data, WC_SHA512_BLOCK_SIZE); - Sha512Transform(sha512, (byte*)sha512->buffer, 1); - } - - return ret; -} -#endif - -#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH) -/* Update the hash with one block of data and optionally get hash. - * - * @param [in, out] sha512 SHA-512 object. - * @param [in] data Buffer of data to hash. - * @param [out] hash Buffer to hold hash. May be NULL. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha512 or data is NULL. - */ -int wc_Sha512HashBlock(wc_Sha512* sha512, const unsigned char* data, - unsigned char* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (data == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - /* Hash block. */ - Sha512Transform(sha512, data, 1); - - if (hash != NULL) { - /* Reverse bytes in digest. */ - word32* hash32 = (word32*)hash; - word32* digest = (word32*)sha512->digest; - hash32[0] = ByteReverseWord32(digest[0]); - hash32[1] = ByteReverseWord32(digest[1]); - hash32[2] = ByteReverseWord32(digest[2]); - hash32[3] = ByteReverseWord32(digest[3]); - hash32[4] = ByteReverseWord32(digest[4]); - hash32[5] = ByteReverseWord32(digest[5]); - hash32[6] = ByteReverseWord32(digest[6]); - hash32[7] = ByteReverseWord32(digest[7]); - /* Reset state. */ - #ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha512->digest[0] = 0x6A09E667L; - sha512->digest[1] = 0xBB67AE85L; - sha512->digest[2] = 0x3C6EF372L; - sha512->digest[3] = 0xA54FF53AL; - sha512->digest[4] = 0x510E527FL; - sha512->digest[5] = 0x9B05688CL; - sha512->digest[6] = 0x1F83D9ABL; - sha512->digest[7] = 0x5BE0CD19L; - #else - /* f, e, b, a, h, g, d, c */ - sha512->digest[0] = 0x9B05688CL; - sha512->digest[1] = 0x510E527FL; - sha512->digest[2] = 0xBB67AE85L; - sha512->digest[3] = 0x6A09E667L; - sha512->digest[4] = 0x5BE0CD19L; - sha512->digest[5] = 0x1F83D9ABL; - sha512->digest[6] = 0xA54FF53AL; - sha512->digest[7] = 0x3C6EF372L; - #endif - } - } - - return ret; -} -#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_FULL_HASH */ - -#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) - -#if !defined(WOLFSSL_NOSHA512_224) - -int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId) -{ - int ret = InitSha512(sha512, heap, devId); - if (ret == 0) { - InitSha512_224_State(sha512); -#if defined(WOLFSSL_SHA512_HASHTYPE) - sha512->hashType = WC_HASH_TYPE_SHA512_224; -#endif - } - return ret; -} -int wc_InitSha512_224(wc_Sha512* sha512) -{ - return wc_InitSha512_224_ex(sha512, NULL, INVALID_DEVID); -} -int wc_Sha512_224Update(wc_Sha512* sha512, const byte* data, word32 len) -{ - return wc_Sha512Update(sha512, data, len); -} -int wc_Sha512_224FinalRaw(wc_Sha512* sha512, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - Sha512FinalRaw(sha512, hash, WC_SHA512_224_DIGEST_SIZE); - } - - return ret; -} -int wc_Sha512_224Final(wc_Sha512* sha512, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - /* Finalize hash. */ - Sha512Final(sha512, hash, WC_SHA512_224_DIGEST_SIZE); - /* Restart SHA-512 object for next hash. */ - InitSha512_224_State(sha512); - } - - return ret; -} -void wc_Sha512_224Free(wc_Sha512* sha512) -{ - wc_Sha512Free(sha512); -} -int wc_Sha512_224GetHash(wc_Sha512* sha512, byte* hash) -{ - int ret; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - wc_Sha512 tmpSha512; - XMEMSET(&tmpSha512, 0, sizeof(tmpSha512)); - /* Create a copy of the hash to finalize. */ - ret = wc_Sha512Copy(sha512, &tmpSha512); - if (ret == 0) { - /* Finalize copy. */ - Sha512Final(&tmpSha512, hash, WC_SHA512_224_DIGEST_SIZE); - wc_Sha512Free(&tmpSha512); - } - } - - return ret; -} -int wc_Sha512_224Copy(wc_Sha512* src, wc_Sha512* dst) -{ - return wc_Sha512Copy(src, dst); -} - -#ifdef WOLFSSL_HASH_FLAGS -int wc_Sha512_224SetFlags(wc_Sha512* sha512, word32 flags) -{ - return wc_Sha512SetFlags(sha512, flags); -} -int wc_Sha512_224GetFlags(wc_Sha512* sha512, word32* flags) -{ - return wc_Sha512GetFlags(sha512, flags); -} -#endif /* WOLFSSL_HASH_FLAGS */ - -#if defined(OPENSSL_EXTRA) -int wc_Sha512_224Transform(wc_Sha512* sha512, const unsigned char* data) -{ - return wc_Sha512Transform(sha512, data); -} -#endif /* OPENSSL_EXTRA */ - -#endif /* !WOLFSSL_NOSHA512_224 */ - -#if !defined(WOLFSSL_NOSHA512_256) - -int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId) -{ - int ret = InitSha512(sha512, heap, devId); - if (ret == 0) { - InitSha512_256_State(sha512); -#if defined(WOLFSSL_SHA512_HASHTYPE) - sha512->hashType = WC_HASH_TYPE_SHA512_256; -#endif - } - return ret; -} -int wc_InitSha512_256(wc_Sha512* sha512) -{ - return wc_InitSha512_256_ex(sha512, NULL, INVALID_DEVID); -} -int wc_Sha512_256Update(wc_Sha512* sha512, const byte* data, word32 len) -{ - return wc_Sha512Update(sha512, data, len); -} -int wc_Sha512_256FinalRaw(wc_Sha512* sha512, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - Sha512FinalRaw(sha512, hash, WC_SHA512_256_DIGEST_SIZE); - } - - return ret; -} -int wc_Sha512_256Final(wc_Sha512* sha512, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - /* Finalize hash. */ - Sha512Final(sha512, hash, WC_SHA512_256_DIGEST_SIZE); - /* Restart SHA-512 object for next hash. */ - InitSha512_256_State(sha512); - } - - return ret; -} -void wc_Sha512_256Free(wc_Sha512* sha512) -{ - wc_Sha512Free(sha512); -} -int wc_Sha512_256GetHash(wc_Sha512* sha512, byte* hash) -{ - int ret; - - /* Validate parameters. */ - if ((sha512 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - wc_Sha512 tmpSha512; - XMEMSET(&tmpSha512, 0, sizeof(tmpSha512)); - /* Create a copy of the hash to finalize. */ - ret = wc_Sha512Copy(sha512, &tmpSha512); - if (ret == 0) { - /* Finalize copy. */ - Sha512Final(&tmpSha512, hash, WC_SHA512_256_DIGEST_SIZE); - wc_Sha512Free(&tmpSha512); - } - } - - return ret; -} -int wc_Sha512_256Copy(wc_Sha512* src, wc_Sha512* dst) -{ - return wc_Sha512Copy(src, dst); -} - -#ifdef WOLFSSL_HASH_FLAGS -int wc_Sha512_256SetFlags(wc_Sha512* sha512, word32 flags) -{ - return wc_Sha512SetFlags(sha512, flags); -} -int wc_Sha512_256GetFlags(wc_Sha512* sha512, word32* flags) -{ - return wc_Sha512GetFlags(sha512, flags); -} -#endif /* WOLFSSL_HASH_FLAGS */ - -#if defined(OPENSSL_EXTRA) -int wc_Sha512_256Transform(wc_Sha512* sha512, const unsigned char* data) -{ - return wc_Sha512Transform(sha512, data); -} -#endif /* OPENSSL_EXTRA */ - -#endif /* !WOLFSSL_NOSHA512_224 */ - -#endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - -#endif /* WOLFSSL_SHA512 */ - - -#ifdef WOLFSSL_SHA384 - -/* Initialize SHA-384 object for hashing. - * - * @param [in, out] sha384 SHA-384 object. - */ -static void InitSha384(wc_Sha384* sha384) -{ - /* Set initial hash values. */ -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - sha384->digest[0] = W64LIT(0xcbbb9d5dc1059ed8); - sha384->digest[1] = W64LIT(0x629a292a367cd507); - sha384->digest[2] = W64LIT(0x9159015a3070dd17); - sha384->digest[3] = W64LIT(0x152fecd8f70e5939); - sha384->digest[4] = W64LIT(0x67332667ffc00b31); - sha384->digest[5] = W64LIT(0x8eb44a8768581511); - sha384->digest[6] = W64LIT(0xdb0c2e0d64f98fa7); - sha384->digest[7] = W64LIT(0x47b5481dbefa4fa4); -#else - /* f, e, b, a, h, g, d, c */ - sha384->digest[0] = W64LIT(0x8eb44a8768581511); - sha384->digest[1] = W64LIT(0x67332667ffc00b31); - sha384->digest[2] = W64LIT(0x629a292a367cd507); - sha384->digest[3] = W64LIT(0xcbbb9d5dc1059ed8); - sha384->digest[4] = W64LIT(0x47b5481dbefa4fa4); - sha384->digest[5] = W64LIT(0xdb0c2e0d64f98fa7); - sha384->digest[6] = W64LIT(0x152fecd8f70e5939); - sha384->digest[7] = W64LIT(0x9159015a3070dd17); -#endif - - /* No hashed data. */ - sha384->buffLen = 0; - /* No data hashed. */ - sha384->loLen = 0; - sha384->hiLen = 0; -} - -/* Initialize SHA-384 object for hashing. - * - * @param [in, out] sha384 SHA-384 object. - * @param [in] heap Dynamic memory hint. - * @param [in] devId Device Id. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha384 is NULL. - */ -int wc_InitSha384_ex(wc_Sha384* sha384, void* heap, int devId) -{ - int ret = InitSha512(sha384, heap, devId); - if (ret == 0) { - InitSha384(sha384); - } - return ret; -} - -/* Initialize SHA-384 object for hashing. - * - * @param [in, out] sha384 SHA-384 object. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha384 is NULL. - */ -int wc_InitSha384(wc_Sha384* sha384) -{ - return wc_InitSha384_ex(sha384, NULL, INVALID_DEVID); -} - -/* Update the hash with data. - * - * @param [in, out] sha384 SHA-384 object. - * @param [in] data Buffer of data to hash. - * @param [in] len Number of bytes in buffer to hash. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha384 is NULL. - * @return BAD_FUNC_ARG when data is NULL but len is not 0. - */ -int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len) -{ - int ret; - - /* Validate parameters. */ - if ((sha384 == NULL) || ((data == NULL) && (len > 0))) { - ret = BAD_FUNC_ARG; - } - else { - ret = Sha512Update((wc_Sha512 *)sha384, data, len); - } - - return ret; -} - -/* Put the current hash into buffer. - * - * @param [in, out] sha384 SHA-384 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha384 or hash is NULL. - */ -int wc_Sha384FinalRaw(wc_Sha384* sha384, byte* hash) -{ - word64 digest[WC_SHA384_DIGEST_SIZE / sizeof(word64)]; - - if (sha384 == NULL || hash == NULL) { - return BAD_FUNC_ARG; - } - -#ifndef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM - ByteReverseWords64((word64*)digest, (word64*)sha384->digest, - WC_SHA384_DIGEST_SIZE); -#else - /* f, e, b, a, h, g, d, c */ - digest[0] = ByteReverseWord64(sha384->digest[3]); - digest[1] = ByteReverseWord64(sha384->digest[2]); - digest[2] = ByteReverseWord64(sha384->digest[7]); - digest[3] = ByteReverseWord64(sha384->digest[6]); - digest[4] = ByteReverseWord64(sha384->digest[1]); - digest[5] = ByteReverseWord64(sha384->digest[0]); -#endif - - XMEMCPY(hash, digest, WC_SHA384_DIGEST_SIZE); - - return 0; -} - -/* Finalize the hash and put into buffer. - * - * @param [in, out] sha384 SHA-384 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha384 or hash is NULL. - */ -int wc_Sha384Final(wc_Sha384* sha384, byte* hash) -{ - int ret = 0; - - /* Validate parameters. */ - if ((sha384 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - /* Finalize hash. */ - Sha512Final((wc_Sha512*)sha384, hash, WC_SHA384_DIGEST_SIZE); - /* Restart SHA-384 object for next hash. */ - InitSha384(sha384); - } - - return ret; -} - -/* Free the SHA-384 hash. - * - * @param [in] sha384 SHA-384 object. - */ -void wc_Sha384Free(wc_Sha384* sha384) -{ - /* No dynamic memory allocated. */ - (void)sha384; -} - -/* Finalize the hash and put into buffer but don't modify state. - * - * @param [in, out] sha384 SHA-384 object. - * @param [out] hash Buffer to hold hash result. - * @return 0 on success. - * @return BAD_FUNC_ARG when sha384 or hash is NULL. - */ -int wc_Sha384GetHash(wc_Sha384* sha384, byte* hash) -{ - int ret; - - /* Validate parameters. */ - if ((sha384 == NULL) || (hash == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - wc_Sha384 tmpSha384; - XMEMSET(&tmpSha384, 0, sizeof(tmpSha384)); - /* Create a copy of the hash to finalize. */ - ret = wc_Sha384Copy(sha384, &tmpSha384); - if (ret == 0) { - /* Finalize copy. */ - ret = wc_Sha384Final(&tmpSha384, hash); - } - } - - return ret; -} - -#ifdef WOLFSSL_HASH_FLAGS -/* Set flags of SHA-384 object. - * - * @param [in, out] sha384 SHA-384 object. - * @param [in] flags Flags to set. - * @return 0 on success. - */ -int wc_Sha384SetFlags(wc_Sha384* sha384, word32 flags) -{ - /* Check we have an object to use. */ - if (sha384 != NULL) { - sha384->flags = flags; - } - return 0; -} -/* Get flags of SHA-384 object. - * - * @param [in] sha384 SHA-384 object. - * @param [out] flags Flags from SHA-384 object. - * @return 0 on success. - */ -int wc_Sha384GetFlags(wc_Sha384* sha384, word32* flags) -{ - /* Check we have an object and return parameter to use. */ - if ((sha384 != NULL) && (flags != NULL)) { - *flags = sha384->flags; - } - return 0; -} -#endif - -/* Deep copy the SHA-384 object. - * - * @param [in] src SHA-384 object to copy. - * @param [out] dst SHA-384 object to fill. - * @return 0 on success. - * @return BAD_FUNC_ARG when src or dst is NULL. - */ -int wc_Sha384Copy(wc_Sha384* src, wc_Sha384* dst) -{ - int ret = 0; - - /* Validate parameters. */ - if ((src == NULL) || (dst == NULL)) { - ret = BAD_FUNC_ARG; - } - else { - XMEMCPY(dst, src, sizeof(wc_Sha384)); - } - - return ret; -} - -#endif /* WOLFSSL_SHA384 */ - -#endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */ -#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-aes-asm.S b/wolfcrypt/src/port/riscv64/riscv-64-aes-asm.S new file mode 100644 index 00000000000..1835833fadd --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-aes-asm.S @@ -0,0 +1,79988 @@ +/* riscv-64-aes-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./aes/aes.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-aes-asm.S + */ +#ifdef WOLFSSL_RISCV_ASM +#ifndef WOLFSSL_RISCV_ASM_INLINE +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + .text + .globl AES_set_key_RISCV64 + .type AES_set_key_RISCV64,@function + .align 2 +AES_set_key_RISCV64: + li t0, 24 + beq a1, t0, L_AES_set_key_RISCV64_192 + li t0, 32 + beq a1, t0, L_AES_set_key_RISCV64_256 + # AES-128 key schedule. + bnez a3, L_AES_set_key_RISCV64_128_dec + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v0, (t0) + .word 0x0282e007 + mv t0, a2 + # vaeskf1.vi v1, v0, 1 + .word 0x8a00a0f7 + # vaeskf1.vi v2, v1, 2 + .word 0x8a112177 + # vaeskf1.vi v3, v2, 3 + .word 0x8a21a1f7 + # vaeskf1.vi v4, v3, 4 + .word 0x8a322277 + # vaeskf1.vi v5, v4, 5 + .word 0x8a42a2f7 + # vaeskf1.vi v6, v5, 6 + .word 0x8a532377 + # vaeskf1.vi v7, v6, 7 + .word 0x8a63a3f7 + # vaeskf1.vi v8, v7, 8 + .word 0x8a742477 + # vaeskf1.vi v9, v8, 9 + .word 0x8a84a4f7 + # vaeskf1.vi v10, v9, 10 + .word 0x8a952577 + # vs8r.v v0, (t0) + .word 0xe2828027 + add t0, t0, 128 + # vs2r.v v8, (t0) + .word 0x22828427 + add t0, t0, 96 + # vs1r.v v10, (t0) + .word 0x02828527 + j L_AES_set_key_RISCV64_done +L_AES_set_key_RISCV64_128_dec: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v10, (t0) + .word 0x0282e507 + mv t0, a2 + # vaeskf1.vi v9, v10, 1 + .word 0x8aa0a4f7 + # vaeskf1.vi v8, v9, 2 + .word 0x8a912477 + # vaeskf1.vi v7, v8, 3 + .word 0x8a81a3f7 + # vaeskf1.vi v6, v7, 4 + .word 0x8a722377 + # vaeskf1.vi v5, v6, 5 + .word 0x8a62a2f7 + # vaeskf1.vi v4, v5, 6 + .word 0x8a532277 + # vaeskf1.vi v3, v4, 7 + .word 0x8a43a1f7 + # vaeskf1.vi v2, v3, 8 + .word 0x8a342177 + # vaeskf1.vi v1, v2, 9 + .word 0x8a24a0f7 + # vaeskf1.vi v0, v1, 10 + .word 0x8a152077 + # vs8r.v v0, (t0) + .word 0xe2828027 + add t0, t0, 128 + # vs2r.v v8, (t0) + .word 0x22828427 + add t0, t0, 96 + # vs1r.v v10, (t0) + .word 0x02828527 + j L_AES_set_key_RISCV64_done + # AES-192 key schedule. +L_AES_set_key_RISCV64_192: + bnez a3, L_AES_set_key_RISCV64_192_dec + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v0, (t0) + .word 0x0282e007 + # vsetivli zero, 1, e32, m1, ta, ma + .word 0xcd00f057 + addi t0, t0, 16 + # vl1re32.v v13, (t0) + .word 0x0282e687 + addi t0, t0, 4 + # vl1re32.v v14, (t0) + .word 0x0282e707 + # vxor.vv v16, v16, v16 + .word 0x2f080857 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a2 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 1 + .word 0x8a00a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 2 + .word 0x8a112077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 3 + .word 0x8a01a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 4 + .word 0x8a122077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 5 + .word 0x8a02a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 6 + .word 0x8a132077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 7 + .word 0x8a03a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 8 + .word 0x8a142077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + addi t0, t0, 32 + # vs1r.v v0, (t0) + .word 0x02828027 + j L_AES_set_key_RISCV64_done +L_AES_set_key_RISCV64_192_dec: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v0, (t0) + .word 0x0282e007 + # vsetivli zero, 1, e32, m1, ta, ma + .word 0xcd00f057 + addi t0, t0, 16 + # vl1re32.v v13, (t0) + .word 0x0282e687 + addi t0, t0, 4 + # vl1re32.v v14, (t0) + .word 0x0282e707 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vxor.vv v16, v16, v16 + .word 0x2f080857 + addi t0, a2, 224 + # vs1r.v v0, (t0) + .word 0x02828027 + mv t0, a2 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 1 + .word 0x8a00a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 2 + .word 0x8a112077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 3 + .word 0x8a01a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 4 + .word 0x8a122077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 5 + .word 0x8a02a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 6 + .word 0x8a132077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v0, (t0) + .word 0x02828027 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v0, 3 + .word 0x3e01b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v0, v14, 3 + .word 0x3ae1b057 + # vaeskf1.vi v1, v0, 7 + .word 0x8a03a0f7 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v1, v1, v16 + .word 0x2f0080d7 + # vslidedown.vi v15, v1, 3 + .word 0x3e11b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v1, (t0) + .word 0x028280a7 + addi t0, t0, 16 + # vslideup.vi v13, v14, 1 + .word 0x3ae0b6d7 + # vsetivli zero, 2, e32, m1, ta, ma + .word 0xcd017057 + # vs1r.v v13, (t0) + .word 0x028286a7 + addi t0, t0, 8 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vslidedown.vi v17, v1, 3 + .word 0x3e11b8d7 + # vslideup.vi v16, v17, 3 + .word 0x3b11b857 + # vslideup.vi v1, v14, 3 + .word 0x3ae1b0d7 + # vaeskf1.vi v0, v1, 8 + .word 0x8a142077 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslideup.vi v16, v14, 3 + .word 0x3ae1b857 + # vxor.vv v0, v0, v16 + .word 0x2f000057 + # vslidedown.vi v15, v0, 3 + .word 0x3e01b7d7 + # vxor.vv v13, v13, v15 + .word 0x2ef686d7 + # vxor.vv v14, v14, v13 + .word 0x2ed70757 + # vs1r.v v0, (t0) + .word 0x02828027 + mv t0, a2 + # vl4re32.v v0, (t0) + .word 0x6282e007 + addi t0, a2, 64 + # vl2re32.v v4, (t0) + .word 0x2282e207 + addi t1, a2, 112 + # vl4re32.v v8, (t1) + .word 0x62836407 + addi t1, a2, 176 + # vl2re32.v v12, (t1) + .word 0x22836607 + # vmv.v.v v21, v0 + .word 0x5e000ad7 + # vmv.v.v v20, v1 + .word 0x5e008a57 + # vmv.v.v v19, v2 + .word 0x5e0109d7 + # vmv.v.v v18, v3 + .word 0x5e018957 + # vmv.v.v v17, v4 + .word 0x5e0208d7 + # vmv.v.v v16, v5 + .word 0x5e028857 + # vmv.v.v v5, v8 + .word 0x5e0402d7 + # vmv.v.v v4, v9 + .word 0x5e048257 + # vmv.v.v v3, v10 + .word 0x5e0501d7 + # vmv.v.v v2, v11 + .word 0x5e058157 + # vmv.v.v v1, v12 + .word 0x5e0600d7 + # vmv.v.v v0, v13 + .word 0x5e068057 + mv t0, a2 + # vs4r.v v0, (t0) + .word 0x62828027 + addi t0, a2, 64 + # vs2r.v v4, (t0) + .word 0x22828227 + addi t1, a2, 112 + # vs4r.v v16, (t1) + .word 0x62830827 + addi t1, a2, 176 + # vs2r.v v20, (t1) + .word 0x22830a27 + j L_AES_set_key_RISCV64_done + # AES-256 key schedule. +L_AES_set_key_RISCV64_256: + bnez a3, L_AES_set_key_RISCV64_256_dec + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl2re32.v v0, (t0) + .word 0x2282e007 + mv t0, a2 + # vmv.v.v v14, v0 + .word 0x5e000757 + # vmv.v.v v13, v1 + .word 0x5e0086d7 + # vaeskf2.vi v14, v13, 2 + .word 0xaad12777 + # vmv.v.v v2, v14 + .word 0x5e070157 + # vaeskf2.vi v13, v14, 3 + .word 0xaae1a6f7 + # vmv.v.v v3, v13 + .word 0x5e0681d7 + # vaeskf2.vi v14, v13, 4 + .word 0xaad22777 + # vmv.v.v v4, v14 + .word 0x5e070257 + # vaeskf2.vi v13, v14, 5 + .word 0xaae2a6f7 + # vmv.v.v v5, v13 + .word 0x5e0682d7 + # vaeskf2.vi v14, v13, 6 + .word 0xaad32777 + # vmv.v.v v6, v14 + .word 0x5e070357 + # vaeskf2.vi v13, v14, 7 + .word 0xaae3a6f7 + # vmv.v.v v7, v13 + .word 0x5e0683d7 + # vaeskf2.vi v14, v13, 8 + .word 0xaad42777 + # vmv.v.v v8, v14 + .word 0x5e070457 + # vaeskf2.vi v13, v14, 9 + .word 0xaae4a6f7 + # vmv.v.v v9, v13 + .word 0x5e0684d7 + # vaeskf2.vi v14, v13, 10 + .word 0xaad52777 + # vmv.v.v v10, v14 + .word 0x5e070557 + # vaeskf2.vi v13, v14, 11 + .word 0xaae5a6f7 + # vmv.v.v v11, v13 + .word 0x5e0685d7 + # vaeskf2.vi v14, v13, 12 + .word 0xaad62777 + # vmv.v.v v12, v14 + .word 0x5e070657 + # vaeskf2.vi v13, v14, 13 + .word 0xaae6a6f7 + # vaeskf2.vi v14, v13, 14 + .word 0xaad72777 + # vs8r.v v0, (t0) + .word 0xe2828027 + add t0, t0, 128 + # vs4r.v v8, (t0) + .word 0x62828427 + add t0, t0, 64 + # vs2r.v v12, (t0) + .word 0x22828627 + add t0, t0, 32 + # vs1r.v v14, (t0) + .word 0x02828727 + j L_AES_set_key_RISCV64_done +L_AES_set_key_RISCV64_256_dec: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl2re32.v v0, (t0) + .word 0x2282e007 + # vmv.v.v v13, v1 + .word 0x5e0086d7 + # vmv.v.v v14, v0 + .word 0x5e000757 + mv t0, a2 + # vaeskf2.vi v0, v1, 2 + .word 0xaa112077 + # vmv.v.v v12, v0 + .word 0x5e000657 + # vaeskf2.vi v1, v0, 3 + .word 0xaa01a0f7 + # vmv.v.v v11, v1 + .word 0x5e0085d7 + # vaeskf2.vi v0, v1, 4 + .word 0xaa122077 + # vmv.v.v v10, v0 + .word 0x5e000557 + # vaeskf2.vi v1, v0, 5 + .word 0xaa02a0f7 + # vmv.v.v v9, v1 + .word 0x5e0084d7 + # vaeskf2.vi v0, v1, 6 + .word 0xaa132077 + # vmv.v.v v8, v0 + .word 0x5e000457 + # vaeskf2.vi v1, v0, 7 + .word 0xaa03a0f7 + # vmv.v.v v7, v1 + .word 0x5e0083d7 + # vaeskf2.vi v0, v1, 8 + .word 0xaa142077 + # vmv.v.v v6, v0 + .word 0x5e000357 + # vaeskf2.vi v1, v0, 9 + .word 0xaa04a0f7 + # vmv.v.v v5, v1 + .word 0x5e0082d7 + # vaeskf2.vi v0, v1, 10 + .word 0xaa152077 + # vmv.v.v v4, v0 + .word 0x5e000257 + # vaeskf2.vi v1, v0, 11 + .word 0xaa05a0f7 + # vmv.v.v v3, v1 + .word 0x5e0081d7 + # vaeskf2.vi v0, v1, 12 + .word 0xaa162077 + # vmv.v.v v2, v0 + .word 0x5e000157 + # vaeskf2.vi v1, v0, 13 + .word 0xaa06a0f7 + # vaeskf2.vi v0, v1, 14 + .word 0xaa172077 + # vs8r.v v0, (t0) + .word 0xe2828027 + add t0, t0, 128 + # vs4r.v v8, (t0) + .word 0x62828427 + add t0, t0, 64 + # vs2r.v v12, (t0) + .word 0x22828627 + add t0, t0, 32 + # vs1r.v v14, (t0) + .word 0x02828727 +L_AES_set_key_RISCV64_done: + ret + .size AES_set_key_RISCV64,.-AES_set_key_RISCV64 +#ifdef HAVE_AESGCM + .text + .globl AES_GCM_encrypt_RISCV64 + .type AES_GCM_encrypt_RISCV64,@function + .align 2 +AES_GCM_encrypt_RISCV64: + addi sp, sp, -48 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + sd s5, 32(sp) + sd s6, 40(sp) + ld s1, 48(sp) + ld s2, 56(sp) + ld s3, 64(sp) + ld s4, 72(sp) + ld s5, 80(sp) + ld s6, 88(sp) + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # X = 0; load H + # vxor.vv v18, v18, v18 + .word 0x2f290957 + mv t0, s3 + # vl1re32.v v19, (t0) + .word 0x0282e987 + li t0, 12 + bne a4, t0, L_AES_GCM_encrypt_RISCV64_j0_ghash + mv t0, s4 + sd zero, 0(t0) + sd zero, 8(t0) + ld t1, 0(a3) + sd t1, 0(t0) + lw t1, 8(a3) + sw t1, 8(t0) + li t1, 1 + sb t1, 15(t0) + # vl1re32.v v16, (t0) + .word 0x0282e807 + j L_AES_GCM_encrypt_RISCV64_j0_done +L_AES_GCM_encrypt_RISCV64_j0_ghash: + # vxor.vv v16, v16, v16 + .word 0x2f080857 + srli t6, a4, 4 + beqz t6, L_AES_GCM_encrypt_RISCV64_j0_nblk_done +L_AES_GCM_encrypt_RISCV64_j0_nloop: + mv t0, a3 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 + addi a3, a3, 16 + addi t6, t6, -1 + bnez t6, L_AES_GCM_encrypt_RISCV64_j0_nloop +L_AES_GCM_encrypt_RISCV64_j0_nblk_done: + andi t1, a4, 15 + beqz t1, L_AES_GCM_encrypt_RISCV64_j0_npad_done + # vxor.vv v17, v17, v17 + .word 0x2f1888d7 + mv t0, s4 + # vs1r.v v17, (t0) + .word 0x028288a7 + mv t3, t1 + mv t0, s4 +L_AES_GCM_encrypt_RISCV64_j0_n_load_byte: + lb t4, 0(a3) + sb t4, 0(t0) + addi a3, a3, 1 + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_RISCV64_j0_n_load_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 +L_AES_GCM_encrypt_RISCV64_j0_npad_done: + # Length block: 0^64 || nonceSz*8 (big-endian) + mv t0, s4 + sd zero, 0(t0) + slli t1, a4, 3 + srli t2, t1, 32 + andi t2, t2, 7 + srli t3, t1, 24 + srli t4, t1, 16 + srli t5, t1, 8 + sh zero, 8(t0) + sb zero, 10(t0) + sb t2, 11(t0) + sb t3, 12(t0) + sb t4, 13(t0) + sb t5, 14(t0) + sb t1, 15(t0) + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 +L_AES_GCM_encrypt_RISCV64_j0_done: + # GHASH the AAD + beqz s1, L_AES_GCM_encrypt_RISCV64_aad_done + srli t1, s1, 4 + beqz t1, L_AES_GCM_encrypt_RISCV64_aad_blocks_done +L_AES_GCM_encrypt_RISCV64_aad_loop: + mv t0, a7 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + addi a7, a7, 16 + addi t1, t1, -1 + bnez t1, L_AES_GCM_encrypt_RISCV64_aad_loop +L_AES_GCM_encrypt_RISCV64_aad_blocks_done: + andi t1, s1, 15 + beqz t1, L_AES_GCM_encrypt_RISCV64_aad_done + # vxor.vv v17, v17, v17 + .word 0x2f1888d7 + mv t0, s4 + # vs1r.v v17, (t0) + .word 0x028288a7 + mv t3, t1 + mv t0, s4 +L_AES_GCM_encrypt_RISCV64_aad_load_byte: + lb t4, 0(a7) + sb t4, 0(t0) + addi a7, a7, 1 + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_RISCV64_aad_load_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 +L_AES_GCM_encrypt_RISCV64_aad_done: + mv t0, s2 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_GCM_encrypt_RISCV64_loaded: + addi t0, s2, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + # Host counter (lane 0) from J0 + # vslidedown.vi v20, v16, 3 + .word 0x3f01ba57 + # vrev8.v v20, v20 + .word 0x4b44aa57 + # 4-block fast path (64-byte groups), then <64-byte tail below + srli t6, a2, 6 + beqz t6, L_AES_GCM_encrypt_RISCV64_x4_done + # Precompute H^2, H^3, H^4 (v21/v22/v23) + # vmv.v.v v21, v19 + .word 0x5e098ad7 + # vmv.v.v v22, v19 + .word 0x5e098b57 + # vgmul.vv v21, v19 + .word 0xa338aaf7 + # vmv.v.v v23, v21 + .word 0x5e0a8bd7 + # vgmul.vv v22, v21 + .word 0xa358ab77 + # vgmul.vv v23, v21 + .word 0xa358abf7 +L_AES_GCM_encrypt_RISCV64_x4_loop: + # Next 4 counters from host counter v20 (lane 0), big-endian into lane 3 + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vmv.v.v v25, v16 + .word 0x5e080cd7 + # vmv.v.v v26, v16 + .word 0x5e080d57 + # vmv.v.v v27, v16 + .word 0x5e080dd7 + # vadd.vi v28, v20, 1 + .word 0x0340be57 + # vadd.vi v29, v20, 2 + .word 0x03413ed7 + # vadd.vi v30, v20, 3 + .word 0x0341bf57 + # vadd.vi v20, v20, 4 + .word 0x03423a57 + # vrev8.v v28, v28 + .word 0x4bc4ae57 + # vrev8.v v29, v29 + .word 0x4bd4aed7 + # vrev8.v v30, v30 + .word 0x4be4af57 + # vrev8.v v31, v20 + .word 0x4b44afd7 + # vslideup.vi v24, v28, 3 + .word 0x3bc1bc57 + # vslideup.vi v25, v29, 3 + .word 0x3bd1bcd7 + # vslideup.vi v26, v30, 3 + .word 0x3be1bd57 + # vslideup.vi v27, v31, 3 + .word 0x3bf1bdd7 + # Encrypt the 4 counter blocks (v24-v27) as one LMUL=4 group + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vaesz.vs v24, v0 + .word 0xa603ac77 + # vaesem.vs v24, v1 + .word 0xa6112c77 + # vaesem.vs v24, v2 + .word 0xa6212c77 + # vaesem.vs v24, v3 + .word 0xa6312c77 + # vaesem.vs v24, v4 + .word 0xa6412c77 + # vaesem.vs v24, v5 + .word 0xa6512c77 + # vaesem.vs v24, v6 + .word 0xa6612c77 + # vaesem.vs v24, v7 + .word 0xa6712c77 + # vaesem.vs v24, v8 + .word 0xa6812c77 + # vaesem.vs v24, v9 + .word 0xa6912c77 + li t4, 11 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_x4aes_last + # vaesem.vs v24, v10 + .word 0xa6a12c77 + # vaesem.vs v24, v11 + .word 0xa6b12c77 + li t4, 13 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_x4aes_last + # vaesem.vs v24, v12 + .word 0xa6c12c77 + # vaesem.vs v24, v13 + .word 0xa6d12c77 +L_AES_GCM_encrypt_RISCV64_x4aes_last: + # vaesef.vs v24, v14 + .word 0xa6e1ac77 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl4re32.v v28, (t0) + .word 0x6282ee07 + # vxor.vv v28, v24, v28 + .word 0x2fcc0e57 + # vxor.vv v29, v25, v29 + .word 0x2fdc8ed7 + # vxor.vv v30, v26, v30 + .word 0x2fed0f57 + # vxor.vv v31, v27, v31 + .word 0x2ffd8fd7 + mv t0, a1 + # vs4r.v v28, (t0) + .word 0x62828e27 + # Aggregated GHASH: X = (X^ct0)*H^4 ^ ct1*H^3 ^ ct2*H^2 ^ ct3*H + # vxor.vv v28, v28, v18 + .word 0x2f2e0e57 + # vgmul.vv v28, v23 + .word 0xa378ae77 + # vgmul.vv v29, v22 + .word 0xa368aef7 + # vgmul.vv v30, v21 + .word 0xa358af77 + # vgmul.vv v31, v19 + .word 0xa338aff7 + # vxor.vv v18, v28, v29 + .word 0x2fde0957 + # vxor.vv v18, v18, v30 + .word 0x2fe90957 + # vxor.vv v18, v18, v31 + .word 0x2ff90957 + addi a0, a0, 64 + addi a1, a1, 64 + addi t6, t6, -1 + bnez t6, L_AES_GCM_encrypt_RISCV64_x4_loop +L_AES_GCM_encrypt_RISCV64_x4_done: + # m2 rung then single-block loop for the <64-byte remainder + andi t6, a2, 63 + srli t6, t6, 4 + andi t5, t6, 2 + beqz t5, L_AES_GCM_encrypt_RISCV64_after_m2 + # 2-block group: counters v24/v25, m2 AES, 2-way GHASH + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vmv.v.v v25, v16 + .word 0x5e080cd7 + # vadd.vi v26, v20, 1 + .word 0x0340bd57 + # vadd.vi v20, v20, 2 + .word 0x03413a57 + # vrev8.v v26, v26 + .word 0x4ba4ad57 + # vrev8.v v27, v20 + .word 0x4b44add7 + # vslideup.vi v24, v26, 3 + .word 0x3ba1bc57 + # vslideup.vi v25, v27, 3 + .word 0x3bb1bcd7 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vaesz.vs v24, v0 + .word 0xa603ac77 + # vaesem.vs v24, v1 + .word 0xa6112c77 + # vaesem.vs v24, v2 + .word 0xa6212c77 + # vaesem.vs v24, v3 + .word 0xa6312c77 + # vaesem.vs v24, v4 + .word 0xa6412c77 + # vaesem.vs v24, v5 + .word 0xa6512c77 + # vaesem.vs v24, v6 + .word 0xa6612c77 + # vaesem.vs v24, v7 + .word 0xa6712c77 + # vaesem.vs v24, v8 + .word 0xa6812c77 + # vaesem.vs v24, v9 + .word 0xa6912c77 + li t4, 11 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_m2aes_last + # vaesem.vs v24, v10 + .word 0xa6a12c77 + # vaesem.vs v24, v11 + .word 0xa6b12c77 + li t4, 13 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_m2aes_last + # vaesem.vs v24, v12 + .word 0xa6c12c77 + # vaesem.vs v24, v13 + .word 0xa6d12c77 +L_AES_GCM_encrypt_RISCV64_m2aes_last: + # vaesef.vs v24, v14 + .word 0xa6e1ac77 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl2re32.v v26, (t0) + .word 0x2282ed07 + # vxor.vv v26, v24, v26 + .word 0x2fac0d57 + # vxor.vv v27, v25, v27 + .word 0x2fbc8dd7 + mv t0, a1 + # vs2r.v v26, (t0) + .word 0x22828d27 + # vmv.v.v v28, v19 + .word 0x5e098e57 + # vgmul.vv v28, v19 + .word 0xa338ae77 + # vghsh.vv v26, v18, v28 + .word 0xb3c92d77 + # vgmul.vv v27, v19 + .word 0xa338adf7 + # vxor.vv v18, v26, v27 + .word 0x2fbd0957 + addi a0, a0, 32 + addi a1, a1, 32 + addi t6, t6, -2 +L_AES_GCM_encrypt_RISCV64_after_m2: + beqz t6, L_AES_GCM_encrypt_RISCV64_blocks_done +L_AES_GCM_encrypt_RISCV64_loop: + # vadd.vi v20, v20, 1 + .word 0x0340ba57 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + # vaesz.vs v21, v0 + .word 0xa603aaf7 + # vaesem.vs v21, v1 + .word 0xa6112af7 + # vaesem.vs v21, v2 + .word 0xa6212af7 + # vaesem.vs v21, v3 + .word 0xa6312af7 + # vaesem.vs v21, v4 + .word 0xa6412af7 + # vaesem.vs v21, v5 + .word 0xa6512af7 + # vaesem.vs v21, v6 + .word 0xa6612af7 + # vaesem.vs v21, v7 + .word 0xa6712af7 + # vaesem.vs v21, v8 + .word 0xa6812af7 + # vaesem.vs v21, v9 + .word 0xa6912af7 + li t4, 11 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_aes_last + # vaesem.vs v21, v10 + .word 0xa6a12af7 + # vaesem.vs v21, v11 + .word 0xa6b12af7 + li t4, 13 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_aes_last + # vaesem.vs v21, v12 + .word 0xa6c12af7 + # vaesem.vs v21, v13 + .word 0xa6d12af7 +L_AES_GCM_encrypt_RISCV64_aes_last: + # vaesef.vs v21, v14 + .word 0xa6e1aaf7 + mv t0, a0 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vxor.vv v21, v21, v17 + .word 0x2f1a8ad7 + mv t0, a1 + # vs1r.v v21, (t0) + .word 0x02828aa7 + # vghsh.vv v18, v21, v19 + .word 0xb33aa977 + addi a0, a0, 16 + addi a1, a1, 16 + addi t6, t6, -1 + bnez t6, L_AES_GCM_encrypt_RISCV64_loop +L_AES_GCM_encrypt_RISCV64_blocks_done: + # Partial final block + andi t1, a2, 15 + beqz t1, L_AES_GCM_encrypt_RISCV64_partial_done + # vadd.vi v20, v20, 1 + .word 0x0340ba57 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + # vaesz.vs v21, v0 + .word 0xa603aaf7 + # vaesem.vs v21, v1 + .word 0xa6112af7 + # vaesem.vs v21, v2 + .word 0xa6212af7 + # vaesem.vs v21, v3 + .word 0xa6312af7 + # vaesem.vs v21, v4 + .word 0xa6412af7 + # vaesem.vs v21, v5 + .word 0xa6512af7 + # vaesem.vs v21, v6 + .word 0xa6612af7 + # vaesem.vs v21, v7 + .word 0xa6712af7 + # vaesem.vs v21, v8 + .word 0xa6812af7 + # vaesem.vs v21, v9 + .word 0xa6912af7 + li t4, 11 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_p_aes_last + # vaesem.vs v21, v10 + .word 0xa6a12af7 + # vaesem.vs v21, v11 + .word 0xa6b12af7 + li t4, 13 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_p_aes_last + # vaesem.vs v21, v12 + .word 0xa6c12af7 + # vaesem.vs v21, v13 + .word 0xa6d12af7 +L_AES_GCM_encrypt_RISCV64_p_aes_last: + # vaesef.vs v21, v14 + .word 0xa6e1aaf7 + # vxor.vv v17, v17, v17 + .word 0x2f1888d7 + mv t0, s4 + # vs1r.v v17, (t0) + .word 0x028288a7 + mv t3, t1 + mv t0, s4 +L_AES_GCM_encrypt_RISCV64_p_load_byte: + lb t4, 0(a0) + sb t4, 0(t0) + addi a0, a0, 1 + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_RISCV64_p_load_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vxor.vv v21, v21, v17 + .word 0x2f1a8ad7 + mv t0, s4 + # vs1r.v v21, (t0) + .word 0x02828aa7 + mv t3, t1 +L_AES_GCM_encrypt_RISCV64_p_store_byte: + lb t4, 0(t0) + sb t4, 0(a1) + addi t0, t0, 1 + addi a1, a1, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_RISCV64_p_store_byte + li t3, 16 + sub t3, t3, t1 +L_AES_GCM_encrypt_RISCV64_p_zero_byte: + sb zero, 0(t0) + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_RISCV64_p_zero_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 +L_AES_GCM_encrypt_RISCV64_partial_done: + # Hash in the lengths of AAD and ciphertext in bits (big-endian) + mv t0, s4 + slli s1, s1, 3 + srli t2, s1, 32 + andi t2, t2, 7 + srli t3, s1, 24 + srli t4, s1, 16 + srli t5, s1, 8 + sh zero, 0(t0) + sb zero, 2(t0) + sb t2, 3(t0) + sb t3, 4(t0) + sb t4, 5(t0) + sb t5, 6(t0) + sb s1, 7(t0) + slli a2, a2, 3 + srli t2, a2, 32 + andi t2, t2, 7 + srli t3, a2, 24 + srli t4, a2, 16 + srli t5, a2, 8 + sh zero, 8(t0) + sb zero, 10(t0) + sb t2, 11(t0) + sb t3, 12(t0) + sb t4, 13(t0) + sb t5, 14(t0) + sb a2, 15(t0) + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + # tag = GHASH ^ E_K(J0) + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_tag_aes_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble s6, t4, L_AES_GCM_encrypt_RISCV64_tag_aes_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_GCM_encrypt_RISCV64_tag_aes_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vxor.vv v18, v18, v16 + .word 0x2f090957 + mv t0, s4 + # vs1r.v v18, (t0) + .word 0x02828927 + # Store tagSz bytes of the tag + mv t0, s4 + mv t3, a6 +L_AES_GCM_encrypt_RISCV64_store_tag: + lb t4, 0(t0) + sb t4, 0(a5) + addi t0, t0, 1 + addi a5, a5, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_RISCV64_store_tag + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + ld s5, 32(sp) + ld s6, 40(sp) + addi sp, sp, 48 + ret + .size AES_GCM_encrypt_RISCV64,.-AES_GCM_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_GCM_decrypt_RISCV64 + .type AES_GCM_decrypt_RISCV64,@function + .align 2 +AES_GCM_decrypt_RISCV64: + addi sp, sp, -48 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + sd s5, 32(sp) + sd s6, 40(sp) + ld s1, 48(sp) + ld s2, 56(sp) + ld s3, 64(sp) + ld s4, 72(sp) + ld s5, 80(sp) + ld s6, 88(sp) + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # X = 0; load H + # vxor.vv v18, v18, v18 + .word 0x2f290957 + mv t0, s3 + # vl1re32.v v19, (t0) + .word 0x0282e987 + li t0, 12 + bne a4, t0, L_AES_GCM_decrypt_RISCV64_j0_ghash + mv t0, s4 + sd zero, 0(t0) + sd zero, 8(t0) + ld t1, 0(a3) + sd t1, 0(t0) + lw t1, 8(a3) + sw t1, 8(t0) + li t1, 1 + sb t1, 15(t0) + # vl1re32.v v16, (t0) + .word 0x0282e807 + j L_AES_GCM_decrypt_RISCV64_j0_done +L_AES_GCM_decrypt_RISCV64_j0_ghash: + # vxor.vv v16, v16, v16 + .word 0x2f080857 + srli t6, a4, 4 + beqz t6, L_AES_GCM_decrypt_RISCV64_j0_nblk_done +L_AES_GCM_decrypt_RISCV64_j0_nloop: + mv t0, a3 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 + addi a3, a3, 16 + addi t6, t6, -1 + bnez t6, L_AES_GCM_decrypt_RISCV64_j0_nloop +L_AES_GCM_decrypt_RISCV64_j0_nblk_done: + andi t1, a4, 15 + beqz t1, L_AES_GCM_decrypt_RISCV64_j0_npad_done + # vxor.vv v17, v17, v17 + .word 0x2f1888d7 + mv t0, s4 + # vs1r.v v17, (t0) + .word 0x028288a7 + mv t3, t1 + mv t0, s4 +L_AES_GCM_decrypt_RISCV64_j0_n_load_byte: + lb t4, 0(a3) + sb t4, 0(t0) + addi a3, a3, 1 + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_RISCV64_j0_n_load_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 +L_AES_GCM_decrypt_RISCV64_j0_npad_done: + # Length block: 0^64 || nonceSz*8 (big-endian) + mv t0, s4 + sd zero, 0(t0) + slli t1, a4, 3 + srli t2, t1, 32 + andi t2, t2, 7 + srli t3, t1, 24 + srli t4, t1, 16 + srli t5, t1, 8 + sh zero, 8(t0) + sb zero, 10(t0) + sb t2, 11(t0) + sb t3, 12(t0) + sb t4, 13(t0) + sb t5, 14(t0) + sb t1, 15(t0) + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 +L_AES_GCM_decrypt_RISCV64_j0_done: + # GHASH the AAD + beqz s1, L_AES_GCM_decrypt_RISCV64_aad_done + srli t1, s1, 4 + beqz t1, L_AES_GCM_decrypt_RISCV64_aad_blocks_done +L_AES_GCM_decrypt_RISCV64_aad_loop: + mv t0, a7 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + addi a7, a7, 16 + addi t1, t1, -1 + bnez t1, L_AES_GCM_decrypt_RISCV64_aad_loop +L_AES_GCM_decrypt_RISCV64_aad_blocks_done: + andi t1, s1, 15 + beqz t1, L_AES_GCM_decrypt_RISCV64_aad_done + # vxor.vv v17, v17, v17 + .word 0x2f1888d7 + mv t0, s4 + # vs1r.v v17, (t0) + .word 0x028288a7 + mv t3, t1 + mv t0, s4 +L_AES_GCM_decrypt_RISCV64_aad_load_byte: + lb t4, 0(a7) + sb t4, 0(t0) + addi a7, a7, 1 + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_RISCV64_aad_load_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 +L_AES_GCM_decrypt_RISCV64_aad_done: + mv t0, s2 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_GCM_decrypt_RISCV64_loaded: + addi t0, s2, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + # Host counter (lane 0) from J0 + # vslidedown.vi v20, v16, 3 + .word 0x3f01ba57 + # vrev8.v v20, v20 + .word 0x4b44aa57 + # 4-block fast path (64-byte groups), then <64-byte tail below + srli t6, a2, 6 + beqz t6, L_AES_GCM_decrypt_RISCV64_x4_done + # Precompute H^2, H^3, H^4 (v21/v22/v23) + # vmv.v.v v21, v19 + .word 0x5e098ad7 + # vmv.v.v v22, v19 + .word 0x5e098b57 + # vgmul.vv v21, v19 + .word 0xa338aaf7 + # vmv.v.v v23, v21 + .word 0x5e0a8bd7 + # vgmul.vv v22, v21 + .word 0xa358ab77 + # vgmul.vv v23, v21 + .word 0xa358abf7 +L_AES_GCM_decrypt_RISCV64_x4_loop: + # Next 4 counters from host counter v20 (lane 0), big-endian into lane 3 + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vmv.v.v v25, v16 + .word 0x5e080cd7 + # vmv.v.v v26, v16 + .word 0x5e080d57 + # vmv.v.v v27, v16 + .word 0x5e080dd7 + # vadd.vi v28, v20, 1 + .word 0x0340be57 + # vadd.vi v29, v20, 2 + .word 0x03413ed7 + # vadd.vi v30, v20, 3 + .word 0x0341bf57 + # vadd.vi v20, v20, 4 + .word 0x03423a57 + # vrev8.v v28, v28 + .word 0x4bc4ae57 + # vrev8.v v29, v29 + .word 0x4bd4aed7 + # vrev8.v v30, v30 + .word 0x4be4af57 + # vrev8.v v31, v20 + .word 0x4b44afd7 + # vslideup.vi v24, v28, 3 + .word 0x3bc1bc57 + # vslideup.vi v25, v29, 3 + .word 0x3bd1bcd7 + # vslideup.vi v26, v30, 3 + .word 0x3be1bd57 + # vslideup.vi v27, v31, 3 + .word 0x3bf1bdd7 + # Encrypt the 4 counter blocks (v24-v27) as one LMUL=4 group + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vaesz.vs v24, v0 + .word 0xa603ac77 + # vaesem.vs v24, v1 + .word 0xa6112c77 + # vaesem.vs v24, v2 + .word 0xa6212c77 + # vaesem.vs v24, v3 + .word 0xa6312c77 + # vaesem.vs v24, v4 + .word 0xa6412c77 + # vaesem.vs v24, v5 + .word 0xa6512c77 + # vaesem.vs v24, v6 + .word 0xa6612c77 + # vaesem.vs v24, v7 + .word 0xa6712c77 + # vaesem.vs v24, v8 + .word 0xa6812c77 + # vaesem.vs v24, v9 + .word 0xa6912c77 + li t4, 11 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_x4aes_last + # vaesem.vs v24, v10 + .word 0xa6a12c77 + # vaesem.vs v24, v11 + .word 0xa6b12c77 + li t4, 13 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_x4aes_last + # vaesem.vs v24, v12 + .word 0xa6c12c77 + # vaesem.vs v24, v13 + .word 0xa6d12c77 +L_AES_GCM_decrypt_RISCV64_x4aes_last: + # vaesef.vs v24, v14 + .word 0xa6e1ac77 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl4re32.v v28, (t0) + .word 0x6282ee07 + # vxor.vv v24, v24, v28 + .word 0x2fcc0c57 + # vxor.vv v25, v25, v29 + .word 0x2fdc8cd7 + # vxor.vv v26, v26, v30 + .word 0x2fed0d57 + # vxor.vv v27, v27, v31 + .word 0x2ffd8dd7 + mv t0, a1 + # vs4r.v v24, (t0) + .word 0x62828c27 + # Aggregated GHASH: X = (X^ct0)*H^4 ^ ct1*H^3 ^ ct2*H^2 ^ ct3*H + # vxor.vv v28, v28, v18 + .word 0x2f2e0e57 + # vgmul.vv v28, v23 + .word 0xa378ae77 + # vgmul.vv v29, v22 + .word 0xa368aef7 + # vgmul.vv v30, v21 + .word 0xa358af77 + # vgmul.vv v31, v19 + .word 0xa338aff7 + # vxor.vv v18, v28, v29 + .word 0x2fde0957 + # vxor.vv v18, v18, v30 + .word 0x2fe90957 + # vxor.vv v18, v18, v31 + .word 0x2ff90957 + addi a0, a0, 64 + addi a1, a1, 64 + addi t6, t6, -1 + bnez t6, L_AES_GCM_decrypt_RISCV64_x4_loop +L_AES_GCM_decrypt_RISCV64_x4_done: + # m2 rung then single-block loop for the <64-byte remainder + andi t6, a2, 63 + srli t6, t6, 4 + andi t5, t6, 2 + beqz t5, L_AES_GCM_decrypt_RISCV64_after_m2 + # 2-block group: counters v24/v25, m2 AES, 2-way GHASH + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vmv.v.v v25, v16 + .word 0x5e080cd7 + # vadd.vi v26, v20, 1 + .word 0x0340bd57 + # vadd.vi v20, v20, 2 + .word 0x03413a57 + # vrev8.v v26, v26 + .word 0x4ba4ad57 + # vrev8.v v27, v20 + .word 0x4b44add7 + # vslideup.vi v24, v26, 3 + .word 0x3ba1bc57 + # vslideup.vi v25, v27, 3 + .word 0x3bb1bcd7 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vaesz.vs v24, v0 + .word 0xa603ac77 + # vaesem.vs v24, v1 + .word 0xa6112c77 + # vaesem.vs v24, v2 + .word 0xa6212c77 + # vaesem.vs v24, v3 + .word 0xa6312c77 + # vaesem.vs v24, v4 + .word 0xa6412c77 + # vaesem.vs v24, v5 + .word 0xa6512c77 + # vaesem.vs v24, v6 + .word 0xa6612c77 + # vaesem.vs v24, v7 + .word 0xa6712c77 + # vaesem.vs v24, v8 + .word 0xa6812c77 + # vaesem.vs v24, v9 + .word 0xa6912c77 + li t4, 11 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_m2aes_last + # vaesem.vs v24, v10 + .word 0xa6a12c77 + # vaesem.vs v24, v11 + .word 0xa6b12c77 + li t4, 13 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_m2aes_last + # vaesem.vs v24, v12 + .word 0xa6c12c77 + # vaesem.vs v24, v13 + .word 0xa6d12c77 +L_AES_GCM_decrypt_RISCV64_m2aes_last: + # vaesef.vs v24, v14 + .word 0xa6e1ac77 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl2re32.v v26, (t0) + .word 0x2282ed07 + # vxor.vv v24, v24, v26 + .word 0x2fac0c57 + # vxor.vv v25, v25, v27 + .word 0x2fbc8cd7 + mv t0, a1 + # vs2r.v v24, (t0) + .word 0x22828c27 + # vmv.v.v v28, v19 + .word 0x5e098e57 + # vgmul.vv v28, v19 + .word 0xa338ae77 + # vghsh.vv v26, v18, v28 + .word 0xb3c92d77 + # vgmul.vv v27, v19 + .word 0xa338adf7 + # vxor.vv v18, v26, v27 + .word 0x2fbd0957 + addi a0, a0, 32 + addi a1, a1, 32 + addi t6, t6, -2 +L_AES_GCM_decrypt_RISCV64_after_m2: + beqz t6, L_AES_GCM_decrypt_RISCV64_blocks_done +L_AES_GCM_decrypt_RISCV64_loop: + # vadd.vi v20, v20, 1 + .word 0x0340ba57 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + # vaesz.vs v21, v0 + .word 0xa603aaf7 + # vaesem.vs v21, v1 + .word 0xa6112af7 + # vaesem.vs v21, v2 + .word 0xa6212af7 + # vaesem.vs v21, v3 + .word 0xa6312af7 + # vaesem.vs v21, v4 + .word 0xa6412af7 + # vaesem.vs v21, v5 + .word 0xa6512af7 + # vaesem.vs v21, v6 + .word 0xa6612af7 + # vaesem.vs v21, v7 + .word 0xa6712af7 + # vaesem.vs v21, v8 + .word 0xa6812af7 + # vaesem.vs v21, v9 + .word 0xa6912af7 + li t4, 11 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_aes_last + # vaesem.vs v21, v10 + .word 0xa6a12af7 + # vaesem.vs v21, v11 + .word 0xa6b12af7 + li t4, 13 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_aes_last + # vaesem.vs v21, v12 + .word 0xa6c12af7 + # vaesem.vs v21, v13 + .word 0xa6d12af7 +L_AES_GCM_decrypt_RISCV64_aes_last: + # vaesef.vs v21, v14 + .word 0xa6e1aaf7 + mv t0, a0 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + # vxor.vv v21, v21, v17 + .word 0x2f1a8ad7 + mv t0, a1 + # vs1r.v v21, (t0) + .word 0x02828aa7 + addi a0, a0, 16 + addi a1, a1, 16 + addi t6, t6, -1 + bnez t6, L_AES_GCM_decrypt_RISCV64_loop +L_AES_GCM_decrypt_RISCV64_blocks_done: + # Partial final block + andi t1, a2, 15 + beqz t1, L_AES_GCM_decrypt_RISCV64_partial_done + # vadd.vi v20, v20, 1 + .word 0x0340ba57 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + # vaesz.vs v21, v0 + .word 0xa603aaf7 + # vaesem.vs v21, v1 + .word 0xa6112af7 + # vaesem.vs v21, v2 + .word 0xa6212af7 + # vaesem.vs v21, v3 + .word 0xa6312af7 + # vaesem.vs v21, v4 + .word 0xa6412af7 + # vaesem.vs v21, v5 + .word 0xa6512af7 + # vaesem.vs v21, v6 + .word 0xa6612af7 + # vaesem.vs v21, v7 + .word 0xa6712af7 + # vaesem.vs v21, v8 + .word 0xa6812af7 + # vaesem.vs v21, v9 + .word 0xa6912af7 + li t4, 11 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_p_aes_last + # vaesem.vs v21, v10 + .word 0xa6a12af7 + # vaesem.vs v21, v11 + .word 0xa6b12af7 + li t4, 13 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_p_aes_last + # vaesem.vs v21, v12 + .word 0xa6c12af7 + # vaesem.vs v21, v13 + .word 0xa6d12af7 +L_AES_GCM_decrypt_RISCV64_p_aes_last: + # vaesef.vs v21, v14 + .word 0xa6e1aaf7 + # vxor.vv v17, v17, v17 + .word 0x2f1888d7 + mv t0, s4 + # vs1r.v v17, (t0) + .word 0x028288a7 + mv t3, t1 + mv t0, s4 +L_AES_GCM_decrypt_RISCV64_p_load_byte: + lb t4, 0(a0) + sb t4, 0(t0) + addi a0, a0, 1 + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_RISCV64_p_load_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + # vxor.vv v21, v21, v17 + .word 0x2f1a8ad7 + mv t0, s4 + # vs1r.v v21, (t0) + .word 0x02828aa7 + mv t3, t1 +L_AES_GCM_decrypt_RISCV64_p_store_byte: + lb t4, 0(t0) + sb t4, 0(a1) + addi t0, t0, 1 + addi a1, a1, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_RISCV64_p_store_byte + li t3, 16 + sub t3, t3, t1 +L_AES_GCM_decrypt_RISCV64_p_zero_byte: + sb zero, 0(t0) + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_RISCV64_p_zero_byte + mv t0, s4 + # vl1re32.v v17, (t0) + .word 0x0282e887 +L_AES_GCM_decrypt_RISCV64_partial_done: + # Hash in the lengths of AAD and ciphertext in bits (big-endian) + mv t0, s4 + slli s1, s1, 3 + srli t2, s1, 32 + andi t2, t2, 7 + srli t3, s1, 24 + srli t4, s1, 16 + srli t5, s1, 8 + sh zero, 0(t0) + sb zero, 2(t0) + sb t2, 3(t0) + sb t3, 4(t0) + sb t4, 5(t0) + sb t5, 6(t0) + sb s1, 7(t0) + slli a2, a2, 3 + srli t2, a2, 32 + andi t2, t2, 7 + srli t3, a2, 24 + srli t4, a2, 16 + srli t5, a2, 8 + sh zero, 8(t0) + sb zero, 10(t0) + sb t2, 11(t0) + sb t3, 12(t0) + sb t4, 13(t0) + sb t5, 14(t0) + sb a2, 15(t0) + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + # tag = GHASH ^ E_K(J0) + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_tag_aes_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble s6, t4, L_AES_GCM_decrypt_RISCV64_tag_aes_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_GCM_decrypt_RISCV64_tag_aes_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vxor.vv v18, v18, v16 + .word 0x2f090957 + mv t0, s4 + # vs1r.v v18, (t0) + .word 0x02828927 + # Compare tagSz bytes; accumulate differences into t2 + mv t0, s4 + mv t3, a6 + xor t2, t2, t2 +L_AES_GCM_decrypt_RISCV64_cmp_tag: + lbu t4, 0(t0) + lbu t5, 0(a5) + xor t5, t5, t4 + or t2, t2, t5 + addi t0, t0, 1 + addi a5, a5, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_RISCV64_cmp_tag + # ret = (t2 != 0) ? -AES_GCM_AUTH_E (-180) : 0 + negw t2, t2 + sraiw t2, t2, 31 + andi a0, t2, -180 + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + ld s5, 32(sp) + ld s6, 40(sp) + addi sp, sp, 48 + ret + .size AES_GCM_decrypt_RISCV64,.-AES_GCM_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#ifdef WOLFSSL_AESGCM_STREAM + .text + .globl AES_GCM_init_RISCV64 + .type AES_GCM_init_RISCV64,@function + .align 2 +AES_GCM_init_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a4 + # vl1re32.v v19, (t0) + .word 0x0282e987 + mv t0, a0 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a1, t4, L_AES_GCM_init_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a1, t4, L_AES_GCM_init_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_GCM_init_RISCV64_loaded: + addi t0, a0, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + li t0, 12 + bne a3, t0, L_AES_GCM_init_RISCV64_j0_ghash + mv t0, a5 + sd zero, 0(t0) + sd zero, 8(t0) + ld t1, 0(a2) + sd t1, 0(t0) + lw t1, 8(a2) + sw t1, 8(t0) + li t1, 1 + sb t1, 15(t0) + # vl1re32.v v16, (t0) + .word 0x0282e807 + j L_AES_GCM_init_RISCV64_j0_done +L_AES_GCM_init_RISCV64_j0_ghash: + # vxor.vv v16, v16, v16 + .word 0x2f080857 + srli t6, a3, 4 + beqz t6, L_AES_GCM_init_RISCV64_j0_nblk_done +L_AES_GCM_init_RISCV64_j0_nloop: + mv t0, a2 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 + addi a2, a2, 16 + addi t6, t6, -1 + bnez t6, L_AES_GCM_init_RISCV64_j0_nloop +L_AES_GCM_init_RISCV64_j0_nblk_done: + andi t1, a3, 15 + beqz t1, L_AES_GCM_init_RISCV64_j0_npad_done + # vxor.vv v17, v17, v17 + .word 0x2f1888d7 + mv t0, a5 + # vs1r.v v17, (t0) + .word 0x028288a7 + mv t3, t1 + mv t0, a5 +L_AES_GCM_init_RISCV64_j0_n_load_byte: + lb t4, 0(a2) + sb t4, 0(t0) + addi a2, a2, 1 + addi t0, t0, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_init_RISCV64_j0_n_load_byte + mv t0, a5 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 +L_AES_GCM_init_RISCV64_j0_npad_done: + # Length block: 0^64 || nonceSz*8 (big-endian) + mv t0, a5 + sd zero, 0(t0) + slli t1, a3, 3 + srli t2, t1, 32 + andi t2, t2, 7 + srli t3, t1, 24 + srli t4, t1, 16 + srli t5, t1, 8 + sh zero, 8(t0) + sb zero, 10(t0) + sb t2, 11(t0) + sb t3, 12(t0) + sb t4, 13(t0) + sb t5, 14(t0) + sb t1, 15(t0) + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v16, v17, v19 + .word 0xb338a877 +L_AES_GCM_init_RISCV64_j0_done: + mv t0, a5 + # vs1r.v v16, (t0) + .word 0x02828827 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a1, t4, L_AES_GCM_init_RISCV64_aes_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a1, t4, L_AES_GCM_init_RISCV64_aes_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_GCM_init_RISCV64_aes_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + mv t0, a6 + # vs1r.v v16, (t0) + .word 0x02828827 + ret + .size AES_GCM_init_RISCV64,.-AES_GCM_init_RISCV64 + .text + .globl AES_GCM_ghash_block_RISCV64 + .type AES_GCM_ghash_block_RISCV64,@function + .align 2 +AES_GCM_ghash_block_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a1 + # vl1re32.v v18, (t0) + .word 0x0282e907 + mv t0, a2 + # vl1re32.v v19, (t0) + .word 0x0282e987 + mv t0, a0 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + mv t0, a1 + # vs1r.v v18, (t0) + .word 0x02828927 + ret + .size AES_GCM_ghash_block_RISCV64,.-AES_GCM_ghash_block_RISCV64 + .text + .globl AES_GCM_aad_update_RISCV64 + .type AES_GCM_aad_update_RISCV64,@function + .align 2 +AES_GCM_aad_update_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a2 + # vl1re32.v v18, (t0) + .word 0x0282e907 + mv t0, a3 + # vl1re32.v v19, (t0) + .word 0x0282e987 + srli t1, a1, 4 + beqz t1, L_AES_GCM_aad_update_RISCV64_done +L_AES_GCM_aad_update_RISCV64_loop: + mv t0, a0 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + addi a0, a0, 16 + addi t1, t1, -1 + bnez t1, L_AES_GCM_aad_update_RISCV64_loop +L_AES_GCM_aad_update_RISCV64_done: + mv t0, a2 + # vs1r.v v18, (t0) + .word 0x02828927 + ret + .size AES_GCM_aad_update_RISCV64,.-AES_GCM_aad_update_RISCV64 + .text + .globl AES_GCM_encrypt_block_RISCV64 + .type AES_GCM_encrypt_block_RISCV64,@function + .align 2 +AES_GCM_encrypt_block_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a1, t4, L_AES_GCM_encrypt_block_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a1, t4, L_AES_GCM_encrypt_block_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_GCM_encrypt_block_RISCV64_loaded: + addi t0, a0, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + mv t0, a4 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vslidedown.vi v20, v16, 3 + .word 0x3f01ba57 + # vrev8.v v20, v20 + .word 0x4b44aa57 + # vadd.vi v20, v20, 1 + .word 0x0340ba57 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + mv t0, a4 + # vs1r.v v21, (t0) + .word 0x02828aa7 + # vaesz.vs v21, v0 + .word 0xa603aaf7 + # vaesem.vs v21, v1 + .word 0xa6112af7 + # vaesem.vs v21, v2 + .word 0xa6212af7 + # vaesem.vs v21, v3 + .word 0xa6312af7 + # vaesem.vs v21, v4 + .word 0xa6412af7 + # vaesem.vs v21, v5 + .word 0xa6512af7 + # vaesem.vs v21, v6 + .word 0xa6612af7 + # vaesem.vs v21, v7 + .word 0xa6712af7 + # vaesem.vs v21, v8 + .word 0xa6812af7 + # vaesem.vs v21, v9 + .word 0xa6912af7 + li t4, 11 + ble a1, t4, L_AES_GCM_encrypt_block_RISCV64_aes_last + # vaesem.vs v21, v10 + .word 0xa6a12af7 + # vaesem.vs v21, v11 + .word 0xa6b12af7 + li t4, 13 + ble a1, t4, L_AES_GCM_encrypt_block_RISCV64_aes_last + # vaesem.vs v21, v12 + .word 0xa6c12af7 + # vaesem.vs v21, v13 + .word 0xa6d12af7 +L_AES_GCM_encrypt_block_RISCV64_aes_last: + # vaesef.vs v21, v14 + .word 0xa6e1aaf7 + mv t0, a3 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vxor.vv v21, v21, v17 + .word 0x2f1a8ad7 + mv t0, a2 + # vs1r.v v21, (t0) + .word 0x02828aa7 + ret + .size AES_GCM_encrypt_block_RISCV64,.-AES_GCM_encrypt_block_RISCV64 + .text + .globl AES_GCM_encrypt_update_RISCV64 + .type AES_GCM_encrypt_update_RISCV64,@function + .align 2 +AES_GCM_encrypt_update_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a1, t4, L_AES_GCM_encrypt_update_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a1, t4, L_AES_GCM_encrypt_update_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_GCM_encrypt_update_RISCV64_loaded: + addi t0, a0, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + mv t0, a5 + # vl1re32.v v18, (t0) + .word 0x0282e907 + mv t0, a6 + # vl1re32.v v19, (t0) + .word 0x0282e987 + mv t0, a7 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vslidedown.vi v20, v16, 3 + .word 0x3f01ba57 + # vrev8.v v20, v20 + .word 0x4b44aa57 + srli t1, a4, 4 + beqz t1, L_AES_GCM_encrypt_update_RISCV64_done +L_AES_GCM_encrypt_update_RISCV64_loop: + # vadd.vi v20, v20, 1 + .word 0x0340ba57 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + # vaesz.vs v21, v0 + .word 0xa603aaf7 + # vaesem.vs v21, v1 + .word 0xa6112af7 + # vaesem.vs v21, v2 + .word 0xa6212af7 + # vaesem.vs v21, v3 + .word 0xa6312af7 + # vaesem.vs v21, v4 + .word 0xa6412af7 + # vaesem.vs v21, v5 + .word 0xa6512af7 + # vaesem.vs v21, v6 + .word 0xa6612af7 + # vaesem.vs v21, v7 + .word 0xa6712af7 + # vaesem.vs v21, v8 + .word 0xa6812af7 + # vaesem.vs v21, v9 + .word 0xa6912af7 + li t4, 11 + ble a1, t4, L_AES_GCM_encrypt_update_RISCV64_aes_last + # vaesem.vs v21, v10 + .word 0xa6a12af7 + # vaesem.vs v21, v11 + .word 0xa6b12af7 + li t4, 13 + ble a1, t4, L_AES_GCM_encrypt_update_RISCV64_aes_last + # vaesem.vs v21, v12 + .word 0xa6c12af7 + # vaesem.vs v21, v13 + .word 0xa6d12af7 +L_AES_GCM_encrypt_update_RISCV64_aes_last: + # vaesef.vs v21, v14 + .word 0xa6e1aaf7 + mv t0, a3 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vxor.vv v21, v21, v17 + .word 0x2f1a8ad7 + mv t0, a2 + # vs1r.v v21, (t0) + .word 0x02828aa7 + # vghsh.vv v18, v21, v19 + .word 0xb33aa977 + addi a3, a3, 16 + addi a2, a2, 16 + addi t1, t1, -1 + bnez t1, L_AES_GCM_encrypt_update_RISCV64_loop +L_AES_GCM_encrypt_update_RISCV64_done: + mv t0, a5 + # vs1r.v v18, (t0) + .word 0x02828927 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + mv t0, a7 + # vs1r.v v21, (t0) + .word 0x02828aa7 + ret + .size AES_GCM_encrypt_update_RISCV64,.-AES_GCM_encrypt_update_RISCV64 + .text + .globl AES_GCM_encrypt_final_RISCV64 + .type AES_GCM_encrypt_final_RISCV64,@function + .align 2 +AES_GCM_encrypt_final_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v18, (t0) + .word 0x0282e907 + mv t0, a5 + # vl1re32.v v19, (t0) + .word 0x0282e987 + mv t0, a0 + slli a4, a4, 3 + srli t2, a4, 32 + andi t2, t2, 7 + srli t3, a4, 24 + srli t4, a4, 16 + srli t5, a4, 8 + sh zero, 0(t0) + sb zero, 2(t0) + sb t2, 3(t0) + sb t3, 4(t0) + sb t4, 5(t0) + sb t5, 6(t0) + sb a4, 7(t0) + slli a3, a3, 3 + srli t2, a3, 32 + andi t2, t2, 7 + srli t3, a3, 24 + srli t4, a3, 16 + srli t5, a3, 8 + sh zero, 8(t0) + sb zero, 10(t0) + sb t2, 11(t0) + sb t3, 12(t0) + sb t4, 13(t0) + sb t5, 14(t0) + sb a3, 15(t0) + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + mv t0, a6 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vxor.vv v18, v18, v16 + .word 0x2f090957 + mv t0, a0 + # vs1r.v v18, (t0) + .word 0x02828927 + mv t0, a0 + mv t3, a2 +L_AES_GCM_encrypt_final_RISCV64_store: + lb t4, 0(t0) + sb t4, 0(a1) + addi t0, t0, 1 + addi a1, a1, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_final_RISCV64_store + ret + .size AES_GCM_encrypt_final_RISCV64,.-AES_GCM_encrypt_final_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_GCM_decrypt_update_RISCV64 + .type AES_GCM_decrypt_update_RISCV64,@function + .align 2 +AES_GCM_decrypt_update_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a1, t4, L_AES_GCM_decrypt_update_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a1, t4, L_AES_GCM_decrypt_update_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_GCM_decrypt_update_RISCV64_loaded: + addi t0, a0, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + mv t0, a5 + # vl1re32.v v18, (t0) + .word 0x0282e907 + mv t0, a6 + # vl1re32.v v19, (t0) + .word 0x0282e987 + mv t0, a7 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vslidedown.vi v20, v16, 3 + .word 0x3f01ba57 + # vrev8.v v20, v20 + .word 0x4b44aa57 + srli t1, a4, 4 + beqz t1, L_AES_GCM_decrypt_update_RISCV64_done +L_AES_GCM_decrypt_update_RISCV64_loop: + # vadd.vi v20, v20, 1 + .word 0x0340ba57 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + # vaesz.vs v21, v0 + .word 0xa603aaf7 + # vaesem.vs v21, v1 + .word 0xa6112af7 + # vaesem.vs v21, v2 + .word 0xa6212af7 + # vaesem.vs v21, v3 + .word 0xa6312af7 + # vaesem.vs v21, v4 + .word 0xa6412af7 + # vaesem.vs v21, v5 + .word 0xa6512af7 + # vaesem.vs v21, v6 + .word 0xa6612af7 + # vaesem.vs v21, v7 + .word 0xa6712af7 + # vaesem.vs v21, v8 + .word 0xa6812af7 + # vaesem.vs v21, v9 + .word 0xa6912af7 + li t4, 11 + ble a1, t4, L_AES_GCM_decrypt_update_RISCV64_aes_last + # vaesem.vs v21, v10 + .word 0xa6a12af7 + # vaesem.vs v21, v11 + .word 0xa6b12af7 + li t4, 13 + ble a1, t4, L_AES_GCM_decrypt_update_RISCV64_aes_last + # vaesem.vs v21, v12 + .word 0xa6c12af7 + # vaesem.vs v21, v13 + .word 0xa6d12af7 +L_AES_GCM_decrypt_update_RISCV64_aes_last: + # vaesef.vs v21, v14 + .word 0xa6e1aaf7 + mv t0, a3 + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + # vxor.vv v21, v21, v17 + .word 0x2f1a8ad7 + mv t0, a2 + # vs1r.v v21, (t0) + .word 0x02828aa7 + addi a3, a3, 16 + addi a2, a2, 16 + addi t1, t1, -1 + bnez t1, L_AES_GCM_decrypt_update_RISCV64_loop +L_AES_GCM_decrypt_update_RISCV64_done: + mv t0, a5 + # vs1r.v v18, (t0) + .word 0x02828927 + # vrev8.v v17, v20 + .word 0x4b44a8d7 + # vmv.v.v v21, v16 + .word 0x5e080ad7 + # vslideup.vi v21, v17, 3 + .word 0x3b11bad7 + mv t0, a7 + # vs1r.v v21, (t0) + .word 0x02828aa7 + ret + .size AES_GCM_decrypt_update_RISCV64,.-AES_GCM_decrypt_update_RISCV64 + .text + .globl AES_GCM_decrypt_final_RISCV64 + .type AES_GCM_decrypt_final_RISCV64,@function + .align 2 +AES_GCM_decrypt_final_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v18, (t0) + .word 0x0282e907 + mv t0, a5 + # vl1re32.v v19, (t0) + .word 0x0282e987 + mv t0, a0 + slli a4, a4, 3 + srli t2, a4, 32 + andi t2, t2, 7 + srli t3, a4, 24 + srli t4, a4, 16 + srli t5, a4, 8 + sh zero, 0(t0) + sb zero, 2(t0) + sb t2, 3(t0) + sb t3, 4(t0) + sb t4, 5(t0) + sb t5, 6(t0) + sb a4, 7(t0) + slli a3, a3, 3 + srli t2, a3, 32 + andi t2, t2, 7 + srli t3, a3, 24 + srli t4, a3, 16 + srli t5, a3, 8 + sh zero, 8(t0) + sb zero, 10(t0) + sb t2, 11(t0) + sb t3, 12(t0) + sb t4, 13(t0) + sb t5, 14(t0) + sb a3, 15(t0) + # vl1re32.v v17, (t0) + .word 0x0282e887 + # vghsh.vv v18, v17, v19 + .word 0xb338a977 + mv t0, a6 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vxor.vv v18, v18, v16 + .word 0x2f090957 + mv t0, a0 + # vs1r.v v18, (t0) + .word 0x02828927 + # Compare tagSz bytes; *res = (match) ? 1 : 0 + mv t0, a0 + mv t3, a2 + xor t2, t2, t2 +L_AES_GCM_decrypt_final_RISCV64_cmp: + lbu t4, 0(t0) + lbu t5, 0(a1) + xor t5, t5, t4 + or t2, t2, t5 + addi t0, t0, 1 + addi a1, a1, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_final_RISCV64_cmp + sltiu t2, t2, 1 + sw t2, 0(a7) + ret + .size AES_GCM_decrypt_final_RISCV64,.-AES_GCM_decrypt_final_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AESGCM_STREAM */ +#endif /* HAVE_AESGCM */ +#ifdef WOLFSSL_AES_XTS + .text + .globl AES_XTS_encrypt_RISCV64 + .type AES_XTS_encrypt_RISCV64,@function + .align 2 +AES_XTS_encrypt_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # tweak = AES_key2(i) + mv t0, a5 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_k2_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_k2_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_XTS_encrypt_RISCV64_k2_loaded: + addi t0, a5, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + mv t0, a3 + # vl1re32.v v15, (t0) + .word 0x0282e787 + # vaesz.vs v15, v0 + .word 0xa603a7f7 + # vaesem.vs v15, v1 + .word 0xa61127f7 + # vaesem.vs v15, v2 + .word 0xa62127f7 + # vaesem.vs v15, v3 + .word 0xa63127f7 + # vaesem.vs v15, v4 + .word 0xa64127f7 + # vaesem.vs v15, v5 + .word 0xa65127f7 + # vaesem.vs v15, v6 + .word 0xa66127f7 + # vaesem.vs v15, v7 + .word 0xa67127f7 + # vaesem.vs v15, v8 + .word 0xa68127f7 + # vaesem.vs v15, v9 + .word 0xa69127f7 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_tw_aes_last + # vaesem.vs v15, v10 + .word 0xa6a127f7 + # vaesem.vs v15, v11 + .word 0xa6b127f7 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_tw_aes_last + # vaesem.vs v15, v12 + .word 0xa6c127f7 + # vaesem.vs v15, v13 + .word 0xa6d127f7 +L_AES_XTS_encrypt_RISCV64_tw_aes_last: + # vaesef.vs v15, v14 + .word 0xa6e1a7f7 + # Load data round keys + mv t0, a4 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_XTS_encrypt_RISCV64_loaded: + addi t0, a4, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + srli t3, a2, 4 + andi a2, a2, 15 + # Binary batch ladder m8->m4->m2->m1 (t5/t6 set before the loop as + # xts_gf_mul clobbers t1-t4). + srli t5, t3, 3 + andi t6, t3, 7 + beqz t5, L_AES_XTS_encrypt_RISCV64_after8 +L_AES_XTS_encrypt_RISCV64_g8: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v25, v24 + .word 0x5e0c0cd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v25 + .word 0x43902357 + # vslidedown.vi v16, v25, 1 + .word 0x3f90b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v25, t1 + .word 0x42036cd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v25, v16, 1 + .word 0x3b00bcd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v26, v25 + .word 0x5e0c8d57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v26 + .word 0x43a02357 + # vslidedown.vi v16, v26, 1 + .word 0x3fa0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v26, t1 + .word 0x42036d57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v26, v16, 1 + .word 0x3b00bd57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v27, v26 + .word 0x5e0d0dd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v27 + .word 0x43b02357 + # vslidedown.vi v16, v27, 1 + .word 0x3fb0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v27, t1 + .word 0x42036dd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v27, v16, 1 + .word 0x3b00bdd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v28, v27 + .word 0x5e0d8e57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v28 + .word 0x43c02357 + # vslidedown.vi v16, v28, 1 + .word 0x3fc0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v28, t1 + .word 0x42036e57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v28, v16, 1 + .word 0x3b00be57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v29, v28 + .word 0x5e0e0ed7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v29 + .word 0x43d02357 + # vslidedown.vi v16, v29, 1 + .word 0x3fd0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v29, t1 + .word 0x42036ed7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v29, v16, 1 + .word 0x3b00bed7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v30, v29 + .word 0x5e0e8f57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v30 + .word 0x43e02357 + # vslidedown.vi v16, v30, 1 + .word 0x3fe0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v30, t1 + .word 0x42036f57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v30, v16, 1 + .word 0x3b00bf57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v31, v30 + .word 0x5e0f0fd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v31 + .word 0x43f02357 + # vslidedown.vi v16, v31, 1 + .word 0x3ff0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v31, t1 + .word 0x42036fd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v31, v16, 1 + .word 0x3b00bfd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v15, v31 + .word 0x5e0f87d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl8re32.v v16, (t0) + .word 0xe282e807 + li t4, 32 + # vsetvli zero, t4, e32, m8, ta, ma + .word 0x0d3ef057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g8_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g8_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_XTS_encrypt_RISCV64_g8_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs8r.v v16, (t0) + .word 0xe2828827 + addi a0, a0, 128 + addi a1, a1, 128 + addi t5, t5, -1 + bnez t5, L_AES_XTS_encrypt_RISCV64_g8 +L_AES_XTS_encrypt_RISCV64_after8: + andi t5, t6, 4 + beqz t5, L_AES_XTS_encrypt_RISCV64_after4 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v25, v24 + .word 0x5e0c0cd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v25 + .word 0x43902357 + # vslidedown.vi v16, v25, 1 + .word 0x3f90b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v25, t1 + .word 0x42036cd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v25, v16, 1 + .word 0x3b00bcd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v26, v25 + .word 0x5e0c8d57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v26 + .word 0x43a02357 + # vslidedown.vi v16, v26, 1 + .word 0x3fa0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v26, t1 + .word 0x42036d57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v26, v16, 1 + .word 0x3b00bd57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v27, v26 + .word 0x5e0d0dd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v27 + .word 0x43b02357 + # vslidedown.vi v16, v27, 1 + .word 0x3fb0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v27, t1 + .word 0x42036dd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v27, v16, 1 + .word 0x3b00bdd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v15, v27 + .word 0x5e0d87d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl4re32.v v16, (t0) + .word 0x6282e807 + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g4_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g4_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_XTS_encrypt_RISCV64_g4_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs4r.v v16, (t0) + .word 0x62828827 + addi a0, a0, 64 + addi a1, a1, 64 +L_AES_XTS_encrypt_RISCV64_after4: + andi t5, t6, 2 + beqz t5, L_AES_XTS_encrypt_RISCV64_after2 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v25, v24 + .word 0x5e0c0cd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v25 + .word 0x43902357 + # vslidedown.vi v16, v25, 1 + .word 0x3f90b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v25, t1 + .word 0x42036cd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v25, v16, 1 + .word 0x3b00bcd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v15, v25 + .word 0x5e0c87d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl2re32.v v16, (t0) + .word 0x2282e807 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g2_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g2_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_XTS_encrypt_RISCV64_g2_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs2r.v v16, (t0) + .word 0x22828827 + addi a0, a0, 32 + addi a1, a1, 32 +L_AES_XTS_encrypt_RISCV64_after2: + andi t5, t6, 1 + beqz t5, L_AES_XTS_encrypt_RISCV64_blocks_done + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v15, v24 + .word 0x5e0c07d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g1_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_g1_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_XTS_encrypt_RISCV64_g1_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs1r.v v16, (t0) + .word 0x02828827 + addi a0, a0, 16 + addi a1, a1, 16 +L_AES_XTS_encrypt_RISCV64_blocks_done: + # Ciphertext stealing for the final partial block + beqz a2, L_AES_XTS_encrypt_RISCV64_done + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + addi t0, a1, -16 + # vl1re32.v v16, (t0) + .word 0x0282e807 + mv t0, a6 + # vs1r.v v16, (t0) + .word 0x02828827 + mv t1, a2 +L_AES_XTS_encrypt_RISCV64_byte: + lbu t2, 0(a6) + lbu t3, 0(a0) + sb t2, 0(a1) + sb t3, 0(a6) + addi a6, a6, 1 + addi a0, a0, 1 + addi a1, a1, 1 + addi t1, t1, -1 + bnez t1, L_AES_XTS_encrypt_RISCV64_byte + sub a1, a1, a2 + addi a1, a1, -16 + sub a6, a6, a2 + mv t0, a6 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_cts_aes_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_XTS_encrypt_RISCV64_cts_aes_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_XTS_encrypt_RISCV64_cts_aes_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + mv t0, a1 + # vs1r.v v16, (t0) + .word 0x02828827 +L_AES_XTS_encrypt_RISCV64_done: + ret + .size AES_XTS_encrypt_RISCV64,.-AES_XTS_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_XTS_decrypt_RISCV64 + .type AES_XTS_decrypt_RISCV64,@function + .align 2 +AES_XTS_decrypt_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # tweak = AES_key2(i) + mv t0, a5 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_k2_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_k2_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_XTS_decrypt_RISCV64_k2_loaded: + addi t0, a5, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + mv t0, a3 + # vl1re32.v v15, (t0) + .word 0x0282e787 + # vaesz.vs v15, v0 + .word 0xa603a7f7 + # vaesem.vs v15, v1 + .word 0xa61127f7 + # vaesem.vs v15, v2 + .word 0xa62127f7 + # vaesem.vs v15, v3 + .word 0xa63127f7 + # vaesem.vs v15, v4 + .word 0xa64127f7 + # vaesem.vs v15, v5 + .word 0xa65127f7 + # vaesem.vs v15, v6 + .word 0xa66127f7 + # vaesem.vs v15, v7 + .word 0xa67127f7 + # vaesem.vs v15, v8 + .word 0xa68127f7 + # vaesem.vs v15, v9 + .word 0xa69127f7 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_tw_aes_last + # vaesem.vs v15, v10 + .word 0xa6a127f7 + # vaesem.vs v15, v11 + .word 0xa6b127f7 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_tw_aes_last + # vaesem.vs v15, v12 + .word 0xa6c127f7 + # vaesem.vs v15, v13 + .word 0xa6d127f7 +L_AES_XTS_decrypt_RISCV64_tw_aes_last: + # vaesef.vs v15, v14 + .word 0xa6e1a7f7 + # Load data (inverse) round keys + mv t0, a4 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_XTS_decrypt_RISCV64_loaded: + addi t0, a4, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + srli t3, a2, 4 + andi a2, a2, 15 + # With a partial block, leave the last full block for stealing + beqz a2, L_AES_XTS_decrypt_RISCV64_no_steal + addi t3, t3, -1 +L_AES_XTS_decrypt_RISCV64_no_steal: + # Binary batch ladder m8->m4->m2->m1 (t5/t6 before loop). + srli t5, t3, 3 + andi t6, t3, 7 + beqz t5, L_AES_XTS_decrypt_RISCV64_after8 +L_AES_XTS_decrypt_RISCV64_g8: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v25, v24 + .word 0x5e0c0cd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v25 + .word 0x43902357 + # vslidedown.vi v16, v25, 1 + .word 0x3f90b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v25, t1 + .word 0x42036cd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v25, v16, 1 + .word 0x3b00bcd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v26, v25 + .word 0x5e0c8d57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v26 + .word 0x43a02357 + # vslidedown.vi v16, v26, 1 + .word 0x3fa0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v26, t1 + .word 0x42036d57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v26, v16, 1 + .word 0x3b00bd57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v27, v26 + .word 0x5e0d0dd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v27 + .word 0x43b02357 + # vslidedown.vi v16, v27, 1 + .word 0x3fb0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v27, t1 + .word 0x42036dd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v27, v16, 1 + .word 0x3b00bdd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v28, v27 + .word 0x5e0d8e57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v28 + .word 0x43c02357 + # vslidedown.vi v16, v28, 1 + .word 0x3fc0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v28, t1 + .word 0x42036e57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v28, v16, 1 + .word 0x3b00be57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v29, v28 + .word 0x5e0e0ed7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v29 + .word 0x43d02357 + # vslidedown.vi v16, v29, 1 + .word 0x3fd0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v29, t1 + .word 0x42036ed7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v29, v16, 1 + .word 0x3b00bed7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v30, v29 + .word 0x5e0e8f57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v30 + .word 0x43e02357 + # vslidedown.vi v16, v30, 1 + .word 0x3fe0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v30, t1 + .word 0x42036f57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v30, v16, 1 + .word 0x3b00bf57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v31, v30 + .word 0x5e0f0fd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v31 + .word 0x43f02357 + # vslidedown.vi v16, v31, 1 + .word 0x3ff0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v31, t1 + .word 0x42036fd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v31, v16, 1 + .word 0x3b00bfd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v15, v31 + .word 0x5e0f87d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl8re32.v v16, (t0) + .word 0xe282e807 + li t4, 32 + # vsetvli zero, t4, e32, m8, ta, ma + .word 0x0d3ef057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g8_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g8_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_XTS_decrypt_RISCV64_g8_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs8r.v v16, (t0) + .word 0xe2828827 + addi a0, a0, 128 + addi a1, a1, 128 + addi t5, t5, -1 + bnez t5, L_AES_XTS_decrypt_RISCV64_g8 +L_AES_XTS_decrypt_RISCV64_after8: + andi t5, t6, 4 + beqz t5, L_AES_XTS_decrypt_RISCV64_after4 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v25, v24 + .word 0x5e0c0cd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v25 + .word 0x43902357 + # vslidedown.vi v16, v25, 1 + .word 0x3f90b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v25, t1 + .word 0x42036cd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v25, v16, 1 + .word 0x3b00bcd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v26, v25 + .word 0x5e0c8d57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v26 + .word 0x43a02357 + # vslidedown.vi v16, v26, 1 + .word 0x3fa0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v26, t1 + .word 0x42036d57 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v26, v16, 1 + .word 0x3b00bd57 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v27, v26 + .word 0x5e0d0dd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v27 + .word 0x43b02357 + # vslidedown.vi v16, v27, 1 + .word 0x3fb0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v27, t1 + .word 0x42036dd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v27, v16, 1 + .word 0x3b00bdd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v15, v27 + .word 0x5e0d87d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl4re32.v v16, (t0) + .word 0x6282e807 + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g4_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g4_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_XTS_decrypt_RISCV64_g4_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs4r.v v16, (t0) + .word 0x62828827 + addi a0, a0, 64 + addi a1, a1, 64 +L_AES_XTS_decrypt_RISCV64_after4: + andi t5, t6, 2 + beqz t5, L_AES_XTS_decrypt_RISCV64_after2 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v25, v24 + .word 0x5e0c0cd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v25 + .word 0x43902357 + # vslidedown.vi v16, v25, 1 + .word 0x3f90b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v25, t1 + .word 0x42036cd7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v25, v16, 1 + .word 0x3b00bcd7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v15, v25 + .word 0x5e0c87d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl2re32.v v16, (t0) + .word 0x2282e807 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g2_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g2_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_XTS_decrypt_RISCV64_g2_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs2r.v v16, (t0) + .word 0x22828827 + addi a0, a0, 32 + addi a1, a1, 32 +L_AES_XTS_decrypt_RISCV64_after2: + andi t5, t6, 1 + beqz t5, L_AES_XTS_decrypt_RISCV64_blocks_done + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v15 + .word 0x5e078c57 + # vmv.v.v v15, v24 + .word 0x5e0c07d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v16, v15, 1 + .word 0x3ef0b857 + # vmv.x.s t2, v16 + .word 0x430023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v16, t2 + .word 0x4203e857 + # vslideup.vi v15, v16, 1 + .word 0x3b00b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g1_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_g1_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_XTS_decrypt_RISCV64_g1_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + mv t0, a1 + # vs1r.v v16, (t0) + .word 0x02828827 + addi a0, a0, 16 + addi a1, a1, 16 +L_AES_XTS_decrypt_RISCV64_blocks_done: + beqz a2, L_AES_XTS_decrypt_RISCV64_done + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # CTS: decrypt last full block with the NEXT tweak + # vmv.v.v v18, v15 + .word 0x5e078957 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vmv.x.s t1, v15 + .word 0x42f02357 + # vslidedown.vi v17, v15, 1 + .word 0x3ef0b8d7 + # vmv.x.s t2, v17 + .word 0x431023d7 + srli t3, t2, 63 + slli t2, t2, 1 + srli t4, t1, 63 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t3, t3 + and t4, t4, t3 + xor t1, t1, t4 + # vmv.s.x v15, t1 + .word 0x420367d7 + # vmv.s.x v17, t2 + .word 0x4203e8d7 + # vslideup.vi v15, v17, 1 + .word 0x3b10b7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a0 + # vl1re32.v v16, (t0) + .word 0x0282e807 + addi a0, a0, 16 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_cts1_aes_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_cts1_aes_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_XTS_decrypt_RISCV64_cts1_aes_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + mv t0, a6 + # vs1r.v v16, (t0) + .word 0x02828827 + addi a1, a1, 16 + mv t1, a2 +L_AES_XTS_decrypt_RISCV64_byte: + lbu t2, 0(a6) + lbu t3, 0(a0) + sb t2, 0(a1) + sb t3, 0(a6) + addi a6, a6, 1 + addi a0, a0, 1 + addi a1, a1, 1 + addi t1, t1, -1 + bnez t1, L_AES_XTS_decrypt_RISCV64_byte + sub a1, a1, a2 + addi a1, a1, -16 + sub a6, a6, a2 + mv t0, a6 + # vl1re32.v v16, (t0) + .word 0x0282e807 + # vxor.vv v16, v16, v18 + .word 0x2f280857 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_cts2_aes_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a7, t4, L_AES_XTS_decrypt_RISCV64_cts2_aes_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_XTS_decrypt_RISCV64_cts2_aes_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vxor.vv v16, v16, v18 + .word 0x2f280857 + mv t0, a1 + # vs1r.v v16, (t0) + .word 0x02828827 +L_AES_XTS_decrypt_RISCV64_done: + ret + .size AES_XTS_decrypt_RISCV64,.-AES_XTS_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_XTS */ +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC) + .text + .globl AES_encrypt_RISCV64 + .type AES_encrypt_RISCV64,@function + .align 2 +AES_encrypt_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a2 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a3, t4, L_AES_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a3, t4, L_AES_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_encrypt_RISCV64_loaded: + addi t0, a2, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + mv t0, a0 + # vl1re32.v v15, (t0) + .word 0x0282e787 + # vaesz.vs v15, v0 + .word 0xa603a7f7 + # vaesem.vs v15, v1 + .word 0xa61127f7 + # vaesem.vs v15, v2 + .word 0xa62127f7 + # vaesem.vs v15, v3 + .word 0xa63127f7 + # vaesem.vs v15, v4 + .word 0xa64127f7 + # vaesem.vs v15, v5 + .word 0xa65127f7 + # vaesem.vs v15, v6 + .word 0xa66127f7 + # vaesem.vs v15, v7 + .word 0xa67127f7 + # vaesem.vs v15, v8 + .word 0xa68127f7 + # vaesem.vs v15, v9 + .word 0xa69127f7 + li t4, 11 + ble a3, t4, L_AES_encrypt_RISCV64_last + # vaesem.vs v15, v10 + .word 0xa6a127f7 + # vaesem.vs v15, v11 + .word 0xa6b127f7 + li t4, 13 + ble a3, t4, L_AES_encrypt_RISCV64_last + # vaesem.vs v15, v12 + .word 0xa6c127f7 + # vaesem.vs v15, v13 + .word 0xa6d127f7 +L_AES_encrypt_RISCV64_last: + # vaesef.vs v15, v14 + .word 0xa6e1a7f7 + mv t0, a1 + # vs1r.v v15, (t0) + .word 0x028287a7 + ret + .size AES_encrypt_RISCV64,.-AES_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_decrypt_RISCV64 + .type AES_decrypt_RISCV64,@function + .align 2 +AES_decrypt_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a2 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a3, t4, L_AES_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a3, t4, L_AES_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_decrypt_RISCV64_loaded: + addi t0, a2, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + mv t0, a0 + # vl1re32.v v15, (t0) + .word 0x0282e787 + # vaesz.vs v15, v0 + .word 0xa603a7f7 + # vaesdm.vs v15, v1 + .word 0xa61027f7 + # vaesdm.vs v15, v2 + .word 0xa62027f7 + # vaesdm.vs v15, v3 + .word 0xa63027f7 + # vaesdm.vs v15, v4 + .word 0xa64027f7 + # vaesdm.vs v15, v5 + .word 0xa65027f7 + # vaesdm.vs v15, v6 + .word 0xa66027f7 + # vaesdm.vs v15, v7 + .word 0xa67027f7 + # vaesdm.vs v15, v8 + .word 0xa68027f7 + # vaesdm.vs v15, v9 + .word 0xa69027f7 + li t4, 11 + ble a3, t4, L_AES_decrypt_RISCV64_last + # vaesdm.vs v15, v10 + .word 0xa6a027f7 + # vaesdm.vs v15, v11 + .word 0xa6b027f7 + li t4, 13 + ble a3, t4, L_AES_decrypt_RISCV64_last + # vaesdm.vs v15, v12 + .word 0xa6c027f7 + # vaesdm.vs v15, v13 + .word 0xa6d027f7 +L_AES_decrypt_RISCV64_last: + # vaesdf.vs v15, v14 + .word 0xa6e0a7f7 + mv t0, a1 + # vs1r.v v15, (t0) + .word 0x028287a7 + ret + .size AES_decrypt_RISCV64,.-AES_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#ifdef HAVE_AES_ECB + .text + .globl AES_encrypt_blocks_RISCV64 + .type AES_encrypt_blocks_RISCV64,@function + .align 2 +AES_encrypt_blocks_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a3 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_encrypt_blocks_RISCV64_loaded: + addi t0, a3, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + srli t3, a2, 4 + mv t1, a0 + mv t2, a1 + # m8 main loop: 8 blocks per pass via an LMUL=8 register group. + srli t5, t3, 3 + beqz t5, L_AES_encrypt_blocks_RISCV64_after8 + li t4, 32 + # vsetvli zero, t4, e32, m8, ta, ma + .word 0x0d3ef057 +L_AES_encrypt_blocks_RISCV64_g8: + # vl8re32.v v16, (t1) + .word 0xe2836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g8_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g8_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_encrypt_blocks_RISCV64_g8_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vs8r.v v16, (t2) + .word 0xe2838827 + addi t1, t1, 128 + addi t2, t2, 128 + addi t5, t5, -1 + bnez t5, L_AES_encrypt_blocks_RISCV64_g8 +L_AES_encrypt_blocks_RISCV64_after8: + andi t6, t3, 7 + # Binary remainder: one m4, then m2, then m1 as the bits require. + andi t5, t6, 4 + beqz t5, L_AES_encrypt_blocks_RISCV64_after4 + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vl4re32.v v16, (t1) + .word 0x62836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g4_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g4_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_encrypt_blocks_RISCV64_g4_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vs4r.v v16, (t2) + .word 0x62838827 + addi t1, t1, 64 + addi t2, t2, 64 +L_AES_encrypt_blocks_RISCV64_after4: + andi t5, t6, 2 + beqz t5, L_AES_encrypt_blocks_RISCV64_after2 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vl2re32.v v16, (t1) + .word 0x22836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g2_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g2_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_encrypt_blocks_RISCV64_g2_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vs2r.v v16, (t2) + .word 0x22838827 + addi t1, t1, 32 + addi t2, t2, 32 +L_AES_encrypt_blocks_RISCV64_after2: + andi t5, t6, 1 + beqz t5, L_AES_encrypt_blocks_RISCV64_done + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vl1re32.v v16, (t1) + .word 0x02836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g1_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a4, t4, L_AES_encrypt_blocks_RISCV64_g1_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_encrypt_blocks_RISCV64_g1_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vs1r.v v16, (t2) + .word 0x02838827 +L_AES_encrypt_blocks_RISCV64_done: + ret + .size AES_encrypt_blocks_RISCV64,.-AES_encrypt_blocks_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_decrypt_blocks_RISCV64 + .type AES_decrypt_blocks_RISCV64,@function + .align 2 +AES_decrypt_blocks_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a3 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_decrypt_blocks_RISCV64_loaded: + addi t0, a3, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + srli t3, a2, 4 + mv t1, a0 + mv t2, a1 + # m8 main loop: 8 blocks per pass via an LMUL=8 register group. + srli t5, t3, 3 + beqz t5, L_AES_decrypt_blocks_RISCV64_after8 + li t4, 32 + # vsetvli zero, t4, e32, m8, ta, ma + .word 0x0d3ef057 +L_AES_decrypt_blocks_RISCV64_g8: + # vl8re32.v v16, (t1) + .word 0xe2836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g8_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g8_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_decrypt_blocks_RISCV64_g8_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vs8r.v v16, (t2) + .word 0xe2838827 + addi t1, t1, 128 + addi t2, t2, 128 + addi t5, t5, -1 + bnez t5, L_AES_decrypt_blocks_RISCV64_g8 +L_AES_decrypt_blocks_RISCV64_after8: + andi t6, t3, 7 + # Binary remainder: one m4, then m2, then m1 as the bits require. + andi t5, t6, 4 + beqz t5, L_AES_decrypt_blocks_RISCV64_after4 + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vl4re32.v v16, (t1) + .word 0x62836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g4_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g4_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_decrypt_blocks_RISCV64_g4_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vs4r.v v16, (t2) + .word 0x62838827 + addi t1, t1, 64 + addi t2, t2, 64 +L_AES_decrypt_blocks_RISCV64_after4: + andi t5, t6, 2 + beqz t5, L_AES_decrypt_blocks_RISCV64_after2 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vl2re32.v v16, (t1) + .word 0x22836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g2_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g2_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_decrypt_blocks_RISCV64_g2_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vs2r.v v16, (t2) + .word 0x22838827 + addi t1, t1, 32 + addi t2, t2, 32 +L_AES_decrypt_blocks_RISCV64_after2: + andi t5, t6, 1 + beqz t5, L_AES_decrypt_blocks_RISCV64_done + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vl1re32.v v16, (t1) + .word 0x02836807 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g1_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a4, t4, L_AES_decrypt_blocks_RISCV64_g1_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_decrypt_blocks_RISCV64_g1_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vs1r.v v16, (t2) + .word 0x02838827 +L_AES_decrypt_blocks_RISCV64_done: + ret + .size AES_decrypt_blocks_RISCV64,.-AES_decrypt_blocks_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_ECB */ +#ifdef HAVE_AES_CBC + .text + .globl AES_CBC_encrypt_RISCV64 + .type AES_CBC_encrypt_RISCV64,@function + .align 2 +AES_CBC_encrypt_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a4 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a5, t4, L_AES_CBC_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a5, t4, L_AES_CBC_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_CBC_encrypt_RISCV64_loaded: + addi t0, a4, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + # Load the IV. + mv t0, a3 + # vl1re32.v v16, (t0) + .word 0x0282e807 + srli t3, a2, 4 + mv t1, a0 + mv t2, a1 + beqz t3, L_AES_CBC_encrypt_RISCV64_done +L_AES_CBC_encrypt_RISCV64_loop: + # Load input and chain with previous block. + # vl1re32.v v15, (t1) + .word 0x02836787 + # vxor.vv v15, v15, v16 + .word 0x2f0787d7 + # vaesz.vs v15, v0 + .word 0xa603a7f7 + # vaesem.vs v15, v1 + .word 0xa61127f7 + # vaesem.vs v15, v2 + .word 0xa62127f7 + # vaesem.vs v15, v3 + .word 0xa63127f7 + # vaesem.vs v15, v4 + .word 0xa64127f7 + # vaesem.vs v15, v5 + .word 0xa65127f7 + # vaesem.vs v15, v6 + .word 0xa66127f7 + # vaesem.vs v15, v7 + .word 0xa67127f7 + # vaesem.vs v15, v8 + .word 0xa68127f7 + # vaesem.vs v15, v9 + .word 0xa69127f7 + li t4, 11 + ble a5, t4, L_AES_CBC_encrypt_RISCV64_last + # vaesem.vs v15, v10 + .word 0xa6a127f7 + # vaesem.vs v15, v11 + .word 0xa6b127f7 + li t4, 13 + ble a5, t4, L_AES_CBC_encrypt_RISCV64_last + # vaesem.vs v15, v12 + .word 0xa6c127f7 + # vaesem.vs v15, v13 + .word 0xa6d127f7 +L_AES_CBC_encrypt_RISCV64_last: + # vaesef.vs v15, v14 + .word 0xa6e1a7f7 + # vs1r.v v15, (t2) + .word 0x028387a7 + # vmv.v.v v16, v15 + .word 0x5e078857 + addi t1, t1, 16 + addi t2, t2, 16 + addi t3, t3, -1 + bnez t3, L_AES_CBC_encrypt_RISCV64_loop + # Store the IV. + mv t0, a3 + # vs1r.v v16, (t0) + .word 0x02828827 +L_AES_CBC_encrypt_RISCV64_done: + ret + .size AES_CBC_encrypt_RISCV64,.-AES_CBC_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_CBC_decrypt_RISCV64 + .type AES_CBC_decrypt_RISCV64,@function + .align 2 +AES_CBC_decrypt_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a4 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_CBC_decrypt_RISCV64_loaded: + addi t0, a4, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + # Load the IV (running chaining value) into v15. + mv t0, a3 + # vl1re32.v v15, (t0) + .word 0x0282e787 + srli t3, a2, 4 + mv t1, a0 + mv t2, a1 + # Binary batch ladder m8->m4->m2->m1. + srli t5, t3, 3 + beqz t5, L_AES_CBC_decrypt_RISCV64_after8 +L_AES_CBC_decrypt_RISCV64_g8: + # vl8re32.v v16, (t1) + .word 0xe2836807 + li t4, 32 + # vsetvli zero, t4, e32, m8, ta, ma + .word 0x0d3ef057 + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g8_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g8_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_CBC_decrypt_RISCV64_g8_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + # vxor.vv v17, v17, v24 + .word 0x2f8888d7 + # vxor.vv v18, v18, v25 + .word 0x2f990957 + # vxor.vv v19, v19, v26 + .word 0x2fa989d7 + # vxor.vv v20, v20, v27 + .word 0x2fba0a57 + # vxor.vv v21, v21, v28 + .word 0x2fca8ad7 + # vxor.vv v22, v22, v29 + .word 0x2fdb0b57 + # vxor.vv v23, v23, v30 + .word 0x2feb8bd7 + # vmv.v.v v15, v31 + .word 0x5e0f87d7 + # vs8r.v v16, (t2) + .word 0xe2838827 + addi t1, t1, 128 + addi t2, t2, 128 + addi t5, t5, -1 + bnez t5, L_AES_CBC_decrypt_RISCV64_g8 +L_AES_CBC_decrypt_RISCV64_after8: + andi t6, t3, 7 + andi t5, t6, 4 + beqz t5, L_AES_CBC_decrypt_RISCV64_after4 + # vl4re32.v v16, (t1) + .word 0x62836807 + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g4_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g4_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_CBC_decrypt_RISCV64_g4_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + # vxor.vv v17, v17, v24 + .word 0x2f8888d7 + # vxor.vv v18, v18, v25 + .word 0x2f990957 + # vxor.vv v19, v19, v26 + .word 0x2fa989d7 + # vmv.v.v v15, v27 + .word 0x5e0d87d7 + # vs4r.v v16, (t2) + .word 0x62838827 + addi t1, t1, 64 + addi t2, t2, 64 +L_AES_CBC_decrypt_RISCV64_after4: + andi t5, t6, 2 + beqz t5, L_AES_CBC_decrypt_RISCV64_after2 + # vl2re32.v v16, (t1) + .word 0x22836807 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g2_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g2_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_CBC_decrypt_RISCV64_g2_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + # vxor.vv v17, v17, v24 + .word 0x2f8888d7 + # vmv.v.v v15, v25 + .word 0x5e0c87d7 + # vs2r.v v16, (t2) + .word 0x22838827 + addi t1, t1, 32 + addi t2, t2, 32 +L_AES_CBC_decrypt_RISCV64_after2: + andi t5, t6, 1 + beqz t5, L_AES_CBC_decrypt_RISCV64_done + # vl1re32.v v16, (t1) + .word 0x02836807 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v24, v16 + .word 0x5e080c57 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesdm.vs v16, v1 + .word 0xa6102877 + # vaesdm.vs v16, v2 + .word 0xa6202877 + # vaesdm.vs v16, v3 + .word 0xa6302877 + # vaesdm.vs v16, v4 + .word 0xa6402877 + # vaesdm.vs v16, v5 + .word 0xa6502877 + # vaesdm.vs v16, v6 + .word 0xa6602877 + # vaesdm.vs v16, v7 + .word 0xa6702877 + # vaesdm.vs v16, v8 + .word 0xa6802877 + # vaesdm.vs v16, v9 + .word 0xa6902877 + li t4, 11 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g1_last + # vaesdm.vs v16, v10 + .word 0xa6a02877 + # vaesdm.vs v16, v11 + .word 0xa6b02877 + li t4, 13 + ble a5, t4, L_AES_CBC_decrypt_RISCV64_g1_last + # vaesdm.vs v16, v12 + .word 0xa6c02877 + # vaesdm.vs v16, v13 + .word 0xa6d02877 +L_AES_CBC_decrypt_RISCV64_g1_last: + # vaesdf.vs v16, v14 + .word 0xa6e0a877 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vxor.vv v16, v16, v15 + .word 0x2ef80857 + # vmv.v.v v15, v24 + .word 0x5e0c07d7 + # vs1r.v v16, (t2) + .word 0x02838827 + addi t1, t1, 16 + addi t2, t2, 16 +L_AES_CBC_decrypt_RISCV64_done: + # Store the IV (v15). + mv t0, a3 + # vs1r.v v15, (t0) + .word 0x028287a7 + ret + .size AES_CBC_decrypt_RISCV64,.-AES_CBC_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER + .text + .globl AES_CTR_encrypt_RISCV64 + .type AES_CTR_encrypt_RISCV64,@function + .align 2 +AES_CTR_encrypt_RISCV64: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + mv t0, a4 + # vl8re32.v v0, (t0) + .word 0xe282e007 + addi t0, t0, 128 + # vl2re32.v v8, (t0) + .word 0x2282e407 + li t4, 11 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v10, (t0) + .word 0x2282e507 + li t4, 13 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_loaded + addi t0, t0, 32 + # vl2re32.v v12, (t0) + .word 0x2282e607 +L_AES_CTR_encrypt_RISCV64_loaded: + addi t0, a4, 224 + # vl1re32.v v14, (t0) + .word 0x0282e707 + # Load the counter into v15 (master); v16-v23/v24-v31 stay free. + mv t0, a3 + # vl1re32.v v15, (t0) + .word 0x0282e787 + mv t1, a0 + mv t2, a1 + # Use up any leftover keystream bytes from tmp. + lw t5, 0(a6) +L_AES_CTR_encrypt_RISCV64_left: + beqz t5, L_AES_CTR_encrypt_RISCV64_left_done + beqz a2, L_AES_CTR_encrypt_RISCV64_left_done + li t0, 16 + sub t0, t0, t5 + add t0, t0, a5 + lb t3, 0(t0) + lb t4, 0(t1) + xor t3, t3, t4 + sb t3, 0(t2) + addi t1, t1, 1 + addi t2, t2, 1 + addi t5, t5, -1 + addi a2, a2, -1 + j L_AES_CTR_encrypt_RISCV64_left +L_AES_CTR_encrypt_RISCV64_left_done: + sw t5, 0(a6) + # Encrypt whole blocks; binary batch ladder m8->m4->m2->m1. + srli t3, a2, 4 + srli t5, t3, 3 + beqz t5, L_AES_CTR_encrypt_RISCV64_after8 +L_AES_CTR_encrypt_RISCV64_g8: + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v16, v15 + .word 0x5e078857 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v17, v15 + .word 0x5e0788d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v18, v15 + .word 0x5e078957 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v19, v15 + .word 0x5e0789d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v20, v15 + .word 0x5e078a57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v21, v15 + .word 0x5e078ad7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v22, v15 + .word 0x5e078b57 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v23, v15 + .word 0x5e078bd7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + li t4, 32 + # vsetvli zero, t4, e32, m8, ta, ma + .word 0x0d3ef057 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g8_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g8_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_CTR_encrypt_RISCV64_g8_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vl8re32.v v24, (t1) + .word 0xe2836c07 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vs8r.v v16, (t2) + .word 0xe2838827 + addi t1, t1, 128 + addi t2, t2, 128 + addi t5, t5, -1 + bnez t5, L_AES_CTR_encrypt_RISCV64_g8 +L_AES_CTR_encrypt_RISCV64_after8: + andi t6, t3, 7 + andi t5, t6, 4 + beqz t5, L_AES_CTR_encrypt_RISCV64_after4 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v16, v15 + .word 0x5e078857 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v17, v15 + .word 0x5e0788d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v18, v15 + .word 0x5e078957 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v19, v15 + .word 0x5e0789d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 16, e32, m4, ta, ma + .word 0xcd287057 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g4_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g4_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_CTR_encrypt_RISCV64_g4_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vl4re32.v v24, (t1) + .word 0x62836c07 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vs4r.v v16, (t2) + .word 0x62838827 + addi t1, t1, 64 + addi t2, t2, 64 +L_AES_CTR_encrypt_RISCV64_after4: + andi t5, t6, 2 + beqz t5, L_AES_CTR_encrypt_RISCV64_after2 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v16, v15 + .word 0x5e078857 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v17, v15 + .word 0x5e0788d7 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 8, e32, m2, ta, ma + .word 0xcd147057 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g2_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g2_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_CTR_encrypt_RISCV64_g2_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vl2re32.v v24, (t1) + .word 0x22836c07 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vs2r.v v16, (t2) + .word 0x22838827 + addi t1, t1, 32 + addi t2, t2, 32 +L_AES_CTR_encrypt_RISCV64_after2: + andi t5, t6, 1 + beqz t5, L_AES_CTR_encrypt_RISCV64_tail + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v16, v15 + .word 0x5e078857 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g1_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_g1_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_CTR_encrypt_RISCV64_g1_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + # vl1re32.v v24, (t1) + .word 0x02836c07 + # vxor.vv v16, v16, v24 + .word 0x2f880857 + # vs1r.v v16, (t2) + .word 0x02838827 + addi t1, t1, 16 + addi t2, t2, 16 +L_AES_CTR_encrypt_RISCV64_tail: + andi a2, a2, 15 + beqz a2, L_AES_CTR_encrypt_RISCV64_store + # Encrypt counter into tmp for the final partial block. + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vmv.v.v v16, v15 + .word 0x5e078857 + # vsetivli zero, 2, e64, m1, ta, ma + .word 0xcd817057 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vslidedown.vi v24, v15, 1 + .word 0x3ef0bc57 + # vxor.vv v25, v25, v25 + .word 0x2f9c8cd7 + # vadd.vi v24, v24, 1 + .word 0x0380bc57 + # vmseq.vv v25, v25, v24 + .word 0x638c8cd7 + # vslideup.vi v15, v24, 1 + .word 0x3b80b7d7 + # vadd.vv v15, v15, v25 + .word 0x039787d7 + # vrev8.v v15, v15 + .word 0x4af4a7d7 + # vsetivli zero, 4, e32, m1, ta, ma + .word 0xcd027057 + # vaesz.vs v16, v0 + .word 0xa603a877 + # vaesem.vs v16, v1 + .word 0xa6112877 + # vaesem.vs v16, v2 + .word 0xa6212877 + # vaesem.vs v16, v3 + .word 0xa6312877 + # vaesem.vs v16, v4 + .word 0xa6412877 + # vaesem.vs v16, v5 + .word 0xa6512877 + # vaesem.vs v16, v6 + .word 0xa6612877 + # vaesem.vs v16, v7 + .word 0xa6712877 + # vaesem.vs v16, v8 + .word 0xa6812877 + # vaesem.vs v16, v9 + .word 0xa6912877 + li t4, 11 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_tblk_last + # vaesem.vs v16, v10 + .word 0xa6a12877 + # vaesem.vs v16, v11 + .word 0xa6b12877 + li t4, 13 + ble a7, t4, L_AES_CTR_encrypt_RISCV64_tblk_last + # vaesem.vs v16, v12 + .word 0xa6c12877 + # vaesem.vs v16, v13 + .word 0xa6d12877 +L_AES_CTR_encrypt_RISCV64_tblk_last: + # vaesef.vs v16, v14 + .word 0xa6e1a877 + mv t0, a5 + # vs1r.v v16, (t0) + .word 0x02828827 + li t6, 16 + sub t6, t6, a2 + sw t6, 0(a6) + mv t0, a5 +L_AES_CTR_encrypt_RISCV64_tail_loop: + lb t3, 0(t1) + lb t4, 0(t0) + xor t3, t3, t4 + sb t3, 0(t2) + addi t1, t1, 1 + addi t2, t2, 1 + addi t0, t0, 1 + addi a2, a2, -1 + bnez a2, L_AES_CTR_encrypt_RISCV64_tail_loop +L_AES_CTR_encrypt_RISCV64_store: + # Store the counter (master v15). + mv t0, a3 + # vs1r.v v15, (t0) + .word 0x028287a7 + ret + .size AES_CTR_encrypt_RISCV64,.-AES_CTR_encrypt_RISCV64 +#endif /* WOLFSSL_AES_COUNTER */ +#else +#ifdef WOLFSSL_RISCV_SCALAR_CRYPTO_ASM + .text + .globl AES_set_key_RISCV64 + .type AES_set_key_RISCV64,@function + .align 2 +AES_set_key_RISCV64: + li t0, 24 + beq a1, t0, L_AES_set_key_RISCV64_192 + li t0, 32 + beq a1, t0, L_AES_set_key_RISCV64_256 + # AES-128 key schedule. + bnez a3, L_AES_set_key_RISCV64_128_dec +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld1_w + ld t0, 0(a0) + j L_ualn_ld1_e +L_ualn_ld1_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld1_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld1_e +L_ualn_ld1_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld1_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld1_e +L_ualn_ld1_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld1_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld2_w + ld t1, 8(a0) + j L_ualn_ld2_e +L_ualn_ld2_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld2_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld2_e +L_ualn_ld2_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld2_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld2_e +L_ualn_ld2_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld2_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t0, 0(a2) + sd t1, 8(a2) + # aes64ks1i x7, x6, 0 + .word 0x31031393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 16(a2) + sd t1, 24(a2) + # aes64ks1i x7, x6, 1 + .word 0x31131393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 32(a2) + sd t1, 40(a2) + # aes64ks1i x7, x6, 2 + .word 0x31231393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 48(a2) + sd t1, 56(a2) + # aes64ks1i x7, x6, 3 + .word 0x31331393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 64(a2) + sd t1, 72(a2) + # aes64ks1i x7, x6, 4 + .word 0x31431393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 80(a2) + sd t1, 88(a2) + # aes64ks1i x7, x6, 5 + .word 0x31531393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 96(a2) + sd t1, 104(a2) + # aes64ks1i x7, x6, 6 + .word 0x31631393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 112(a2) + sd t1, 120(a2) + # aes64ks1i x7, x6, 7 + .word 0x31731393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 128(a2) + sd t1, 136(a2) + # aes64ks1i x7, x6, 8 + .word 0x31831393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 144(a2) + sd t1, 152(a2) + # aes64ks1i x7, x6, 9 + .word 0x31931393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 160(a2) + sd t1, 168(a2) + sd t0, 224(a2) + sd t1, 232(a2) + j L_AES_set_key_RISCV64_done +L_AES_set_key_RISCV64_128_dec: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld3_w + ld t0, 0(a0) + j L_ualn_ld3_e +L_ualn_ld3_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld3_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld3_e +L_ualn_ld3_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld3_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld3_e +L_ualn_ld3_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld3_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld4_w + ld t1, 8(a0) + j L_ualn_ld4_e +L_ualn_ld4_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld4_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld4_e +L_ualn_ld4_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld4_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld4_e +L_ualn_ld4_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld4_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t0, 160(a2) + sd t1, 168(a2) + # aes64ks1i x7, x6, 0 + .word 0x31031393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 144(a2) + sd t3, 152(a2) + # aes64ks1i x7, x6, 1 + .word 0x31131393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 128(a2) + sd t3, 136(a2) + # aes64ks1i x7, x6, 2 + .word 0x31231393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 112(a2) + sd t3, 120(a2) + # aes64ks1i x7, x6, 3 + .word 0x31331393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 96(a2) + sd t3, 104(a2) + # aes64ks1i x7, x6, 4 + .word 0x31431393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 80(a2) + sd t3, 88(a2) + # aes64ks1i x7, x6, 5 + .word 0x31531393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 64(a2) + sd t3, 72(a2) + # aes64ks1i x7, x6, 6 + .word 0x31631393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 48(a2) + sd t3, 56(a2) + # aes64ks1i x7, x6, 7 + .word 0x31731393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 32(a2) + sd t3, 40(a2) + # aes64ks1i x7, x6, 8 + .word 0x31831393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64im x7, x5 + .word 0x30029393 + # aes64im x28, x6 + .word 0x30031e13 + sd t2, 16(a2) + sd t3, 24(a2) + # aes64ks1i x7, x6, 9 + .word 0x31931393 + # aes64ks2 x5, x7, x5 + .word 0x7e5382b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 0(a2) + sd t1, 8(a2) + sd t0, 224(a2) + sd t1, 232(a2) + j L_AES_set_key_RISCV64_done + # AES-192 key schedule. +L_AES_set_key_RISCV64_192: + bnez a3, L_AES_set_key_RISCV64_192_dec +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld5_w + ld t0, 0(a0) + j L_ualn_ld5_e +L_ualn_ld5_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld5_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld5_e +L_ualn_ld5_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld5_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld5_e +L_ualn_ld5_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld5_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld6_w + ld t1, 8(a0) + j L_ualn_ld6_e +L_ualn_ld6_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld6_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld6_e +L_ualn_ld6_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld6_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld6_e +L_ualn_ld6_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld6_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 16(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld7_w + ld t2, 16(a0) + j L_ualn_ld7_e +L_ualn_ld7_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld7_h + lwu t2, 16(a0) + lwu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld7_e +L_ualn_ld7_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld7_b + lhu t2, 16(a0) + lhu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld7_e +L_ualn_ld7_b: + lbu t2, 16(a0) + lbu t4, 17(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 19(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 21(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 23(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld7_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t0, 0(a2) + sd t1, 8(a2) + sd t2, 16(a2) + # aes64ks1i x28, x7, 0 + .word 0x31039e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + sd t0, 24(a2) + sd t1, 32(a2) + sd t2, 40(a2) + # aes64ks1i x28, x7, 1 + .word 0x31139e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + sd t0, 48(a2) + sd t1, 56(a2) + sd t2, 64(a2) + # aes64ks1i x28, x7, 2 + .word 0x31239e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + sd t0, 72(a2) + sd t1, 80(a2) + sd t2, 88(a2) + # aes64ks1i x28, x7, 3 + .word 0x31339e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + sd t0, 96(a2) + sd t1, 104(a2) + sd t2, 112(a2) + # aes64ks1i x28, x7, 4 + .word 0x31439e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + sd t0, 120(a2) + sd t1, 128(a2) + sd t2, 136(a2) + # aes64ks1i x28, x7, 5 + .word 0x31539e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + sd t0, 144(a2) + sd t1, 152(a2) + sd t2, 160(a2) + # aes64ks1i x28, x7, 6 + .word 0x31639e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + sd t0, 168(a2) + sd t1, 176(a2) + sd t2, 184(a2) + # aes64ks1i x28, x7, 7 + .word 0x31739e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 192(a2) + sd t1, 200(a2) + sd t0, 224(a2) + sd t1, 232(a2) + j L_AES_set_key_RISCV64_done +L_AES_set_key_RISCV64_192_dec: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld8_w + ld t0, 0(a0) + j L_ualn_ld8_e +L_ualn_ld8_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld8_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld8_e +L_ualn_ld8_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld8_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld8_e +L_ualn_ld8_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld8_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld9_w + ld t1, 8(a0) + j L_ualn_ld9_e +L_ualn_ld9_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld9_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld9_e +L_ualn_ld9_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld9_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld9_e +L_ualn_ld9_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld9_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 16(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld10_w + ld t2, 16(a0) + j L_ualn_ld10_e +L_ualn_ld10_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld10_h + lwu t2, 16(a0) + lwu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld10_e +L_ualn_ld10_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld10_b + lhu t2, 16(a0) + lhu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld10_e +L_ualn_ld10_b: + lbu t2, 16(a0) + lbu t4, 17(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 19(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 21(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 23(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld10_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + # aes64im x28, x7 + .word 0x30039e13 + sd t0, 192(a2) + sd t1, 200(a2) + sd t3, 176(a2) + # aes64ks1i x28, x7, 0 + .word 0x31039e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + # aes64im x28, x5 + .word 0x30029e13 + # aes64im x29, x6 + .word 0x30031e93 + # aes64im x30, x7 + .word 0x30039f13 + sd t3, 184(a2) + sd t4, 160(a2) + sd t5, 168(a2) + # aes64ks1i x28, x7, 1 + .word 0x31139e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + # aes64im x28, x5 + .word 0x30029e13 + # aes64im x29, x6 + .word 0x30031e93 + # aes64im x30, x7 + .word 0x30039f13 + sd t3, 144(a2) + sd t4, 152(a2) + sd t5, 128(a2) + # aes64ks1i x28, x7, 2 + .word 0x31239e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + # aes64im x28, x5 + .word 0x30029e13 + # aes64im x29, x6 + .word 0x30031e93 + # aes64im x30, x7 + .word 0x30039f13 + sd t3, 136(a2) + sd t4, 112(a2) + sd t5, 120(a2) + # aes64ks1i x28, x7, 3 + .word 0x31339e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + # aes64im x28, x5 + .word 0x30029e13 + # aes64im x29, x6 + .word 0x30031e93 + # aes64im x30, x7 + .word 0x30039f13 + sd t3, 96(a2) + sd t4, 104(a2) + sd t5, 80(a2) + # aes64ks1i x28, x7, 4 + .word 0x31439e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + # aes64im x28, x5 + .word 0x30029e13 + # aes64im x29, x6 + .word 0x30031e93 + # aes64im x30, x7 + .word 0x30039f13 + sd t3, 88(a2) + sd t4, 64(a2) + sd t5, 72(a2) + # aes64ks1i x28, x7, 5 + .word 0x31539e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + # aes64im x28, x5 + .word 0x30029e13 + # aes64im x29, x6 + .word 0x30031e93 + # aes64im x30, x7 + .word 0x30039f13 + sd t3, 48(a2) + sd t4, 56(a2) + sd t5, 32(a2) + # aes64ks1i x28, x7, 6 + .word 0x31639e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks2 x7, x6, x7 + .word 0x7e7303b3 + # aes64im x28, x5 + .word 0x30029e13 + # aes64im x29, x6 + .word 0x30031e93 + # aes64im x30, x7 + .word 0x30039f13 + sd t3, 40(a2) + sd t4, 16(a2) + sd t5, 24(a2) + # aes64ks1i x28, x7, 7 + .word 0x31739e13 + # aes64ks2 x5, x28, x5 + .word 0x7e5e02b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 0(a2) + sd t1, 8(a2) + sd t4, 224(a2) + sd t5, 232(a2) + j L_AES_set_key_RISCV64_done + # AES-256 key schedule. +L_AES_set_key_RISCV64_256: + bnez a3, L_AES_set_key_RISCV64_256_dec +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld11_w + ld t0, 0(a0) + j L_ualn_ld11_e +L_ualn_ld11_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld11_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld11_e +L_ualn_ld11_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld11_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld11_e +L_ualn_ld11_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld11_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld12_w + ld t1, 8(a0) + j L_ualn_ld12_e +L_ualn_ld12_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld12_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld12_e +L_ualn_ld12_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld12_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld12_e +L_ualn_ld12_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld12_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 16(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld13_w + ld t2, 16(a0) + j L_ualn_ld13_e +L_ualn_ld13_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld13_h + lwu t2, 16(a0) + lwu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld13_e +L_ualn_ld13_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld13_b + lhu t2, 16(a0) + lhu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld13_e +L_ualn_ld13_b: + lbu t2, 16(a0) + lbu t4, 17(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 19(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 21(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 23(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld13_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 24(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld14_w + ld t3, 24(a0) + j L_ualn_ld14_e +L_ualn_ld14_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld14_h + lwu t3, 24(a0) + lwu t4, 28(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld14_e +L_ualn_ld14_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld14_b + lhu t3, 24(a0) + lhu t4, 26(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 28(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 30(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld14_e +L_ualn_ld14_b: + lbu t3, 24(a0) + lbu t4, 25(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 26(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 27(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 28(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 29(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 30(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 31(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld14_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t0, 0(a2) + sd t1, 8(a2) + sd t2, 16(a2) + sd t3, 24(a2) + # aes64ks1i x29, x28, 0 + .word 0x310e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + sd t0, 32(a2) + sd t1, 40(a2) + sd t2, 48(a2) + sd t3, 56(a2) + # aes64ks1i x29, x28, 1 + .word 0x311e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + sd t0, 64(a2) + sd t1, 72(a2) + sd t2, 80(a2) + sd t3, 88(a2) + # aes64ks1i x29, x28, 2 + .word 0x312e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + sd t0, 96(a2) + sd t1, 104(a2) + sd t2, 112(a2) + sd t3, 120(a2) + # aes64ks1i x29, x28, 3 + .word 0x313e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + sd t0, 128(a2) + sd t1, 136(a2) + sd t2, 144(a2) + sd t3, 152(a2) + # aes64ks1i x29, x28, 4 + .word 0x314e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + sd t0, 160(a2) + sd t1, 168(a2) + sd t2, 176(a2) + sd t3, 184(a2) + # aes64ks1i x29, x28, 5 + .word 0x315e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + sd t0, 192(a2) + sd t1, 200(a2) + sd t2, 208(a2) + sd t3, 216(a2) + # aes64ks1i x29, x28, 6 + .word 0x316e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 224(a2) + sd t1, 232(a2) + j L_AES_set_key_RISCV64_done +L_AES_set_key_RISCV64_256_dec: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld15_w + ld t0, 0(a0) + j L_ualn_ld15_e +L_ualn_ld15_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld15_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld15_e +L_ualn_ld15_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld15_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld15_e +L_ualn_ld15_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld15_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld16_w + ld t1, 8(a0) + j L_ualn_ld16_e +L_ualn_ld16_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld16_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld16_e +L_ualn_ld16_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld16_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld16_e +L_ualn_ld16_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld16_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 16(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld17_w + ld t2, 16(a0) + j L_ualn_ld17_e +L_ualn_ld17_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld17_h + lwu t2, 16(a0) + lwu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld17_e +L_ualn_ld17_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld17_b + lhu t2, 16(a0) + lhu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld17_e +L_ualn_ld17_b: + lbu t2, 16(a0) + lbu t4, 17(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 18(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 19(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 20(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 21(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 22(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 23(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld17_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 24(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld18_w + ld t3, 24(a0) + j L_ualn_ld18_e +L_ualn_ld18_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld18_h + lwu t3, 24(a0) + lwu t4, 28(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld18_e +L_ualn_ld18_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld18_b + lhu t3, 24(a0) + lhu t4, 26(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 28(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 30(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld18_e +L_ualn_ld18_b: + lbu t3, 24(a0) + lbu t4, 25(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 26(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 27(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 28(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 29(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 30(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 31(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld18_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t0, 224(a2) + sd t1, 232(a2) + # aes64im x29, x7 + .word 0x30039e93 + # aes64im x30, x28 + .word 0x300e1f13 + sd t4, 208(a2) + sd t5, 216(a2) + # aes64ks1i x29, x28, 0 + .word 0x310e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + # aes64im x29, x5 + .word 0x30029e93 + # aes64im x30, x6 + .word 0x30031f13 + sd t4, 192(a2) + sd t5, 200(a2) + # aes64im x29, x7 + .word 0x30039e93 + # aes64im x30, x28 + .word 0x300e1f13 + sd t4, 176(a2) + sd t5, 184(a2) + # aes64ks1i x29, x28, 1 + .word 0x311e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + # aes64im x29, x5 + .word 0x30029e93 + # aes64im x30, x6 + .word 0x30031f13 + sd t4, 160(a2) + sd t5, 168(a2) + # aes64im x29, x7 + .word 0x30039e93 + # aes64im x30, x28 + .word 0x300e1f13 + sd t4, 144(a2) + sd t5, 152(a2) + # aes64ks1i x29, x28, 2 + .word 0x312e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + # aes64im x29, x5 + .word 0x30029e93 + # aes64im x30, x6 + .word 0x30031f13 + sd t4, 128(a2) + sd t5, 136(a2) + # aes64im x29, x7 + .word 0x30039e93 + # aes64im x30, x28 + .word 0x300e1f13 + sd t4, 112(a2) + sd t5, 120(a2) + # aes64ks1i x29, x28, 3 + .word 0x313e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + # aes64im x29, x5 + .word 0x30029e93 + # aes64im x30, x6 + .word 0x30031f13 + sd t4, 96(a2) + sd t5, 104(a2) + # aes64im x29, x7 + .word 0x30039e93 + # aes64im x30, x28 + .word 0x300e1f13 + sd t4, 80(a2) + sd t5, 88(a2) + # aes64ks1i x29, x28, 4 + .word 0x314e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + # aes64im x29, x5 + .word 0x30029e93 + # aes64im x30, x6 + .word 0x30031f13 + sd t4, 64(a2) + sd t5, 72(a2) + # aes64im x29, x7 + .word 0x30039e93 + # aes64im x30, x28 + .word 0x300e1f13 + sd t4, 48(a2) + sd t5, 56(a2) + # aes64ks1i x29, x28, 5 + .word 0x315e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + # aes64ks1i x29, x6, 10 + .word 0x31a31e93 + # aes64ks2 x7, x29, x7 + .word 0x7e7e83b3 + # aes64ks2 x28, x7, x28 + .word 0x7fc38e33 + # aes64im x29, x5 + .word 0x30029e93 + # aes64im x30, x6 + .word 0x30031f13 + sd t4, 32(a2) + sd t5, 40(a2) + # aes64im x29, x7 + .word 0x30039e93 + # aes64im x30, x28 + .word 0x300e1f13 + sd t4, 16(a2) + sd t5, 24(a2) + # aes64ks1i x29, x28, 6 + .word 0x316e1e93 + # aes64ks2 x5, x29, x5 + .word 0x7e5e82b3 + # aes64ks2 x6, x5, x6 + .word 0x7e628333 + sd t0, 0(a2) + sd t1, 8(a2) +L_AES_set_key_RISCV64_done: + ret + .size AES_set_key_RISCV64,.-AES_set_key_RISCV64 +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC) + .text + .globl AES_encrypt_RISCV64 + .type AES_encrypt_RISCV64,@function + .align 2 +AES_encrypt_RISCV64: + mv t5, a3 + # Load input block +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld19_w + ld t2, 0(a0) + j L_ualn_ld19_e +L_ualn_ld19_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld19_h + lwu t2, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld19_e +L_ualn_ld19_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld19_b + lhu t2, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld19_e +L_ualn_ld19_b: + lbu t2, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld19_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld20_w + ld t3, 8(a0) + j L_ualn_ld20_e +L_ualn_ld20_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld20_h + lwu t3, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld20_e +L_ualn_ld20_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld20_b + lhu t3, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld20_e +L_ualn_ld20_b: + lbu t3, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld20_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a3, 0(a2) + ld a4, 8(a2) + ld a5, 16(a2) + ld a6, 24(a2) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(a2) + ld a4, 40(a2) + ld a5, 48(a2) + ld a6, 56(a2) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(a2) + ld a4, 72(a2) + ld a5, 80(a2) + ld a6, 88(a2) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(a2) + ld a4, 104(a2) + ld a5, 112(a2) + ld a6, 120(a2) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(a2) + ld a4, 136(a2) + ld a5, 144(a2) + ld a6, 152(a2) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(a2) + ld a4, 168(a2) + li t4, 11 + ble t5, t4, L_AES_encrypt_RISCV64_done + ld a5, 176(a2) + ld a6, 184(a2) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(a2) + ld a4, 200(a2) + li t4, 13 + ble t5, t4, L_AES_encrypt_RISCV64_done + ld a5, 208(a2) + ld a6, 216(a2) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(a2) + ld a4, 232(a2) +L_AES_encrypt_RISCV64_done: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # Store output block +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd21_w + sd t2, 0(a1) + j L_ualn_sd21_e +L_ualn_sd21_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd21_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd21_e +L_ualn_sd21_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd21_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd21_e +L_ualn_sd21_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd21_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd22_w + sd t3, 8(a1) + j L_ualn_sd22_e +L_ualn_sd22_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd22_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd22_e +L_ualn_sd22_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd22_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd22_e +L_ualn_sd22_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd22_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ret + .size AES_encrypt_RISCV64,.-AES_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_decrypt_RISCV64 + .type AES_decrypt_RISCV64,@function + .align 2 +AES_decrypt_RISCV64: + mv t5, a3 + # Load input block +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld23_w + ld t2, 0(a0) + j L_ualn_ld23_e +L_ualn_ld23_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld23_h + lwu t2, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld23_e +L_ualn_ld23_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld23_b + lhu t2, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld23_e +L_ualn_ld23_b: + lbu t2, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld23_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld24_w + ld t3, 8(a0) + j L_ualn_ld24_e +L_ualn_ld24_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld24_h + lwu t3, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld24_e +L_ualn_ld24_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld24_b + lhu t3, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld24_e +L_ualn_ld24_b: + lbu t3, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld24_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a3, 0(a2) + ld a4, 8(a2) + ld a5, 16(a2) + ld a6, 24(a2) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(a2) + ld a4, 40(a2) + ld a5, 48(a2) + ld a6, 56(a2) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(a2) + ld a4, 72(a2) + ld a5, 80(a2) + ld a6, 88(a2) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(a2) + ld a4, 104(a2) + ld a5, 112(a2) + ld a6, 120(a2) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(a2) + ld a4, 136(a2) + ld a5, 144(a2) + ld a6, 152(a2) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(a2) + ld a4, 168(a2) + li t4, 11 + ble t5, t4, L_AES_decrypt_RISCV64_done + ld a5, 176(a2) + ld a6, 184(a2) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(a2) + ld a4, 200(a2) + li t4, 13 + ble t5, t4, L_AES_decrypt_RISCV64_done + ld a5, 208(a2) + ld a6, 216(a2) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(a2) + ld a4, 232(a2) +L_AES_decrypt_RISCV64_done: + # aes64ds x7, x5, x6 + .word 0x3a6283b3 + # aes64ds x28, x6, x5 + .word 0x3a530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # Store output block +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd25_w + sd t2, 0(a1) + j L_ualn_sd25_e +L_ualn_sd25_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd25_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd25_e +L_ualn_sd25_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd25_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd25_e +L_ualn_sd25_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd25_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd26_w + sd t3, 8(a1) + j L_ualn_sd26_e +L_ualn_sd26_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd26_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd26_e +L_ualn_sd26_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd26_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd26_e +L_ualn_sd26_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd26_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ret + .size AES_decrypt_RISCV64,.-AES_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#ifdef HAVE_AES_ECB + .text + .globl AES_encrypt_blocks_RISCV64 + .type AES_encrypt_blocks_RISCV64,@function + .align 2 +AES_encrypt_blocks_RISCV64: + mv t5, a3 + mv t6, a4 + srliw a2, a2, 4 +L_AES_encrypt_blocks_RISCV64_loop: + beqz a2, L_AES_encrypt_blocks_RISCV64_end +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld27_w + ld t2, 0(a0) + j L_ualn_ld27_e +L_ualn_ld27_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld27_h + lwu t2, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld27_e +L_ualn_ld27_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld27_b + lhu t2, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld27_e +L_ualn_ld27_b: + lbu t2, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld27_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld28_w + ld t3, 8(a0) + j L_ualn_ld28_e +L_ualn_ld28_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld28_h + lwu t3, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld28_e +L_ualn_ld28_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld28_b + lhu t3, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld28_e +L_ualn_ld28_b: + lbu t3, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld28_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a3, 0(t5) + ld a4, 8(t5) + ld a5, 16(t5) + ld a6, 24(t5) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t5) + ld a4, 40(t5) + ld a5, 48(t5) + ld a6, 56(t5) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t5) + ld a4, 72(t5) + ld a5, 80(t5) + ld a6, 88(t5) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t5) + ld a4, 104(t5) + ld a5, 112(t5) + ld a6, 120(t5) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t5) + ld a4, 136(t5) + ld a5, 144(t5) + ld a6, 152(t5) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t5) + ld a4, 168(t5) + li t4, 11 + ble t6, t4, L_AES_encrypt_blocks_RISCV64_last + ld a5, 176(t5) + ld a6, 184(t5) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t5) + ld a4, 200(t5) + li t4, 13 + ble t6, t4, L_AES_encrypt_blocks_RISCV64_last + ld a5, 208(t5) + ld a6, 216(t5) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t5) + ld a4, 232(t5) +L_AES_encrypt_blocks_RISCV64_last: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd29_w + sd t2, 0(a1) + j L_ualn_sd29_e +L_ualn_sd29_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd29_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd29_e +L_ualn_sd29_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd29_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd29_e +L_ualn_sd29_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd29_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd30_w + sd t3, 8(a1) + j L_ualn_sd30_e +L_ualn_sd30_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd30_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd30_e +L_ualn_sd30_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd30_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd30_e +L_ualn_sd30_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd30_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_encrypt_blocks_RISCV64_loop +L_AES_encrypt_blocks_RISCV64_end: + ret + .size AES_encrypt_blocks_RISCV64,.-AES_encrypt_blocks_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_decrypt_blocks_RISCV64 + .type AES_decrypt_blocks_RISCV64,@function + .align 2 +AES_decrypt_blocks_RISCV64: + mv t5, a3 + mv t6, a4 + srliw a2, a2, 4 +L_AES_decrypt_blocks_RISCV64_loop: + beqz a2, L_AES_decrypt_blocks_RISCV64_end +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld31_w + ld t2, 0(a0) + j L_ualn_ld31_e +L_ualn_ld31_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld31_h + lwu t2, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld31_e +L_ualn_ld31_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld31_b + lhu t2, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld31_e +L_ualn_ld31_b: + lbu t2, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld31_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld32_w + ld t3, 8(a0) + j L_ualn_ld32_e +L_ualn_ld32_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld32_h + lwu t3, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld32_e +L_ualn_ld32_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld32_b + lhu t3, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld32_e +L_ualn_ld32_b: + lbu t3, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld32_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a3, 0(t5) + ld a4, 8(t5) + ld a5, 16(t5) + ld a6, 24(t5) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t5) + ld a4, 40(t5) + ld a5, 48(t5) + ld a6, 56(t5) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t5) + ld a4, 72(t5) + ld a5, 80(t5) + ld a6, 88(t5) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t5) + ld a4, 104(t5) + ld a5, 112(t5) + ld a6, 120(t5) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t5) + ld a4, 136(t5) + ld a5, 144(t5) + ld a6, 152(t5) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t5) + ld a4, 168(t5) + li t4, 11 + ble t6, t4, L_AES_decrypt_blocks_RISCV64_last + ld a5, 176(t5) + ld a6, 184(t5) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t5) + ld a4, 200(t5) + li t4, 13 + ble t6, t4, L_AES_decrypt_blocks_RISCV64_last + ld a5, 208(t5) + ld a6, 216(t5) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t5) + ld a4, 232(t5) +L_AES_decrypt_blocks_RISCV64_last: + # aes64ds x7, x5, x6 + .word 0x3a6283b3 + # aes64ds x28, x6, x5 + .word 0x3a530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd33_w + sd t2, 0(a1) + j L_ualn_sd33_e +L_ualn_sd33_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd33_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd33_e +L_ualn_sd33_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd33_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd33_e +L_ualn_sd33_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd33_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd34_w + sd t3, 8(a1) + j L_ualn_sd34_e +L_ualn_sd34_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd34_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd34_e +L_ualn_sd34_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd34_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd34_e +L_ualn_sd34_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd34_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_decrypt_blocks_RISCV64_loop +L_AES_decrypt_blocks_RISCV64_end: + ret + .size AES_decrypt_blocks_RISCV64,.-AES_decrypt_blocks_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_ECB */ +#ifdef HAVE_AES_CBC + .text + .globl AES_CBC_encrypt_RISCV64 + .type AES_CBC_encrypt_RISCV64,@function + .align 2 +AES_CBC_encrypt_RISCV64: + addi sp, sp, -16 + sd s1, 0(sp) + sd s2, 8(sp) + mv t5, a3 + mv t6, a4 + mv a7, a5 + srliw a2, a2, 4 + ld s1, 0(t5) + ld s2, 8(t5) +L_AES_CBC_encrypt_RISCV64_loop: + beqz a2, L_AES_CBC_encrypt_RISCV64_end +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a3, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld35_w + ld a3, 0(a0) + j L_ualn_ld35_e +L_ualn_ld35_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld35_h + lwu a3, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + j L_ualn_ld35_e +L_ualn_ld35_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld35_b + lhu a3, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + j L_ualn_ld35_e +L_ualn_ld35_b: + lbu a3, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or a3, a3, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or a3, a3, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or a3, a3, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or a3, a3, t4 +L_ualn_ld35_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld36_w + ld a4, 8(a0) + j L_ualn_ld36_e +L_ualn_ld36_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld36_h + lwu a4, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + j L_ualn_ld36_e +L_ualn_ld36_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld36_b + lhu a4, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + j L_ualn_ld36_e +L_ualn_ld36_b: + lbu a4, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a4, a4, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a4, a4, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a4, a4, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a4, a4, t4 +L_ualn_ld36_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, a3, s1 + xor t3, a4, s2 + ld a3, 0(t6) + ld a4, 8(t6) + ld a5, 16(t6) + ld a6, 24(t6) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t6) + ld a4, 40(t6) + ld a5, 48(t6) + ld a6, 56(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t6) + ld a4, 72(t6) + ld a5, 80(t6) + ld a6, 88(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t6) + ld a4, 104(t6) + ld a5, 112(t6) + ld a6, 120(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t6) + ld a4, 136(t6) + ld a5, 144(t6) + ld a6, 152(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t6) + ld a4, 168(t6) + li t4, 11 + ble a7, t4, L_AES_CBC_encrypt_RISCV64_last + ld a5, 176(t6) + ld a6, 184(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t6) + ld a4, 200(t6) + li t4, 13 + ble a7, t4, L_AES_CBC_encrypt_RISCV64_last + ld a5, 208(t6) + ld a6, 216(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t6) + ld a4, 232(t6) +L_AES_CBC_encrypt_RISCV64_last: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd37_w + sd t2, 0(a1) + j L_ualn_sd37_e +L_ualn_sd37_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd37_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd37_e +L_ualn_sd37_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd37_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd37_e +L_ualn_sd37_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd37_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd38_w + sd t3, 8(a1) + j L_ualn_sd38_e +L_ualn_sd38_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd38_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd38_e +L_ualn_sd38_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd38_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd38_e +L_ualn_sd38_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd38_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv s1, t2 + mv s2, t3 + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_CBC_encrypt_RISCV64_loop +L_AES_CBC_encrypt_RISCV64_end: + sd s1, 0(t5) + sd s2, 8(t5) + ld s1, 0(sp) + ld s2, 8(sp) + addi sp, sp, 16 + ret + .size AES_CBC_encrypt_RISCV64,.-AES_CBC_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_CBC_decrypt_RISCV64 + .type AES_CBC_decrypt_RISCV64,@function + .align 2 +AES_CBC_decrypt_RISCV64: + addi sp, sp, -32 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + mv t5, a3 + mv t6, a4 + mv a7, a5 + srliw a2, a2, 4 + ld s1, 0(t5) + ld s2, 8(t5) +L_AES_CBC_decrypt_RISCV64_loop: + beqz a2, L_AES_CBC_decrypt_RISCV64_end +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld39_w + ld t2, 0(a0) + j L_ualn_ld39_e +L_ualn_ld39_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld39_h + lwu t2, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld39_e +L_ualn_ld39_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld39_b + lhu t2, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld39_e +L_ualn_ld39_b: + lbu t2, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld39_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld40_w + ld t3, 8(a0) + j L_ualn_ld40_e +L_ualn_ld40_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld40_h + lwu t3, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld40_e +L_ualn_ld40_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld40_b + lhu t3, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld40_e +L_ualn_ld40_b: + lbu t3, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld40_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv s3, t2 + mv s4, t3 + ld a3, 0(t6) + ld a4, 8(t6) + ld a5, 16(t6) + ld a6, 24(t6) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t6) + ld a4, 40(t6) + ld a5, 48(t6) + ld a6, 56(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t6) + ld a4, 72(t6) + ld a5, 80(t6) + ld a6, 88(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t6) + ld a4, 104(t6) + ld a5, 112(t6) + ld a6, 120(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t6) + ld a4, 136(t6) + ld a5, 144(t6) + ld a6, 152(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t6) + ld a4, 168(t6) + li t4, 11 + ble a7, t4, L_AES_CBC_decrypt_RISCV64_last + ld a5, 176(t6) + ld a6, 184(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t6) + ld a4, 200(t6) + li t4, 13 + ble a7, t4, L_AES_CBC_decrypt_RISCV64_last + ld a5, 208(t6) + ld a6, 216(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t6) + ld a4, 232(t6) +L_AES_CBC_decrypt_RISCV64_last: + # aes64ds x7, x5, x6 + .word 0x3a6283b3 + # aes64ds x28, x6, x5 + .word 0x3a530e33 + xor t2, t2, a3 + xor t3, t3, a4 + xor t2, t2, s1 + xor t3, t3, s2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd41_w + sd t2, 0(a1) + j L_ualn_sd41_e +L_ualn_sd41_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd41_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd41_e +L_ualn_sd41_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd41_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd41_e +L_ualn_sd41_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd41_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd42_w + sd t3, 8(a1) + j L_ualn_sd42_e +L_ualn_sd42_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd42_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd42_e +L_ualn_sd42_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd42_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd42_e +L_ualn_sd42_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd42_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv s1, s3 + mv s2, s4 + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_CBC_decrypt_RISCV64_loop +L_AES_CBC_decrypt_RISCV64_end: + sd s1, 0(t5) + sd s2, 8(t5) + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + addi sp, sp, 32 + ret + .size AES_CBC_decrypt_RISCV64,.-AES_CBC_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER + .text + .globl AES_CTR_encrypt_RISCV64 + .type AES_CTR_encrypt_RISCV64,@function + .align 2 +AES_CTR_encrypt_RISCV64: + addi sp, sp, -32 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + mv t5, a3 + mv s1, a4 + mv s2, a5 + mv s3, a6 + mv s4, a7 + # Consume any leftover keystream bytes from tmp. + lw t6, 0(s3) +L_AES_CTR_encrypt_RISCV64_left: + beqz t6, L_AES_CTR_encrypt_RISCV64_left_done + beqz a2, L_AES_CTR_encrypt_RISCV64_left_done + li a3, 16 + sub a3, a3, t6 + add a3, a3, s2 + lb a4, 0(a3) + lb a5, 0(a0) + xor a4, a4, a5 + sb a4, 0(a1) + addi a0, a0, 1 + addi a1, a1, 1 + addiw t6, t6, -1 + addiw a2, a2, -1 + j L_AES_CTR_encrypt_RISCV64_left +L_AES_CTR_encrypt_RISCV64_left_done: + sw t6, 0(s3) + # Whole blocks: keystream = E(counter); out = in ^ ks; counter++. +L_AES_CTR_encrypt_RISCV64_blk: + li a3, 16 + bltu a2, a3, L_AES_CTR_encrypt_RISCV64_tail + ld t2, 0(t5) + ld t3, 8(t5) + ld a3, 0(s1) + ld a4, 8(s1) + ld a5, 16(s1) + ld a6, 24(s1) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s1) + ld a4, 40(s1) + ld a5, 48(s1) + ld a6, 56(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s1) + ld a4, 72(s1) + ld a5, 80(s1) + ld a6, 88(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s1) + ld a4, 104(s1) + ld a5, 112(s1) + ld a6, 120(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s1) + ld a4, 136(s1) + ld a5, 144(s1) + ld a6, 152(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s1) + ld a4, 168(s1) + li t4, 11 + ble s4, t4, L_AES_CTR_encrypt_RISCV64_blk_last + ld a5, 176(s1) + ld a6, 184(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s1) + ld a4, 200(s1) + li t4, 13 + ble s4, t4, L_AES_CTR_encrypt_RISCV64_blk_last + ld a5, 208(s1) + ld a6, 216(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s1) + ld a4, 232(s1) +L_AES_CTR_encrypt_RISCV64_blk_last: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a3, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld43_w + ld a3, 0(a0) + j L_ualn_ld43_e +L_ualn_ld43_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld43_h + lwu a3, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + j L_ualn_ld43_e +L_ualn_ld43_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld43_b + lhu a3, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + j L_ualn_ld43_e +L_ualn_ld43_b: + lbu a3, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or a3, a3, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or a3, a3, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or a3, a3, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or a3, a3, t4 +L_ualn_ld43_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld44_w + ld a4, 8(a0) + j L_ualn_ld44_e +L_ualn_ld44_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld44_h + lwu a4, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + j L_ualn_ld44_e +L_ualn_ld44_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld44_b + lhu a4, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + j L_ualn_ld44_e +L_ualn_ld44_b: + lbu a4, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a4, a4, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a4, a4, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a4, a4, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a4, a4, t4 +L_ualn_ld44_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd45_w + sd t2, 0(a1) + j L_ualn_sd45_e +L_ualn_sd45_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd45_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd45_e +L_ualn_sd45_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd45_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd45_e +L_ualn_sd45_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd45_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd46_w + sd t3, 8(a1) + j L_ualn_sd46_e +L_ualn_sd46_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd46_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd46_e +L_ualn_sd46_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd46_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd46_e +L_ualn_sd46_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd46_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t0, 8(t5) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, t0 + .word 0x6b82d293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli t0, t0, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + addi t0, t0, 1 + seqz t4, t0 + ld t1, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t1 + .word 0x6b835313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli t1, t1, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + add t1, t1, t4 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, t0 + .word 0x6b82d293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli t0, t0, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t1 + .word 0x6b835313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli t1, t1, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 8(t5) + sd t1, 0(t5) + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -16 + j L_AES_CTR_encrypt_RISCV64_blk + # Final partial block: keystream -> tmp, *left = 16 - sz. +L_AES_CTR_encrypt_RISCV64_tail: + beqz a2, L_AES_CTR_encrypt_RISCV64_done + ld t2, 0(t5) + ld t3, 8(t5) + ld a3, 0(s1) + ld a4, 8(s1) + ld a5, 16(s1) + ld a6, 24(s1) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s1) + ld a4, 40(s1) + ld a5, 48(s1) + ld a6, 56(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s1) + ld a4, 72(s1) + ld a5, 80(s1) + ld a6, 88(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s1) + ld a4, 104(s1) + ld a5, 112(s1) + ld a6, 120(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s1) + ld a4, 136(s1) + ld a5, 144(s1) + ld a6, 152(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s1) + ld a4, 168(s1) + li t4, 11 + ble s4, t4, L_AES_CTR_encrypt_RISCV64_tail_last + ld a5, 176(s1) + ld a6, 184(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s1) + ld a4, 200(s1) + li t4, 13 + ble s4, t4, L_AES_CTR_encrypt_RISCV64_tail_last + ld a5, 208(s1) + ld a6, 216(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s1) + ld a4, 232(s1) +L_AES_CTR_encrypt_RISCV64_tail_last: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + sd t2, 0(s2) + sd t3, 8(s2) + ld t0, 8(t5) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, t0 + .word 0x6b82d293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli t0, t0, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + addi t0, t0, 1 + seqz t4, t0 + ld t1, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t1 + .word 0x6b835313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli t1, t1, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + add t1, t1, t4 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, t0 + .word 0x6b82d293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli t0, t0, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t1 + .word 0x6b835313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli t1, t1, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 8(t5) + sd t1, 0(t5) + li a3, 16 + subw a3, a3, a2 + sw a3, 0(s3) + mv a4, s2 +L_AES_CTR_encrypt_RISCV64_tail_loop: + lb a5, 0(a0) + lb a6, 0(a4) + xor a5, a5, a6 + sb a5, 0(a1) + addi a0, a0, 1 + addi a1, a1, 1 + addi a4, a4, 1 + addiw a2, a2, -1 + bnez a2, L_AES_CTR_encrypt_RISCV64_tail_loop +L_AES_CTR_encrypt_RISCV64_done: + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + addi sp, sp, 32 + ret + .size AES_CTR_encrypt_RISCV64,.-AES_CTR_encrypt_RISCV64 +#endif /* WOLFSSL_AES_COUNTER */ +#ifdef WOLFSSL_AES_XTS + .text + .globl AES_XTS_encrypt_RISCV64 + .type AES_XTS_encrypt_RISCV64,@function + .align 2 +AES_XTS_encrypt_RISCV64: + addi sp, sp, -64 + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + mv t5, a3 + mv t6, a4 + mv s1, a5 + mv s2, a6 + mv s3, a7 + # tweak = AES_key2(i) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(t5) +#else + andi t4, t5, 7 + bnez t4, L_ualn_ld47_w + ld t2, 0(t5) + j L_ualn_ld47_e +L_ualn_ld47_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld47_h + lwu t2, 0(t5) + lwu t4, 4(t5) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld47_e +L_ualn_ld47_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld47_b + lhu t2, 0(t5) + lhu t4, 2(t5) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(t5) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(t5) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld47_e +L_ualn_ld47_b: + lbu t2, 0(t5) + lbu t4, 1(t5) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(t5) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(t5) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(t5) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(t5) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(t5) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(t5) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld47_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(t5) +#else + andi t4, t5, 7 + bnez t4, L_ualn_ld48_w + ld t3, 8(t5) + j L_ualn_ld48_e +L_ualn_ld48_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld48_h + lwu t3, 8(t5) + lwu t4, 12(t5) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld48_e +L_ualn_ld48_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld48_b + lhu t3, 8(t5) + lhu t4, 10(t5) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(t5) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(t5) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld48_e +L_ualn_ld48_b: + lbu t3, 8(t5) + lbu t4, 9(t5) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(t5) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(t5) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(t5) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(t5) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(t5) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(t5) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld48_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a3, 0(s1) + ld a4, 8(s1) + ld a5, 16(s1) + ld a6, 24(s1) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s1) + ld a4, 40(s1) + ld a5, 48(s1) + ld a6, 56(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s1) + ld a4, 72(s1) + ld a5, 80(s1) + ld a6, 88(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s1) + ld a4, 104(s1) + ld a5, 112(s1) + ld a6, 120(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s1) + ld a4, 136(s1) + ld a5, 144(s1) + ld a6, 152(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s1) + ld a4, 168(s1) + li t4, 11 + ble s3, t4, L_AES_XTS_encrypt_RISCV64_tw + ld a5, 176(s1) + ld a6, 184(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s1) + ld a4, 200(s1) + li t4, 13 + ble s3, t4, L_AES_XTS_encrypt_RISCV64_tw + ld a5, 208(s1) + ld a6, 216(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s1) + ld a4, 232(s1) +L_AES_XTS_encrypt_RISCV64_tw: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + mv s4, t2 + mv s5, t3 + srliw t5, a2, 4 + andi a2, a2, 15 +L_AES_XTS_encrypt_RISCV64_loop: + beqz t5, L_AES_XTS_encrypt_RISCV64_done +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a3, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld49_w + ld a3, 0(a0) + j L_ualn_ld49_e +L_ualn_ld49_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld49_h + lwu a3, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + j L_ualn_ld49_e +L_ualn_ld49_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld49_b + lhu a3, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + j L_ualn_ld49_e +L_ualn_ld49_b: + lbu a3, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or a3, a3, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or a3, a3, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or a3, a3, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or a3, a3, t4 +L_ualn_ld49_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld50_w + ld a4, 8(a0) + j L_ualn_ld50_e +L_ualn_ld50_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld50_h + lwu a4, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + j L_ualn_ld50_e +L_ualn_ld50_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld50_b + lhu a4, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + j L_ualn_ld50_e +L_ualn_ld50_b: + lbu a4, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a4, a4, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a4, a4, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a4, a4, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a4, a4, t4 +L_ualn_ld50_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, a3, s4 + xor t3, a4, s5 + ld a3, 0(t6) + ld a4, 8(t6) + ld a5, 16(t6) + ld a6, 24(t6) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t6) + ld a4, 40(t6) + ld a5, 48(t6) + ld a6, 56(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t6) + ld a4, 72(t6) + ld a5, 80(t6) + ld a6, 88(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t6) + ld a4, 104(t6) + ld a5, 112(t6) + ld a6, 120(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t6) + ld a4, 136(t6) + ld a5, 144(t6) + ld a6, 152(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t6) + ld a4, 168(t6) + li t4, 11 + ble s3, t4, L_AES_XTS_encrypt_RISCV64_last + ld a5, 176(t6) + ld a6, 184(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t6) + ld a4, 200(t6) + li t4, 13 + ble s3, t4, L_AES_XTS_encrypt_RISCV64_last + ld a5, 208(t6) + ld a6, 216(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t6) + ld a4, 232(t6) +L_AES_XTS_encrypt_RISCV64_last: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + xor t2, t2, s4 + xor t3, t3, s5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd51_w + sd t2, 0(a1) + j L_ualn_sd51_e +L_ualn_sd51_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd51_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd51_e +L_ualn_sd51_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd51_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd51_e +L_ualn_sd51_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd51_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd52_w + sd t3, 8(a1) + j L_ualn_sd52_e +L_ualn_sd52_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd52_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd52_e +L_ualn_sd52_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd52_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd52_e +L_ualn_sd52_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd52_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + srli t4, s4, 63 + srli a3, s5, 63 + slli s5, s5, 1 + or s5, s5, t4 + slli s4, s4, 1 + li t4, 135 + neg a3, a3 + and t4, t4, a3 + xor s4, s4, t4 + addi a0, a0, 16 + addi a1, a1, 16 + addiw t5, t5, -1 + j L_AES_XTS_encrypt_RISCV64_loop +L_AES_XTS_encrypt_RISCV64_done: + beqz a2, L_AES_XTS_encrypt_RISCV64_cts_done + # Ciphertext stealing: steal from the last full ciphertext (out[-16]). + addi a3, a1, -16 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a3) +#else + andi t4, a3, 7 + bnez t4, L_ualn_ld53_w + ld t2, 0(a3) + j L_ualn_ld53_e +L_ualn_ld53_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld53_h + lwu t2, 0(a3) + lwu t4, 4(a3) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld53_e +L_ualn_ld53_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld53_b + lhu t2, 0(a3) + lhu t4, 2(a3) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(a3) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(a3) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld53_e +L_ualn_ld53_b: + lbu t2, 0(a3) + lbu t4, 1(a3) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(a3) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(a3) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(a3) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(a3) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(a3) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(a3) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld53_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a3) +#else + andi t4, a3, 7 + bnez t4, L_ualn_ld54_w + ld t3, 8(a3) + j L_ualn_ld54_e +L_ualn_ld54_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld54_h + lwu t3, 8(a3) + lwu t4, 12(a3) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld54_e +L_ualn_ld54_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld54_b + lhu t3, 8(a3) + lhu t4, 10(a3) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(a3) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(a3) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld54_e +L_ualn_ld54_b: + lbu t3, 8(a3) + lbu t4, 9(a3) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(a3) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(a3) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(a3) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(a3) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(a3) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(a3) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld54_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t2, 0(s2) + sd t3, 8(s2) + mv a3, s2 + mv a4, a2 +L_AES_XTS_encrypt_RISCV64_byte: + lbu t2, 0(a3) + lbu t3, 0(a0) + sb t2, 0(a1) + sb t3, 0(a3) + addi a3, a3, 1 + addi a0, a0, 1 + addi a1, a1, 1 + addiw a4, a4, -1 + bnez a4, L_AES_XTS_encrypt_RISCV64_byte + sub a1, a1, a2 + addi a1, a1, -16 + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, s4 + xor t3, t3, s5 + ld a3, 0(t6) + ld a4, 8(t6) + ld a5, 16(t6) + ld a6, 24(t6) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t6) + ld a4, 40(t6) + ld a5, 48(t6) + ld a6, 56(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t6) + ld a4, 72(t6) + ld a5, 80(t6) + ld a6, 88(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t6) + ld a4, 104(t6) + ld a5, 112(t6) + ld a6, 120(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t6) + ld a4, 136(t6) + ld a5, 144(t6) + ld a6, 152(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t6) + ld a4, 168(t6) + li t4, 11 + ble s3, t4, L_AES_XTS_encrypt_RISCV64_cts_last + ld a5, 176(t6) + ld a6, 184(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t6) + ld a4, 200(t6) + li t4, 13 + ble s3, t4, L_AES_XTS_encrypt_RISCV64_cts_last + ld a5, 208(t6) + ld a6, 216(t6) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t6) + ld a4, 232(t6) +L_AES_XTS_encrypt_RISCV64_cts_last: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + xor t2, t2, s4 + xor t3, t3, s5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd55_w + sd t2, 0(a1) + j L_ualn_sd55_e +L_ualn_sd55_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd55_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd55_e +L_ualn_sd55_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd55_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd55_e +L_ualn_sd55_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd55_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd56_w + sd t3, 8(a1) + j L_ualn_sd56_e +L_ualn_sd56_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd56_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd56_e +L_ualn_sd56_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd56_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd56_e +L_ualn_sd56_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd56_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +L_AES_XTS_encrypt_RISCV64_cts_done: + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + addi sp, sp, 64 + ret + .size AES_XTS_encrypt_RISCV64,.-AES_XTS_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_XTS_decrypt_RISCV64 + .type AES_XTS_decrypt_RISCV64,@function + .align 2 +AES_XTS_decrypt_RISCV64: + addi sp, sp, -64 + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + mv t5, a3 + mv t6, a4 + mv s1, a5 + mv s2, a6 + mv s3, a7 + # tweak = AES_key2(i) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(t5) +#else + andi t4, t5, 7 + bnez t4, L_ualn_ld57_w + ld t2, 0(t5) + j L_ualn_ld57_e +L_ualn_ld57_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld57_h + lwu t2, 0(t5) + lwu t4, 4(t5) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld57_e +L_ualn_ld57_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld57_b + lhu t2, 0(t5) + lhu t4, 2(t5) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(t5) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(t5) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld57_e +L_ualn_ld57_b: + lbu t2, 0(t5) + lbu t4, 1(t5) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(t5) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(t5) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(t5) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(t5) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(t5) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(t5) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld57_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(t5) +#else + andi t4, t5, 7 + bnez t4, L_ualn_ld58_w + ld t3, 8(t5) + j L_ualn_ld58_e +L_ualn_ld58_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld58_h + lwu t3, 8(t5) + lwu t4, 12(t5) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld58_e +L_ualn_ld58_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld58_b + lhu t3, 8(t5) + lhu t4, 10(t5) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(t5) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(t5) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld58_e +L_ualn_ld58_b: + lbu t3, 8(t5) + lbu t4, 9(t5) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(t5) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(t5) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(t5) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(t5) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(t5) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(t5) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld58_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a3, 0(s1) + ld a4, 8(s1) + ld a5, 16(s1) + ld a6, 24(s1) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s1) + ld a4, 40(s1) + ld a5, 48(s1) + ld a6, 56(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s1) + ld a4, 72(s1) + ld a5, 80(s1) + ld a6, 88(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s1) + ld a4, 104(s1) + ld a5, 112(s1) + ld a6, 120(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s1) + ld a4, 136(s1) + ld a5, 144(s1) + ld a6, 152(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s1) + ld a4, 168(s1) + li t4, 11 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_tw + ld a5, 176(s1) + ld a6, 184(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s1) + ld a4, 200(s1) + li t4, 13 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_tw + ld a5, 208(s1) + ld a6, 216(s1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s1) + ld a4, 232(s1) +L_AES_XTS_decrypt_RISCV64_tw: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + mv s4, t2 + mv s5, t3 + srliw t5, a2, 4 + andi a2, a2, 15 + beqz a2, L_AES_XTS_decrypt_RISCV64_full + addiw t5, t5, -1 +L_AES_XTS_decrypt_RISCV64_full: +L_AES_XTS_decrypt_RISCV64_loop: + beqz t5, L_AES_XTS_decrypt_RISCV64_done +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a3, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld59_w + ld a3, 0(a0) + j L_ualn_ld59_e +L_ualn_ld59_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld59_h + lwu a3, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + j L_ualn_ld59_e +L_ualn_ld59_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld59_b + lhu a3, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + j L_ualn_ld59_e +L_ualn_ld59_b: + lbu a3, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or a3, a3, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or a3, a3, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or a3, a3, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or a3, a3, t4 +L_ualn_ld59_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld60_w + ld a4, 8(a0) + j L_ualn_ld60_e +L_ualn_ld60_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld60_h + lwu a4, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + j L_ualn_ld60_e +L_ualn_ld60_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld60_b + lhu a4, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + j L_ualn_ld60_e +L_ualn_ld60_b: + lbu a4, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a4, a4, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a4, a4, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a4, a4, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a4, a4, t4 +L_ualn_ld60_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, a3, s4 + xor t3, a4, s5 + ld a3, 0(t6) + ld a4, 8(t6) + ld a5, 16(t6) + ld a6, 24(t6) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t6) + ld a4, 40(t6) + ld a5, 48(t6) + ld a6, 56(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t6) + ld a4, 72(t6) + ld a5, 80(t6) + ld a6, 88(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t6) + ld a4, 104(t6) + ld a5, 112(t6) + ld a6, 120(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t6) + ld a4, 136(t6) + ld a5, 144(t6) + ld a6, 152(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t6) + ld a4, 168(t6) + li t4, 11 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_last + ld a5, 176(t6) + ld a6, 184(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t6) + ld a4, 200(t6) + li t4, 13 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_last + ld a5, 208(t6) + ld a6, 216(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t6) + ld a4, 232(t6) +L_AES_XTS_decrypt_RISCV64_last: + # aes64ds x7, x5, x6 + .word 0x3a6283b3 + # aes64ds x28, x6, x5 + .word 0x3a530e33 + xor t2, t2, a3 + xor t3, t3, a4 + xor t2, t2, s4 + xor t3, t3, s5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd61_w + sd t2, 0(a1) + j L_ualn_sd61_e +L_ualn_sd61_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd61_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd61_e +L_ualn_sd61_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd61_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd61_e +L_ualn_sd61_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd61_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd62_w + sd t3, 8(a1) + j L_ualn_sd62_e +L_ualn_sd62_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd62_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd62_e +L_ualn_sd62_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd62_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd62_e +L_ualn_sd62_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd62_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + srli t4, s4, 63 + srli a3, s5, 63 + slli s5, s5, 1 + or s5, s5, t4 + slli s4, s4, 1 + li t4, 135 + neg a3, a3 + and t4, t4, a3 + xor s4, s4, t4 + addi a0, a0, 16 + addi a1, a1, 16 + addiw t5, t5, -1 + j L_AES_XTS_decrypt_RISCV64_loop +L_AES_XTS_decrypt_RISCV64_done: + beqz a2, L_AES_XTS_decrypt_RISCV64_cts_done + # CTS: decrypt last full block with the NEXT tweak, then steal. + mv s6, s4 + mv s7, s5 + srli t4, s4, 63 + srli a3, s5, 63 + slli s5, s5, 1 + or s5, s5, t4 + slli s4, s4, 1 + li t4, 135 + neg a3, a3 + and t4, t4, a3 + xor s4, s4, t4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a3, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld63_w + ld a3, 0(a0) + j L_ualn_ld63_e +L_ualn_ld63_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld63_h + lwu a3, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + j L_ualn_ld63_e +L_ualn_ld63_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld63_b + lhu a3, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + j L_ualn_ld63_e +L_ualn_ld63_b: + lbu a3, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or a3, a3, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or a3, a3, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or a3, a3, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or a3, a3, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or a3, a3, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or a3, a3, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or a3, a3, t4 +L_ualn_ld63_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld64_w + ld a4, 8(a0) + j L_ualn_ld64_e +L_ualn_ld64_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld64_h + lwu a4, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + j L_ualn_ld64_e +L_ualn_ld64_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld64_b + lhu a4, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + j L_ualn_ld64_e +L_ualn_ld64_b: + lbu a4, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a4, a4, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a4, a4, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a4, a4, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a4, a4, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a4, a4, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a4, a4, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a4, a4, t4 +L_ualn_ld64_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a0, a0, 16 + xor t2, a3, s4 + xor t3, a4, s5 + ld a3, 0(t6) + ld a4, 8(t6) + ld a5, 16(t6) + ld a6, 24(t6) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t6) + ld a4, 40(t6) + ld a5, 48(t6) + ld a6, 56(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t6) + ld a4, 72(t6) + ld a5, 80(t6) + ld a6, 88(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t6) + ld a4, 104(t6) + ld a5, 112(t6) + ld a6, 120(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t6) + ld a4, 136(t6) + ld a5, 144(t6) + ld a6, 152(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t6) + ld a4, 168(t6) + li t4, 11 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts1_last + ld a5, 176(t6) + ld a6, 184(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t6) + ld a4, 200(t6) + li t4, 13 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts1_last + ld a5, 208(t6) + ld a6, 216(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t6) + ld a4, 232(t6) +L_AES_XTS_decrypt_RISCV64_cts1_last: + # aes64ds x7, x5, x6 + .word 0x3a6283b3 + # aes64ds x28, x6, x5 + .word 0x3a530e33 + xor t2, t2, a3 + xor t3, t3, a4 + xor t2, t2, s4 + xor t3, t3, s5 + sd t2, 0(s2) + sd t3, 8(s2) + addi a1, a1, 16 + mv a3, s2 + mv a4, a2 +L_AES_XTS_decrypt_RISCV64_byte: + lbu t2, 0(a3) + lbu t3, 0(a0) + sb t2, 0(a1) + sb t3, 0(a3) + addi a3, a3, 1 + addi a0, a0, 1 + addi a1, a1, 1 + addiw a4, a4, -1 + bnez a4, L_AES_XTS_decrypt_RISCV64_byte + sub a1, a1, a2 + addi a1, a1, -16 + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, s6 + xor t3, t3, s7 + ld a3, 0(t6) + ld a4, 8(t6) + ld a5, 16(t6) + ld a6, 24(t6) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(t6) + ld a4, 40(t6) + ld a5, 48(t6) + ld a6, 56(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(t6) + ld a4, 72(t6) + ld a5, 80(t6) + ld a6, 88(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(t6) + ld a4, 104(t6) + ld a5, 112(t6) + ld a6, 120(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(t6) + ld a4, 136(t6) + ld a5, 144(t6) + ld a6, 152(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(t6) + ld a4, 168(t6) + li t4, 11 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts2_last + ld a5, 176(t6) + ld a6, 184(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(t6) + ld a4, 200(t6) + li t4, 13 + ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts2_last + ld a5, 208(t6) + ld a6, 216(t6) + # aes64dsm x7, x5, x6 + .word 0x3e6283b3 + # aes64dsm x28, x6, x5 + .word 0x3e530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64dsm x5, x7, x28 + .word 0x3fc382b3 + # aes64dsm x6, x28, x7 + .word 0x3e7e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(t6) + ld a4, 232(t6) +L_AES_XTS_decrypt_RISCV64_cts2_last: + # aes64ds x7, x5, x6 + .word 0x3a6283b3 + # aes64ds x28, x6, x5 + .word 0x3a530e33 + xor t2, t2, a3 + xor t3, t3, a4 + xor t2, t2, s6 + xor t3, t3, s7 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd65_w + sd t2, 0(a1) + j L_ualn_sd65_e +L_ualn_sd65_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd65_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd65_e +L_ualn_sd65_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd65_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd65_e +L_ualn_sd65_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd65_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd66_w + sd t3, 8(a1) + j L_ualn_sd66_e +L_ualn_sd66_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd66_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd66_e +L_ualn_sd66_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd66_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd66_e +L_ualn_sd66_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd66_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +L_AES_XTS_decrypt_RISCV64_cts_done: + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + addi sp, sp, 64 + ret + .size AES_XTS_decrypt_RISCV64,.-AES_XTS_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_XTS */ +#ifdef HAVE_AESGCM + .text + .globl AES_GCM_set_key_RISCV64 + .type AES_GCM_set_key_RISCV64,@function + .align 2 +AES_GCM_set_key_RISCV64: + mv t5, a3 + # H = E_K(nonce) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld67_w + ld t2, 0(a0) + j L_ualn_ld67_e +L_ualn_ld67_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld67_h + lwu t2, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + j L_ualn_ld67_e +L_ualn_ld67_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld67_b + lhu t2, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + j L_ualn_ld67_e +L_ualn_ld67_b: + lbu t2, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t2, t2, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t2, t2, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t2, t2, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t2, t2, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t2, t2, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t2, t2, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t2, t2, t4 +L_ualn_ld67_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld68_w + ld t3, 8(a0) + j L_ualn_ld68_e +L_ualn_ld68_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld68_h + lwu t3, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + j L_ualn_ld68_e +L_ualn_ld68_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld68_b + lhu t3, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + j L_ualn_ld68_e +L_ualn_ld68_b: + lbu t3, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t3, t3, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t3, t3, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t3, t3, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t3, t3, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t3, t3, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t3, t3, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t3, t3, t4 +L_ualn_ld68_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a3, 0(a1) + ld a4, 8(a1) + ld a5, 16(a1) + ld a6, 24(a1) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(a1) + ld a4, 40(a1) + ld a5, 48(a1) + ld a6, 56(a1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(a1) + ld a4, 72(a1) + ld a5, 80(a1) + ld a6, 88(a1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(a1) + ld a4, 104(a1) + ld a5, 112(a1) + ld a6, 120(a1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(a1) + ld a4, 136(a1) + ld a5, 144(a1) + ld a6, 152(a1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(a1) + ld a4, 168(a1) + li t4, 11 + ble t5, t4, L_AES_GCM_set_key_RISCV64_done + ld a5, 176(a1) + ld a6, 184(a1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(a1) + ld a4, 200(a1) + li t4, 13 + ble t5, t4, L_AES_GCM_set_key_RISCV64_done + ld a5, 208(a1) + ld a6, 216(a1) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(a1) + ld a4, 232(a1) +L_AES_GCM_set_key_RISCV64_done: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # Reflect bits in each byte of H (for carryless-multiply GHASH) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x7, x7 + .word 0x6873d393 + # brev8 x28, x28 + .word 0x687e5e13 +#else + li a4, 6148914691236517205 + srli a5, t2, 1 + srli a6, t3, 1 + and t2, t2, a4 + and t3, t3, a4 + and a5, a5, a4 + and a6, a6, a4 + slli t2, t2, 1 + slli t3, t3, 1 + or t2, t2, a5 + or t3, t3, a6 + li a4, 3689348814741910323 + srli a5, t2, 2 + srli a6, t3, 2 + and t2, t2, a4 + and t3, t3, a4 + and a5, a5, a4 + and a6, a6, a4 + slli t2, t2, 2 + slli t3, t3, 2 + or t2, t2, a5 + or t3, t3, a6 + li a4, 1085102592571150095 + srli a5, t2, 4 + srli a6, t3, 4 + and t2, t2, a4 + and t3, t3, a4 + and a5, a5, a4 + and a6, a6, a4 + slli t2, t2, 4 + slli t3, t3, 4 + or t2, t2, a5 + or t3, t3, a6 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t2, 0(a2) + sd t3, 8(a2) + ret + .size AES_GCM_set_key_RISCV64,.-AES_GCM_set_key_RISCV64 + .text + .globl GHASH_RISCV64 + .type GHASH_RISCV64,@function + .align 2 +GHASH_RISCV64: + mv a6, a2 + mv a7, a3 + beqz a7, L_GHASH_RISCV64_ret + ld t0, 0(a0) + ld t1, 8(a0) + ld t2, 0(a1) + ld t3, 8(a1) + li t6, 135 + # Reflect x (h was reflected at set_key) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ +L_GHASH_RISCV64_loop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a6) +#else + andi t4, a6, 7 + bnez t4, L_ualn_ld69_w + ld t5, 0(a6) + j L_ualn_ld69_e +L_ualn_ld69_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld69_h + lwu t5, 0(a6) + lwu t4, 4(a6) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld69_e +L_ualn_ld69_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld69_b + lhu t5, 0(a6) + lhu t4, 2(a6) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(a6) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(a6) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld69_e +L_ualn_ld69_b: + lbu t5, 0(a6) + lbu t4, 1(a6) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(a6) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(a6) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(a6) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(a6) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(a6) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(a6) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld69_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a6) +#else + andi t4, a6, 7 + bnez t4, L_ualn_ld70_w + ld a5, 8(a6) + j L_ualn_ld70_e +L_ualn_ld70_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld70_h + lwu a5, 8(a6) + lwu t4, 12(a6) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld70_e +L_ualn_ld70_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld70_b + lhu a5, 8(a6) + lhu t4, 10(a6) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(a6) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(a6) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld70_e +L_ualn_ld70_b: + lbu a5, 8(a6) + lbu t4, 9(a6) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(a6) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(a6) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(a6) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(a6) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(a6) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(a6) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld70_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # Carryless multiply x * h in GF(2^128) - 3-way Karatsuba (6 clmul) + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # Reduce modulo the GCM polynomial (0x87) + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + addi a6, a6, 16 + addi a7, a7, -1 + bnez a7, L_GHASH_RISCV64_loop + # Reflect x back and store +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(a0) + sd t1, 8(a0) +L_GHASH_RISCV64_ret: + ret + .size GHASH_RISCV64,.-GHASH_RISCV64 + .text + .globl AES_GCM_encrypt_RISCV64 + .type AES_GCM_encrypt_RISCV64,@function + .align 2 +AES_GCM_encrypt_RISCV64: + addi sp, sp, -128 + sd s1, 40(sp) + sd s2, 48(sp) + sd s3, 56(sp) + sd s4, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + sd s8, 96(sp) + sd s9, 104(sp) + sd s10, 112(sp) + sd s11, 120(sp) + mv s9, a2 + mv s10, a5 + mv s11, a6 + ld s2, 128(sp) + ld s3, 136(sp) + ld s4, 144(sp) + ld s5, 152(sp) + ld s6, 160(sp) + ld s7, 168(sp) + li s1, 0 + li s8, 0 + li t0, 12 + bne a4, t0, L_AES_GCM_encrypt_RISCV64_j0ghash +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 0(a3) +#else + andi t0, a3, 7 + bnez t0, L_ualn_ld71_w + ld t1, 0(a3) + j L_ualn_ld71_e +L_ualn_ld71_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld71_h + lwu t1, 0(a3) + lwu t0, 4(a3) + slli t0, t0, 32 + or t1, t1, t0 + j L_ualn_ld71_e +L_ualn_ld71_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld71_b + lhu t1, 0(a3) + lhu t0, 2(a3) + slli t0, t0, 16 + or t1, t1, t0 + lhu t0, 4(a3) + slli t0, t0, 32 + or t1, t1, t0 + lhu t0, 6(a3) + slli t0, t0, 48 + or t1, t1, t0 + j L_ualn_ld71_e +L_ualn_ld71_b: + lbu t1, 0(a3) + lbu t0, 1(a3) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 2(a3) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 3(a3) + slli t0, t0, 24 + or t1, t1, t0 + lbu t0, 4(a3) + slli t0, t0, 32 + or t1, t1, t0 + lbu t0, 5(a3) + slli t0, t0, 40 + or t1, t1, t0 + lbu t0, 6(a3) + slli t0, t0, 48 + or t1, t1, t0 + lbu t0, 7(a3) + slli t0, t0, 56 + or t1, t1, t0 +L_ualn_ld71_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t1, 0(s6) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 8(a3) +#else + andi t0, a3, 3 + bnez t0, L_ualn_lw72_h + lw t1, 8(a3) + j L_ualn_lw72_e +L_ualn_lw72_h: + andi t0, t0, 1 + bnez t0, L_ualn_lw72_b + lhu t1, 8(a3) + lhu t0, 10(a3) + slli t0, t0, 16 + or t1, t1, t0 + addiw t1, t1, 0 + j L_ualn_lw72_e +L_ualn_lw72_b: + lbu t1, 8(a3) + lbu t0, 9(a3) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 10(a3) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 11(a3) + slli t0, t0, 24 + or t1, t1, t0 + addiw t1, t1, 0 +L_ualn_lw72_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 8(s6) + sb zero, 12(s6) + sb zero, 13(s6) + sb zero, 14(s6) + li t1, 1 + sb t1, 15(s6) + j L_AES_GCM_encrypt_RISCV64_j0done +L_AES_GCM_encrypt_RISCV64_j0ghash: + # Length block 0^64 || nonceSz*8 (BE) into reg (nonceSz still valid) + mv t0, s6 + sd zero, 0(t0) + sd zero, 8(t0) + slli t1, a4, 3 + srli t2, t1, 32 + andi t2, t2, 7 + sb t2, 11(t0) + srli t2, t1, 24 + srli t3, t1, 16 + srli t4, t1, 8 + sb t2, 12(t0) + sb t3, 13(t0) + sb t4, 14(t0) + sb t1, 15(t0) + sd s10, 24(sp) + sd s11, 16(sp) + mv s10, a3 + mv s11, a4 + beqz s11, L_AES_GCM_encrypt_RISCV64_j0n_gdone + srli a6, s11, 4 + beqz a6, L_AES_GCM_encrypt_RISCV64_j0n_gpart +L_AES_GCM_encrypt_RISCV64_j0n_gloop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(s10) +#else + andi t4, s10, 7 + bnez t4, L_ualn_ld73_w + ld t5, 0(s10) + j L_ualn_ld73_e +L_ualn_ld73_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld73_h + lwu t5, 0(s10) + lwu t4, 4(s10) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld73_e +L_ualn_ld73_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld73_b + lhu t5, 0(s10) + lhu t4, 2(s10) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(s10) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(s10) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld73_e +L_ualn_ld73_b: + lbu t5, 0(s10) + lbu t4, 1(s10) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(s10) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(s10) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(s10) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(s10) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(s10) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(s10) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld73_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(s10) +#else + andi t4, s10, 7 + bnez t4, L_ualn_ld74_w + ld a5, 8(s10) + j L_ualn_ld74_e +L_ualn_ld74_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld74_h + lwu a5, 8(s10) + lwu t4, 12(s10) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld74_e +L_ualn_ld74_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld74_b + lhu a5, 8(s10) + lhu t4, 10(s10) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(s10) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(s10) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld74_e +L_ualn_ld74_b: + lbu a5, 8(s10) + lbu t4, 9(s10) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(s10) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(s10) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(s10) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(s10) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(s10) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(s10) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld74_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi s10, s10, 16 + addi a6, a6, -1 + bnez a6, L_AES_GCM_encrypt_RISCV64_j0n_gloop +L_AES_GCM_encrypt_RISCV64_j0n_gpart: + andi a6, s11, 15 + beqz a6, L_AES_GCM_encrypt_RISCV64_j0n_gdone + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + mv t1, a6 +L_AES_GCM_encrypt_RISCV64_j0n_gpb: + lb t2, 0(s10) + sb t2, 0(t0) + addi s10, s10, 1 + addi t0, t0, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_encrypt_RISCV64_j0n_gpb + mv t0, s5 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 +L_AES_GCM_encrypt_RISCV64_j0n_gdone: + # GHASH the length block (from reg) + mv t0, s6 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + ld s10, 24(sp) + ld s11, 16(sp) + # J0 = reflect(X); store to reg; reset X=0 + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(s6) + sd t1, 8(s6) + li s1, 0 + li s8, 0 +L_AES_GCM_encrypt_RISCV64_j0done: + ld t2, 0(s6) + ld t3, 8(s6) + ld a3, 0(s3) + ld a4, 8(s3) + ld a5, 16(s3) + ld a6, 24(s3) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s3) + ld a4, 40(s3) + ld a5, 48(s3) + ld a6, 56(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s3) + ld a4, 72(s3) + ld a5, 80(s3) + ld a6, 88(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s3) + ld a4, 104(s3) + ld a5, 112(s3) + ld a6, 120(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s3) + ld a4, 136(s3) + ld a5, 144(s3) + ld a6, 152(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s3) + ld a4, 168(s3) + li t4, 11 + ble s7, t4, L_AES_GCM_encrypt_RISCV64_ekj0_done + ld a5, 176(s3) + ld a6, 184(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s3) + ld a4, 200(s3) + li t4, 13 + ble s7, t4, L_AES_GCM_encrypt_RISCV64_ekj0_done + ld a5, 208(s3) + ld a6, 216(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s3) + ld a4, 232(s3) +L_AES_GCM_encrypt_RISCV64_ekj0_done: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + sd t2, 0(sp) + sd t3, 8(sp) + # GHASH the AAD + beqz s2, L_AES_GCM_encrypt_RISCV64_aad_gdone + srli a6, s2, 4 + beqz a6, L_AES_GCM_encrypt_RISCV64_aad_gpart +L_AES_GCM_encrypt_RISCV64_aad_gloop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a7) +#else + andi t4, a7, 7 + bnez t4, L_ualn_ld75_w + ld t5, 0(a7) + j L_ualn_ld75_e +L_ualn_ld75_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld75_h + lwu t5, 0(a7) + lwu t4, 4(a7) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld75_e +L_ualn_ld75_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld75_b + lhu t5, 0(a7) + lhu t4, 2(a7) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(a7) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(a7) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld75_e +L_ualn_ld75_b: + lbu t5, 0(a7) + lbu t4, 1(a7) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(a7) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(a7) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(a7) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(a7) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(a7) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(a7) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld75_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a7) +#else + andi t4, a7, 7 + bnez t4, L_ualn_ld76_w + ld a5, 8(a7) + j L_ualn_ld76_e +L_ualn_ld76_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld76_h + lwu a5, 8(a7) + lwu t4, 12(a7) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld76_e +L_ualn_ld76_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld76_b + lhu a5, 8(a7) + lhu t4, 10(a7) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(a7) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(a7) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld76_e +L_ualn_ld76_b: + lbu a5, 8(a7) + lbu t4, 9(a7) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(a7) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(a7) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(a7) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(a7) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(a7) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(a7) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld76_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi a7, a7, 16 + addi a6, a6, -1 + bnez a6, L_AES_GCM_encrypt_RISCV64_aad_gloop +L_AES_GCM_encrypt_RISCV64_aad_gpart: + andi a6, s2, 15 + beqz a6, L_AES_GCM_encrypt_RISCV64_aad_gdone + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + mv t1, a6 +L_AES_GCM_encrypt_RISCV64_aad_gpb: + lb t2, 0(a7) + sb t2, 0(t0) + addi a7, a7, 1 + addi t0, t0, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_encrypt_RISCV64_aad_gpb + mv t0, s5 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 +L_AES_GCM_encrypt_RISCV64_aad_gdone: + srli a7, s9, 4 + beqz a7, L_AES_GCM_encrypt_RISCV64_dbdone +L_AES_GCM_encrypt_RISCV64_dloop: + lbu t0, 12(s6) + lbu t1, 13(s6) + lbu t2, 14(s6) + lbu t3, 15(s6) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s6) + sb t2, 13(s6) + sb t3, 14(s6) + sb t0, 15(s6) + ld t2, 0(s6) + ld t3, 8(s6) + ld a3, 0(s3) + ld a4, 8(s3) + ld a5, 16(s3) + ld a6, 24(s3) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s3) + ld a4, 40(s3) + ld a5, 48(s3) + ld a6, 56(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s3) + ld a4, 72(s3) + ld a5, 80(s3) + ld a6, 88(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s3) + ld a4, 104(s3) + ld a5, 112(s3) + ld a6, 120(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s3) + ld a4, 136(s3) + ld a5, 144(s3) + ld a6, 152(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s3) + ld a4, 168(s3) + li t4, 11 + ble s7, t4, L_AES_GCM_encrypt_RISCV64_denc + ld a5, 176(s3) + ld a6, 184(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s3) + ld a4, 200(s3) + li t4, 13 + ble s7, t4, L_AES_GCM_encrypt_RISCV64_denc + ld a5, 208(s3) + ld a6, 216(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s3) + ld a4, 232(s3) +L_AES_GCM_encrypt_RISCV64_denc: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld77_w + ld t5, 0(a0) + j L_ualn_ld77_e +L_ualn_ld77_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld77_h + lwu t5, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld77_e +L_ualn_ld77_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld77_b + lhu t5, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld77_e +L_ualn_ld77_b: + lbu t5, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld77_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld78_w + ld a5, 8(a0) + j L_ualn_ld78_e +L_ualn_ld78_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld78_h + lwu a5, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld78_e +L_ualn_ld78_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld78_b + lhu a5, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld78_e +L_ualn_ld78_b: + lbu a5, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld78_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, t2, t5 + xor t3, t3, a5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd79_w + sd t2, 0(a1) + j L_ualn_sd79_e +L_ualn_sd79_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd79_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd79_e +L_ualn_sd79_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd79_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd79_e +L_ualn_sd79_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd79_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd80_w + sd t3, 8(a1) + j L_ualn_sd80_e +L_ualn_sd80_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd80_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd80_e +L_ualn_sd80_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd80_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd80_e +L_ualn_sd80_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd80_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t5, t2 + mv a5, t3 + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi a0, a0, 16 + addi a1, a1, 16 + addi a7, a7, -1 + bnez a7, L_AES_GCM_encrypt_RISCV64_dloop +L_AES_GCM_encrypt_RISCV64_dbdone: + # Partial final block (cnt = sz & 15) + andi a7, s9, 15 + beqz a7, L_AES_GCM_encrypt_RISCV64_pdone + lbu t0, 12(s6) + lbu t1, 13(s6) + lbu t2, 14(s6) + lbu t3, 15(s6) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s6) + sb t2, 13(s6) + sb t3, 14(s6) + sb t0, 15(s6) + ld t2, 0(s6) + ld t3, 8(s6) + ld a3, 0(s3) + ld a4, 8(s3) + ld a5, 16(s3) + ld a6, 24(s3) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s3) + ld a4, 40(s3) + ld a5, 48(s3) + ld a6, 56(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s3) + ld a4, 72(s3) + ld a5, 80(s3) + ld a6, 88(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s3) + ld a4, 104(s3) + ld a5, 112(s3) + ld a6, 120(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s3) + ld a4, 136(s3) + ld a5, 144(s3) + ld a6, 152(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s3) + ld a4, 168(s3) + li t4, 11 + ble s7, t4, L_AES_GCM_encrypt_RISCV64_penc + ld a5, 176(s3) + ld a6, 184(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s3) + ld a4, 200(s3) + li t4, 13 + ble s7, t4, L_AES_GCM_encrypt_RISCV64_penc + ld a5, 208(s3) + ld a6, 216(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s3) + ld a4, 232(s3) +L_AES_GCM_encrypt_RISCV64_penc: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + mv t0, s6 + sd t2, 0(t0) + sd t3, 8(t0) + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + li t4, 0 +L_AES_GCM_encrypt_RISCV64_pbyte: + add t5, a0, t4 + lb t5, 0(t5) + add t6, s6, t4 + lb t6, 0(t6) + xor t0, t5, t6 + add t1, a1, t4 + sb t0, 0(t1) + add t1, s5, t4 + sb t0, 0(t1) + addi t4, t4, 1 + blt t4, a7, L_AES_GCM_encrypt_RISCV64_pbyte + mv t0, s5 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 +L_AES_GCM_encrypt_RISCV64_pdone: + # Length block: aadSz*8 (BE64) || sz*8 (BE64) + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + slli s2, s2, 3 + srli t2, s2, 32 + andi t2, t2, 7 + sb t2, 3(t0) + srli t2, s2, 24 + srli t3, s2, 16 + srli t4, s2, 8 + sb t2, 4(t0) + sb t3, 5(t0) + sb t4, 6(t0) + sb s2, 7(t0) + slli s9, s9, 3 + srli t2, s9, 32 + andi t2, t2, 7 + sb t2, 11(t0) + srli t2, s9, 24 + srli t3, s9, 16 + srli t4, s9, 8 + sb t2, 12(t0) + sb t3, 13(t0) + sb t4, 14(t0) + sb s9, 15(t0) + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + # tag = reflect(X) ^ E_K(J0) + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + ld t2, 0(sp) + ld t3, 8(sp) + xor t0, t0, t2 + xor t1, t1, t3 + mv t4, s5 + sd t0, 0(t4) + sd t1, 8(t4) + # Store tagSz bytes + mv t0, s5 + mv t3, s11 +L_AES_GCM_encrypt_RISCV64_stag: + lb t4, 0(t0) + sb t4, 0(s10) + addi t0, t0, 1 + addi s10, s10, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_RISCV64_stag + ld s1, 40(sp) + ld s2, 48(sp) + ld s3, 56(sp) + ld s4, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + ld s8, 96(sp) + ld s9, 104(sp) + ld s10, 112(sp) + ld s11, 120(sp) + addi sp, sp, 128 + ret + .size AES_GCM_encrypt_RISCV64,.-AES_GCM_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_GCM_decrypt_RISCV64 + .type AES_GCM_decrypt_RISCV64,@function + .align 2 +AES_GCM_decrypt_RISCV64: + addi sp, sp, -128 + sd s1, 40(sp) + sd s2, 48(sp) + sd s3, 56(sp) + sd s4, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + sd s8, 96(sp) + sd s9, 104(sp) + sd s10, 112(sp) + sd s11, 120(sp) + mv s9, a2 + mv s10, a5 + mv s11, a6 + ld s2, 128(sp) + ld s3, 136(sp) + ld s4, 144(sp) + ld s5, 152(sp) + ld s6, 160(sp) + ld s7, 168(sp) + li s1, 0 + li s8, 0 + li t0, 12 + bne a4, t0, L_AES_GCM_decrypt_RISCV64_j0ghash +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 0(a3) +#else + andi t0, a3, 7 + bnez t0, L_ualn_ld81_w + ld t1, 0(a3) + j L_ualn_ld81_e +L_ualn_ld81_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld81_h + lwu t1, 0(a3) + lwu t0, 4(a3) + slli t0, t0, 32 + or t1, t1, t0 + j L_ualn_ld81_e +L_ualn_ld81_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld81_b + lhu t1, 0(a3) + lhu t0, 2(a3) + slli t0, t0, 16 + or t1, t1, t0 + lhu t0, 4(a3) + slli t0, t0, 32 + or t1, t1, t0 + lhu t0, 6(a3) + slli t0, t0, 48 + or t1, t1, t0 + j L_ualn_ld81_e +L_ualn_ld81_b: + lbu t1, 0(a3) + lbu t0, 1(a3) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 2(a3) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 3(a3) + slli t0, t0, 24 + or t1, t1, t0 + lbu t0, 4(a3) + slli t0, t0, 32 + or t1, t1, t0 + lbu t0, 5(a3) + slli t0, t0, 40 + or t1, t1, t0 + lbu t0, 6(a3) + slli t0, t0, 48 + or t1, t1, t0 + lbu t0, 7(a3) + slli t0, t0, 56 + or t1, t1, t0 +L_ualn_ld81_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t1, 0(s6) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 8(a3) +#else + andi t0, a3, 3 + bnez t0, L_ualn_lw82_h + lw t1, 8(a3) + j L_ualn_lw82_e +L_ualn_lw82_h: + andi t0, t0, 1 + bnez t0, L_ualn_lw82_b + lhu t1, 8(a3) + lhu t0, 10(a3) + slli t0, t0, 16 + or t1, t1, t0 + addiw t1, t1, 0 + j L_ualn_lw82_e +L_ualn_lw82_b: + lbu t1, 8(a3) + lbu t0, 9(a3) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 10(a3) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 11(a3) + slli t0, t0, 24 + or t1, t1, t0 + addiw t1, t1, 0 +L_ualn_lw82_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 8(s6) + sb zero, 12(s6) + sb zero, 13(s6) + sb zero, 14(s6) + li t1, 1 + sb t1, 15(s6) + j L_AES_GCM_decrypt_RISCV64_j0done +L_AES_GCM_decrypt_RISCV64_j0ghash: + # Length block 0^64 || nonceSz*8 (BE) into reg (nonceSz still valid) + mv t0, s6 + sd zero, 0(t0) + sd zero, 8(t0) + slli t1, a4, 3 + srli t2, t1, 32 + andi t2, t2, 7 + sb t2, 11(t0) + srli t2, t1, 24 + srli t3, t1, 16 + srli t4, t1, 8 + sb t2, 12(t0) + sb t3, 13(t0) + sb t4, 14(t0) + sb t1, 15(t0) + sd s10, 24(sp) + sd s11, 16(sp) + mv s10, a3 + mv s11, a4 + beqz s11, L_AES_GCM_decrypt_RISCV64_j0n_gdone + srli a6, s11, 4 + beqz a6, L_AES_GCM_decrypt_RISCV64_j0n_gpart +L_AES_GCM_decrypt_RISCV64_j0n_gloop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(s10) +#else + andi t4, s10, 7 + bnez t4, L_ualn_ld83_w + ld t5, 0(s10) + j L_ualn_ld83_e +L_ualn_ld83_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld83_h + lwu t5, 0(s10) + lwu t4, 4(s10) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld83_e +L_ualn_ld83_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld83_b + lhu t5, 0(s10) + lhu t4, 2(s10) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(s10) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(s10) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld83_e +L_ualn_ld83_b: + lbu t5, 0(s10) + lbu t4, 1(s10) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(s10) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(s10) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(s10) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(s10) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(s10) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(s10) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld83_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(s10) +#else + andi t4, s10, 7 + bnez t4, L_ualn_ld84_w + ld a5, 8(s10) + j L_ualn_ld84_e +L_ualn_ld84_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld84_h + lwu a5, 8(s10) + lwu t4, 12(s10) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld84_e +L_ualn_ld84_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld84_b + lhu a5, 8(s10) + lhu t4, 10(s10) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(s10) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(s10) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld84_e +L_ualn_ld84_b: + lbu a5, 8(s10) + lbu t4, 9(s10) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(s10) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(s10) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(s10) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(s10) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(s10) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(s10) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld84_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi s10, s10, 16 + addi a6, a6, -1 + bnez a6, L_AES_GCM_decrypt_RISCV64_j0n_gloop +L_AES_GCM_decrypt_RISCV64_j0n_gpart: + andi a6, s11, 15 + beqz a6, L_AES_GCM_decrypt_RISCV64_j0n_gdone + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + mv t1, a6 +L_AES_GCM_decrypt_RISCV64_j0n_gpb: + lb t2, 0(s10) + sb t2, 0(t0) + addi s10, s10, 1 + addi t0, t0, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_decrypt_RISCV64_j0n_gpb + mv t0, s5 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 +L_AES_GCM_decrypt_RISCV64_j0n_gdone: + # GHASH the length block (from reg) + mv t0, s6 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + ld s10, 24(sp) + ld s11, 16(sp) + # J0 = reflect(X); store to reg; reset X=0 + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(s6) + sd t1, 8(s6) + li s1, 0 + li s8, 0 +L_AES_GCM_decrypt_RISCV64_j0done: + ld t2, 0(s6) + ld t3, 8(s6) + ld a3, 0(s3) + ld a4, 8(s3) + ld a5, 16(s3) + ld a6, 24(s3) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s3) + ld a4, 40(s3) + ld a5, 48(s3) + ld a6, 56(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s3) + ld a4, 72(s3) + ld a5, 80(s3) + ld a6, 88(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s3) + ld a4, 104(s3) + ld a5, 112(s3) + ld a6, 120(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s3) + ld a4, 136(s3) + ld a5, 144(s3) + ld a6, 152(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s3) + ld a4, 168(s3) + li t4, 11 + ble s7, t4, L_AES_GCM_decrypt_RISCV64_ekj0_done + ld a5, 176(s3) + ld a6, 184(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s3) + ld a4, 200(s3) + li t4, 13 + ble s7, t4, L_AES_GCM_decrypt_RISCV64_ekj0_done + ld a5, 208(s3) + ld a6, 216(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s3) + ld a4, 232(s3) +L_AES_GCM_decrypt_RISCV64_ekj0_done: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + sd t2, 0(sp) + sd t3, 8(sp) + # GHASH the AAD + beqz s2, L_AES_GCM_decrypt_RISCV64_aad_gdone + srli a6, s2, 4 + beqz a6, L_AES_GCM_decrypt_RISCV64_aad_gpart +L_AES_GCM_decrypt_RISCV64_aad_gloop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a7) +#else + andi t4, a7, 7 + bnez t4, L_ualn_ld85_w + ld t5, 0(a7) + j L_ualn_ld85_e +L_ualn_ld85_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld85_h + lwu t5, 0(a7) + lwu t4, 4(a7) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld85_e +L_ualn_ld85_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld85_b + lhu t5, 0(a7) + lhu t4, 2(a7) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(a7) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(a7) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld85_e +L_ualn_ld85_b: + lbu t5, 0(a7) + lbu t4, 1(a7) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(a7) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(a7) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(a7) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(a7) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(a7) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(a7) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld85_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a7) +#else + andi t4, a7, 7 + bnez t4, L_ualn_ld86_w + ld a5, 8(a7) + j L_ualn_ld86_e +L_ualn_ld86_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld86_h + lwu a5, 8(a7) + lwu t4, 12(a7) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld86_e +L_ualn_ld86_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld86_b + lhu a5, 8(a7) + lhu t4, 10(a7) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(a7) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(a7) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld86_e +L_ualn_ld86_b: + lbu a5, 8(a7) + lbu t4, 9(a7) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(a7) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(a7) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(a7) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(a7) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(a7) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(a7) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld86_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi a7, a7, 16 + addi a6, a6, -1 + bnez a6, L_AES_GCM_decrypt_RISCV64_aad_gloop +L_AES_GCM_decrypt_RISCV64_aad_gpart: + andi a6, s2, 15 + beqz a6, L_AES_GCM_decrypt_RISCV64_aad_gdone + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + mv t1, a6 +L_AES_GCM_decrypt_RISCV64_aad_gpb: + lb t2, 0(a7) + sb t2, 0(t0) + addi a7, a7, 1 + addi t0, t0, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_decrypt_RISCV64_aad_gpb + mv t0, s5 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 +L_AES_GCM_decrypt_RISCV64_aad_gdone: + srli a7, s9, 4 + beqz a7, L_AES_GCM_decrypt_RISCV64_dbdone +L_AES_GCM_decrypt_RISCV64_dloop: + lbu t0, 12(s6) + lbu t1, 13(s6) + lbu t2, 14(s6) + lbu t3, 15(s6) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s6) + sb t2, 13(s6) + sb t3, 14(s6) + sb t0, 15(s6) + ld t2, 0(s6) + ld t3, 8(s6) + ld a3, 0(s3) + ld a4, 8(s3) + ld a5, 16(s3) + ld a6, 24(s3) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s3) + ld a4, 40(s3) + ld a5, 48(s3) + ld a6, 56(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s3) + ld a4, 72(s3) + ld a5, 80(s3) + ld a6, 88(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s3) + ld a4, 104(s3) + ld a5, 112(s3) + ld a6, 120(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s3) + ld a4, 136(s3) + ld a5, 144(s3) + ld a6, 152(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s3) + ld a4, 168(s3) + li t4, 11 + ble s7, t4, L_AES_GCM_decrypt_RISCV64_denc + ld a5, 176(s3) + ld a6, 184(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s3) + ld a4, 200(s3) + li t4, 13 + ble s7, t4, L_AES_GCM_decrypt_RISCV64_denc + ld a5, 208(s3) + ld a6, 216(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s3) + ld a4, 232(s3) +L_AES_GCM_decrypt_RISCV64_denc: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld87_w + ld t5, 0(a0) + j L_ualn_ld87_e +L_ualn_ld87_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld87_h + lwu t5, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld87_e +L_ualn_ld87_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld87_b + lhu t5, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld87_e +L_ualn_ld87_b: + lbu t5, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld87_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld88_w + ld a5, 8(a0) + j L_ualn_ld88_e +L_ualn_ld88_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld88_h + lwu a5, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld88_e +L_ualn_ld88_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld88_b + lhu a5, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld88_e +L_ualn_ld88_b: + lbu a5, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld88_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, t2, t5 + xor t3, t3, a5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd89_w + sd t2, 0(a1) + j L_ualn_sd89_e +L_ualn_sd89_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd89_h + sw t2, 0(a1) + srli t4, t2, 32 + sw t4, 4(a1) + j L_ualn_sd89_e +L_ualn_sd89_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd89_b + sh t2, 0(a1) + srli t4, t2, 16 + sh t4, 2(a1) + srli t4, t2, 32 + sh t4, 4(a1) + srli t4, t2, 48 + sh t4, 6(a1) + j L_ualn_sd89_e +L_ualn_sd89_b: + sb t2, 0(a1) + srli t4, t2, 8 + sb t4, 1(a1) + srli t4, t2, 16 + sb t4, 2(a1) + srli t4, t2, 24 + sb t4, 3(a1) + srli t4, t2, 32 + sb t4, 4(a1) + srli t4, t2, 40 + sb t4, 5(a1) + srli t4, t2, 48 + sb t4, 6(a1) + srli t4, t2, 56 + sb t4, 7(a1) +L_ualn_sd89_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_sd90_w + sd t3, 8(a1) + j L_ualn_sd90_e +L_ualn_sd90_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd90_h + sw t3, 8(a1) + srli t4, t3, 32 + sw t4, 12(a1) + j L_ualn_sd90_e +L_ualn_sd90_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd90_b + sh t3, 8(a1) + srli t4, t3, 16 + sh t4, 10(a1) + srli t4, t3, 32 + sh t4, 12(a1) + srli t4, t3, 48 + sh t4, 14(a1) + j L_ualn_sd90_e +L_ualn_sd90_b: + sb t3, 8(a1) + srli t4, t3, 8 + sb t4, 9(a1) + srli t4, t3, 16 + sb t4, 10(a1) + srli t4, t3, 24 + sb t4, 11(a1) + srli t4, t3, 32 + sb t4, 12(a1) + srli t4, t3, 40 + sb t4, 13(a1) + srli t4, t3, 48 + sb t4, 14(a1) + srli t4, t3, 56 + sb t4, 15(a1) +L_ualn_sd90_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi a0, a0, 16 + addi a1, a1, 16 + addi a7, a7, -1 + bnez a7, L_AES_GCM_decrypt_RISCV64_dloop +L_AES_GCM_decrypt_RISCV64_dbdone: + # Partial final block (cnt = sz & 15) + andi a7, s9, 15 + beqz a7, L_AES_GCM_decrypt_RISCV64_pdone + lbu t0, 12(s6) + lbu t1, 13(s6) + lbu t2, 14(s6) + lbu t3, 15(s6) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s6) + sb t2, 13(s6) + sb t3, 14(s6) + sb t0, 15(s6) + ld t2, 0(s6) + ld t3, 8(s6) + ld a3, 0(s3) + ld a4, 8(s3) + ld a5, 16(s3) + ld a6, 24(s3) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(s3) + ld a4, 40(s3) + ld a5, 48(s3) + ld a6, 56(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(s3) + ld a4, 72(s3) + ld a5, 80(s3) + ld a6, 88(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(s3) + ld a4, 104(s3) + ld a5, 112(s3) + ld a6, 120(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(s3) + ld a4, 136(s3) + ld a5, 144(s3) + ld a6, 152(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(s3) + ld a4, 168(s3) + li t4, 11 + ble s7, t4, L_AES_GCM_decrypt_RISCV64_penc + ld a5, 176(s3) + ld a6, 184(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(s3) + ld a4, 200(s3) + li t4, 13 + ble s7, t4, L_AES_GCM_decrypt_RISCV64_penc + ld a5, 208(s3) + ld a6, 216(s3) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(s3) + ld a4, 232(s3) +L_AES_GCM_decrypt_RISCV64_penc: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + mv t0, s6 + sd t2, 0(t0) + sd t3, 8(t0) + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + li t4, 0 +L_AES_GCM_decrypt_RISCV64_pbyte: + add t5, a0, t4 + lb t5, 0(t5) + add t6, s6, t4 + lb t6, 0(t6) + xor t0, t5, t6 + add t1, a1, t4 + sb t0, 0(t1) + add t1, s5, t4 + sb t5, 0(t1) + addi t4, t4, 1 + blt t4, a7, L_AES_GCM_decrypt_RISCV64_pbyte + mv t0, s5 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 +L_AES_GCM_decrypt_RISCV64_pdone: + # Length block: aadSz*8 (BE64) || sz*8 (BE64) + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + slli s2, s2, 3 + srli t2, s2, 32 + andi t2, t2, 7 + sb t2, 3(t0) + srli t2, s2, 24 + srli t3, s2, 16 + srli t4, s2, 8 + sb t2, 4(t0) + sb t3, 5(t0) + sb t4, 6(t0) + sb s2, 7(t0) + slli s9, s9, 3 + srli t2, s9, 32 + andi t2, t2, 7 + sb t2, 11(t0) + srli t2, s9, 24 + srli t3, s9, 16 + srli t4, s9, 8 + sb t2, 12(t0) + sb t3, 13(t0) + sb t4, 14(t0) + sb s9, 15(t0) + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + # tag = reflect(X) ^ E_K(J0) + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + ld t2, 0(sp) + ld t3, 8(sp) + xor t0, t0, t2 + xor t1, t1, t3 + mv t4, s5 + sd t0, 0(t4) + sd t1, 8(t4) + # Compare tagSz bytes (unsigned); @ret = diff ? -180 : 0 + mv t0, s5 + mv t3, s11 + xor t2, t2, t2 +L_AES_GCM_decrypt_RISCV64_ctag: + lbu t4, 0(t0) + lbu t5, 0(s10) + xor t5, t5, t4 + or t2, t2, t5 + addi t0, t0, 1 + addi s10, s10, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_RISCV64_ctag + negw t2, t2 + sraiw t2, t2, 31 + andi a0, t2, -180 + ld s1, 40(sp) + ld s2, 48(sp) + ld s3, 56(sp) + ld s4, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + ld s8, 96(sp) + ld s9, 104(sp) + ld s10, 112(sp) + ld s11, 120(sp) + addi sp, sp, 128 + ret + .size AES_GCM_decrypt_RISCV64,.-AES_GCM_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#ifdef WOLFSSL_AESGCM_STREAM + .text + .globl AES_GCM_init_RISCV64 + .type AES_GCM_init_RISCV64,@function + .align 2 +AES_GCM_init_RISCV64: + addi sp, sp, -112 + sd s1, 40(sp) + sd s2, 48(sp) + sd s3, 56(sp) + sd s4, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + sd s8, 96(sp) + sd s9, 104(sp) + mv s2, a2 + mv s3, a3 + mv s4, a4 + mv s5, a5 + mv s6, a6 + li s1, 0 + li s8, 0 + li t0, 12 + bne s3, t0, L_AES_GCM_init_RISCV64_j0ghash +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 0(s2) +#else + andi t0, s2, 7 + bnez t0, L_ualn_ld91_w + ld t1, 0(s2) + j L_ualn_ld91_e +L_ualn_ld91_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld91_h + lwu t1, 0(s2) + lwu t0, 4(s2) + slli t0, t0, 32 + or t1, t1, t0 + j L_ualn_ld91_e +L_ualn_ld91_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld91_b + lhu t1, 0(s2) + lhu t0, 2(s2) + slli t0, t0, 16 + or t1, t1, t0 + lhu t0, 4(s2) + slli t0, t0, 32 + or t1, t1, t0 + lhu t0, 6(s2) + slli t0, t0, 48 + or t1, t1, t0 + j L_ualn_ld91_e +L_ualn_ld91_b: + lbu t1, 0(s2) + lbu t0, 1(s2) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 2(s2) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 3(s2) + slli t0, t0, 24 + or t1, t1, t0 + lbu t0, 4(s2) + slli t0, t0, 32 + or t1, t1, t0 + lbu t0, 5(s2) + slli t0, t0, 40 + or t1, t1, t0 + lbu t0, 6(s2) + slli t0, t0, 48 + or t1, t1, t0 + lbu t0, 7(s2) + slli t0, t0, 56 + or t1, t1, t0 +L_ualn_ld91_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t1, 0(s5) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 8(s2) +#else + andi t0, s2, 3 + bnez t0, L_ualn_lw92_h + lw t1, 8(s2) + j L_ualn_lw92_e +L_ualn_lw92_h: + andi t0, t0, 1 + bnez t0, L_ualn_lw92_b + lhu t1, 8(s2) + lhu t0, 10(s2) + slli t0, t0, 16 + or t1, t1, t0 + addiw t1, t1, 0 + j L_ualn_lw92_e +L_ualn_lw92_b: + lbu t1, 8(s2) + lbu t0, 9(s2) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 10(s2) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 11(s2) + slli t0, t0, 24 + or t1, t1, t0 + addiw t1, t1, 0 +L_ualn_lw92_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 8(s5) + sb zero, 12(s5) + sb zero, 13(s5) + sb zero, 14(s5) + li t1, 1 + sb t1, 15(s5) + j L_AES_GCM_init_RISCV64_j0done +L_AES_GCM_init_RISCV64_j0ghash: + # Length block 0^64 || nonceSz*8 (BE) into reg (nonceSz still valid) + mv t0, s5 + sd zero, 0(t0) + sd zero, 8(t0) + slli t1, s3, 3 + srli t2, t1, 32 + andi t2, t2, 7 + sb t2, 11(t0) + srli t2, t1, 24 + srli t3, t1, 16 + srli t4, t1, 8 + sb t2, 12(t0) + sb t3, 13(t0) + sb t4, 14(t0) + sb t1, 15(t0) + sd s7, 24(sp) + sd s9, 16(sp) + mv s7, s2 + mv s9, s3 + beqz s9, L_AES_GCM_init_RISCV64_j0n_gdone + srli a6, s9, 4 + beqz a6, L_AES_GCM_init_RISCV64_j0n_gpart +L_AES_GCM_init_RISCV64_j0n_gloop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld93_w + ld t5, 0(s7) + j L_ualn_ld93_e +L_ualn_ld93_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld93_h + lwu t5, 0(s7) + lwu t4, 4(s7) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld93_e +L_ualn_ld93_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld93_b + lhu t5, 0(s7) + lhu t4, 2(s7) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(s7) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(s7) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld93_e +L_ualn_ld93_b: + lbu t5, 0(s7) + lbu t4, 1(s7) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(s7) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(s7) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(s7) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(s7) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(s7) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(s7) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld93_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld94_w + ld a5, 8(s7) + j L_ualn_ld94_e +L_ualn_ld94_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld94_h + lwu a5, 8(s7) + lwu t4, 12(s7) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld94_e +L_ualn_ld94_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld94_b + lhu a5, 8(s7) + lhu t4, 10(s7) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(s7) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(s7) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld94_e +L_ualn_ld94_b: + lbu a5, 8(s7) + lbu t4, 9(s7) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(s7) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(s7) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(s7) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(s7) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(s7) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(s7) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld94_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi s7, s7, 16 + addi a6, a6, -1 + bnez a6, L_AES_GCM_init_RISCV64_j0n_gloop +L_AES_GCM_init_RISCV64_j0n_gpart: + andi a6, s9, 15 + beqz a6, L_AES_GCM_init_RISCV64_j0n_gdone + mv t0, s6 + sd zero, 0(t0) + sd zero, 8(t0) + mv t1, a6 +L_AES_GCM_init_RISCV64_j0n_gpb: + lb t2, 0(s7) + sb t2, 0(t0) + addi s7, s7, 1 + addi t0, t0, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_init_RISCV64_j0n_gpb + mv t0, s6 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 +L_AES_GCM_init_RISCV64_j0n_gdone: + # GHASH the length block (from reg) + mv t0, s5 + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + ld s7, 24(sp) + ld s9, 16(sp) + # J0 = reflect(X); store to reg; reset X=0 + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(s5) + sd t1, 8(s5) + li s1, 0 + li s8, 0 +L_AES_GCM_init_RISCV64_j0done: + # initCtr = E_K(J0) + ld t2, 0(s5) + ld t3, 8(s5) + ld a3, 0(a0) + ld a4, 8(a0) + ld a5, 16(a0) + ld a6, 24(a0) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(a0) + ld a4, 40(a0) + ld a5, 48(a0) + ld a6, 56(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(a0) + ld a4, 72(a0) + ld a5, 80(a0) + ld a6, 88(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(a0) + ld a4, 104(a0) + ld a5, 112(a0) + ld a6, 120(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(a0) + ld a4, 136(a0) + ld a5, 144(a0) + ld a6, 152(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(a0) + ld a4, 168(a0) + li t4, 11 + ble a1, t4, L_AES_GCM_init_RISCV64_ekj0_done + ld a5, 176(a0) + ld a6, 184(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(a0) + ld a4, 200(a0) + li t4, 13 + ble a1, t4, L_AES_GCM_init_RISCV64_ekj0_done + ld a5, 208(a0) + ld a6, 216(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(a0) + ld a4, 232(a0) +L_AES_GCM_init_RISCV64_ekj0_done: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 + sd t2, 0(s6) + sd t3, 8(s6) + ld s1, 40(sp) + ld s2, 48(sp) + ld s3, 56(sp) + ld s4, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + ld s8, 96(sp) + ld s9, 104(sp) + addi sp, sp, 112 + ret + .size AES_GCM_init_RISCV64,.-AES_GCM_init_RISCV64 + .text + .globl AES_GCM_ghash_block_RISCV64 + .type AES_GCM_ghash_block_RISCV64,@function + .align 2 +AES_GCM_ghash_block_RISCV64: + addi sp, sp, -16 + sd s1, 0(sp) + sd s8, 8(sp) + mv a6, a2 + ld t0, 0(a1) + ld t1, 8(a1) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + mv s1, t0 + mv s8, t1 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld95_w + ld t5, 0(a0) + j L_ualn_ld95_e +L_ualn_ld95_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld95_h + lwu t5, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld95_e +L_ualn_ld95_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld95_b + lhu t5, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld95_e +L_ualn_ld95_b: + lbu t5, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld95_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld96_w + ld a5, 8(a0) + j L_ualn_ld96_e +L_ualn_ld96_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld96_h + lwu a5, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld96_e +L_ualn_ld96_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld96_b + lhu a5, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld96_e +L_ualn_ld96_b: + lbu a5, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld96_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(a6) + ld t3, 8(a6) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(a1) + sd t1, 8(a1) + ld s1, 0(sp) + ld s8, 8(sp) + addi sp, sp, 16 + ret + .size AES_GCM_ghash_block_RISCV64,.-AES_GCM_ghash_block_RISCV64 + .text + .globl AES_GCM_aad_update_RISCV64 + .type AES_GCM_aad_update_RISCV64,@function + .align 2 +AES_GCM_aad_update_RISCV64: + addi sp, sp, -32 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s8, 24(sp) + mv s2, a2 + mv s3, a3 + ld t0, 0(s2) + ld t1, 8(s2) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + mv s1, t0 + mv s8, t1 + srli a7, a1, 4 + beqz a7, L_AES_GCM_aad_update_RISCV64_done +L_AES_GCM_aad_update_RISCV64_loop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld97_w + ld t5, 0(a0) + j L_ualn_ld97_e +L_ualn_ld97_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld97_h + lwu t5, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld97_e +L_ualn_ld97_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld97_b + lhu t5, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld97_e +L_ualn_ld97_b: + lbu t5, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld97_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld98_w + ld a5, 8(a0) + j L_ualn_ld98_e +L_ualn_ld98_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld98_h + lwu a5, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld98_e +L_ualn_ld98_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld98_b + lhu a5, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld98_e +L_ualn_ld98_b: + lbu a5, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld98_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s3) + ld t3, 8(s3) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi a0, a0, 16 + addi a7, a7, -1 + bnez a7, L_AES_GCM_aad_update_RISCV64_loop +L_AES_GCM_aad_update_RISCV64_done: + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(s2) + sd t1, 8(s2) + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s8, 24(sp) + addi sp, sp, 32 + ret + .size AES_GCM_aad_update_RISCV64,.-AES_GCM_aad_update_RISCV64 + .text + .globl AES_GCM_encrypt_block_RISCV64 + .type AES_GCM_encrypt_block_RISCV64,@function + .align 2 +AES_GCM_encrypt_block_RISCV64: + addi sp, sp, -16 + sd s1, 0(sp) + sd s2, 8(sp) + mv a7, a2 + mv s1, a3 + mv s2, a4 + lbu t0, 12(s2) + lbu t1, 13(s2) + lbu t2, 14(s2) + lbu t3, 15(s2) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s2) + sb t2, 13(s2) + sb t3, 14(s2) + sb t0, 15(s2) + ld t2, 0(s2) + ld t3, 8(s2) + ld a3, 0(a0) + ld a4, 8(a0) + ld a5, 16(a0) + ld a6, 24(a0) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(a0) + ld a4, 40(a0) + ld a5, 48(a0) + ld a6, 56(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(a0) + ld a4, 72(a0) + ld a5, 80(a0) + ld a6, 88(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(a0) + ld a4, 104(a0) + ld a5, 112(a0) + ld a6, 120(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(a0) + ld a4, 136(a0) + ld a5, 144(a0) + ld a6, 152(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(a0) + ld a4, 168(a0) + li t4, 11 + ble a1, t4, L_AES_GCM_encrypt_block_RISCV64_done + ld a5, 176(a0) + ld a6, 184(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(a0) + ld a4, 200(a0) + li t4, 13 + ble a1, t4, L_AES_GCM_encrypt_block_RISCV64_done + ld a5, 208(a0) + ld a6, 216(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(a0) + ld a4, 232(a0) +L_AES_GCM_encrypt_block_RISCV64_done: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(s1) +#else + andi t6, s1, 7 + bnez t6, L_ualn_ld99_w + ld t5, 0(s1) + j L_ualn_ld99_e +L_ualn_ld99_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld99_h + lwu t5, 0(s1) + lwu t6, 4(s1) + slli t6, t6, 32 + or t5, t5, t6 + j L_ualn_ld99_e +L_ualn_ld99_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld99_b + lhu t5, 0(s1) + lhu t6, 2(s1) + slli t6, t6, 16 + or t5, t5, t6 + lhu t6, 4(s1) + slli t6, t6, 32 + or t5, t5, t6 + lhu t6, 6(s1) + slli t6, t6, 48 + or t5, t5, t6 + j L_ualn_ld99_e +L_ualn_ld99_b: + lbu t5, 0(s1) + lbu t6, 1(s1) + slli t6, t6, 8 + or t5, t5, t6 + lbu t6, 2(s1) + slli t6, t6, 16 + or t5, t5, t6 + lbu t6, 3(s1) + slli t6, t6, 24 + or t5, t5, t6 + lbu t6, 4(s1) + slli t6, t6, 32 + or t5, t5, t6 + lbu t6, 5(s1) + slli t6, t6, 40 + or t5, t5, t6 + lbu t6, 6(s1) + slli t6, t6, 48 + or t5, t5, t6 + lbu t6, 7(s1) + slli t6, t6, 56 + or t5, t5, t6 +L_ualn_ld99_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t4, 8(s1) +#else + andi t6, s1, 7 + bnez t6, L_ualn_ld100_w + ld t4, 8(s1) + j L_ualn_ld100_e +L_ualn_ld100_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld100_h + lwu t4, 8(s1) + lwu t6, 12(s1) + slli t6, t6, 32 + or t4, t4, t6 + j L_ualn_ld100_e +L_ualn_ld100_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld100_b + lhu t4, 8(s1) + lhu t6, 10(s1) + slli t6, t6, 16 + or t4, t4, t6 + lhu t6, 12(s1) + slli t6, t6, 32 + or t4, t4, t6 + lhu t6, 14(s1) + slli t6, t6, 48 + or t4, t4, t6 + j L_ualn_ld100_e +L_ualn_ld100_b: + lbu t4, 8(s1) + lbu t6, 9(s1) + slli t6, t6, 8 + or t4, t4, t6 + lbu t6, 10(s1) + slli t6, t6, 16 + or t4, t4, t6 + lbu t6, 11(s1) + slli t6, t6, 24 + or t4, t4, t6 + lbu t6, 12(s1) + slli t6, t6, 32 + or t4, t4, t6 + lbu t6, 13(s1) + slli t6, t6, 40 + or t4, t4, t6 + lbu t6, 14(s1) + slli t6, t6, 48 + or t4, t4, t6 + lbu t6, 15(s1) + slli t6, t6, 56 + or t4, t4, t6 +L_ualn_ld100_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, t2, t5 + xor t3, t3, t4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a7) +#else + andi t6, a7, 7 + bnez t6, L_ualn_sd101_w + sd t2, 0(a7) + j L_ualn_sd101_e +L_ualn_sd101_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd101_h + sw t2, 0(a7) + srli t6, t2, 32 + sw t6, 4(a7) + j L_ualn_sd101_e +L_ualn_sd101_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd101_b + sh t2, 0(a7) + srli t6, t2, 16 + sh t6, 2(a7) + srli t6, t2, 32 + sh t6, 4(a7) + srli t6, t2, 48 + sh t6, 6(a7) + j L_ualn_sd101_e +L_ualn_sd101_b: + sb t2, 0(a7) + srli t6, t2, 8 + sb t6, 1(a7) + srli t6, t2, 16 + sb t6, 2(a7) + srli t6, t2, 24 + sb t6, 3(a7) + srli t6, t2, 32 + sb t6, 4(a7) + srli t6, t2, 40 + sb t6, 5(a7) + srli t6, t2, 48 + sb t6, 6(a7) + srli t6, t2, 56 + sb t6, 7(a7) +L_ualn_sd101_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a7) +#else + andi t6, a7, 7 + bnez t6, L_ualn_sd102_w + sd t3, 8(a7) + j L_ualn_sd102_e +L_ualn_sd102_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd102_h + sw t3, 8(a7) + srli t6, t3, 32 + sw t6, 12(a7) + j L_ualn_sd102_e +L_ualn_sd102_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd102_b + sh t3, 8(a7) + srli t6, t3, 16 + sh t6, 10(a7) + srli t6, t3, 32 + sh t6, 12(a7) + srli t6, t3, 48 + sh t6, 14(a7) + j L_ualn_sd102_e +L_ualn_sd102_b: + sb t3, 8(a7) + srli t6, t3, 8 + sb t6, 9(a7) + srli t6, t3, 16 + sb t6, 10(a7) + srli t6, t3, 24 + sb t6, 11(a7) + srli t6, t3, 32 + sb t6, 12(a7) + srli t6, t3, 40 + sb t6, 13(a7) + srli t6, t3, 48 + sb t6, 14(a7) + srli t6, t3, 56 + sb t6, 15(a7) +L_ualn_sd102_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld s1, 0(sp) + ld s2, 8(sp) + addi sp, sp, 16 + ret + .size AES_GCM_encrypt_block_RISCV64,.-AES_GCM_encrypt_block_RISCV64 + .text + .globl AES_GCM_encrypt_update_RISCV64 + .type AES_GCM_encrypt_update_RISCV64,@function + .align 2 +AES_GCM_encrypt_update_RISCV64: + addi sp, sp, -64 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + sd s5, 32(sp) + sd s6, 40(sp) + sd s7, 48(sp) + sd s8, 56(sp) + mv s2, a2 + mv s3, a3 + mv s4, a4 + mv s5, a5 + mv s6, a6 + mv s7, a7 + ld t0, 0(s5) + ld t1, 8(s5) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + mv s1, t0 + mv s8, t1 + srli a7, s4, 4 + beqz a7, L_AES_GCM_encrypt_update_RISCV64_done +L_AES_GCM_encrypt_update_RISCV64_loop: + lbu t0, 12(s7) + lbu t1, 13(s7) + lbu t2, 14(s7) + lbu t3, 15(s7) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s7) + sb t2, 13(s7) + sb t3, 14(s7) + sb t0, 15(s7) + ld t2, 0(s7) + ld t3, 8(s7) + ld a3, 0(a0) + ld a4, 8(a0) + ld a5, 16(a0) + ld a6, 24(a0) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(a0) + ld a4, 40(a0) + ld a5, 48(a0) + ld a6, 56(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(a0) + ld a4, 72(a0) + ld a5, 80(a0) + ld a6, 88(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(a0) + ld a4, 104(a0) + ld a5, 112(a0) + ld a6, 120(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(a0) + ld a4, 136(a0) + ld a5, 144(a0) + ld a6, 152(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(a0) + ld a4, 168(a0) + li t4, 11 + ble a1, t4, L_AES_GCM_encrypt_update_RISCV64_enc + ld a5, 176(a0) + ld a6, 184(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(a0) + ld a4, 200(a0) + li t4, 13 + ble a1, t4, L_AES_GCM_encrypt_update_RISCV64_enc + ld a5, 208(a0) + ld a6, 216(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(a0) + ld a4, 232(a0) +L_AES_GCM_encrypt_update_RISCV64_enc: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(s3) +#else + andi t4, s3, 7 + bnez t4, L_ualn_ld103_w + ld t5, 0(s3) + j L_ualn_ld103_e +L_ualn_ld103_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld103_h + lwu t5, 0(s3) + lwu t4, 4(s3) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld103_e +L_ualn_ld103_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld103_b + lhu t5, 0(s3) + lhu t4, 2(s3) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(s3) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(s3) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld103_e +L_ualn_ld103_b: + lbu t5, 0(s3) + lbu t4, 1(s3) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(s3) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(s3) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(s3) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(s3) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(s3) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(s3) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld103_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(s3) +#else + andi t4, s3, 7 + bnez t4, L_ualn_ld104_w + ld a5, 8(s3) + j L_ualn_ld104_e +L_ualn_ld104_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld104_h + lwu a5, 8(s3) + lwu t4, 12(s3) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld104_e +L_ualn_ld104_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld104_b + lhu a5, 8(s3) + lhu t4, 10(s3) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(s3) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(s3) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld104_e +L_ualn_ld104_b: + lbu a5, 8(s3) + lbu t4, 9(s3) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(s3) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(s3) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(s3) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(s3) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(s3) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(s3) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld104_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, t2, t5 + xor t3, t3, a5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(s2) +#else + andi t4, s2, 7 + bnez t4, L_ualn_sd105_w + sd t2, 0(s2) + j L_ualn_sd105_e +L_ualn_sd105_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd105_h + sw t2, 0(s2) + srli t4, t2, 32 + sw t4, 4(s2) + j L_ualn_sd105_e +L_ualn_sd105_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd105_b + sh t2, 0(s2) + srli t4, t2, 16 + sh t4, 2(s2) + srli t4, t2, 32 + sh t4, 4(s2) + srli t4, t2, 48 + sh t4, 6(s2) + j L_ualn_sd105_e +L_ualn_sd105_b: + sb t2, 0(s2) + srli t4, t2, 8 + sb t4, 1(s2) + srli t4, t2, 16 + sb t4, 2(s2) + srli t4, t2, 24 + sb t4, 3(s2) + srli t4, t2, 32 + sb t4, 4(s2) + srli t4, t2, 40 + sb t4, 5(s2) + srli t4, t2, 48 + sb t4, 6(s2) + srli t4, t2, 56 + sb t4, 7(s2) +L_ualn_sd105_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(s2) +#else + andi t4, s2, 7 + bnez t4, L_ualn_sd106_w + sd t3, 8(s2) + j L_ualn_sd106_e +L_ualn_sd106_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd106_h + sw t3, 8(s2) + srli t4, t3, 32 + sw t4, 12(s2) + j L_ualn_sd106_e +L_ualn_sd106_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd106_b + sh t3, 8(s2) + srli t4, t3, 16 + sh t4, 10(s2) + srli t4, t3, 32 + sh t4, 12(s2) + srli t4, t3, 48 + sh t4, 14(s2) + j L_ualn_sd106_e +L_ualn_sd106_b: + sb t3, 8(s2) + srli t4, t3, 8 + sb t4, 9(s2) + srli t4, t3, 16 + sb t4, 10(s2) + srli t4, t3, 24 + sb t4, 11(s2) + srli t4, t3, 32 + sb t4, 12(s2) + srli t4, t3, 40 + sb t4, 13(s2) + srli t4, t3, 48 + sb t4, 14(s2) + srli t4, t3, 56 + sb t4, 15(s2) +L_ualn_sd106_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t5, t2 + mv a5, t3 + mv t0, s1 + mv t1, s8 + ld t2, 0(s6) + ld t3, 8(s6) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi s3, s3, 16 + addi s2, s2, 16 + addi a7, a7, -1 + bnez a7, L_AES_GCM_encrypt_update_RISCV64_loop +L_AES_GCM_encrypt_update_RISCV64_done: + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(s5) + sd t1, 8(s5) + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + ld s5, 32(sp) + ld s6, 40(sp) + ld s7, 48(sp) + ld s8, 56(sp) + addi sp, sp, 64 + ret + .size AES_GCM_encrypt_update_RISCV64,.-AES_GCM_encrypt_update_RISCV64 + .text + .globl AES_GCM_encrypt_final_RISCV64 + .type AES_GCM_encrypt_final_RISCV64,@function + .align 2 +AES_GCM_encrypt_final_RISCV64: + addi sp, sp, -48 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + sd s5, 32(sp) + sd s8, 40(sp) + mv a7, a2 + mv s2, a3 + mv s3, a4 + mv s4, a5 + mv s5, a6 + ld t0, 0(a0) + ld t1, 8(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + mv s1, t0 + mv s8, t1 + mv t0, a0 + sd zero, 0(t0) + sd zero, 8(t0) + slli s3, s3, 3 + srli t2, s3, 32 + andi t2, t2, 7 + sb t2, 3(t0) + srli t2, s3, 24 + srli t3, s3, 16 + srli t4, s3, 8 + sb t2, 4(t0) + sb t3, 5(t0) + sb t4, 6(t0) + sb s3, 7(t0) + slli s2, s2, 3 + srli t2, s2, 32 + andi t2, t2, 7 + sb t2, 11(t0) + srli t2, s2, 24 + srli t3, s2, 16 + srli t4, s2, 8 + sb t2, 12(t0) + sb t3, 13(t0) + sb t4, 14(t0) + sb s2, 15(t0) + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s4) + ld t3, 8(s4) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + # tag = reflect(X) ^ initCtr(=E_K(J0)) + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + ld t2, 0(s5) + ld t3, 8(s5) + xor t0, t0, t2 + xor t1, t1, t3 + mv t4, a0 + sd t0, 0(t4) + sd t1, 8(t4) + mv t0, a0 + mv t3, a7 +L_AES_GCM_encrypt_final_RISCV64_stag: + lb t4, 0(t0) + sb t4, 0(a1) + addi t0, t0, 1 + addi a1, a1, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_encrypt_final_RISCV64_stag + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + ld s5, 32(sp) + ld s8, 40(sp) + addi sp, sp, 48 + ret + .size AES_GCM_encrypt_final_RISCV64,.-AES_GCM_encrypt_final_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_GCM_decrypt_update_RISCV64 + .type AES_GCM_decrypt_update_RISCV64,@function + .align 2 +AES_GCM_decrypt_update_RISCV64: + addi sp, sp, -64 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + sd s5, 32(sp) + sd s6, 40(sp) + sd s7, 48(sp) + sd s8, 56(sp) + mv s2, a2 + mv s3, a3 + mv s4, a4 + mv s5, a5 + mv s6, a6 + mv s7, a7 + ld t0, 0(s5) + ld t1, 8(s5) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + mv s1, t0 + mv s8, t1 + srli a7, s4, 4 + beqz a7, L_AES_GCM_decrypt_update_RISCV64_done +L_AES_GCM_decrypt_update_RISCV64_loop: + lbu t0, 12(s7) + lbu t1, 13(s7) + lbu t2, 14(s7) + lbu t3, 15(s7) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s7) + sb t2, 13(s7) + sb t3, 14(s7) + sb t0, 15(s7) + ld t2, 0(s7) + ld t3, 8(s7) + ld a3, 0(a0) + ld a4, 8(a0) + ld a5, 16(a0) + ld a6, 24(a0) + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 32(a0) + ld a4, 40(a0) + ld a5, 48(a0) + ld a6, 56(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 64(a0) + ld a4, 72(a0) + ld a5, 80(a0) + ld a6, 88(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 96(a0) + ld a4, 104(a0) + ld a5, 112(a0) + ld a6, 120(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 128(a0) + ld a4, 136(a0) + ld a5, 144(a0) + ld a6, 152(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 160(a0) + ld a4, 168(a0) + li t4, 11 + ble a1, t4, L_AES_GCM_decrypt_update_RISCV64_enc + ld a5, 176(a0) + ld a6, 184(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 192(a0) + ld a4, 200(a0) + li t4, 13 + ble a1, t4, L_AES_GCM_decrypt_update_RISCV64_enc + ld a5, 208(a0) + ld a6, 216(a0) + # aes64esm x7, x5, x6 + .word 0x366283b3 + # aes64esm x28, x6, x5 + .word 0x36530e33 + xor t2, t2, a3 + xor t3, t3, a4 + # aes64esm x5, x7, x28 + .word 0x37c382b3 + # aes64esm x6, x28, x7 + .word 0x367e0333 + xor t0, t0, a5 + xor t1, t1, a6 + ld a3, 224(a0) + ld a4, 232(a0) +L_AES_GCM_decrypt_update_RISCV64_enc: + # aes64es x7, x5, x6 + .word 0x326283b3 + # aes64es x28, x6, x5 + .word 0x32530e33 + xor t2, t2, a3 + xor t3, t3, a4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(s3) +#else + andi t4, s3, 7 + bnez t4, L_ualn_ld107_w + ld t5, 0(s3) + j L_ualn_ld107_e +L_ualn_ld107_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld107_h + lwu t5, 0(s3) + lwu t4, 4(s3) + slli t4, t4, 32 + or t5, t5, t4 + j L_ualn_ld107_e +L_ualn_ld107_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld107_b + lhu t5, 0(s3) + lhu t4, 2(s3) + slli t4, t4, 16 + or t5, t5, t4 + lhu t4, 4(s3) + slli t4, t4, 32 + or t5, t5, t4 + lhu t4, 6(s3) + slli t4, t4, 48 + or t5, t5, t4 + j L_ualn_ld107_e +L_ualn_ld107_b: + lbu t5, 0(s3) + lbu t4, 1(s3) + slli t4, t4, 8 + or t5, t5, t4 + lbu t4, 2(s3) + slli t4, t4, 16 + or t5, t5, t4 + lbu t4, 3(s3) + slli t4, t4, 24 + or t5, t5, t4 + lbu t4, 4(s3) + slli t4, t4, 32 + or t5, t5, t4 + lbu t4, 5(s3) + slli t4, t4, 40 + or t5, t5, t4 + lbu t4, 6(s3) + slli t4, t4, 48 + or t5, t5, t4 + lbu t4, 7(s3) + slli t4, t4, 56 + or t5, t5, t4 +L_ualn_ld107_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(s3) +#else + andi t4, s3, 7 + bnez t4, L_ualn_ld108_w + ld a5, 8(s3) + j L_ualn_ld108_e +L_ualn_ld108_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld108_h + lwu a5, 8(s3) + lwu t4, 12(s3) + slli t4, t4, 32 + or a5, a5, t4 + j L_ualn_ld108_e +L_ualn_ld108_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld108_b + lhu a5, 8(s3) + lhu t4, 10(s3) + slli t4, t4, 16 + or a5, a5, t4 + lhu t4, 12(s3) + slli t4, t4, 32 + or a5, a5, t4 + lhu t4, 14(s3) + slli t4, t4, 48 + or a5, a5, t4 + j L_ualn_ld108_e +L_ualn_ld108_b: + lbu a5, 8(s3) + lbu t4, 9(s3) + slli t4, t4, 8 + or a5, a5, t4 + lbu t4, 10(s3) + slli t4, t4, 16 + or a5, a5, t4 + lbu t4, 11(s3) + slli t4, t4, 24 + or a5, a5, t4 + lbu t4, 12(s3) + slli t4, t4, 32 + or a5, a5, t4 + lbu t4, 13(s3) + slli t4, t4, 40 + or a5, a5, t4 + lbu t4, 14(s3) + slli t4, t4, 48 + or a5, a5, t4 + lbu t4, 15(s3) + slli t4, t4, 56 + or a5, a5, t4 +L_ualn_ld108_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t2, t2, t5 + xor t3, t3, a5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(s2) +#else + andi t4, s2, 7 + bnez t4, L_ualn_sd109_w + sd t2, 0(s2) + j L_ualn_sd109_e +L_ualn_sd109_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd109_h + sw t2, 0(s2) + srli t4, t2, 32 + sw t4, 4(s2) + j L_ualn_sd109_e +L_ualn_sd109_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd109_b + sh t2, 0(s2) + srli t4, t2, 16 + sh t4, 2(s2) + srli t4, t2, 32 + sh t4, 4(s2) + srli t4, t2, 48 + sh t4, 6(s2) + j L_ualn_sd109_e +L_ualn_sd109_b: + sb t2, 0(s2) + srli t4, t2, 8 + sb t4, 1(s2) + srli t4, t2, 16 + sb t4, 2(s2) + srli t4, t2, 24 + sb t4, 3(s2) + srli t4, t2, 32 + sb t4, 4(s2) + srli t4, t2, 40 + sb t4, 5(s2) + srli t4, t2, 48 + sb t4, 6(s2) + srli t4, t2, 56 + sb t4, 7(s2) +L_ualn_sd109_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(s2) +#else + andi t4, s2, 7 + bnez t4, L_ualn_sd110_w + sd t3, 8(s2) + j L_ualn_sd110_e +L_ualn_sd110_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd110_h + sw t3, 8(s2) + srli t4, t3, 32 + sw t4, 12(s2) + j L_ualn_sd110_e +L_ualn_sd110_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd110_b + sh t3, 8(s2) + srli t4, t3, 16 + sh t4, 10(s2) + srli t4, t3, 32 + sh t4, 12(s2) + srli t4, t3, 48 + sh t4, 14(s2) + j L_ualn_sd110_e +L_ualn_sd110_b: + sb t3, 8(s2) + srli t4, t3, 8 + sb t4, 9(s2) + srli t4, t3, 16 + sb t4, 10(s2) + srli t4, t3, 24 + sb t4, 11(s2) + srli t4, t3, 32 + sb t4, 12(s2) + srli t4, t3, 40 + sb t4, 13(s2) + srli t4, t3, 48 + sb t4, 14(s2) + srli t4, t3, 56 + sb t4, 15(s2) +L_ualn_sd110_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, s1 + mv t1, s8 + ld t2, 0(s6) + ld t3, 8(s6) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + addi s3, s3, 16 + addi s2, s2, 16 + addi a7, a7, -1 + bnez a7, L_AES_GCM_decrypt_update_RISCV64_loop +L_AES_GCM_decrypt_update_RISCV64_done: + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + sd t0, 0(s5) + sd t1, 8(s5) + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + ld s5, 32(sp) + ld s6, 40(sp) + ld s7, 48(sp) + ld s8, 56(sp) + addi sp, sp, 64 + ret + .size AES_GCM_decrypt_update_RISCV64,.-AES_GCM_decrypt_update_RISCV64 + .text + .globl AES_GCM_decrypt_final_RISCV64 + .type AES_GCM_decrypt_final_RISCV64,@function + .align 2 +AES_GCM_decrypt_final_RISCV64: + addi sp, sp, -64 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + sd s5, 32(sp) + sd s6, 40(sp) + sd s7, 48(sp) + sd s8, 56(sp) + mv s2, a2 + mv s3, a3 + mv s4, a4 + mv s5, a5 + mv s6, a6 + mv s7, a7 + ld t0, 0(a0) + ld t1, 8(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li t2, 6148914691236517205 + srli t3, t0, 1 + srli t4, t1, 1 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, t3 + or t1, t1, t4 + li t2, 3689348814741910323 + srli t3, t0, 2 + srli t4, t1, 2 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, t3 + or t1, t1, t4 + li t2, 1085102592571150095 + srli t3, t0, 4 + srli t4, t1, 4 + and t0, t0, t2 + and t1, t1, t2 + and t3, t3, t2 + and t4, t4, t2 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, t3 + or t1, t1, t4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + mv s1, t0 + mv s8, t1 + mv t0, a0 + sd zero, 0(t0) + sd zero, 8(t0) + slli s4, s4, 3 + srli t2, s4, 32 + andi t2, t2, 7 + sb t2, 3(t0) + srli t2, s4, 24 + srli t3, s4, 16 + srli t4, s4, 8 + sb t2, 4(t0) + sb t3, 5(t0) + sb t4, 6(t0) + sb s4, 7(t0) + slli s3, s3, 3 + srli t2, s3, 32 + andi t2, t2, 7 + sb t2, 11(t0) + srli t2, s3, 24 + srli t3, s3, 16 + srli t4, s3, 8 + sb t2, 12(t0) + sb t3, 13(t0) + sb t4, 14(t0) + sb s3, 15(t0) + ld t5, 0(t0) + ld a5, 8(t0) + mv t0, s1 + mv t1, s8 + ld t2, 0(s5) + ld t3, 8(s5) + li t6, 135 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x30, x30 + .word 0x687f5f13 + # brev8 x15, x15 + .word 0x6877d793 +#else + li a4, 6148914691236517205 + srli a2, t5, 1 + srli a3, a5, 1 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 1 + slli a5, a5, 1 + or t5, t5, a2 + or a5, a5, a3 + li a4, 3689348814741910323 + srli a2, t5, 2 + srli a3, a5, 2 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 2 + slli a5, a5, 2 + or t5, t5, a2 + or a5, a5, a3 + li a4, 1085102592571150095 + srli a2, t5, 4 + srli a3, a5, 4 + and t5, t5, a4 + and a5, a5, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t5, t5, 4 + slli a5, a5, 4 + or t5, t5, a2 + or a5, a5, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + xor t0, t0, t5 + xor t1, t1, a5 + # clmul x12, x5, x7 + .word 0x0a729633 + # clmulh x29, x5, x7 + .word 0x0a72beb3 + # clmul x30, x6, x28 + .word 0x0bc31f33 + # clmulh x15, x6, x28 + .word 0x0bc337b3 + xor a3, t0, t1 + xor a4, t2, t3 + # clmul x5, x13, x14 + .word 0x0ae692b3 + # clmulh x6, x13, x14 + .word 0x0ae6b333 + xor a3, t4, t0 + xor a3, a3, a2 + xor a3, a3, t5 + xor a4, t5, t1 + xor a4, a4, t4 + xor a4, a4, a5 + # clmul x29, x15, x31 + .word 0x0bf79eb3 + # clmulh x30, x15, x31 + .word 0x0bf7bf33 + xor a3, a3, t4 + xor a4, a4, t5 + # clmul x29, x14, x31 + .word 0x0bf71eb3 + # clmulh x30, x14, x31 + .word 0x0bf73f33 + xor t0, a2, t4 + xor t1, a3, t5 + mv s1, t0 + mv s8, t1 + # tag = reflect(X) ^ initCtr(=E_K(J0)) + mv t0, s1 + mv t1, s8 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # brev8 x5, x5 + .word 0x6872d293 + # brev8 x6, x6 + .word 0x68735313 +#else + li a4, 6148914691236517205 + srli a2, t0, 1 + srli a3, t1, 1 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 1 + slli t1, t1, 1 + or t0, t0, a2 + or t1, t1, a3 + li a4, 3689348814741910323 + srli a2, t0, 2 + srli a3, t1, 2 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 2 + slli t1, t1, 2 + or t0, t0, a2 + or t1, t1, a3 + li a4, 1085102592571150095 + srli a2, t0, 4 + srli a3, t1, 4 + and t0, t0, a4 + and t1, t1, a4 + and a2, a2, a4 + and a3, a3, a4 + slli t0, t0, 4 + slli t1, t1, 4 + or t0, t0, a2 + or t1, t1, a3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + ld t2, 0(s6) + ld t3, 8(s6) + xor t0, t0, t2 + xor t1, t1, t3 + mv t4, a0 + sd t0, 0(t4) + sd t1, 8(t4) + # *res = (match) ? 1 : 0 + mv t0, a0 + mv t3, s2 + xor t2, t2, t2 +L_AES_GCM_decrypt_final_RISCV64_ctag: + lbu t4, 0(t0) + lbu t5, 0(a1) + xor t5, t5, t4 + or t2, t2, t5 + addi t0, t0, 1 + addi a1, a1, 1 + addi t3, t3, -1 + bnez t3, L_AES_GCM_decrypt_final_RISCV64_ctag + sltiu t2, t2, 1 + sw t2, 0(s7) + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + ld s5, 32(sp) + ld s6, 40(sp) + ld s7, 48(sp) + ld s8, 56(sp) + addi sp, sp, 64 + ret + .size AES_GCM_decrypt_final_RISCV64,.-AES_GCM_decrypt_final_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AESGCM_STREAM */ +#endif /* HAVE_AESGCM */ +#else + .section .rodata + .type L_AES_base_te, %object + .size L_AES_base_te, 4096 + # 4-byte aligned, 32-bit aligned + .align 2 +L_AES_base_te: + .long 0xc66363a5,0xf87c7c84,0xee777799,0xf67b7b8d + .long 0xfff2f20d,0xd66b6bbd,0xde6f6fb1,0x91c5c554 + .long 0x60303050,0x02010103,0xce6767a9,0x562b2b7d + .long 0xe7fefe19,0xb5d7d762,0x4dababe6,0xec76769a + .long 0x8fcaca45,0x1f82829d,0x89c9c940,0xfa7d7d87 + .long 0xeffafa15,0xb25959eb,0x8e4747c9,0xfbf0f00b + .long 0x41adadec,0xb3d4d467,0x5fa2a2fd,0x45afafea + .long 0x239c9cbf,0x53a4a4f7,0xe4727296,0x9bc0c05b + .long 0x75b7b7c2,0xe1fdfd1c,0x3d9393ae,0x4c26266a + .long 0x6c36365a,0x7e3f3f41,0xf5f7f702,0x83cccc4f + .long 0x6834345c,0x51a5a5f4,0xd1e5e534,0xf9f1f108 + .long 0xe2717193,0xabd8d873,0x62313153,0x2a15153f + .long 0x0804040c,0x95c7c752,0x46232365,0x9dc3c35e + .long 0x30181828,0x379696a1,0x0a05050f,0x2f9a9ab5 + .long 0x0e070709,0x24121236,0x1b80809b,0xdfe2e23d + .long 0xcdebeb26,0x4e272769,0x7fb2b2cd,0xea75759f + .long 0x1209091b,0x1d83839e,0x582c2c74,0x341a1a2e + .long 0x361b1b2d,0xdc6e6eb2,0xb45a5aee,0x5ba0a0fb + .long 0xa45252f6,0x763b3b4d,0xb7d6d661,0x7db3b3ce + .long 0x5229297b,0xdde3e33e,0x5e2f2f71,0x13848497 + .long 0xa65353f5,0xb9d1d168,0x00000000,0xc1eded2c + .long 0x40202060,0xe3fcfc1f,0x79b1b1c8,0xb65b5bed + .long 0xd46a6abe,0x8dcbcb46,0x67bebed9,0x7239394b + .long 0x944a4ade,0x984c4cd4,0xb05858e8,0x85cfcf4a + .long 0xbbd0d06b,0xc5efef2a,0x4faaaae5,0xedfbfb16 + .long 0x864343c5,0x9a4d4dd7,0x66333355,0x11858594 + .long 0x8a4545cf,0xe9f9f910,0x04020206,0xfe7f7f81 + .long 0xa05050f0,0x783c3c44,0x259f9fba,0x4ba8a8e3 + .long 0xa25151f3,0x5da3a3fe,0x804040c0,0x058f8f8a + .long 0x3f9292ad,0x219d9dbc,0x70383848,0xf1f5f504 + .long 0x63bcbcdf,0x77b6b6c1,0xafdada75,0x42212163 + .long 0x20101030,0xe5ffff1a,0xfdf3f30e,0xbfd2d26d + .long 0x81cdcd4c,0x180c0c14,0x26131335,0xc3ecec2f + .long 0xbe5f5fe1,0x359797a2,0x884444cc,0x2e171739 + .long 0x93c4c457,0x55a7a7f2,0xfc7e7e82,0x7a3d3d47 + .long 0xc86464ac,0xba5d5de7,0x3219192b,0xe6737395 + .long 0xc06060a0,0x19818198,0x9e4f4fd1,0xa3dcdc7f + .long 0x44222266,0x542a2a7e,0x3b9090ab,0x0b888883 + .long 0x8c4646ca,0xc7eeee29,0x6bb8b8d3,0x2814143c + .long 0xa7dede79,0xbc5e5ee2,0x160b0b1d,0xaddbdb76 + .long 0xdbe0e03b,0x64323256,0x743a3a4e,0x140a0a1e + .long 0x924949db,0x0c06060a,0x4824246c,0xb85c5ce4 + .long 0x9fc2c25d,0xbdd3d36e,0x43acacef,0xc46262a6 + .long 0x399191a8,0x319595a4,0xd3e4e437,0xf279798b + .long 0xd5e7e732,0x8bc8c843,0x6e373759,0xda6d6db7 + .long 0x018d8d8c,0xb1d5d564,0x9c4e4ed2,0x49a9a9e0 + .long 0xd86c6cb4,0xac5656fa,0xf3f4f407,0xcfeaea25 + .long 0xca6565af,0xf47a7a8e,0x47aeaee9,0x10080818 + .long 0x6fbabad5,0xf0787888,0x4a25256f,0x5c2e2e72 + .long 0x381c1c24,0x57a6a6f1,0x73b4b4c7,0x97c6c651 + .long 0xcbe8e823,0xa1dddd7c,0xe874749c,0x3e1f1f21 + .long 0x964b4bdd,0x61bdbddc,0x0d8b8b86,0x0f8a8a85 + .long 0xe0707090,0x7c3e3e42,0x71b5b5c4,0xcc6666aa + .long 0x904848d8,0x06030305,0xf7f6f601,0x1c0e0e12 + .long 0xc26161a3,0x6a35355f,0xae5757f9,0x69b9b9d0 + .long 0x17868691,0x99c1c158,0x3a1d1d27,0x279e9eb9 + .long 0xd9e1e138,0xebf8f813,0x2b9898b3,0x22111133 + .long 0xd26969bb,0xa9d9d970,0x078e8e89,0x339494a7 + .long 0x2d9b9bb6,0x3c1e1e22,0x15878792,0xc9e9e920 + .long 0x87cece49,0xaa5555ff,0x50282878,0xa5dfdf7a + .long 0x038c8c8f,0x59a1a1f8,0x09898980,0x1a0d0d17 + .long 0x65bfbfda,0xd7e6e631,0x844242c6,0xd06868b8 + .long 0x824141c3,0x299999b0,0x5a2d2d77,0x1e0f0f11 + .long 0x7bb0b0cb,0xa85454fc,0x6dbbbbd6,0x2c16163a + .long 0xa5c66363,0x84f87c7c,0x99ee7777,0x8df67b7b + .long 0x0dfff2f2,0xbdd66b6b,0xb1de6f6f,0x5491c5c5 + .long 0x50603030,0x03020101,0xa9ce6767,0x7d562b2b + .long 0x19e7fefe,0x62b5d7d7,0xe64dabab,0x9aec7676 + .long 0x458fcaca,0x9d1f8282,0x4089c9c9,0x87fa7d7d + .long 0x15effafa,0xebb25959,0xc98e4747,0x0bfbf0f0 + .long 0xec41adad,0x67b3d4d4,0xfd5fa2a2,0xea45afaf + .long 0xbf239c9c,0xf753a4a4,0x96e47272,0x5b9bc0c0 + .long 0xc275b7b7,0x1ce1fdfd,0xae3d9393,0x6a4c2626 + .long 0x5a6c3636,0x417e3f3f,0x02f5f7f7,0x4f83cccc + .long 0x5c683434,0xf451a5a5,0x34d1e5e5,0x08f9f1f1 + .long 0x93e27171,0x73abd8d8,0x53623131,0x3f2a1515 + .long 0x0c080404,0x5295c7c7,0x65462323,0x5e9dc3c3 + .long 0x28301818,0xa1379696,0x0f0a0505,0xb52f9a9a + .long 0x090e0707,0x36241212,0x9b1b8080,0x3ddfe2e2 + .long 0x26cdebeb,0x694e2727,0xcd7fb2b2,0x9fea7575 + .long 0x1b120909,0x9e1d8383,0x74582c2c,0x2e341a1a + .long 0x2d361b1b,0xb2dc6e6e,0xeeb45a5a,0xfb5ba0a0 + .long 0xf6a45252,0x4d763b3b,0x61b7d6d6,0xce7db3b3 + .long 0x7b522929,0x3edde3e3,0x715e2f2f,0x97138484 + .long 0xf5a65353,0x68b9d1d1,0x00000000,0x2cc1eded + .long 0x60402020,0x1fe3fcfc,0xc879b1b1,0xedb65b5b + .long 0xbed46a6a,0x468dcbcb,0xd967bebe,0x4b723939 + .long 0xde944a4a,0xd4984c4c,0xe8b05858,0x4a85cfcf + .long 0x6bbbd0d0,0x2ac5efef,0xe54faaaa,0x16edfbfb + .long 0xc5864343,0xd79a4d4d,0x55663333,0x94118585 + .long 0xcf8a4545,0x10e9f9f9,0x06040202,0x81fe7f7f + .long 0xf0a05050,0x44783c3c,0xba259f9f,0xe34ba8a8 + .long 0xf3a25151,0xfe5da3a3,0xc0804040,0x8a058f8f + .long 0xad3f9292,0xbc219d9d,0x48703838,0x04f1f5f5 + .long 0xdf63bcbc,0xc177b6b6,0x75afdada,0x63422121 + .long 0x30201010,0x1ae5ffff,0x0efdf3f3,0x6dbfd2d2 + .long 0x4c81cdcd,0x14180c0c,0x35261313,0x2fc3ecec + .long 0xe1be5f5f,0xa2359797,0xcc884444,0x392e1717 + .long 0x5793c4c4,0xf255a7a7,0x82fc7e7e,0x477a3d3d + .long 0xacc86464,0xe7ba5d5d,0x2b321919,0x95e67373 + .long 0xa0c06060,0x98198181,0xd19e4f4f,0x7fa3dcdc + .long 0x66442222,0x7e542a2a,0xab3b9090,0x830b8888 + .long 0xca8c4646,0x29c7eeee,0xd36bb8b8,0x3c281414 + .long 0x79a7dede,0xe2bc5e5e,0x1d160b0b,0x76addbdb + .long 0x3bdbe0e0,0x56643232,0x4e743a3a,0x1e140a0a + .long 0xdb924949,0x0a0c0606,0x6c482424,0xe4b85c5c + .long 0x5d9fc2c2,0x6ebdd3d3,0xef43acac,0xa6c46262 + .long 0xa8399191,0xa4319595,0x37d3e4e4,0x8bf27979 + .long 0x32d5e7e7,0x438bc8c8,0x596e3737,0xb7da6d6d + .long 0x8c018d8d,0x64b1d5d5,0xd29c4e4e,0xe049a9a9 + .long 0xb4d86c6c,0xfaac5656,0x07f3f4f4,0x25cfeaea + .long 0xafca6565,0x8ef47a7a,0xe947aeae,0x18100808 + .long 0xd56fbaba,0x88f07878,0x6f4a2525,0x725c2e2e + .long 0x24381c1c,0xf157a6a6,0xc773b4b4,0x5197c6c6 + .long 0x23cbe8e8,0x7ca1dddd,0x9ce87474,0x213e1f1f + .long 0xdd964b4b,0xdc61bdbd,0x860d8b8b,0x850f8a8a + .long 0x90e07070,0x427c3e3e,0xc471b5b5,0xaacc6666 + .long 0xd8904848,0x05060303,0x01f7f6f6,0x121c0e0e + .long 0xa3c26161,0x5f6a3535,0xf9ae5757,0xd069b9b9 + .long 0x91178686,0x5899c1c1,0x273a1d1d,0xb9279e9e + .long 0x38d9e1e1,0x13ebf8f8,0xb32b9898,0x33221111 + .long 0xbbd26969,0x70a9d9d9,0x89078e8e,0xa7339494 + .long 0xb62d9b9b,0x223c1e1e,0x92158787,0x20c9e9e9 + .long 0x4987cece,0xffaa5555,0x78502828,0x7aa5dfdf + .long 0x8f038c8c,0xf859a1a1,0x80098989,0x171a0d0d + .long 0xda65bfbf,0x31d7e6e6,0xc6844242,0xb8d06868 + .long 0xc3824141,0xb0299999,0x775a2d2d,0x111e0f0f + .long 0xcb7bb0b0,0xfca85454,0xd66dbbbb,0x3a2c1616 + .long 0x63a5c663,0x7c84f87c,0x7799ee77,0x7b8df67b + .long 0xf20dfff2,0x6bbdd66b,0x6fb1de6f,0xc55491c5 + .long 0x30506030,0x01030201,0x67a9ce67,0x2b7d562b + .long 0xfe19e7fe,0xd762b5d7,0xabe64dab,0x769aec76 + .long 0xca458fca,0x829d1f82,0xc94089c9,0x7d87fa7d + .long 0xfa15effa,0x59ebb259,0x47c98e47,0xf00bfbf0 + .long 0xadec41ad,0xd467b3d4,0xa2fd5fa2,0xafea45af + .long 0x9cbf239c,0xa4f753a4,0x7296e472,0xc05b9bc0 + .long 0xb7c275b7,0xfd1ce1fd,0x93ae3d93,0x266a4c26 + .long 0x365a6c36,0x3f417e3f,0xf702f5f7,0xcc4f83cc + .long 0x345c6834,0xa5f451a5,0xe534d1e5,0xf108f9f1 + .long 0x7193e271,0xd873abd8,0x31536231,0x153f2a15 + .long 0x040c0804,0xc75295c7,0x23654623,0xc35e9dc3 + .long 0x18283018,0x96a13796,0x050f0a05,0x9ab52f9a + .long 0x07090e07,0x12362412,0x809b1b80,0xe23ddfe2 + .long 0xeb26cdeb,0x27694e27,0xb2cd7fb2,0x759fea75 + .long 0x091b1209,0x839e1d83,0x2c74582c,0x1a2e341a + .long 0x1b2d361b,0x6eb2dc6e,0x5aeeb45a,0xa0fb5ba0 + .long 0x52f6a452,0x3b4d763b,0xd661b7d6,0xb3ce7db3 + .long 0x297b5229,0xe33edde3,0x2f715e2f,0x84971384 + .long 0x53f5a653,0xd168b9d1,0x00000000,0xed2cc1ed + .long 0x20604020,0xfc1fe3fc,0xb1c879b1,0x5bedb65b + .long 0x6abed46a,0xcb468dcb,0xbed967be,0x394b7239 + .long 0x4ade944a,0x4cd4984c,0x58e8b058,0xcf4a85cf + .long 0xd06bbbd0,0xef2ac5ef,0xaae54faa,0xfb16edfb + .long 0x43c58643,0x4dd79a4d,0x33556633,0x85941185 + .long 0x45cf8a45,0xf910e9f9,0x02060402,0x7f81fe7f + .long 0x50f0a050,0x3c44783c,0x9fba259f,0xa8e34ba8 + .long 0x51f3a251,0xa3fe5da3,0x40c08040,0x8f8a058f + .long 0x92ad3f92,0x9dbc219d,0x38487038,0xf504f1f5 + .long 0xbcdf63bc,0xb6c177b6,0xda75afda,0x21634221 + .long 0x10302010,0xff1ae5ff,0xf30efdf3,0xd26dbfd2 + .long 0xcd4c81cd,0x0c14180c,0x13352613,0xec2fc3ec + .long 0x5fe1be5f,0x97a23597,0x44cc8844,0x17392e17 + .long 0xc45793c4,0xa7f255a7,0x7e82fc7e,0x3d477a3d + .long 0x64acc864,0x5de7ba5d,0x192b3219,0x7395e673 + .long 0x60a0c060,0x81981981,0x4fd19e4f,0xdc7fa3dc + .long 0x22664422,0x2a7e542a,0x90ab3b90,0x88830b88 + .long 0x46ca8c46,0xee29c7ee,0xb8d36bb8,0x143c2814 + .long 0xde79a7de,0x5ee2bc5e,0x0b1d160b,0xdb76addb + .long 0xe03bdbe0,0x32566432,0x3a4e743a,0x0a1e140a + .long 0x49db9249,0x060a0c06,0x246c4824,0x5ce4b85c + .long 0xc25d9fc2,0xd36ebdd3,0xacef43ac,0x62a6c462 + .long 0x91a83991,0x95a43195,0xe437d3e4,0x798bf279 + .long 0xe732d5e7,0xc8438bc8,0x37596e37,0x6db7da6d + .long 0x8d8c018d,0xd564b1d5,0x4ed29c4e,0xa9e049a9 + .long 0x6cb4d86c,0x56faac56,0xf407f3f4,0xea25cfea + .long 0x65afca65,0x7a8ef47a,0xaee947ae,0x08181008 + .long 0xbad56fba,0x7888f078,0x256f4a25,0x2e725c2e + .long 0x1c24381c,0xa6f157a6,0xb4c773b4,0xc65197c6 + .long 0xe823cbe8,0xdd7ca1dd,0x749ce874,0x1f213e1f + .long 0x4bdd964b,0xbddc61bd,0x8b860d8b,0x8a850f8a + .long 0x7090e070,0x3e427c3e,0xb5c471b5,0x66aacc66 + .long 0x48d89048,0x03050603,0xf601f7f6,0x0e121c0e + .long 0x61a3c261,0x355f6a35,0x57f9ae57,0xb9d069b9 + .long 0x86911786,0xc15899c1,0x1d273a1d,0x9eb9279e + .long 0xe138d9e1,0xf813ebf8,0x98b32b98,0x11332211 + .long 0x69bbd269,0xd970a9d9,0x8e89078e,0x94a73394 + .long 0x9bb62d9b,0x1e223c1e,0x87921587,0xe920c9e9 + .long 0xce4987ce,0x55ffaa55,0x28785028,0xdf7aa5df + .long 0x8c8f038c,0xa1f859a1,0x89800989,0x0d171a0d + .long 0xbfda65bf,0xe631d7e6,0x42c68442,0x68b8d068 + .long 0x41c38241,0x99b02999,0x2d775a2d,0x0f111e0f + .long 0xb0cb7bb0,0x54fca854,0xbbd66dbb,0x163a2c16 + .long 0x6363a5c6,0x7c7c84f8,0x777799ee,0x7b7b8df6 + .long 0xf2f20dff,0x6b6bbdd6,0x6f6fb1de,0xc5c55491 + .long 0x30305060,0x01010302,0x6767a9ce,0x2b2b7d56 + .long 0xfefe19e7,0xd7d762b5,0xababe64d,0x76769aec + .long 0xcaca458f,0x82829d1f,0xc9c94089,0x7d7d87fa + .long 0xfafa15ef,0x5959ebb2,0x4747c98e,0xf0f00bfb + .long 0xadadec41,0xd4d467b3,0xa2a2fd5f,0xafafea45 + .long 0x9c9cbf23,0xa4a4f753,0x727296e4,0xc0c05b9b + .long 0xb7b7c275,0xfdfd1ce1,0x9393ae3d,0x26266a4c + .long 0x36365a6c,0x3f3f417e,0xf7f702f5,0xcccc4f83 + .long 0x34345c68,0xa5a5f451,0xe5e534d1,0xf1f108f9 + .long 0x717193e2,0xd8d873ab,0x31315362,0x15153f2a + .long 0x04040c08,0xc7c75295,0x23236546,0xc3c35e9d + .long 0x18182830,0x9696a137,0x05050f0a,0x9a9ab52f + .long 0x0707090e,0x12123624,0x80809b1b,0xe2e23ddf + .long 0xebeb26cd,0x2727694e,0xb2b2cd7f,0x75759fea + .long 0x09091b12,0x83839e1d,0x2c2c7458,0x1a1a2e34 + .long 0x1b1b2d36,0x6e6eb2dc,0x5a5aeeb4,0xa0a0fb5b + .long 0x5252f6a4,0x3b3b4d76,0xd6d661b7,0xb3b3ce7d + .long 0x29297b52,0xe3e33edd,0x2f2f715e,0x84849713 + .long 0x5353f5a6,0xd1d168b9,0x00000000,0xeded2cc1 + .long 0x20206040,0xfcfc1fe3,0xb1b1c879,0x5b5bedb6 + .long 0x6a6abed4,0xcbcb468d,0xbebed967,0x39394b72 + .long 0x4a4ade94,0x4c4cd498,0x5858e8b0,0xcfcf4a85 + .long 0xd0d06bbb,0xefef2ac5,0xaaaae54f,0xfbfb16ed + .long 0x4343c586,0x4d4dd79a,0x33335566,0x85859411 + .long 0x4545cf8a,0xf9f910e9,0x02020604,0x7f7f81fe + .long 0x5050f0a0,0x3c3c4478,0x9f9fba25,0xa8a8e34b + .long 0x5151f3a2,0xa3a3fe5d,0x4040c080,0x8f8f8a05 + .long 0x9292ad3f,0x9d9dbc21,0x38384870,0xf5f504f1 + .long 0xbcbcdf63,0xb6b6c177,0xdada75af,0x21216342 + .long 0x10103020,0xffff1ae5,0xf3f30efd,0xd2d26dbf + .long 0xcdcd4c81,0x0c0c1418,0x13133526,0xecec2fc3 + .long 0x5f5fe1be,0x9797a235,0x4444cc88,0x1717392e + .long 0xc4c45793,0xa7a7f255,0x7e7e82fc,0x3d3d477a + .long 0x6464acc8,0x5d5de7ba,0x19192b32,0x737395e6 + .long 0x6060a0c0,0x81819819,0x4f4fd19e,0xdcdc7fa3 + .long 0x22226644,0x2a2a7e54,0x9090ab3b,0x8888830b + .long 0x4646ca8c,0xeeee29c7,0xb8b8d36b,0x14143c28 + .long 0xdede79a7,0x5e5ee2bc,0x0b0b1d16,0xdbdb76ad + .long 0xe0e03bdb,0x32325664,0x3a3a4e74,0x0a0a1e14 + .long 0x4949db92,0x06060a0c,0x24246c48,0x5c5ce4b8 + .long 0xc2c25d9f,0xd3d36ebd,0xacacef43,0x6262a6c4 + .long 0x9191a839,0x9595a431,0xe4e437d3,0x79798bf2 + .long 0xe7e732d5,0xc8c8438b,0x3737596e,0x6d6db7da + .long 0x8d8d8c01,0xd5d564b1,0x4e4ed29c,0xa9a9e049 + .long 0x6c6cb4d8,0x5656faac,0xf4f407f3,0xeaea25cf + .long 0x6565afca,0x7a7a8ef4,0xaeaee947,0x08081810 + .long 0xbabad56f,0x787888f0,0x25256f4a,0x2e2e725c + .long 0x1c1c2438,0xa6a6f157,0xb4b4c773,0xc6c65197 + .long 0xe8e823cb,0xdddd7ca1,0x74749ce8,0x1f1f213e + .long 0x4b4bdd96,0xbdbddc61,0x8b8b860d,0x8a8a850f + .long 0x707090e0,0x3e3e427c,0xb5b5c471,0x6666aacc + .long 0x4848d890,0x03030506,0xf6f601f7,0x0e0e121c + .long 0x6161a3c2,0x35355f6a,0x5757f9ae,0xb9b9d069 + .long 0x86869117,0xc1c15899,0x1d1d273a,0x9e9eb927 + .long 0xe1e138d9,0xf8f813eb,0x9898b32b,0x11113322 + .long 0x6969bbd2,0xd9d970a9,0x8e8e8907,0x9494a733 + .long 0x9b9bb62d,0x1e1e223c,0x87879215,0xe9e920c9 + .long 0xcece4987,0x5555ffaa,0x28287850,0xdfdf7aa5 + .long 0x8c8c8f03,0xa1a1f859,0x89898009,0x0d0d171a + .long 0xbfbfda65,0xe6e631d7,0x4242c684,0x6868b8d0 + .long 0x4141c382,0x9999b029,0x2d2d775a,0x0f0f111e + .long 0xb0b0cb7b,0x5454fca8,0xbbbbd66d,0x16163a2c + .section .rodata + .type L_AES_base_td, %object + .size L_AES_base_td, 4096 + # 4-byte aligned, 32-bit aligned + .align 2 +L_AES_base_td: + .long 0x51f4a750,0x7e416553,0x1a17a4c3,0x3a275e96 + .long 0x3bab6bcb,0x1f9d45f1,0xacfa58ab,0x4be30393 + .long 0x2030fa55,0xad766df6,0x88cc7691,0xf5024c25 + .long 0x4fe5d7fc,0xc52acbd7,0x26354480,0xb562a38f + .long 0xdeb15a49,0x25ba1b67,0x45ea0e98,0x5dfec0e1 + .long 0xc32f7502,0x814cf012,0x8d4697a3,0x6bd3f9c6 + .long 0x038f5fe7,0x15929c95,0xbf6d7aeb,0x955259da + .long 0xd4be832d,0x587421d3,0x49e06929,0x8ec9c844 + .long 0x75c2896a,0xf48e7978,0x99583e6b,0x27b971dd + .long 0xbee14fb6,0xf088ad17,0xc920ac66,0x7dce3ab4 + .long 0x63df4a18,0xe51a3182,0x97513360,0x62537f45 + .long 0xb16477e0,0xbb6bae84,0xfe81a01c,0xf9082b94 + .long 0x70486858,0x8f45fd19,0x94de6c87,0x527bf8b7 + .long 0xab73d323,0x724b02e2,0xe31f8f57,0x6655ab2a + .long 0xb2eb2807,0x2fb5c203,0x86c57b9a,0xd33708a5 + .long 0x302887f2,0x23bfa5b2,0x02036aba,0xed16825c + .long 0x8acf1c2b,0xa779b492,0xf307f2f0,0x4e69e2a1 + .long 0x65daf4cd,0x0605bed5,0xd134621f,0xc4a6fe8a + .long 0x342e539d,0xa2f355a0,0x058ae132,0xa4f6eb75 + .long 0x0b83ec39,0x4060efaa,0x5e719f06,0xbd6e1051 + .long 0x3e218af9,0x96dd063d,0xdd3e05ae,0x4de6bd46 + .long 0x91548db5,0x71c45d05,0x0406d46f,0x605015ff + .long 0x1998fb24,0xd6bde997,0x894043cc,0x67d99e77 + .long 0xb0e842bd,0x07898b88,0xe7195b38,0x79c8eedb + .long 0xa17c0a47,0x7c420fe9,0xf8841ec9,0x00000000 + .long 0x09808683,0x322bed48,0x1e1170ac,0x6c5a724e + .long 0xfd0efffb,0x0f853856,0x3daed51e,0x362d3927 + .long 0x0a0fd964,0x685ca621,0x9b5b54d1,0x24362e3a + .long 0x0c0a67b1,0x9357e70f,0xb4ee96d2,0x1b9b919e + .long 0x80c0c54f,0x61dc20a2,0x5a774b69,0x1c121a16 + .long 0xe293ba0a,0xc0a02ae5,0x3c22e043,0x121b171d + .long 0x0e090d0b,0xf28bc7ad,0x2db6a8b9,0x141ea9c8 + .long 0x57f11985,0xaf75074c,0xee99ddbb,0xa37f60fd + .long 0xf701269f,0x5c72f5bc,0x44663bc5,0x5bfb7e34 + .long 0x8b432976,0xcb23c6dc,0xb6edfc68,0xb8e4f163 + .long 0xd731dcca,0x42638510,0x13972240,0x84c61120 + .long 0x854a247d,0xd2bb3df8,0xaef93211,0xc729a16d + .long 0x1d9e2f4b,0xdcb230f3,0x0d8652ec,0x77c1e3d0 + .long 0x2bb3166c,0xa970b999,0x119448fa,0x47e96422 + .long 0xa8fc8cc4,0xa0f03f1a,0x567d2cd8,0x223390ef + .long 0x87494ec7,0xd938d1c1,0x8ccaa2fe,0x98d40b36 + .long 0xa6f581cf,0xa57ade28,0xdab78e26,0x3fadbfa4 + .long 0x2c3a9de4,0x5078920d,0x6a5fcc9b,0x547e4662 + .long 0xf68d13c2,0x90d8b8e8,0x2e39f75e,0x82c3aff5 + .long 0x9f5d80be,0x69d0937c,0x6fd52da9,0xcf2512b3 + .long 0xc8ac993b,0x10187da7,0xe89c636e,0xdb3bbb7b + .long 0xcd267809,0x6e5918f4,0xec9ab701,0x834f9aa8 + .long 0xe6956e65,0xaaffe67e,0x21bccf08,0xef15e8e6 + .long 0xbae79bd9,0x4a6f36ce,0xea9f09d4,0x29b07cd6 + .long 0x31a4b2af,0x2a3f2331,0xc6a59430,0x35a266c0 + .long 0x744ebc37,0xfc82caa6,0xe090d0b0,0x33a7d815 + .long 0xf104984a,0x41ecdaf7,0x7fcd500e,0x1791f62f + .long 0x764dd68d,0x43efb04d,0xccaa4d54,0xe49604df + .long 0x9ed1b5e3,0x4c6a881b,0xc12c1fb8,0x4665517f + .long 0x9d5eea04,0x018c355d,0xfa877473,0xfb0b412e + .long 0xb3671d5a,0x92dbd252,0xe9105633,0x6dd64713 + .long 0x9ad7618c,0x37a10c7a,0x59f8148e,0xeb133c89 + .long 0xcea927ee,0xb761c935,0xe11ce5ed,0x7a47b13c + .long 0x9cd2df59,0x55f2733f,0x1814ce79,0x73c737bf + .long 0x53f7cdea,0x5ffdaa5b,0xdf3d6f14,0x7844db86 + .long 0xcaaff381,0xb968c43e,0x3824342c,0xc2a3405f + .long 0x161dc372,0xbce2250c,0x283c498b,0xff0d9541 + .long 0x39a80171,0x080cb3de,0xd8b4e49c,0x6456c190 + .long 0x7bcb8461,0xd532b670,0x486c5c74,0xd0b85742 + .long 0x5051f4a7,0x537e4165,0xc31a17a4,0x963a275e + .long 0xcb3bab6b,0xf11f9d45,0xabacfa58,0x934be303 + .long 0x552030fa,0xf6ad766d,0x9188cc76,0x25f5024c + .long 0xfc4fe5d7,0xd7c52acb,0x80263544,0x8fb562a3 + .long 0x49deb15a,0x6725ba1b,0x9845ea0e,0xe15dfec0 + .long 0x02c32f75,0x12814cf0,0xa38d4697,0xc66bd3f9 + .long 0xe7038f5f,0x9515929c,0xebbf6d7a,0xda955259 + .long 0x2dd4be83,0xd3587421,0x2949e069,0x448ec9c8 + .long 0x6a75c289,0x78f48e79,0x6b99583e,0xdd27b971 + .long 0xb6bee14f,0x17f088ad,0x66c920ac,0xb47dce3a + .long 0x1863df4a,0x82e51a31,0x60975133,0x4562537f + .long 0xe0b16477,0x84bb6bae,0x1cfe81a0,0x94f9082b + .long 0x58704868,0x198f45fd,0x8794de6c,0xb7527bf8 + .long 0x23ab73d3,0xe2724b02,0x57e31f8f,0x2a6655ab + .long 0x07b2eb28,0x032fb5c2,0x9a86c57b,0xa5d33708 + .long 0xf2302887,0xb223bfa5,0xba02036a,0x5ced1682 + .long 0x2b8acf1c,0x92a779b4,0xf0f307f2,0xa14e69e2 + .long 0xcd65daf4,0xd50605be,0x1fd13462,0x8ac4a6fe + .long 0x9d342e53,0xa0a2f355,0x32058ae1,0x75a4f6eb + .long 0x390b83ec,0xaa4060ef,0x065e719f,0x51bd6e10 + .long 0xf93e218a,0x3d96dd06,0xaedd3e05,0x464de6bd + .long 0xb591548d,0x0571c45d,0x6f0406d4,0xff605015 + .long 0x241998fb,0x97d6bde9,0xcc894043,0x7767d99e + .long 0xbdb0e842,0x8807898b,0x38e7195b,0xdb79c8ee + .long 0x47a17c0a,0xe97c420f,0xc9f8841e,0x00000000 + .long 0x83098086,0x48322bed,0xac1e1170,0x4e6c5a72 + .long 0xfbfd0eff,0x560f8538,0x1e3daed5,0x27362d39 + .long 0x640a0fd9,0x21685ca6,0xd19b5b54,0x3a24362e + .long 0xb10c0a67,0x0f9357e7,0xd2b4ee96,0x9e1b9b91 + .long 0x4f80c0c5,0xa261dc20,0x695a774b,0x161c121a + .long 0x0ae293ba,0xe5c0a02a,0x433c22e0,0x1d121b17 + .long 0x0b0e090d,0xadf28bc7,0xb92db6a8,0xc8141ea9 + .long 0x8557f119,0x4caf7507,0xbbee99dd,0xfda37f60 + .long 0x9ff70126,0xbc5c72f5,0xc544663b,0x345bfb7e + .long 0x768b4329,0xdccb23c6,0x68b6edfc,0x63b8e4f1 + .long 0xcad731dc,0x10426385,0x40139722,0x2084c611 + .long 0x7d854a24,0xf8d2bb3d,0x11aef932,0x6dc729a1 + .long 0x4b1d9e2f,0xf3dcb230,0xec0d8652,0xd077c1e3 + .long 0x6c2bb316,0x99a970b9,0xfa119448,0x2247e964 + .long 0xc4a8fc8c,0x1aa0f03f,0xd8567d2c,0xef223390 + .long 0xc787494e,0xc1d938d1,0xfe8ccaa2,0x3698d40b + .long 0xcfa6f581,0x28a57ade,0x26dab78e,0xa43fadbf + .long 0xe42c3a9d,0x0d507892,0x9b6a5fcc,0x62547e46 + .long 0xc2f68d13,0xe890d8b8,0x5e2e39f7,0xf582c3af + .long 0xbe9f5d80,0x7c69d093,0xa96fd52d,0xb3cf2512 + .long 0x3bc8ac99,0xa710187d,0x6ee89c63,0x7bdb3bbb + .long 0x09cd2678,0xf46e5918,0x01ec9ab7,0xa8834f9a + .long 0x65e6956e,0x7eaaffe6,0x0821bccf,0xe6ef15e8 + .long 0xd9bae79b,0xce4a6f36,0xd4ea9f09,0xd629b07c + .long 0xaf31a4b2,0x312a3f23,0x30c6a594,0xc035a266 + .long 0x37744ebc,0xa6fc82ca,0xb0e090d0,0x1533a7d8 + .long 0x4af10498,0xf741ecda,0x0e7fcd50,0x2f1791f6 + .long 0x8d764dd6,0x4d43efb0,0x54ccaa4d,0xdfe49604 + .long 0xe39ed1b5,0x1b4c6a88,0xb8c12c1f,0x7f466551 + .long 0x049d5eea,0x5d018c35,0x73fa8774,0x2efb0b41 + .long 0x5ab3671d,0x5292dbd2,0x33e91056,0x136dd647 + .long 0x8c9ad761,0x7a37a10c,0x8e59f814,0x89eb133c + .long 0xeecea927,0x35b761c9,0xede11ce5,0x3c7a47b1 + .long 0x599cd2df,0x3f55f273,0x791814ce,0xbf73c737 + .long 0xea53f7cd,0x5b5ffdaa,0x14df3d6f,0x867844db + .long 0x81caaff3,0x3eb968c4,0x2c382434,0x5fc2a340 + .long 0x72161dc3,0x0cbce225,0x8b283c49,0x41ff0d95 + .long 0x7139a801,0xde080cb3,0x9cd8b4e4,0x906456c1 + .long 0x617bcb84,0x70d532b6,0x74486c5c,0x42d0b857 + .long 0xa75051f4,0x65537e41,0xa4c31a17,0x5e963a27 + .long 0x6bcb3bab,0x45f11f9d,0x58abacfa,0x03934be3 + .long 0xfa552030,0x6df6ad76,0x769188cc,0x4c25f502 + .long 0xd7fc4fe5,0xcbd7c52a,0x44802635,0xa38fb562 + .long 0x5a49deb1,0x1b6725ba,0x0e9845ea,0xc0e15dfe + .long 0x7502c32f,0xf012814c,0x97a38d46,0xf9c66bd3 + .long 0x5fe7038f,0x9c951592,0x7aebbf6d,0x59da9552 + .long 0x832dd4be,0x21d35874,0x692949e0,0xc8448ec9 + .long 0x896a75c2,0x7978f48e,0x3e6b9958,0x71dd27b9 + .long 0x4fb6bee1,0xad17f088,0xac66c920,0x3ab47dce + .long 0x4a1863df,0x3182e51a,0x33609751,0x7f456253 + .long 0x77e0b164,0xae84bb6b,0xa01cfe81,0x2b94f908 + .long 0x68587048,0xfd198f45,0x6c8794de,0xf8b7527b + .long 0xd323ab73,0x02e2724b,0x8f57e31f,0xab2a6655 + .long 0x2807b2eb,0xc2032fb5,0x7b9a86c5,0x08a5d337 + .long 0x87f23028,0xa5b223bf,0x6aba0203,0x825ced16 + .long 0x1c2b8acf,0xb492a779,0xf2f0f307,0xe2a14e69 + .long 0xf4cd65da,0xbed50605,0x621fd134,0xfe8ac4a6 + .long 0x539d342e,0x55a0a2f3,0xe132058a,0xeb75a4f6 + .long 0xec390b83,0xefaa4060,0x9f065e71,0x1051bd6e + .long 0x8af93e21,0x063d96dd,0x05aedd3e,0xbd464de6 + .long 0x8db59154,0x5d0571c4,0xd46f0406,0x15ff6050 + .long 0xfb241998,0xe997d6bd,0x43cc8940,0x9e7767d9 + .long 0x42bdb0e8,0x8b880789,0x5b38e719,0xeedb79c8 + .long 0x0a47a17c,0x0fe97c42,0x1ec9f884,0x00000000 + .long 0x86830980,0xed48322b,0x70ac1e11,0x724e6c5a + .long 0xfffbfd0e,0x38560f85,0xd51e3dae,0x3927362d + .long 0xd9640a0f,0xa621685c,0x54d19b5b,0x2e3a2436 + .long 0x67b10c0a,0xe70f9357,0x96d2b4ee,0x919e1b9b + .long 0xc54f80c0,0x20a261dc,0x4b695a77,0x1a161c12 + .long 0xba0ae293,0x2ae5c0a0,0xe0433c22,0x171d121b + .long 0x0d0b0e09,0xc7adf28b,0xa8b92db6,0xa9c8141e + .long 0x198557f1,0x074caf75,0xddbbee99,0x60fda37f + .long 0x269ff701,0xf5bc5c72,0x3bc54466,0x7e345bfb + .long 0x29768b43,0xc6dccb23,0xfc68b6ed,0xf163b8e4 + .long 0xdccad731,0x85104263,0x22401397,0x112084c6 + .long 0x247d854a,0x3df8d2bb,0x3211aef9,0xa16dc729 + .long 0x2f4b1d9e,0x30f3dcb2,0x52ec0d86,0xe3d077c1 + .long 0x166c2bb3,0xb999a970,0x48fa1194,0x642247e9 + .long 0x8cc4a8fc,0x3f1aa0f0,0x2cd8567d,0x90ef2233 + .long 0x4ec78749,0xd1c1d938,0xa2fe8cca,0x0b3698d4 + .long 0x81cfa6f5,0xde28a57a,0x8e26dab7,0xbfa43fad + .long 0x9de42c3a,0x920d5078,0xcc9b6a5f,0x4662547e + .long 0x13c2f68d,0xb8e890d8,0xf75e2e39,0xaff582c3 + .long 0x80be9f5d,0x937c69d0,0x2da96fd5,0x12b3cf25 + .long 0x993bc8ac,0x7da71018,0x636ee89c,0xbb7bdb3b + .long 0x7809cd26,0x18f46e59,0xb701ec9a,0x9aa8834f + .long 0x6e65e695,0xe67eaaff,0xcf0821bc,0xe8e6ef15 + .long 0x9bd9bae7,0x36ce4a6f,0x09d4ea9f,0x7cd629b0 + .long 0xb2af31a4,0x23312a3f,0x9430c6a5,0x66c035a2 + .long 0xbc37744e,0xcaa6fc82,0xd0b0e090,0xd81533a7 + .long 0x984af104,0xdaf741ec,0x500e7fcd,0xf62f1791 + .long 0xd68d764d,0xb04d43ef,0x4d54ccaa,0x04dfe496 + .long 0xb5e39ed1,0x881b4c6a,0x1fb8c12c,0x517f4665 + .long 0xea049d5e,0x355d018c,0x7473fa87,0x412efb0b + .long 0x1d5ab367,0xd25292db,0x5633e910,0x47136dd6 + .long 0x618c9ad7,0x0c7a37a1,0x148e59f8,0x3c89eb13 + .long 0x27eecea9,0xc935b761,0xe5ede11c,0xb13c7a47 + .long 0xdf599cd2,0x733f55f2,0xce791814,0x37bf73c7 + .long 0xcdea53f7,0xaa5b5ffd,0x6f14df3d,0xdb867844 + .long 0xf381caaf,0xc43eb968,0x342c3824,0x405fc2a3 + .long 0xc372161d,0x250cbce2,0x498b283c,0x9541ff0d + .long 0x017139a8,0xb3de080c,0xe49cd8b4,0xc1906456 + .long 0x84617bcb,0xb670d532,0x5c74486c,0x5742d0b8 + .long 0xf4a75051,0x4165537e,0x17a4c31a,0x275e963a + .long 0xab6bcb3b,0x9d45f11f,0xfa58abac,0xe303934b + .long 0x30fa5520,0x766df6ad,0xcc769188,0x024c25f5 + .long 0xe5d7fc4f,0x2acbd7c5,0x35448026,0x62a38fb5 + .long 0xb15a49de,0xba1b6725,0xea0e9845,0xfec0e15d + .long 0x2f7502c3,0x4cf01281,0x4697a38d,0xd3f9c66b + .long 0x8f5fe703,0x929c9515,0x6d7aebbf,0x5259da95 + .long 0xbe832dd4,0x7421d358,0xe0692949,0xc9c8448e + .long 0xc2896a75,0x8e7978f4,0x583e6b99,0xb971dd27 + .long 0xe14fb6be,0x88ad17f0,0x20ac66c9,0xce3ab47d + .long 0xdf4a1863,0x1a3182e5,0x51336097,0x537f4562 + .long 0x6477e0b1,0x6bae84bb,0x81a01cfe,0x082b94f9 + .long 0x48685870,0x45fd198f,0xde6c8794,0x7bf8b752 + .long 0x73d323ab,0x4b02e272,0x1f8f57e3,0x55ab2a66 + .long 0xeb2807b2,0xb5c2032f,0xc57b9a86,0x3708a5d3 + .long 0x2887f230,0xbfa5b223,0x036aba02,0x16825ced + .long 0xcf1c2b8a,0x79b492a7,0x07f2f0f3,0x69e2a14e + .long 0xdaf4cd65,0x05bed506,0x34621fd1,0xa6fe8ac4 + .long 0x2e539d34,0xf355a0a2,0x8ae13205,0xf6eb75a4 + .long 0x83ec390b,0x60efaa40,0x719f065e,0x6e1051bd + .long 0x218af93e,0xdd063d96,0x3e05aedd,0xe6bd464d + .long 0x548db591,0xc45d0571,0x06d46f04,0x5015ff60 + .long 0x98fb2419,0xbde997d6,0x4043cc89,0xd99e7767 + .long 0xe842bdb0,0x898b8807,0x195b38e7,0xc8eedb79 + .long 0x7c0a47a1,0x420fe97c,0x841ec9f8,0x00000000 + .long 0x80868309,0x2bed4832,0x1170ac1e,0x5a724e6c + .long 0x0efffbfd,0x8538560f,0xaed51e3d,0x2d392736 + .long 0x0fd9640a,0x5ca62168,0x5b54d19b,0x362e3a24 + .long 0x0a67b10c,0x57e70f93,0xee96d2b4,0x9b919e1b + .long 0xc0c54f80,0xdc20a261,0x774b695a,0x121a161c + .long 0x93ba0ae2,0xa02ae5c0,0x22e0433c,0x1b171d12 + .long 0x090d0b0e,0x8bc7adf2,0xb6a8b92d,0x1ea9c814 + .long 0xf1198557,0x75074caf,0x99ddbbee,0x7f60fda3 + .long 0x01269ff7,0x72f5bc5c,0x663bc544,0xfb7e345b + .long 0x4329768b,0x23c6dccb,0xedfc68b6,0xe4f163b8 + .long 0x31dccad7,0x63851042,0x97224013,0xc6112084 + .long 0x4a247d85,0xbb3df8d2,0xf93211ae,0x29a16dc7 + .long 0x9e2f4b1d,0xb230f3dc,0x8652ec0d,0xc1e3d077 + .long 0xb3166c2b,0x70b999a9,0x9448fa11,0xe9642247 + .long 0xfc8cc4a8,0xf03f1aa0,0x7d2cd856,0x3390ef22 + .long 0x494ec787,0x38d1c1d9,0xcaa2fe8c,0xd40b3698 + .long 0xf581cfa6,0x7ade28a5,0xb78e26da,0xadbfa43f + .long 0x3a9de42c,0x78920d50,0x5fcc9b6a,0x7e466254 + .long 0x8d13c2f6,0xd8b8e890,0x39f75e2e,0xc3aff582 + .long 0x5d80be9f,0xd0937c69,0xd52da96f,0x2512b3cf + .long 0xac993bc8,0x187da710,0x9c636ee8,0x3bbb7bdb + .long 0x267809cd,0x5918f46e,0x9ab701ec,0x4f9aa883 + .long 0x956e65e6,0xffe67eaa,0xbccf0821,0x15e8e6ef + .long 0xe79bd9ba,0x6f36ce4a,0x9f09d4ea,0xb07cd629 + .long 0xa4b2af31,0x3f23312a,0xa59430c6,0xa266c035 + .long 0x4ebc3774,0x82caa6fc,0x90d0b0e0,0xa7d81533 + .long 0x04984af1,0xecdaf741,0xcd500e7f,0x91f62f17 + .long 0x4dd68d76,0xefb04d43,0xaa4d54cc,0x9604dfe4 + .long 0xd1b5e39e,0x6a881b4c,0x2c1fb8c1,0x65517f46 + .long 0x5eea049d,0x8c355d01,0x877473fa,0x0b412efb + .long 0x671d5ab3,0xdbd25292,0x105633e9,0xd647136d + .long 0xd7618c9a,0xa10c7a37,0xf8148e59,0x133c89eb + .long 0xa927eece,0x61c935b7,0x1ce5ede1,0x47b13c7a + .long 0xd2df599c,0xf2733f55,0x14ce7918,0xc737bf73 + .long 0xf7cdea53,0xfdaa5b5f,0x3d6f14df,0x44db8678 + .long 0xaff381ca,0x68c43eb9,0x24342c38,0xa3405fc2 + .long 0x1dc37216,0xe2250cbc,0x3c498b28,0x0d9541ff + .long 0xa8017139,0x0cb3de08,0xb4e49cd8,0x56c19064 + .long 0xcb84617b,0x32b670d5,0x6c5c7448,0xb85742d0 + .section .rodata + .type L_AES_base_td4, %object + .size L_AES_base_td4, 256 + # 1-byte aligned, 8-bit aligned + .align 0 +L_AES_base_td4: + .byte 0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38 + .byte 0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb + .byte 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87 + .byte 0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb + .byte 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d + .byte 0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e + .byte 0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2 + .byte 0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25 + .byte 0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16 + .byte 0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92 + .byte 0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda + .byte 0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84 + .byte 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a + .byte 0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06 + .byte 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02 + .byte 0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b + .byte 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea + .byte 0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73 + .byte 0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85 + .byte 0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e + .byte 0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89 + .byte 0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b + .byte 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20 + .byte 0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4 + .byte 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31 + .byte 0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f + .byte 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d + .byte 0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef + .byte 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0 + .byte 0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61 + .byte 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26 + .byte 0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d + .section .rodata + .type L_AES_base_rcon, %object + .size L_AES_base_rcon, 40 + # 4-byte aligned, 32-bit aligned + .align 2 +L_AES_base_rcon: + .long 0x01000000,0x02000000,0x04000000,0x08000000 + .long 0x10000000,0x20000000,0x40000000,0x80000000 + .long 0x1b000000,0x36000000 +#ifdef GCM_TABLE + .section .rodata + .type L_AES_base_gcm_r, %object + .size L_AES_base_gcm_r, 512 + # 1-byte aligned, 8-bit aligned + .align 0 +L_AES_base_gcm_r: + .byte 0x00,0x00,0x01,0xc2,0x03,0x84,0x02,0x46 + .byte 0x07,0x08,0x06,0xca,0x04,0x8c,0x05,0x4e + .byte 0x0e,0x10,0x0f,0xd2,0x0d,0x94,0x0c,0x56 + .byte 0x09,0x18,0x08,0xda,0x0a,0x9c,0x0b,0x5e + .byte 0x1c,0x20,0x1d,0xe2,0x1f,0xa4,0x1e,0x66 + .byte 0x1b,0x28,0x1a,0xea,0x18,0xac,0x19,0x6e + .byte 0x12,0x30,0x13,0xf2,0x11,0xb4,0x10,0x76 + .byte 0x15,0x38,0x14,0xfa,0x16,0xbc,0x17,0x7e + .byte 0x38,0x40,0x39,0x82,0x3b,0xc4,0x3a,0x06 + .byte 0x3f,0x48,0x3e,0x8a,0x3c,0xcc,0x3d,0x0e + .byte 0x36,0x50,0x37,0x92,0x35,0xd4,0x34,0x16 + .byte 0x31,0x58,0x30,0x9a,0x32,0xdc,0x33,0x1e + .byte 0x24,0x60,0x25,0xa2,0x27,0xe4,0x26,0x26 + .byte 0x23,0x68,0x22,0xaa,0x20,0xec,0x21,0x2e + .byte 0x2a,0x70,0x2b,0xb2,0x29,0xf4,0x28,0x36 + .byte 0x2d,0x78,0x2c,0xba,0x2e,0xfc,0x2f,0x3e + .byte 0x70,0x80,0x71,0x42,0x73,0x04,0x72,0xc6 + .byte 0x77,0x88,0x76,0x4a,0x74,0x0c,0x75,0xce + .byte 0x7e,0x90,0x7f,0x52,0x7d,0x14,0x7c,0xd6 + .byte 0x79,0x98,0x78,0x5a,0x7a,0x1c,0x7b,0xde + .byte 0x6c,0xa0,0x6d,0x62,0x6f,0x24,0x6e,0xe6 + .byte 0x6b,0xa8,0x6a,0x6a,0x68,0x2c,0x69,0xee + .byte 0x62,0xb0,0x63,0x72,0x61,0x34,0x60,0xf6 + .byte 0x65,0xb8,0x64,0x7a,0x66,0x3c,0x67,0xfe + .byte 0x48,0xc0,0x49,0x02,0x4b,0x44,0x4a,0x86 + .byte 0x4f,0xc8,0x4e,0x0a,0x4c,0x4c,0x4d,0x8e + .byte 0x46,0xd0,0x47,0x12,0x45,0x54,0x44,0x96 + .byte 0x41,0xd8,0x40,0x1a,0x42,0x5c,0x43,0x9e + .byte 0x54,0xe0,0x55,0x22,0x57,0x64,0x56,0xa6 + .byte 0x53,0xe8,0x52,0x2a,0x50,0x6c,0x51,0xae + .byte 0x5a,0xf0,0x5b,0x32,0x59,0x74,0x58,0xb6 + .byte 0x5d,0xf8,0x5c,0x3a,0x5e,0x7c,0x5f,0xbe + .byte 0xe1,0x00,0xe0,0xc2,0xe2,0x84,0xe3,0x46 + .byte 0xe6,0x08,0xe7,0xca,0xe5,0x8c,0xe4,0x4e + .byte 0xef,0x10,0xee,0xd2,0xec,0x94,0xed,0x56 + .byte 0xe8,0x18,0xe9,0xda,0xeb,0x9c,0xea,0x5e + .byte 0xfd,0x20,0xfc,0xe2,0xfe,0xa4,0xff,0x66 + .byte 0xfa,0x28,0xfb,0xea,0xf9,0xac,0xf8,0x6e + .byte 0xf3,0x30,0xf2,0xf2,0xf0,0xb4,0xf1,0x76 + .byte 0xf4,0x38,0xf5,0xfa,0xf7,0xbc,0xf6,0x7e + .byte 0xd9,0x40,0xd8,0x82,0xda,0xc4,0xdb,0x06 + .byte 0xde,0x48,0xdf,0x8a,0xdd,0xcc,0xdc,0x0e + .byte 0xd7,0x50,0xd6,0x92,0xd4,0xd4,0xd5,0x16 + .byte 0xd0,0x58,0xd1,0x9a,0xd3,0xdc,0xd2,0x1e + .byte 0xc5,0x60,0xc4,0xa2,0xc6,0xe4,0xc7,0x26 + .byte 0xc2,0x68,0xc3,0xaa,0xc1,0xec,0xc0,0x2e + .byte 0xcb,0x70,0xca,0xb2,0xc8,0xf4,0xc9,0x36 + .byte 0xcc,0x78,0xcd,0xba,0xcf,0xfc,0xce,0x3e + .byte 0x91,0x80,0x90,0x42,0x92,0x04,0x93,0xc6 + .byte 0x96,0x88,0x97,0x4a,0x95,0x0c,0x94,0xce + .byte 0x9f,0x90,0x9e,0x52,0x9c,0x14,0x9d,0xd6 + .byte 0x98,0x98,0x99,0x5a,0x9b,0x1c,0x9a,0xde + .byte 0x8d,0xa0,0x8c,0x62,0x8e,0x24,0x8f,0xe6 + .byte 0x8a,0xa8,0x8b,0x6a,0x89,0x2c,0x88,0xee + .byte 0x83,0xb0,0x82,0x72,0x80,0x34,0x81,0xf6 + .byte 0x84,0xb8,0x85,0x7a,0x87,0x3c,0x86,0xfe + .byte 0xa9,0xc0,0xa8,0x02,0xaa,0x44,0xab,0x86 + .byte 0xae,0xc8,0xaf,0x0a,0xad,0x4c,0xac,0x8e + .byte 0xa7,0xd0,0xa6,0x12,0xa4,0x54,0xa5,0x96 + .byte 0xa0,0xd8,0xa1,0x1a,0xa3,0x5c,0xa2,0x9e + .byte 0xb5,0xe0,0xb4,0x22,0xb6,0x64,0xb7,0xa6 + .byte 0xb2,0xe8,0xb3,0x2a,0xb1,0x6c,0xb0,0xae + .byte 0xbb,0xf0,0xba,0x32,0xb8,0x74,0xb9,0xb6 + .byte 0xbc,0xf8,0xbd,0x3a,0xbf,0x7c,0xbe,0xbe +#else + .section .rodata + .type L_AES_base_gcm_r, %object + .size L_AES_base_gcm_r, 32 + # 1-byte aligned, 8-bit aligned + .align 0 +L_AES_base_gcm_r: + .byte 0x00,0x00,0x1c,0x20,0x38,0x40,0x24,0x60 + .byte 0x70,0x80,0x6c,0xa0,0x48,0xc0,0x54,0xe0 + .byte 0xe1,0x00,0xfd,0x20,0xd9,0x40,0xc5,0x60 + .byte 0x91,0x80,0x8d,0xa0,0xa9,0xc0,0xb5,0xe0 +#endif /* GCM_TABLE */ + .text + .globl AES_set_key_RISCV64 + .type AES_set_key_RISCV64,@function + .align 2 +AES_set_key_RISCV64: + addi sp, sp, -64 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + sd s5, 32(sp) + sd s6, 40(sp) + sd s7, 48(sp) + sd s8, 56(sp) + la s6, L_AES_base_te + la s7, L_AES_base_td + la s8, L_AES_base_rcon +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + # Build forward key schedule (dispatch on key length) + li t0, 24 + beq a1, t0, L_AES_set_key_RISCV64_192 + li t0, 32 + beq a1, t0, L_AES_set_key_RISCV64_256 + # AES-128 key schedule + mv s3, a2 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(a0) + lbu t1, 4(a0) + lbu t2, 8(a0) + lbu t3, 12(a0) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(a0) + or t0, t0, t4 + lbu t5, 5(a0) + or t1, t1, t5 + lbu t6, 9(a0) + or t2, t2, t6 + lbu t4, 13(a0) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(a0) + or t0, t0, t4 + lbu t5, 6(a0) + or t1, t1, t5 + lbu t6, 10(a0) + or t2, t2, t6 + lbu t4, 14(a0) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(a0) + or t0, t0, t4 + lbu t5, 7(a0) + or t1, t1, t5 + lbu t6, 11(a0) + or t2, t2, t6 + lbu t4, 15(a0) + or t3, t3, t4 +#else + ld t1, 0(a0) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(a0) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t0, 0(s3) + sw t1, 4(s3) + sw t2, 8(s3) + sw t3, 12(s3) + li a6, 10 + li a7, 0 +L_AES_set_key_RISCV64_128_loop: + addi s3, s3, 16 + andi t5, t3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s6 +#else + slli t5, t5, 2 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + li t6, 65280 + and t5, t5, t6 + xor t0, t0, t5 + srli t5, t3, 22 + andi t5, t5, 1020 + add t5, t5, s6 + addi t5, t5, 1024 + lbu t5, 0(t5) + xor t0, t0, t5 + srli t5, t3, 14 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 2048 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 4278190080 + and t5, t5, t6 + xor t0, t0, t5 + srli t5, t3, 6 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 3072 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 16711680 + and t5, t5, t6 + xor t0, t0, t5 + add t5, s8, a7 + lw t5, 0(t5) + xor t0, t0, t5 + xor t1, t1, t0 + xor t2, t2, t1 + xor t3, t3, t2 + sw t0, 0(s3) + sw t1, 4(s3) + sw t2, 8(s3) + sw t3, 12(s3) + addi a6, a6, -1 + addi a7, a7, 4 + bnez a6, L_AES_set_key_RISCV64_128_loop + j L_AES_set_key_RISCV64_fwd_done + # AES-192 key schedule +L_AES_set_key_RISCV64_192: + mv s3, a2 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(a0) + lbu t1, 4(a0) + lbu t2, 8(a0) + lbu t3, 12(a0) + lbu s1, 16(a0) + lbu s2, 20(a0) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli s1, s1, 8 + slli s2, s2, 8 + lbu t4, 1(a0) + or t0, t0, t4 + lbu t5, 5(a0) + or t1, t1, t5 + lbu t6, 9(a0) + or t2, t2, t6 + lbu t4, 13(a0) + or t3, t3, t4 + lbu t5, 17(a0) + or s1, s1, t5 + lbu t6, 21(a0) + or s2, s2, t6 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli s1, s1, 8 + slli s2, s2, 8 + lbu t4, 2(a0) + or t0, t0, t4 + lbu t5, 6(a0) + or t1, t1, t5 + lbu t6, 10(a0) + or t2, t2, t6 + lbu t4, 14(a0) + or t3, t3, t4 + lbu t5, 18(a0) + or s1, s1, t5 + lbu t6, 22(a0) + or s2, s2, t6 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli s1, s1, 8 + slli s2, s2, 8 + lbu t4, 3(a0) + or t0, t0, t4 + lbu t5, 7(a0) + or t1, t1, t5 + lbu t6, 11(a0) + or t2, t2, t6 + lbu t4, 15(a0) + or t3, t3, t4 + lbu t5, 19(a0) + or s1, s1, t5 + lbu t6, 23(a0) + or s2, s2, t6 +#else + ld t1, 0(a0) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(a0) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 + ld s2, 16(a0) + # rev8 s2, s2 + .word 0x6b895913 + srli s1, s2, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t0, 0(s3) + sw t1, 4(s3) + sw t2, 8(s3) + sw t3, 12(s3) + sw s1, 16(s3) + sw s2, 20(s3) + li a6, 8 + li a7, 0 +L_AES_set_key_RISCV64_192_loop: + addi s3, s3, 24 + andi t5, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s6 +#else + slli t5, t5, 2 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + li t6, 65280 + and t5, t5, t6 + xor t0, t0, t5 + srli t5, s2, 22 + andi t5, t5, 1020 + add t5, t5, s6 + addi t5, t5, 1024 + lbu t5, 0(t5) + xor t0, t0, t5 + srli t5, s2, 14 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 2048 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 4278190080 + and t5, t5, t6 + xor t0, t0, t5 + srli t5, s2, 6 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 3072 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 16711680 + and t5, t5, t6 + xor t0, t0, t5 + add t5, s8, a7 + lw t5, 0(t5) + xor t0, t0, t5 + xor t1, t1, t0 + xor t2, t2, t1 + xor t3, t3, t2 + xor s1, s1, t3 + xor s2, s2, s1 + sw t0, 0(s3) + sw t1, 4(s3) + sw t2, 8(s3) + sw t3, 12(s3) + sw s1, 16(s3) + sw s2, 20(s3) + addi a6, a6, -1 + addi a7, a7, 4 + bnez a6, L_AES_set_key_RISCV64_192_loop + j L_AES_set_key_RISCV64_fwd_done + # AES-256 key schedule +L_AES_set_key_RISCV64_256: + mv s3, a2 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(a0) + lbu t1, 4(a0) + lbu t2, 8(a0) + lbu t3, 12(a0) + lbu s1, 16(a0) + lbu s2, 20(a0) + lbu a4, 24(a0) + lbu a5, 28(a0) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli s1, s1, 8 + slli s2, s2, 8 + slli a4, a4, 8 + slli a5, a5, 8 + lbu t4, 1(a0) + or t0, t0, t4 + lbu t5, 5(a0) + or t1, t1, t5 + lbu t6, 9(a0) + or t2, t2, t6 + lbu t4, 13(a0) + or t3, t3, t4 + lbu t5, 17(a0) + or s1, s1, t5 + lbu t6, 21(a0) + or s2, s2, t6 + lbu t4, 25(a0) + or a4, a4, t4 + lbu t5, 29(a0) + or a5, a5, t5 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli s1, s1, 8 + slli s2, s2, 8 + slli a4, a4, 8 + slli a5, a5, 8 + lbu t4, 2(a0) + or t0, t0, t4 + lbu t5, 6(a0) + or t1, t1, t5 + lbu t6, 10(a0) + or t2, t2, t6 + lbu t4, 14(a0) + or t3, t3, t4 + lbu t5, 18(a0) + or s1, s1, t5 + lbu t6, 22(a0) + or s2, s2, t6 + lbu t4, 26(a0) + or a4, a4, t4 + lbu t5, 30(a0) + or a5, a5, t5 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli s1, s1, 8 + slli s2, s2, 8 + slli a4, a4, 8 + slli a5, a5, 8 + lbu t4, 3(a0) + or t0, t0, t4 + lbu t5, 7(a0) + or t1, t1, t5 + lbu t6, 11(a0) + or t2, t2, t6 + lbu t4, 15(a0) + or t3, t3, t4 + lbu t5, 19(a0) + or s1, s1, t5 + lbu t6, 23(a0) + or s2, s2, t6 + lbu t4, 27(a0) + or a4, a4, t4 + lbu t5, 31(a0) + or a5, a5, t5 +#else + ld t1, 0(a0) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(a0) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 + ld s2, 16(a0) + # rev8 s2, s2 + .word 0x6b895913 + srli s1, s2, 32 + ld a5, 24(a0) + # rev8 a5, a5 + .word 0x6b87d793 + srli a4, a5, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t0, 0(s3) + sw t1, 4(s3) + sw t2, 8(s3) + sw t3, 12(s3) + sw s1, 16(s3) + sw s2, 20(s3) + sw a4, 24(s3) + sw a5, 28(s3) + li a6, 7 + li a7, 0 +L_AES_set_key_RISCV64_256_loop: + addi s3, s3, 32 + andi t5, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s6 +#else + slli t5, t5, 2 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + li t6, 65280 + and t5, t5, t6 + xor t0, t0, t5 + srli t5, a5, 22 + andi t5, t5, 1020 + add t5, t5, s6 + addi t5, t5, 1024 + lbu t5, 0(t5) + xor t0, t0, t5 + srli t5, a5, 14 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 2048 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 4278190080 + and t5, t5, t6 + xor t0, t0, t5 + srli t5, a5, 6 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 3072 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 16711680 + and t5, t5, t6 + xor t0, t0, t5 + add t5, s8, a7 + lw t5, 0(t5) + xor t0, t0, t5 + xor t1, t1, t0 + xor t2, t2, t1 + xor t3, t3, t2 + sw t0, 0(s3) + sw t1, 4(s3) + sw t2, 8(s3) + sw t3, 12(s3) + addi a7, a7, 4 + addi a6, a6, -1 + beqz a6, L_AES_set_key_RISCV64_256_done + srli t5, t3, 6 + andi t5, t5, 1020 + add t5, t5, s6 + lw t5, 0(t5) + li t6, 65280 + and t5, t5, t6 + xor s1, s1, t5 + andi t5, t3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s6 +#else + slli t5, t5, 2 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lbu t5, 0(t5) + xor s1, s1, t5 + srli t5, t3, 22 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 2048 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 4278190080 + and t5, t5, t6 + xor s1, s1, t5 + srli t5, t3, 14 + andi t5, t5, 1020 + add t5, t5, s6 + li t6, 3072 + add t5, t5, t6 + lw t5, 0(t5) + li t6, 16711680 + and t5, t5, t6 + xor s1, s1, t5 + xor s2, s2, s1 + xor a4, a4, s2 + xor a5, a5, a4 + sw s1, 16(s3) + sw s2, 20(s3) + sw a4, 24(s3) + sw a5, 28(s3) + j L_AES_set_key_RISCV64_256_loop +L_AES_set_key_RISCV64_256_done: +L_AES_set_key_RISCV64_fwd_done: + # If decrypting, apply inverse MixColumns to the schedule + beqz a3, L_AES_set_key_RISCV64_done + addi s5, s6, 1024 + srli s4, a1, 2 + addi s4, s4, 6 + mv s3, a2 + slli a4, s4, 4 + add a4, a4, s3 + srli s4, s4, 1 + addi s4, s4, -1 + # Swap first and last round keys + ld t0, 0(s3) + ld t1, 8(s3) + ld t2, 0(a4) + ld t3, 8(a4) + sd t0, 0(a4) + sd t1, 8(a4) + sd t2, 0(s3) + sd t3, 8(s3) +L_AES_set_key_RISCV64_inv_mixcol_loop: + addi s3, s3, 16 + addi a4, a4, -16 + lw t0, 0(s3) + lw t1, 4(s3) + lw t2, 8(s3) + lw t3, 12(s3) + lw a6, 0(a4) + lw a7, 4(a4) + lw s1, 8(a4) + lw s2, 12(a4) + srli t5, t0, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t0, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t0, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t0, t6, t5 + srli t5, t1, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t1, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t1, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t1, t6, t5 + srli t5, t2, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t2, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t2, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t2, t6, t5 + srli t5, t3, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t3, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t3, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t3, t6, t5 + srli t5, a6, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, a6, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, a6, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor a6, t6, t5 + srli t5, a7, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, a7, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, a7, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, a7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor a7, t6, t5 + srli t5, s1, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, s1, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, s1, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor s1, t6, t5 + srli t5, s2, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, s2, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, s2, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor s2, t6, t5 + sw t0, 0(a4) + sw t1, 4(a4) + sw t2, 8(a4) + sw t3, 12(a4) + sw a6, 0(s3) + sw a7, 4(s3) + sw s1, 8(s3) + sw s2, 12(s3) + addi s4, s4, -1 + bnez s4, L_AES_set_key_RISCV64_inv_mixcol_loop + # Middle round key + lw t0, 16(s3) + lw t1, 20(s3) + lw t2, 24(s3) + lw t3, 28(s3) + srli t5, t0, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t0, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t0, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t0, t6, t5 + srli t5, t1, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t1, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t1, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t1, t6, t5 + srli t5, t2, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t2, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t2, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t2, t6, t5 + srli t5, t3, 22 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t5) + srli t5, t3, 14 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + addi t5, t5, 1024 + lw t5, 0(t5) + xor t6, t6, t5 + srli t5, t3, 6 + andi t5, t5, 1020 + add t5, t5, s5 + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 2048 + add t5, t5, t4 + lw t5, 0(t5) + xor t6, t6, t5 + andi t5, t3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s5 +#else + slli t5, t5, 2 + add t5, t5, s5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s7 +#else + slli t5, t5, 2 + add t5, t5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + li t4, 3072 + add t5, t5, t4 + lw t5, 0(t5) + xor t3, t6, t5 + sw t0, 16(s3) + sw t1, 20(s3) + sw t2, 24(s3) + sw t3, 28(s3) +L_AES_set_key_RISCV64_done: + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + ld s5, 32(sp) + ld s6, 40(sp) + ld s7, 48(sp) + ld s8, 56(sp) + addi sp, sp, 64 + ret + .size AES_set_key_RISCV64,.-AES_set_key_RISCV64 +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC) + .text + .globl AES_encrypt_RISCV64 + .type AES_encrypt_RISCV64,@function + .align 2 +AES_encrypt_RISCV64: + addi sp, sp, -32 + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + la t0, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t1, 0(a0) + lbu t2, 4(a0) + lbu t3, 8(a0) + lbu t4, 12(a0) + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli t4, t4, 8 + lbu t5, 1(a0) + or t1, t1, t5 + lbu t6, 5(a0) + or t2, t2, t6 + lbu a4, 9(a0) + or t3, t3, a4 + lbu t5, 13(a0) + or t4, t4, t5 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli t4, t4, 8 + lbu t5, 2(a0) + or t1, t1, t5 + lbu t6, 6(a0) + or t2, t2, t6 + lbu a4, 10(a0) + or t3, t3, a4 + lbu t5, 14(a0) + or t4, t4, t5 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + slli t4, t4, 8 + lbu t5, 3(a0) + or t1, t1, t5 + lbu t6, 7(a0) + or t2, t2, t6 + lbu a4, 11(a0) + or t3, t3, a4 + lbu t5, 15(a0) + or t4, t4, t5 +#else + ld t2, 0(a0) + # rev8 t2, t2 + .word 0x6b83d393 + srli t1, t2, 32 + ld t4, 8(a0) + # rev8 t4, t4 + .word 0x6b8ede93 + srli t3, t4, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a7, 0(a2) + lw s1, 4(a2) + lw s2, 8(a2) + lw s3, 12(a2) + xor a7, t1, a7 + xor s1, t2, s1 + xor s2, t3, s2 + xor s3, t4, s3 + srliw t1, a7, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t1) + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + addi t5, t0, 1024 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, s3, 14 + srliw t4, a7, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + srliw t1, s2, 6 + srliw t2, s3, 6 + srliw t3, a7, 6 + srliw t4, s1, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + andi t1, s3, 255 + andi t2, a7, 255 + andi t3, s1, 255 + andi t4, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + lw t1, 16(a2) + lw t2, 20(a2) + lw t3, 24(a2) + lw t4, 28(a2) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + srliw t1, t6, 24 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + addi t5, t0, 1024 + srliw t1, a4, 14 + srliw t2, a5, 14 + srliw t3, a6, 14 + srliw t4, t6, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + srliw t1, a5, 6 + srliw t2, a6, 6 + srliw t3, t6, 6 + srliw t4, a4, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + andi t1, a6, 255 + andi t2, t6, 255 + andi t3, a4, 255 + andi t4, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + lw t1, 32(a2) + lw t2, 36(a2) + lw t3, 40(a2) + lw t4, 44(a2) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + srliw t1, a7, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t1) + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + addi t5, t0, 1024 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, s3, 14 + srliw t4, a7, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + srliw t1, s2, 6 + srliw t2, s3, 6 + srliw t3, a7, 6 + srliw t4, s1, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + andi t1, s3, 255 + andi t2, a7, 255 + andi t3, s1, 255 + andi t4, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + lw t1, 48(a2) + lw t2, 52(a2) + lw t3, 56(a2) + lw t4, 60(a2) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + srliw t1, t6, 24 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + addi t5, t0, 1024 + srliw t1, a4, 14 + srliw t2, a5, 14 + srliw t3, a6, 14 + srliw t4, t6, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + srliw t1, a5, 6 + srliw t2, a6, 6 + srliw t3, t6, 6 + srliw t4, a4, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + andi t1, a6, 255 + andi t2, t6, 255 + andi t3, a4, 255 + andi t4, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + lw t1, 64(a2) + lw t2, 68(a2) + lw t3, 72(a2) + lw t4, 76(a2) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + srliw t1, a7, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t1) + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + addi t5, t0, 1024 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, s3, 14 + srliw t4, a7, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + srliw t1, s2, 6 + srliw t2, s3, 6 + srliw t3, a7, 6 + srliw t4, s1, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + andi t1, s3, 255 + andi t2, a7, 255 + andi t3, s1, 255 + andi t4, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + lw t1, 80(a2) + lw t2, 84(a2) + lw t3, 88(a2) + lw t4, 92(a2) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + srliw t1, t6, 24 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + addi t5, t0, 1024 + srliw t1, a4, 14 + srliw t2, a5, 14 + srliw t3, a6, 14 + srliw t4, t6, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + srliw t1, a5, 6 + srliw t2, a6, 6 + srliw t3, t6, 6 + srliw t4, a4, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + andi t1, a6, 255 + andi t2, t6, 255 + andi t3, a4, 255 + andi t4, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + lw t1, 96(a2) + lw t2, 100(a2) + lw t3, 104(a2) + lw t4, 108(a2) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + srliw t1, a7, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t1) + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + addi t5, t0, 1024 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, s3, 14 + srliw t4, a7, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + srliw t1, s2, 6 + srliw t2, s3, 6 + srliw t3, a7, 6 + srliw t4, s1, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + andi t1, s3, 255 + andi t2, a7, 255 + andi t3, s1, 255 + andi t4, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + lw t1, 112(a2) + lw t2, 116(a2) + lw t3, 120(a2) + lw t4, 124(a2) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + srliw t1, t6, 24 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + addi t5, t0, 1024 + srliw t1, a4, 14 + srliw t2, a5, 14 + srliw t3, a6, 14 + srliw t4, t6, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + srliw t1, a5, 6 + srliw t2, a6, 6 + srliw t3, t6, 6 + srliw t4, a4, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + andi t1, a6, 255 + andi t2, t6, 255 + andi t3, a4, 255 + andi t4, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + lw t1, 128(a2) + lw t2, 132(a2) + lw t3, 136(a2) + lw t4, 140(a2) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + srliw t1, a7, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t1) + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + addi t5, t0, 1024 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, s3, 14 + srliw t4, a7, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + srliw t1, s2, 6 + srliw t2, s3, 6 + srliw t3, a7, 6 + srliw t4, s1, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + andi t1, s3, 255 + andi t2, a7, 255 + andi t3, s1, 255 + andi t4, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + lw t1, 144(a2) + lw t2, 148(a2) + lw t3, 152(a2) + lw t4, 156(a2) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + li t5, 10 + ble a3, t5, L_AES_encrypt_RISCV64_done + srliw t1, t6, 24 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + addi t5, t0, 1024 + srliw t1, a4, 14 + srliw t2, a5, 14 + srliw t3, a6, 14 + srliw t4, t6, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + srliw t1, a5, 6 + srliw t2, a6, 6 + srliw t3, t6, 6 + srliw t4, a4, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + andi t1, a6, 255 + andi t2, t6, 255 + andi t3, a4, 255 + andi t4, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + lw t1, 160(a2) + lw t2, 164(a2) + lw t3, 168(a2) + lw t4, 172(a2) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + srliw t1, a7, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t1) + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + addi t5, t0, 1024 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, s3, 14 + srliw t4, a7, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + srliw t1, s2, 6 + srliw t2, s3, 6 + srliw t3, a7, 6 + srliw t4, s1, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + andi t1, s3, 255 + andi t2, a7, 255 + andi t3, s1, 255 + andi t4, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + lw t1, 176(a2) + lw t2, 180(a2) + lw t3, 184(a2) + lw t4, 188(a2) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + li t5, 12 + ble a3, t5, L_AES_encrypt_RISCV64_done + srliw t1, t6, 24 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + addi t5, t0, 1024 + srliw t1, a4, 14 + srliw t2, a5, 14 + srliw t3, a6, 14 + srliw t4, t6, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + srliw t1, a5, 6 + srliw t2, a6, 6 + srliw t3, t6, 6 + srliw t4, a4, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + addi t5, t5, 1024 + andi t1, a6, 255 + andi t2, t6, 255 + andi t3, a4, 255 + andi t4, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + lw t1, 192(a2) + lw t2, 196(a2) + lw t3, 200(a2) + lw t4, 204(a2) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + srliw t1, a7, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t0 + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t6, 0(t1) + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + addi t5, t0, 1024 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, s3, 14 + srliw t4, a7, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + srliw t1, s2, 6 + srliw t2, s3, 6 + srliw t3, a7, 6 + srliw t4, s1, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + addi t5, t5, 1024 + andi t1, s3, 255 + andi t2, a7, 255 + andi t3, s1, 255 + andi t4, s2, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + lw t1, 208(a2) + lw t2, 212(a2) + lw t3, 216(a2) + lw t4, 220(a2) + xor t6, t6, t1 + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 +L_AES_encrypt_RISCV64_done: + srliw t1, a5, 6 + srliw t2, a6, 6 + srliw t3, t6, 6 + srliw t4, a4, 6 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t0 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + lw a7, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + li t5, 65280 + and a7, a7, t5 + and s1, s1, t5 + and s2, s2, t5 + and s3, s3, t5 + addi t5, t0, 1024 + andi t1, a6, 255 + andi t2, t6, 255 + andi t3, a4, 255 + andi t4, a5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + slli t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + lbu t4, 0(t4) + or a7, a7, t1 + or s1, s1, t2 + or s2, s2, t3 + or s3, s3, t4 + addi t5, t5, 1024 + srliw t1, t6, 24 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t1, t1, t5 + sh2add t2, t2, t5 + sh2add t3, t3, t5 + sh2add t4, t4, t5 +#else + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + slli t4, t4, 2 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + li t5, 4278190080 + and t1, t1, t5 + and t2, t2, t5 + and t3, t3, t5 + and t4, t4, t5 + or a7, a7, t1 + or s1, s1, t2 + or s2, s2, t3 + or s3, s3, t4 + li t5, 3072 + add t5, t0, t5 + srliw t1, a4, 14 + srliw t2, a5, 14 + srliw t3, a6, 14 + srliw t4, t6, 14 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + add t1, t1, t5 + add t2, t2, t5 + add t3, t3, t5 + add t4, t4, t5 + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + li t5, 16711680 + and t1, t1, t5 + and t2, t2, t5 + and t3, t3, t5 + and t4, t4, t5 + or a7, a7, t1 + or s1, s1, t2 + or s2, s2, t3 + or s3, s3, t4 + slli t5, a3, 4 + add t5, a2, t5 + lw t1, 0(t5) + lw t2, 4(t5) + lw t3, 8(t5) + lw t4, 12(t5) + xor a7, a7, t1 + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t1, a7, 24 + srli t2, s1, 24 + srli t3, s2, 24 + srli t4, s3, 24 + sb t1, 0(a1) + sb t2, 4(a1) + sb t3, 8(a1) + sb t4, 12(a1) + srli t1, a7, 16 + srli t2, s1, 16 + srli t3, s2, 16 + srli t4, s3, 16 + sb t1, 1(a1) + sb t2, 5(a1) + sb t3, 9(a1) + sb t4, 13(a1) + srli t1, a7, 8 + srli t2, s1, 8 + srli t3, s2, 8 + srli t4, s3, 8 + sb t1, 2(a1) + sb t2, 6(a1) + sb t3, 10(a1) + sb t4, 14(a1) + sb a7, 3(a1) + sb s1, 7(a1) + sb s2, 11(a1) + sb s3, 15(a1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t1, a7, 32 + slli t2, s1, 32 + slli t3, s2, 32 + slli t4, s3, 32 + srli t2, t2, 32 + srli t4, t4, 32 + or t2, t2, t1 + or t4, t4, t3 +#else + # pack t2, s1, a7 + .word 0x0914c3b3 + # pack t4, s3, s2 + .word 0x0929ceb3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t2, t2 + .word 0x6b83d393 + # rev8 t4, t4 + .word 0x6b8ede93 + sd t2, 0(a1) + sd t4, 8(a1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + addi sp, sp, 32 + ret + .size AES_encrypt_RISCV64,.-AES_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_decrypt_RISCV64 + .type AES_decrypt_RISCV64,@function + .align 2 +AES_decrypt_RISCV64: + addi sp, sp, -32 + sd s1, 0(sp) + sd s2, 8(sp) + sd s3, 16(sp) + sd s4, 24(sp) + la t0, L_AES_base_td + la t1, L_AES_base_td4 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t2, 0(a0) + lbu t3, 4(a0) + lbu t4, 8(a0) + lbu t5, 12(a0) + slli t2, t2, 8 + slli t3, t3, 8 + slli t4, t4, 8 + slli t5, t5, 8 + lbu t6, 1(a0) + or t2, t2, t6 + lbu a4, 5(a0) + or t3, t3, a4 + lbu a5, 9(a0) + or t4, t4, a5 + lbu t6, 13(a0) + or t5, t5, t6 + slli t2, t2, 8 + slli t3, t3, 8 + slli t4, t4, 8 + slli t5, t5, 8 + lbu t6, 2(a0) + or t2, t2, t6 + lbu a4, 6(a0) + or t3, t3, a4 + lbu a5, 10(a0) + or t4, t4, a5 + lbu t6, 14(a0) + or t5, t5, t6 + slli t2, t2, 8 + slli t3, t3, 8 + slli t4, t4, 8 + slli t5, t5, 8 + lbu t6, 3(a0) + or t2, t2, t6 + lbu a4, 7(a0) + or t3, t3, a4 + lbu a5, 11(a0) + or t4, t4, a5 + lbu t6, 15(a0) + or t5, t5, t6 +#else + ld t3, 0(a0) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 + ld t5, 8(a0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s1, 0(a2) + lw s2, 4(a2) + lw s3, 8(a2) + lw s4, 12(a2) + xor s1, t2, s1 + xor s2, t3, s2 + xor s3, t4, s3 + xor s4, t5, s4 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 + srliw t5, s4, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + lw a7, 0(t5) + addi t6, t0, 1024 + srliw t2, s4, 14 + srliw t3, s1, 14 + srliw t4, s2, 14 + srliw t5, s3, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + srliw t2, s3, 6 + srliw t3, s4, 6 + srliw t4, s1, 6 + srliw t5, s2, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + andi t2, s2, 255 + andi t3, s3, 255 + andi t4, s4, 255 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + lw t2, 16(a2) + lw t3, 20(a2) + lw t4, 24(a2) + lw t5, 28(a2) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 + srliw t5, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + lw s4, 0(t5) + addi t6, t0, 1024 + srliw t2, a7, 14 + srliw t3, a4, 14 + srliw t4, a5, 14 + srliw t5, a6, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + srliw t2, a6, 6 + srliw t3, a7, 6 + srliw t4, a4, 6 + srliw t5, a5, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + andi t2, a5, 255 + andi t3, a6, 255 + andi t4, a7, 255 + andi t5, a4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + lw t2, 32(a2) + lw t3, 36(a2) + lw t4, 40(a2) + lw t5, 44(a2) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 + srliw t5, s4, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + lw a7, 0(t5) + addi t6, t0, 1024 + srliw t2, s4, 14 + srliw t3, s1, 14 + srliw t4, s2, 14 + srliw t5, s3, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + srliw t2, s3, 6 + srliw t3, s4, 6 + srliw t4, s1, 6 + srliw t5, s2, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + andi t2, s2, 255 + andi t3, s3, 255 + andi t4, s4, 255 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + lw t2, 48(a2) + lw t3, 52(a2) + lw t4, 56(a2) + lw t5, 60(a2) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 + srliw t5, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + lw s4, 0(t5) + addi t6, t0, 1024 + srliw t2, a7, 14 + srliw t3, a4, 14 + srliw t4, a5, 14 + srliw t5, a6, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + srliw t2, a6, 6 + srliw t3, a7, 6 + srliw t4, a4, 6 + srliw t5, a5, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + andi t2, a5, 255 + andi t3, a6, 255 + andi t4, a7, 255 + andi t5, a4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + lw t2, 64(a2) + lw t3, 68(a2) + lw t4, 72(a2) + lw t5, 76(a2) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 + srliw t5, s4, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + lw a7, 0(t5) + addi t6, t0, 1024 + srliw t2, s4, 14 + srliw t3, s1, 14 + srliw t4, s2, 14 + srliw t5, s3, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + srliw t2, s3, 6 + srliw t3, s4, 6 + srliw t4, s1, 6 + srliw t5, s2, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + andi t2, s2, 255 + andi t3, s3, 255 + andi t4, s4, 255 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + lw t2, 80(a2) + lw t3, 84(a2) + lw t4, 88(a2) + lw t5, 92(a2) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 + srliw t5, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + lw s4, 0(t5) + addi t6, t0, 1024 + srliw t2, a7, 14 + srliw t3, a4, 14 + srliw t4, a5, 14 + srliw t5, a6, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + srliw t2, a6, 6 + srliw t3, a7, 6 + srliw t4, a4, 6 + srliw t5, a5, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + andi t2, a5, 255 + andi t3, a6, 255 + andi t4, a7, 255 + andi t5, a4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + lw t2, 96(a2) + lw t3, 100(a2) + lw t4, 104(a2) + lw t5, 108(a2) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 + srliw t5, s4, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + lw a7, 0(t5) + addi t6, t0, 1024 + srliw t2, s4, 14 + srliw t3, s1, 14 + srliw t4, s2, 14 + srliw t5, s3, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + srliw t2, s3, 6 + srliw t3, s4, 6 + srliw t4, s1, 6 + srliw t5, s2, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + andi t2, s2, 255 + andi t3, s3, 255 + andi t4, s4, 255 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + lw t2, 112(a2) + lw t3, 116(a2) + lw t4, 120(a2) + lw t5, 124(a2) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 + srliw t5, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + lw s4, 0(t5) + addi t6, t0, 1024 + srliw t2, a7, 14 + srliw t3, a4, 14 + srliw t4, a5, 14 + srliw t5, a6, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + srliw t2, a6, 6 + srliw t3, a7, 6 + srliw t4, a4, 6 + srliw t5, a5, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + andi t2, a5, 255 + andi t3, a6, 255 + andi t4, a7, 255 + andi t5, a4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + lw t2, 128(a2) + lw t3, 132(a2) + lw t4, 136(a2) + lw t5, 140(a2) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 + srliw t5, s4, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + lw a7, 0(t5) + addi t6, t0, 1024 + srliw t2, s4, 14 + srliw t3, s1, 14 + srliw t4, s2, 14 + srliw t5, s3, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + srliw t2, s3, 6 + srliw t3, s4, 6 + srliw t4, s1, 6 + srliw t5, s2, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + andi t2, s2, 255 + andi t3, s3, 255 + andi t4, s4, 255 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + lw t2, 144(a2) + lw t3, 148(a2) + lw t4, 152(a2) + lw t5, 156(a2) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + li t6, 10 + ble a3, t6, L_AES_decrypt_RISCV64_done + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 + srliw t5, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + lw s4, 0(t5) + addi t6, t0, 1024 + srliw t2, a7, 14 + srliw t3, a4, 14 + srliw t4, a5, 14 + srliw t5, a6, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + srliw t2, a6, 6 + srliw t3, a7, 6 + srliw t4, a4, 6 + srliw t5, a5, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + andi t2, a5, 255 + andi t3, a6, 255 + andi t4, a7, 255 + andi t5, a4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + lw t2, 160(a2) + lw t3, 164(a2) + lw t4, 168(a2) + lw t5, 172(a2) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 + srliw t5, s4, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + lw a7, 0(t5) + addi t6, t0, 1024 + srliw t2, s4, 14 + srliw t3, s1, 14 + srliw t4, s2, 14 + srliw t5, s3, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + srliw t2, s3, 6 + srliw t3, s4, 6 + srliw t4, s1, 6 + srliw t5, s2, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + andi t2, s2, 255 + andi t3, s3, 255 + andi t4, s4, 255 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + lw t2, 176(a2) + lw t3, 180(a2) + lw t4, 184(a2) + lw t5, 188(a2) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + li t6, 12 + ble a3, t6, L_AES_decrypt_RISCV64_done + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 + srliw t5, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s1, 0(t2) + lw s2, 0(t3) + lw s3, 0(t4) + lw s4, 0(t5) + addi t6, t0, 1024 + srliw t2, a7, 14 + srliw t3, a4, 14 + srliw t4, a5, 14 + srliw t5, a6, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + srliw t2, a6, 6 + srliw t3, a7, 6 + srliw t4, a4, 6 + srliw t5, a5, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + addi t6, t6, 1024 + andi t2, a5, 255 + andi t3, a6, 255 + andi t4, a7, 255 + andi t5, a4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + lw t2, 192(a2) + lw t3, 196(a2) + lw t4, 200(a2) + lw t5, 204(a2) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + srliw t2, s1, 24 + srliw t3, s2, 24 + srliw t4, s3, 24 + srliw t5, s4, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t0 + sh2add t3, t3, t0 + sh2add t4, t4, t0 + sh2add t5, t5, t0 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t0 + add t3, t3, t0 + add t4, t4, t0 + add t5, t5, t0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t2) + lw a5, 0(t3) + lw a6, 0(t4) + lw a7, 0(t5) + addi t6, t0, 1024 + srliw t2, s4, 14 + srliw t3, s1, 14 + srliw t4, s2, 14 + srliw t5, s3, 14 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + srliw t2, s3, 6 + srliw t3, s4, 6 + srliw t4, s1, 6 + srliw t5, s2, 6 + andi t2, t2, 1020 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + addi t6, t6, 1024 + andi t2, s2, 255 + andi t3, s3, 255 + andi t4, s4, 255 + andi t5, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t2, t2, t6 + sh2add t3, t3, t6 + sh2add t4, t4, t6 + sh2add t5, t5, t6 +#else + slliw t2, t2, 2 + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + add t2, t2, t6 + add t3, t3, t6 + add t4, t4, t6 + add t5, t5, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t2, 0(t2) + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 + lw t2, 208(a2) + lw t3, 212(a2) + lw t4, 216(a2) + lw t5, 220(a2) + xor a4, a4, t2 + xor a5, a5, t3 + xor a6, a6, t4 + xor a7, a7, t5 +L_AES_decrypt_RISCV64_done: + srliw t2, a4, 24 + srliw t3, a5, 24 + srliw t4, a6, 24 + srliw t5, a7, 24 + add t2, t2, t1 + add t3, t3, t1 + add t4, t4, t1 + add t5, t5, t1 + lbu s1, 0(t2) + lbu s2, 0(t3) + lbu s3, 0(t4) + lbu s4, 0(t5) + slli s1, s1, 24 + slli s2, s2, 24 + slli s3, s3, 24 + slli s4, s4, 24 + srliw t2, a7, 16 + srliw t3, a4, 16 + srliw t4, a5, 16 + srliw t5, a6, 16 + andi t2, t2, 255 + andi t3, t3, 255 + andi t4, t4, 255 + andi t5, t5, 255 + add t2, t2, t1 + add t3, t3, t1 + add t4, t4, t1 + add t5, t5, t1 + lbu t2, 0(t2) + lbu t3, 0(t3) + lbu t4, 0(t4) + lbu t5, 0(t5) + slli t2, t2, 16 + slli t3, t3, 16 + slli t4, t4, 16 + slli t5, t5, 16 + or s1, s1, t2 + or s2, s2, t3 + or s3, s3, t4 + or s4, s4, t5 + srliw t2, a6, 8 + srliw t3, a7, 8 + srliw t4, a4, 8 + srliw t5, a5, 8 + andi t2, t2, 255 + andi t3, t3, 255 + andi t4, t4, 255 + andi t5, t5, 255 + add t2, t2, t1 + add t3, t3, t1 + add t4, t4, t1 + add t5, t5, t1 + lbu t2, 0(t2) + lbu t3, 0(t3) + lbu t4, 0(t4) + lbu t5, 0(t5) + slli t2, t2, 8 + slli t3, t3, 8 + slli t4, t4, 8 + slli t5, t5, 8 + or s1, s1, t2 + or s2, s2, t3 + or s3, s3, t4 + or s4, s4, t5 + andi t2, a5, 255 + andi t3, a6, 255 + andi t4, a7, 255 + andi t5, a4, 255 + add t2, t2, t1 + add t3, t3, t1 + add t4, t4, t1 + add t5, t5, t1 + lbu t2, 0(t2) + lbu t3, 0(t3) + lbu t4, 0(t4) + lbu t5, 0(t5) + or s1, s1, t2 + or s2, s2, t3 + or s3, s3, t4 + or s4, s4, t5 + slli t6, a3, 4 + add t6, a2, t6 + lw t2, 0(t6) + lw t3, 4(t6) + lw t4, 8(t6) + lw t5, 12(t6) + xor s1, s1, t2 + xor s2, s2, t3 + xor s3, s3, t4 + xor s4, s4, t5 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t2, s1, 24 + srli t3, s2, 24 + srli t4, s3, 24 + srli t5, s4, 24 + sb t2, 0(a1) + sb t3, 4(a1) + sb t4, 8(a1) + sb t5, 12(a1) + srli t2, s1, 16 + srli t3, s2, 16 + srli t4, s3, 16 + srli t5, s4, 16 + sb t2, 1(a1) + sb t3, 5(a1) + sb t4, 9(a1) + sb t5, 13(a1) + srli t2, s1, 8 + srli t3, s2, 8 + srli t4, s3, 8 + srli t5, s4, 8 + sb t2, 2(a1) + sb t3, 6(a1) + sb t4, 10(a1) + sb t5, 14(a1) + sb s1, 3(a1) + sb s2, 7(a1) + sb s3, 11(a1) + sb s4, 15(a1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t2, s1, 32 + slli t3, s2, 32 + slli t4, s3, 32 + slli t5, s4, 32 + srli t3, t3, 32 + srli t5, t5, 32 + or t3, t3, t2 + or t5, t5, t4 +#else + # pack t3, s2, s1 + .word 0x08994e33 + # pack t5, s4, s3 + .word 0x093a4f33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t3, t3 + .word 0x6b8e5e13 + # rev8 t5, t5 + .word 0x6b8f5f13 + sd t3, 0(a1) + sd t5, 8(a1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld s1, 0(sp) + ld s2, 8(sp) + ld s3, 16(sp) + ld s4, 24(sp) + addi sp, sp, 32 + ret + .size AES_decrypt_RISCV64,.-AES_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#ifdef HAVE_AES_ECB + .text + .globl AES_encrypt_blocks_RISCV64 + .type AES_encrypt_blocks_RISCV64,@function + .align 2 +AES_encrypt_blocks_RISCV64: + addi sp, sp, -80 + sd s1, 32(sp) + sd s2, 40(sp) + sd s3, 48(sp) + sd s4, 56(sp) + sd s5, 64(sp) + sd s6, 72(sp) + la t2, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 16(sp) + srliw a2, a2, 4 +L_AES_encrypt_blocks_RISCV64_block: + beqz a2, L_AES_encrypt_blocks_RISCV64_end + mv t0, a0 + mv t1, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t3, 0(t0) + lbu t4, 4(t0) + lbu t5, 8(t0) + lbu t6, 12(t0) + slli t3, t3, 8 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + lbu a5, 1(t0) + or t3, t3, a5 + lbu a6, 5(t0) + or t4, t4, a6 + lbu a7, 9(t0) + or t5, t5, a7 + lbu a5, 13(t0) + or t6, t6, a5 + slli t3, t3, 8 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + lbu a5, 2(t0) + or t3, t3, a5 + lbu a6, 6(t0) + or t4, t4, a6 + lbu a7, 10(t0) + or t5, t5, a7 + lbu a5, 14(t0) + or t6, t6, a5 + slli t3, t3, 8 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + lbu a5, 3(t0) + or t3, t3, a5 + lbu a6, 7(t0) + or t4, t4, a6 + lbu a7, 11(t0) + or t5, t5, a7 + lbu a5, 15(t0) + or t6, t6, a5 +#else + ld t4, 0(t0) + # rev8 t4, t4 + .word 0x6b8ede93 + srli t3, t4, 32 + ld t6, 8(t0) + # rev8 t6, t6 + .word 0x6b8fdf93 + srli t5, t6, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s3, 0(a3) + lw s4, 4(a3) + lw s5, 8(a3) + lw s6, 12(a3) + xor s3, t3, s3 + xor s4, t4, s4 + xor s5, t5, s5 + xor s6, t6, s6 + srliw t3, s3, 24 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a6, 0(t3) + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + addi a5, t2, 1024 + srliw t3, s4, 14 + srliw t4, s5, 14 + srliw t5, s6, 14 + srliw t6, s3, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + srliw t3, s5, 6 + srliw t4, s6, 6 + srliw t5, s3, 6 + srliw t6, s4, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + andi t3, s6, 255 + andi t4, s3, 255 + andi t5, s4, 255 + andi t6, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + lw t3, 16(a3) + lw t4, 20(a3) + lw t5, 24(a3) + lw t6, 28(a3) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + srliw t3, a6, 24 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t3) + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + addi a5, t2, 1024 + srliw t3, a7, 14 + srliw t4, s1, 14 + srliw t5, s2, 14 + srliw t6, a6, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + srliw t3, s1, 6 + srliw t4, s2, 6 + srliw t5, a6, 6 + srliw t6, a7, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + andi t3, s2, 255 + andi t4, a6, 255 + andi t5, a7, 255 + andi t6, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + lw t3, 32(a3) + lw t4, 36(a3) + lw t5, 40(a3) + lw t6, 44(a3) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + srliw t3, s3, 24 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a6, 0(t3) + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + addi a5, t2, 1024 + srliw t3, s4, 14 + srliw t4, s5, 14 + srliw t5, s6, 14 + srliw t6, s3, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + srliw t3, s5, 6 + srliw t4, s6, 6 + srliw t5, s3, 6 + srliw t6, s4, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + andi t3, s6, 255 + andi t4, s3, 255 + andi t5, s4, 255 + andi t6, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + lw t3, 48(a3) + lw t4, 52(a3) + lw t5, 56(a3) + lw t6, 60(a3) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + srliw t3, a6, 24 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t3) + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + addi a5, t2, 1024 + srliw t3, a7, 14 + srliw t4, s1, 14 + srliw t5, s2, 14 + srliw t6, a6, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + srliw t3, s1, 6 + srliw t4, s2, 6 + srliw t5, a6, 6 + srliw t6, a7, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + andi t3, s2, 255 + andi t4, a6, 255 + andi t5, a7, 255 + andi t6, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + lw t3, 64(a3) + lw t4, 68(a3) + lw t5, 72(a3) + lw t6, 76(a3) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + srliw t3, s3, 24 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a6, 0(t3) + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + addi a5, t2, 1024 + srliw t3, s4, 14 + srliw t4, s5, 14 + srliw t5, s6, 14 + srliw t6, s3, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + srliw t3, s5, 6 + srliw t4, s6, 6 + srliw t5, s3, 6 + srliw t6, s4, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + andi t3, s6, 255 + andi t4, s3, 255 + andi t5, s4, 255 + andi t6, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + lw t3, 80(a3) + lw t4, 84(a3) + lw t5, 88(a3) + lw t6, 92(a3) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + srliw t3, a6, 24 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t3) + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + addi a5, t2, 1024 + srliw t3, a7, 14 + srliw t4, s1, 14 + srliw t5, s2, 14 + srliw t6, a6, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + srliw t3, s1, 6 + srliw t4, s2, 6 + srliw t5, a6, 6 + srliw t6, a7, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + andi t3, s2, 255 + andi t4, a6, 255 + andi t5, a7, 255 + andi t6, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + lw t3, 96(a3) + lw t4, 100(a3) + lw t5, 104(a3) + lw t6, 108(a3) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + srliw t3, s3, 24 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a6, 0(t3) + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + addi a5, t2, 1024 + srliw t3, s4, 14 + srliw t4, s5, 14 + srliw t5, s6, 14 + srliw t6, s3, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + srliw t3, s5, 6 + srliw t4, s6, 6 + srliw t5, s3, 6 + srliw t6, s4, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + andi t3, s6, 255 + andi t4, s3, 255 + andi t5, s4, 255 + andi t6, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + lw t3, 112(a3) + lw t4, 116(a3) + lw t5, 120(a3) + lw t6, 124(a3) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + srliw t3, a6, 24 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t3) + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + addi a5, t2, 1024 + srliw t3, a7, 14 + srliw t4, s1, 14 + srliw t5, s2, 14 + srliw t6, a6, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + srliw t3, s1, 6 + srliw t4, s2, 6 + srliw t5, a6, 6 + srliw t6, a7, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + andi t3, s2, 255 + andi t4, a6, 255 + andi t5, a7, 255 + andi t6, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + lw t3, 128(a3) + lw t4, 132(a3) + lw t5, 136(a3) + lw t6, 140(a3) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + srliw t3, s3, 24 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a6, 0(t3) + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + addi a5, t2, 1024 + srliw t3, s4, 14 + srliw t4, s5, 14 + srliw t5, s6, 14 + srliw t6, s3, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + srliw t3, s5, 6 + srliw t4, s6, 6 + srliw t5, s3, 6 + srliw t6, s4, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + andi t3, s6, 255 + andi t4, s3, 255 + andi t5, s4, 255 + andi t6, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + lw t3, 144(a3) + lw t4, 148(a3) + lw t5, 152(a3) + lw t6, 156(a3) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + li a5, 10 + ble a4, a5, L_AES_enc_block_1_done + srliw t3, a6, 24 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t3) + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + addi a5, t2, 1024 + srliw t3, a7, 14 + srliw t4, s1, 14 + srliw t5, s2, 14 + srliw t6, a6, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + srliw t3, s1, 6 + srliw t4, s2, 6 + srliw t5, a6, 6 + srliw t6, a7, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + andi t3, s2, 255 + andi t4, a6, 255 + andi t5, a7, 255 + andi t6, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + lw t3, 160(a3) + lw t4, 164(a3) + lw t5, 168(a3) + lw t6, 172(a3) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + srliw t3, s3, 24 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a6, 0(t3) + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + addi a5, t2, 1024 + srliw t3, s4, 14 + srliw t4, s5, 14 + srliw t5, s6, 14 + srliw t6, s3, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + srliw t3, s5, 6 + srliw t4, s6, 6 + srliw t5, s3, 6 + srliw t6, s4, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + andi t3, s6, 255 + andi t4, s3, 255 + andi t5, s4, 255 + andi t6, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + lw t3, 176(a3) + lw t4, 180(a3) + lw t5, 184(a3) + lw t6, 188(a3) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + li a5, 12 + ble a4, a5, L_AES_enc_block_1_done + srliw t3, a6, 24 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t3) + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + addi a5, t2, 1024 + srliw t3, a7, 14 + srliw t4, s1, 14 + srliw t5, s2, 14 + srliw t6, a6, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + srliw t3, s1, 6 + srliw t4, s2, 6 + srliw t5, a6, 6 + srliw t6, a7, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + addi a5, a5, 1024 + andi t3, s2, 255 + andi t4, a6, 255 + andi t5, a7, 255 + andi t6, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + lw t3, 192(a3) + lw t4, 196(a3) + lw t5, 200(a3) + lw t6, 204(a3) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + srliw t3, s3, 24 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, t2 + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a6, 0(t3) + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + addi a5, t2, 1024 + srliw t3, s4, 14 + srliw t4, s5, 14 + srliw t5, s6, 14 + srliw t6, s3, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + srliw t3, s5, 6 + srliw t4, s6, 6 + srliw t5, s3, 6 + srliw t6, s4, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + addi a5, a5, 1024 + andi t3, s6, 255 + andi t4, s3, 255 + andi t5, s4, 255 + andi t6, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slliw t3, t3, 2 + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + lw t3, 208(a3) + lw t4, 212(a3) + lw t5, 216(a3) + lw t6, 220(a3) + xor a6, a6, t3 + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 +L_AES_enc_block_1_done: + srliw t3, s1, 6 + srliw t4, s2, 6 + srliw t5, a6, 6 + srliw t6, a7, 6 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, t2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + lw s3, 0(t3) + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + li a5, 65280 + and s3, s3, a5 + and s4, s4, a5 + and s5, s5, a5 + and s6, s6, a5 + addi a5, t2, 1024 + andi t3, s2, 255 + andi t4, a6, 255 + andi t5, a7, 255 + andi t6, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slli t3, t3, 2 + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t3, 0(t3) + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + or s3, s3, t3 + or s4, s4, t4 + or s5, s5, t5 + or s6, s6, t6 + addi a5, a5, 1024 + srliw t3, a6, 24 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t3, t3, a5 + sh2add t4, t4, a5 + sh2add t5, t5, a5 + sh2add t6, t6, a5 +#else + slli t3, t3, 2 + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + li a5, 4278190080 + and t3, t3, a5 + and t4, t4, a5 + and t5, t5, a5 + and t6, t6, a5 + or s3, s3, t3 + or s4, s4, t4 + or s5, s5, t5 + or s6, s6, t6 + li a5, 3072 + add a5, t2, a5 + srliw t3, a7, 14 + srliw t4, s1, 14 + srliw t5, s2, 14 + srliw t6, a6, 14 + andi t3, t3, 1020 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + add t3, t3, a5 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + lw t3, 0(t3) + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + li a5, 16711680 + and t3, t3, a5 + and t4, t4, a5 + and t5, t5, a5 + and t6, t6, a5 + or s3, s3, t3 + or s4, s4, t4 + or s5, s5, t5 + or s6, s6, t6 + slli a5, a4, 4 + add a5, a3, a5 + lw t3, 0(a5) + lw t4, 4(a5) + lw t5, 8(a5) + lw t6, 12(a5) + xor s3, s3, t3 + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t3, s3, 24 + srli t4, s4, 24 + srli t5, s5, 24 + srli t6, s6, 24 + sb t3, 0(t1) + sb t4, 4(t1) + sb t5, 8(t1) + sb t6, 12(t1) + srli t3, s3, 16 + srli t4, s4, 16 + srli t5, s5, 16 + srli t6, s6, 16 + sb t3, 1(t1) + sb t4, 5(t1) + sb t5, 9(t1) + sb t6, 13(t1) + srli t3, s3, 8 + srli t4, s4, 8 + srli t5, s5, 8 + srli t6, s6, 8 + sb t3, 2(t1) + sb t4, 6(t1) + sb t5, 10(t1) + sb t6, 14(t1) + sb s3, 3(t1) + sb s4, 7(t1) + sb s5, 11(t1) + sb s6, 15(t1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t3, s3, 32 + slli t4, s4, 32 + slli t5, s5, 32 + slli t6, s6, 32 + srli t4, t4, 32 + srli t6, t6, 32 + or t4, t4, t3 + or t6, t6, t5 +#else + # pack t4, s4, s3 + .word 0x093a4eb3 + # pack t6, s6, s5 + .word 0x095b4fb3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t4, t4 + .word 0x6b8ede93 + # rev8 t6, t6 + .word 0x6b8fdf93 + sd t4, 0(t1) + sd t6, 8(t1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_encrypt_blocks_RISCV64_block +L_AES_encrypt_blocks_RISCV64_end: + ld ra, 16(sp) + ld s1, 32(sp) + ld s2, 40(sp) + ld s3, 48(sp) + ld s4, 56(sp) + ld s5, 64(sp) + ld s6, 72(sp) + addi sp, sp, 80 + ret + .size AES_encrypt_blocks_RISCV64,.-AES_encrypt_blocks_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_decrypt_blocks_RISCV64 + .type AES_decrypt_blocks_RISCV64,@function + .align 2 +AES_decrypt_blocks_RISCV64: + addi sp, sp, -96 + sd s1, 40(sp) + sd s2, 48(sp) + sd s3, 56(sp) + sd s4, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + la t2, L_AES_base_td + la t3, L_AES_base_td4 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 16(sp) + srliw a2, a2, 4 +L_AES_decrypt_blocks_RISCV64_block: + beqz a2, L_AES_decrypt_blocks_RISCV64_end + mv t0, a0 + mv t1, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu a5, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli a5, a5, 8 + lbu a6, 1(t0) + or t4, t4, a6 + lbu a7, 5(t0) + or t5, t5, a7 + lbu s1, 9(t0) + or t6, t6, s1 + lbu a6, 13(t0) + or a5, a5, a6 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli a5, a5, 8 + lbu a6, 2(t0) + or t4, t4, a6 + lbu a7, 6(t0) + or t5, t5, a7 + lbu s1, 10(t0) + or t6, t6, s1 + lbu a6, 14(t0) + or a5, a5, a6 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli a5, a5, 8 + lbu a6, 3(t0) + or t4, t4, a6 + lbu a7, 7(t0) + or t5, t5, a7 + lbu s1, 11(t0) + or t6, t6, s1 + lbu a6, 15(t0) + or a5, a5, a6 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld a5, 8(t0) + # rev8 a5, a5 + .word 0x6b87d793 + srli t6, a5, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s4, 0(a3) + lw s5, 4(a3) + lw s6, 8(a3) + lw s7, 12(a3) + xor s4, t4, s4 + xor s5, t5, s5 + xor s6, t6, s6 + xor s7, a5, s7 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 + srliw a5, s7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + lw s3, 0(a5) + addi a6, t2, 1024 + srliw t4, s7, 14 + srliw t5, s4, 14 + srliw t6, s5, 14 + srliw a5, s6, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + srliw t4, s6, 6 + srliw t5, s7, 6 + srliw t6, s4, 6 + srliw a5, s5, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + andi t4, s5, 255 + andi t5, s6, 255 + andi t6, s7, 255 + andi a5, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + lw t4, 16(a3) + lw t5, 20(a3) + lw t6, 24(a3) + lw a5, 28(a3) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 + srliw a5, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + lw s7, 0(a5) + addi a6, t2, 1024 + srliw t4, s3, 14 + srliw t5, a7, 14 + srliw t6, s1, 14 + srliw a5, s2, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + srliw t4, s2, 6 + srliw t5, s3, 6 + srliw t6, a7, 6 + srliw a5, s1, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + andi t4, s1, 255 + andi t5, s2, 255 + andi t6, s3, 255 + andi a5, a7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + lw t4, 32(a3) + lw t5, 36(a3) + lw t6, 40(a3) + lw a5, 44(a3) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 + srliw a5, s7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + lw s3, 0(a5) + addi a6, t2, 1024 + srliw t4, s7, 14 + srliw t5, s4, 14 + srliw t6, s5, 14 + srliw a5, s6, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + srliw t4, s6, 6 + srliw t5, s7, 6 + srliw t6, s4, 6 + srliw a5, s5, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + andi t4, s5, 255 + andi t5, s6, 255 + andi t6, s7, 255 + andi a5, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + lw t4, 48(a3) + lw t5, 52(a3) + lw t6, 56(a3) + lw a5, 60(a3) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 + srliw a5, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + lw s7, 0(a5) + addi a6, t2, 1024 + srliw t4, s3, 14 + srliw t5, a7, 14 + srliw t6, s1, 14 + srliw a5, s2, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + srliw t4, s2, 6 + srliw t5, s3, 6 + srliw t6, a7, 6 + srliw a5, s1, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + andi t4, s1, 255 + andi t5, s2, 255 + andi t6, s3, 255 + andi a5, a7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + lw t4, 64(a3) + lw t5, 68(a3) + lw t6, 72(a3) + lw a5, 76(a3) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 + srliw a5, s7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + lw s3, 0(a5) + addi a6, t2, 1024 + srliw t4, s7, 14 + srliw t5, s4, 14 + srliw t6, s5, 14 + srliw a5, s6, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + srliw t4, s6, 6 + srliw t5, s7, 6 + srliw t6, s4, 6 + srliw a5, s5, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + andi t4, s5, 255 + andi t5, s6, 255 + andi t6, s7, 255 + andi a5, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + lw t4, 80(a3) + lw t5, 84(a3) + lw t6, 88(a3) + lw a5, 92(a3) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 + srliw a5, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + lw s7, 0(a5) + addi a6, t2, 1024 + srliw t4, s3, 14 + srliw t5, a7, 14 + srliw t6, s1, 14 + srliw a5, s2, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + srliw t4, s2, 6 + srliw t5, s3, 6 + srliw t6, a7, 6 + srliw a5, s1, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + andi t4, s1, 255 + andi t5, s2, 255 + andi t6, s3, 255 + andi a5, a7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + lw t4, 96(a3) + lw t5, 100(a3) + lw t6, 104(a3) + lw a5, 108(a3) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 + srliw a5, s7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + lw s3, 0(a5) + addi a6, t2, 1024 + srliw t4, s7, 14 + srliw t5, s4, 14 + srliw t6, s5, 14 + srliw a5, s6, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + srliw t4, s6, 6 + srliw t5, s7, 6 + srliw t6, s4, 6 + srliw a5, s5, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + andi t4, s5, 255 + andi t5, s6, 255 + andi t6, s7, 255 + andi a5, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + lw t4, 112(a3) + lw t5, 116(a3) + lw t6, 120(a3) + lw a5, 124(a3) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 + srliw a5, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + lw s7, 0(a5) + addi a6, t2, 1024 + srliw t4, s3, 14 + srliw t5, a7, 14 + srliw t6, s1, 14 + srliw a5, s2, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + srliw t4, s2, 6 + srliw t5, s3, 6 + srliw t6, a7, 6 + srliw a5, s1, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + andi t4, s1, 255 + andi t5, s2, 255 + andi t6, s3, 255 + andi a5, a7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + lw t4, 128(a3) + lw t5, 132(a3) + lw t6, 136(a3) + lw a5, 140(a3) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 + srliw a5, s7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + lw s3, 0(a5) + addi a6, t2, 1024 + srliw t4, s7, 14 + srliw t5, s4, 14 + srliw t6, s5, 14 + srliw a5, s6, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + srliw t4, s6, 6 + srliw t5, s7, 6 + srliw t6, s4, 6 + srliw a5, s5, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + andi t4, s5, 255 + andi t5, s6, 255 + andi t6, s7, 255 + andi a5, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + lw t4, 144(a3) + lw t5, 148(a3) + lw t6, 152(a3) + lw a5, 156(a3) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + li a6, 10 + ble a4, a6, L_AES_dec_block_2_done + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 + srliw a5, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + lw s7, 0(a5) + addi a6, t2, 1024 + srliw t4, s3, 14 + srliw t5, a7, 14 + srliw t6, s1, 14 + srliw a5, s2, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + srliw t4, s2, 6 + srliw t5, s3, 6 + srliw t6, a7, 6 + srliw a5, s1, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + andi t4, s1, 255 + andi t5, s2, 255 + andi t6, s3, 255 + andi a5, a7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + lw t4, 160(a3) + lw t5, 164(a3) + lw t6, 168(a3) + lw a5, 172(a3) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 + srliw a5, s7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + lw s3, 0(a5) + addi a6, t2, 1024 + srliw t4, s7, 14 + srliw t5, s4, 14 + srliw t6, s5, 14 + srliw a5, s6, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + srliw t4, s6, 6 + srliw t5, s7, 6 + srliw t6, s4, 6 + srliw a5, s5, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + andi t4, s5, 255 + andi t5, s6, 255 + andi t6, s7, 255 + andi a5, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + lw t4, 176(a3) + lw t5, 180(a3) + lw t6, 184(a3) + lw a5, 188(a3) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + li a6, 12 + ble a4, a6, L_AES_dec_block_2_done + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 + srliw a5, s3, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s4, 0(t4) + lw s5, 0(t5) + lw s6, 0(t6) + lw s7, 0(a5) + addi a6, t2, 1024 + srliw t4, s3, 14 + srliw t5, a7, 14 + srliw t6, s1, 14 + srliw a5, s2, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + srliw t4, s2, 6 + srliw t5, s3, 6 + srliw t6, a7, 6 + srliw a5, s1, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + addi a6, a6, 1024 + andi t4, s1, 255 + andi t5, s2, 255 + andi t6, s3, 255 + andi a5, a7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + lw t4, 192(a3) + lw t5, 196(a3) + lw t6, 200(a3) + lw a5, 204(a3) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + srliw t4, s4, 24 + srliw t5, s5, 24 + srliw t6, s6, 24 + srliw a5, s7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t2 + sh2add t5, t5, t2 + sh2add t6, t6, t2 + sh2add a5, a5, t2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, t2 + add t5, t5, t2 + add t6, t6, t2 + add a5, a5, t2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(t4) + lw s1, 0(t5) + lw s2, 0(t6) + lw s3, 0(a5) + addi a6, t2, 1024 + srliw t4, s7, 14 + srliw t5, s4, 14 + srliw t6, s5, 14 + srliw a5, s6, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + srliw t4, s6, 6 + srliw t5, s7, 6 + srliw t6, s4, 6 + srliw a5, s5, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a5, a5, 1020 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + addi a6, a6, 1024 + andi t4, s5, 255 + andi t5, s6, 255 + andi t6, s7, 255 + andi a5, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, a6 + sh2add t5, t5, a6 + sh2add t6, t6, a6 + sh2add a5, a5, a6 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a5, a5, 2 + add t4, t4, a6 + add t5, t5, a6 + add t6, t6, a6 + add a5, a5, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw a5, 0(a5) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 + lw t4, 208(a3) + lw t5, 212(a3) + lw t6, 216(a3) + lw a5, 220(a3) + xor a7, a7, t4 + xor s1, s1, t5 + xor s2, s2, t6 + xor s3, s3, a5 +L_AES_dec_block_2_done: + srliw t4, a7, 24 + srliw t5, s1, 24 + srliw t6, s2, 24 + srliw a5, s3, 24 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add a5, a5, t3 + lbu s4, 0(t4) + lbu s5, 0(t5) + lbu s6, 0(t6) + lbu s7, 0(a5) + slli s4, s4, 24 + slli s5, s5, 24 + slli s6, s6, 24 + slli s7, s7, 24 + srliw t4, s3, 16 + srliw t5, a7, 16 + srliw t6, s1, 16 + srliw a5, s2, 16 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi a5, a5, 255 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add a5, a5, t3 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu a5, 0(a5) + slli t4, t4, 16 + slli t5, t5, 16 + slli t6, t6, 16 + slli a5, a5, 16 + or s4, s4, t4 + or s5, s5, t5 + or s6, s6, t6 + or s7, s7, a5 + srliw t4, s2, 8 + srliw t5, s3, 8 + srliw t6, a7, 8 + srliw a5, s1, 8 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi a5, a5, 255 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add a5, a5, t3 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu a5, 0(a5) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli a5, a5, 8 + or s4, s4, t4 + or s5, s5, t5 + or s6, s6, t6 + or s7, s7, a5 + andi t4, s1, 255 + andi t5, s2, 255 + andi t6, s3, 255 + andi a5, a7, 255 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add a5, a5, t3 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu a5, 0(a5) + or s4, s4, t4 + or s5, s5, t5 + or s6, s6, t6 + or s7, s7, a5 + slli a6, a4, 4 + add a6, a3, a6 + lw t4, 0(a6) + lw t5, 4(a6) + lw t6, 8(a6) + lw a5, 12(a6) + xor s4, s4, t4 + xor s5, s5, t5 + xor s6, s6, t6 + xor s7, s7, a5 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s4, 24 + srli t5, s5, 24 + srli t6, s6, 24 + srli a5, s7, 24 + sb t4, 0(t1) + sb t5, 4(t1) + sb t6, 8(t1) + sb a5, 12(t1) + srli t4, s4, 16 + srli t5, s5, 16 + srli t6, s6, 16 + srli a5, s7, 16 + sb t4, 1(t1) + sb t5, 5(t1) + sb t6, 9(t1) + sb a5, 13(t1) + srli t4, s4, 8 + srli t5, s5, 8 + srli t6, s6, 8 + srli a5, s7, 8 + sb t4, 2(t1) + sb t5, 6(t1) + sb t6, 10(t1) + sb a5, 14(t1) + sb s4, 3(t1) + sb s5, 7(t1) + sb s6, 11(t1) + sb s7, 15(t1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s4, 32 + slli t5, s5, 32 + slli t6, s6, 32 + slli a5, s7, 32 + srli t5, t5, 32 + srli a5, a5, 32 + or t5, t5, t4 + or a5, a5, t6 +#else + # pack t5, s5, s4 + .word 0x094acf33 + # pack a5, s7, s6 + .word 0x096bc7b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 a5, a5 + .word 0x6b87d793 + sd t5, 0(t1) + sd a5, 8(t1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_decrypt_blocks_RISCV64_block +L_AES_decrypt_blocks_RISCV64_end: + ld ra, 16(sp) + ld s1, 40(sp) + ld s2, 48(sp) + ld s3, 56(sp) + ld s4, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + addi sp, sp, 96 + ret + .size AES_decrypt_blocks_RISCV64,.-AES_decrypt_blocks_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_ECB */ +#ifdef HAVE_AES_CBC + .text + .globl AES_CBC_encrypt_RISCV64 + .type AES_CBC_encrypt_RISCV64,@function + .align 2 +AES_CBC_encrypt_RISCV64: + addi sp, sp, -112 + sd s1, 40(sp) + sd s2, 48(sp) + sd s3, 56(sp) + sd s4, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + sd s8, 96(sp) + sd s9, 104(sp) + la t4, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 16(sp) + srliw a2, a2, 4 + ld t2, 0(a3) + ld t3, 8(a3) +L_AES_CBC_encrypt_RISCV64_block: + beqz a2, L_AES_CBC_encrypt_RISCV64_end +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 0(a0) +#else + andi a6, a0, 7 + bnez a6, L_ualn_ld1_w + ld t5, 0(a0) + j L_ualn_ld1_e +L_ualn_ld1_w: + andi a6, a6, 3 + bnez a6, L_ualn_ld1_h + lwu t5, 0(a0) + lwu a6, 4(a0) + slli a6, a6, 32 + or t5, t5, a6 + j L_ualn_ld1_e +L_ualn_ld1_h: + andi a6, a6, 1 + bnez a6, L_ualn_ld1_b + lhu t5, 0(a0) + lhu a6, 2(a0) + slli a6, a6, 16 + or t5, t5, a6 + lhu a6, 4(a0) + slli a6, a6, 32 + or t5, t5, a6 + lhu a6, 6(a0) + slli a6, a6, 48 + or t5, t5, a6 + j L_ualn_ld1_e +L_ualn_ld1_b: + lbu t5, 0(a0) + lbu a6, 1(a0) + slli a6, a6, 8 + or t5, t5, a6 + lbu a6, 2(a0) + slli a6, a6, 16 + or t5, t5, a6 + lbu a6, 3(a0) + slli a6, a6, 24 + or t5, t5, a6 + lbu a6, 4(a0) + slli a6, a6, 32 + or t5, t5, a6 + lbu a6, 5(a0) + slli a6, a6, 40 + or t5, t5, a6 + lbu a6, 6(a0) + slli a6, a6, 48 + or t5, t5, a6 + lbu a6, 7(a0) + slli a6, a6, 56 + or t5, t5, a6 +L_ualn_ld1_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t6, 8(a0) +#else + andi a6, a0, 7 + bnez a6, L_ualn_ld2_w + ld t6, 8(a0) + j L_ualn_ld2_e +L_ualn_ld2_w: + andi a6, a6, 3 + bnez a6, L_ualn_ld2_h + lwu t6, 8(a0) + lwu a6, 12(a0) + slli a6, a6, 32 + or t6, t6, a6 + j L_ualn_ld2_e +L_ualn_ld2_h: + andi a6, a6, 1 + bnez a6, L_ualn_ld2_b + lhu t6, 8(a0) + lhu a6, 10(a0) + slli a6, a6, 16 + or t6, t6, a6 + lhu a6, 12(a0) + slli a6, a6, 32 + or t6, t6, a6 + lhu a6, 14(a0) + slli a6, a6, 48 + or t6, t6, a6 + j L_ualn_ld2_e +L_ualn_ld2_b: + lbu t6, 8(a0) + lbu a6, 9(a0) + slli a6, a6, 8 + or t6, t6, a6 + lbu a6, 10(a0) + slli a6, a6, 16 + or t6, t6, a6 + lbu a6, 11(a0) + slli a6, a6, 24 + or t6, t6, a6 + lbu a6, 12(a0) + slli a6, a6, 32 + or t6, t6, a6 + lbu a6, 13(a0) + slli a6, a6, 40 + or t6, t6, a6 + lbu a6, 14(a0) + slli a6, a6, 48 + or t6, t6, a6 + lbu a6, 15(a0) + slli a6, a6, 56 + or t6, t6, a6 +L_ualn_ld2_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t5, t5, t2 + xor t6, t6, t3 + sd t5, 0(sp) + sd t6, 8(sp) + addi t0, sp, 0 + mv t1, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t5, 0(t0) + lbu t6, 4(t0) + lbu a6, 8(t0) + lbu a7, 12(t0) + slli t5, t5, 8 + slli t6, t6, 8 + slli a6, a6, 8 + slli a7, a7, 8 + lbu s1, 1(t0) + or t5, t5, s1 + lbu s2, 5(t0) + or t6, t6, s2 + lbu s3, 9(t0) + or a6, a6, s3 + lbu s1, 13(t0) + or a7, a7, s1 + slli t5, t5, 8 + slli t6, t6, 8 + slli a6, a6, 8 + slli a7, a7, 8 + lbu s1, 2(t0) + or t5, t5, s1 + lbu s2, 6(t0) + or t6, t6, s2 + lbu s3, 10(t0) + or a6, a6, s3 + lbu s1, 14(t0) + or a7, a7, s1 + slli t5, t5, 8 + slli t6, t6, 8 + slli a6, a6, 8 + slli a7, a7, 8 + lbu s1, 3(t0) + or t5, t5, s1 + lbu s2, 7(t0) + or t6, t6, s2 + lbu s3, 11(t0) + or a6, a6, s3 + lbu s1, 15(t0) + or a7, a7, s1 +#else + ld t6, 0(t0) + # rev8 t6, t6 + .word 0x6b8fdf93 + srli t5, t6, 32 + ld a7, 8(t0) + # rev8 a7, a7 + .word 0x6b88d893 + srli a6, a7, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s6, 0(a4) + lw s7, 4(a4) + lw s8, 8(a4) + lw s9, 12(a4) + xor s6, t5, s6 + xor s7, t6, s7 + xor s8, a6, s8 + xor s9, a7, s9 + srliw t5, s6, 24 + srliw t6, s7, 24 + srliw a6, s8, 24 + srliw a7, s9, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s2, 0(t5) + lw s3, 0(t6) + lw s4, 0(a6) + lw s5, 0(a7) + addi s1, t4, 1024 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw a6, s9, 14 + srliw a7, s6, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + srliw t5, s8, 6 + srliw t6, s9, 6 + srliw a6, s6, 6 + srliw a7, s7, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + andi t5, s9, 255 + andi t6, s6, 255 + andi a6, s7, 255 + andi a7, s8, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + lw t5, 16(a4) + lw t6, 20(a4) + lw a6, 24(a4) + lw a7, 28(a4) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + srliw t5, s2, 24 + srliw t6, s3, 24 + srliw a6, s4, 24 + srliw a7, s5, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s6, 0(t5) + lw s7, 0(t6) + lw s8, 0(a6) + lw s9, 0(a7) + addi s1, t4, 1024 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw a6, s5, 14 + srliw a7, s2, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + srliw t5, s4, 6 + srliw t6, s5, 6 + srliw a6, s2, 6 + srliw a7, s3, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + andi t5, s5, 255 + andi t6, s2, 255 + andi a6, s3, 255 + andi a7, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + lw t5, 32(a4) + lw t6, 36(a4) + lw a6, 40(a4) + lw a7, 44(a4) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + srliw t5, s6, 24 + srliw t6, s7, 24 + srliw a6, s8, 24 + srliw a7, s9, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s2, 0(t5) + lw s3, 0(t6) + lw s4, 0(a6) + lw s5, 0(a7) + addi s1, t4, 1024 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw a6, s9, 14 + srliw a7, s6, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + srliw t5, s8, 6 + srliw t6, s9, 6 + srliw a6, s6, 6 + srliw a7, s7, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + andi t5, s9, 255 + andi t6, s6, 255 + andi a6, s7, 255 + andi a7, s8, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + lw t5, 48(a4) + lw t6, 52(a4) + lw a6, 56(a4) + lw a7, 60(a4) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + srliw t5, s2, 24 + srliw t6, s3, 24 + srliw a6, s4, 24 + srliw a7, s5, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s6, 0(t5) + lw s7, 0(t6) + lw s8, 0(a6) + lw s9, 0(a7) + addi s1, t4, 1024 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw a6, s5, 14 + srliw a7, s2, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + srliw t5, s4, 6 + srliw t6, s5, 6 + srliw a6, s2, 6 + srliw a7, s3, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + andi t5, s5, 255 + andi t6, s2, 255 + andi a6, s3, 255 + andi a7, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + lw t5, 64(a4) + lw t6, 68(a4) + lw a6, 72(a4) + lw a7, 76(a4) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + srliw t5, s6, 24 + srliw t6, s7, 24 + srliw a6, s8, 24 + srliw a7, s9, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s2, 0(t5) + lw s3, 0(t6) + lw s4, 0(a6) + lw s5, 0(a7) + addi s1, t4, 1024 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw a6, s9, 14 + srliw a7, s6, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + srliw t5, s8, 6 + srliw t6, s9, 6 + srliw a6, s6, 6 + srliw a7, s7, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + andi t5, s9, 255 + andi t6, s6, 255 + andi a6, s7, 255 + andi a7, s8, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + lw t5, 80(a4) + lw t6, 84(a4) + lw a6, 88(a4) + lw a7, 92(a4) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + srliw t5, s2, 24 + srliw t6, s3, 24 + srliw a6, s4, 24 + srliw a7, s5, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s6, 0(t5) + lw s7, 0(t6) + lw s8, 0(a6) + lw s9, 0(a7) + addi s1, t4, 1024 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw a6, s5, 14 + srliw a7, s2, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + srliw t5, s4, 6 + srliw t6, s5, 6 + srliw a6, s2, 6 + srliw a7, s3, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + andi t5, s5, 255 + andi t6, s2, 255 + andi a6, s3, 255 + andi a7, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + lw t5, 96(a4) + lw t6, 100(a4) + lw a6, 104(a4) + lw a7, 108(a4) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + srliw t5, s6, 24 + srliw t6, s7, 24 + srliw a6, s8, 24 + srliw a7, s9, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s2, 0(t5) + lw s3, 0(t6) + lw s4, 0(a6) + lw s5, 0(a7) + addi s1, t4, 1024 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw a6, s9, 14 + srliw a7, s6, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + srliw t5, s8, 6 + srliw t6, s9, 6 + srliw a6, s6, 6 + srliw a7, s7, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + andi t5, s9, 255 + andi t6, s6, 255 + andi a6, s7, 255 + andi a7, s8, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + lw t5, 112(a4) + lw t6, 116(a4) + lw a6, 120(a4) + lw a7, 124(a4) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + srliw t5, s2, 24 + srliw t6, s3, 24 + srliw a6, s4, 24 + srliw a7, s5, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s6, 0(t5) + lw s7, 0(t6) + lw s8, 0(a6) + lw s9, 0(a7) + addi s1, t4, 1024 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw a6, s5, 14 + srliw a7, s2, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + srliw t5, s4, 6 + srliw t6, s5, 6 + srliw a6, s2, 6 + srliw a7, s3, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + andi t5, s5, 255 + andi t6, s2, 255 + andi a6, s3, 255 + andi a7, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + lw t5, 128(a4) + lw t6, 132(a4) + lw a6, 136(a4) + lw a7, 140(a4) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + srliw t5, s6, 24 + srliw t6, s7, 24 + srliw a6, s8, 24 + srliw a7, s9, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s2, 0(t5) + lw s3, 0(t6) + lw s4, 0(a6) + lw s5, 0(a7) + addi s1, t4, 1024 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw a6, s9, 14 + srliw a7, s6, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + srliw t5, s8, 6 + srliw t6, s9, 6 + srliw a6, s6, 6 + srliw a7, s7, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + andi t5, s9, 255 + andi t6, s6, 255 + andi a6, s7, 255 + andi a7, s8, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + lw t5, 144(a4) + lw t6, 148(a4) + lw a6, 152(a4) + lw a7, 156(a4) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + li s1, 10 + ble a5, s1, L_AES_enc_block_3_done + srliw t5, s2, 24 + srliw t6, s3, 24 + srliw a6, s4, 24 + srliw a7, s5, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s6, 0(t5) + lw s7, 0(t6) + lw s8, 0(a6) + lw s9, 0(a7) + addi s1, t4, 1024 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw a6, s5, 14 + srliw a7, s2, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + srliw t5, s4, 6 + srliw t6, s5, 6 + srliw a6, s2, 6 + srliw a7, s3, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + andi t5, s5, 255 + andi t6, s2, 255 + andi a6, s3, 255 + andi a7, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + lw t5, 160(a4) + lw t6, 164(a4) + lw a6, 168(a4) + lw a7, 172(a4) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + srliw t5, s6, 24 + srliw t6, s7, 24 + srliw a6, s8, 24 + srliw a7, s9, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s2, 0(t5) + lw s3, 0(t6) + lw s4, 0(a6) + lw s5, 0(a7) + addi s1, t4, 1024 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw a6, s9, 14 + srliw a7, s6, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + srliw t5, s8, 6 + srliw t6, s9, 6 + srliw a6, s6, 6 + srliw a7, s7, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + andi t5, s9, 255 + andi t6, s6, 255 + andi a6, s7, 255 + andi a7, s8, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + lw t5, 176(a4) + lw t6, 180(a4) + lw a6, 184(a4) + lw a7, 188(a4) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + li s1, 12 + ble a5, s1, L_AES_enc_block_3_done + srliw t5, s2, 24 + srliw t6, s3, 24 + srliw a6, s4, 24 + srliw a7, s5, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s6, 0(t5) + lw s7, 0(t6) + lw s8, 0(a6) + lw s9, 0(a7) + addi s1, t4, 1024 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw a6, s5, 14 + srliw a7, s2, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + srliw t5, s4, 6 + srliw t6, s5, 6 + srliw a6, s2, 6 + srliw a7, s3, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + addi s1, s1, 1024 + andi t5, s5, 255 + andi t6, s2, 255 + andi a6, s3, 255 + andi a7, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + lw t5, 192(a4) + lw t6, 196(a4) + lw a6, 200(a4) + lw a7, 204(a4) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + srliw t5, s6, 24 + srliw t6, s7, 24 + srliw a6, s8, 24 + srliw a7, s9, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, t4 + sh2add t6, t6, t4 + sh2add a6, a6, t4 + sh2add a7, a7, t4 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s2, 0(t5) + lw s3, 0(t6) + lw s4, 0(a6) + lw s5, 0(a7) + addi s1, t4, 1024 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw a6, s9, 14 + srliw a7, s6, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + srliw t5, s8, 6 + srliw t6, s9, 6 + srliw a6, s6, 6 + srliw a7, s7, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + addi s1, s1, 1024 + andi t5, s9, 255 + andi t6, s6, 255 + andi a6, s7, 255 + andi a7, s8, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw a6, a6, 2 + slliw a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 + lw t5, 208(a4) + lw t6, 212(a4) + lw a6, 216(a4) + lw a7, 220(a4) + xor s2, s2, t5 + xor s3, s3, t6 + xor s4, s4, a6 + xor s5, s5, a7 +L_AES_enc_block_3_done: + srliw t5, s4, 6 + srliw t6, s5, 6 + srliw a6, s2, 6 + srliw a7, s3, 6 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, t4 + add t6, t6, t4 + add a6, a6, t4 + add a7, a7, t4 + lw s6, 0(t5) + lw s7, 0(t6) + lw s8, 0(a6) + lw s9, 0(a7) + li s1, 65280 + and s6, s6, s1 + and s7, s7, s1 + and s8, s8, s1 + and s9, s9, s1 + addi s1, t4, 1024 + andi t5, s5, 255 + andi t6, s2, 255 + andi a6, s3, 255 + andi a7, s4, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slli t5, t5, 2 + slli t6, t6, 2 + slli a6, a6, 2 + slli a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu a6, 0(a6) + lbu a7, 0(a7) + or s6, s6, t5 + or s7, s7, t6 + or s8, s8, a6 + or s9, s9, a7 + addi s1, s1, 1024 + srliw t5, s2, 24 + srliw t6, s3, 24 + srliw a6, s4, 24 + srliw a7, s5, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t5, t5, s1 + sh2add t6, t6, s1 + sh2add a6, a6, s1 + sh2add a7, a7, s1 +#else + slli t5, t5, 2 + slli t6, t6, 2 + slli a6, a6, 2 + slli a7, a7, 2 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + li s1, 4278190080 + and t5, t5, s1 + and t6, t6, s1 + and a6, a6, s1 + and a7, a7, s1 + or s6, s6, t5 + or s7, s7, t6 + or s8, s8, a6 + or s9, s9, a7 + li s1, 3072 + add s1, t4, s1 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw a6, s5, 14 + srliw a7, s2, 14 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi a6, a6, 1020 + andi a7, a7, 1020 + add t5, t5, s1 + add t6, t6, s1 + add a6, a6, s1 + add a7, a7, s1 + lw t5, 0(t5) + lw t6, 0(t6) + lw a6, 0(a6) + lw a7, 0(a7) + li s1, 16711680 + and t5, t5, s1 + and t6, t6, s1 + and a6, a6, s1 + and a7, a7, s1 + or s6, s6, t5 + or s7, s7, t6 + or s8, s8, a6 + or s9, s9, a7 + slli s1, a5, 4 + add s1, a4, s1 + lw t5, 0(s1) + lw t6, 4(s1) + lw a6, 8(s1) + lw a7, 12(s1) + xor s6, s6, t5 + xor s7, s7, t6 + xor s8, s8, a6 + xor s9, s9, a7 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t5, s6, 24 + srli t6, s7, 24 + srli a6, s8, 24 + srli a7, s9, 24 + sb t5, 0(t1) + sb t6, 4(t1) + sb a6, 8(t1) + sb a7, 12(t1) + srli t5, s6, 16 + srli t6, s7, 16 + srli a6, s8, 16 + srli a7, s9, 16 + sb t5, 1(t1) + sb t6, 5(t1) + sb a6, 9(t1) + sb a7, 13(t1) + srli t5, s6, 8 + srli t6, s7, 8 + srli a6, s8, 8 + srli a7, s9, 8 + sb t5, 2(t1) + sb t6, 6(t1) + sb a6, 10(t1) + sb a7, 14(t1) + sb s6, 3(t1) + sb s7, 7(t1) + sb s8, 11(t1) + sb s9, 15(t1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t5, s6, 32 + slli t6, s7, 32 + slli a6, s8, 32 + slli a7, s9, 32 + srli t6, t6, 32 + srli a7, a7, 32 + or t6, t6, t5 + or a7, a7, a6 +#else + # pack t6, s7, s6 + .word 0x096bcfb3 + # pack a7, s9, s8 + .word 0x098cc8b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t6, t6 + .word 0x6b8fdf93 + # rev8 a7, a7 + .word 0x6b88d893 + sd t6, 0(t1) + sd a7, 8(t1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a1) +#else + andi t5, a1, 7 + bnez t5, L_ualn_ld3_w + ld t2, 0(a1) + j L_ualn_ld3_e +L_ualn_ld3_w: + andi t5, t5, 3 + bnez t5, L_ualn_ld3_h + lwu t2, 0(a1) + lwu t5, 4(a1) + slli t5, t5, 32 + or t2, t2, t5 + j L_ualn_ld3_e +L_ualn_ld3_h: + andi t5, t5, 1 + bnez t5, L_ualn_ld3_b + lhu t2, 0(a1) + lhu t5, 2(a1) + slli t5, t5, 16 + or t2, t2, t5 + lhu t5, 4(a1) + slli t5, t5, 32 + or t2, t2, t5 + lhu t5, 6(a1) + slli t5, t5, 48 + or t2, t2, t5 + j L_ualn_ld3_e +L_ualn_ld3_b: + lbu t2, 0(a1) + lbu t5, 1(a1) + slli t5, t5, 8 + or t2, t2, t5 + lbu t5, 2(a1) + slli t5, t5, 16 + or t2, t2, t5 + lbu t5, 3(a1) + slli t5, t5, 24 + or t2, t2, t5 + lbu t5, 4(a1) + slli t5, t5, 32 + or t2, t2, t5 + lbu t5, 5(a1) + slli t5, t5, 40 + or t2, t2, t5 + lbu t5, 6(a1) + slli t5, t5, 48 + or t2, t2, t5 + lbu t5, 7(a1) + slli t5, t5, 56 + or t2, t2, t5 +L_ualn_ld3_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a1) +#else + andi t5, a1, 7 + bnez t5, L_ualn_ld4_w + ld t3, 8(a1) + j L_ualn_ld4_e +L_ualn_ld4_w: + andi t5, t5, 3 + bnez t5, L_ualn_ld4_h + lwu t3, 8(a1) + lwu t5, 12(a1) + slli t5, t5, 32 + or t3, t3, t5 + j L_ualn_ld4_e +L_ualn_ld4_h: + andi t5, t5, 1 + bnez t5, L_ualn_ld4_b + lhu t3, 8(a1) + lhu t5, 10(a1) + slli t5, t5, 16 + or t3, t3, t5 + lhu t5, 12(a1) + slli t5, t5, 32 + or t3, t3, t5 + lhu t5, 14(a1) + slli t5, t5, 48 + or t3, t3, t5 + j L_ualn_ld4_e +L_ualn_ld4_b: + lbu t3, 8(a1) + lbu t5, 9(a1) + slli t5, t5, 8 + or t3, t3, t5 + lbu t5, 10(a1) + slli t5, t5, 16 + or t3, t3, t5 + lbu t5, 11(a1) + slli t5, t5, 24 + or t3, t3, t5 + lbu t5, 12(a1) + slli t5, t5, 32 + or t3, t3, t5 + lbu t5, 13(a1) + slli t5, t5, 40 + or t3, t3, t5 + lbu t5, 14(a1) + slli t5, t5, 48 + or t3, t3, t5 + lbu t5, 15(a1) + slli t5, t5, 56 + or t3, t3, t5 +L_ualn_ld4_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_CBC_encrypt_RISCV64_block +L_AES_CBC_encrypt_RISCV64_end: + sd t2, 0(a3) + sd t3, 8(a3) + ld ra, 16(sp) + ld s1, 40(sp) + ld s2, 48(sp) + ld s3, 56(sp) + ld s4, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + ld s8, 96(sp) + ld s9, 104(sp) + addi sp, sp, 112 + ret + .size AES_CBC_encrypt_RISCV64,.-AES_CBC_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_CBC_decrypt_RISCV64 + .type AES_CBC_decrypt_RISCV64,@function + .align 2 +AES_CBC_decrypt_RISCV64: + addi sp, sp, -128 + sd s0, 32(sp) + sd s1, 40(sp) + sd s2, 48(sp) + sd s3, 56(sp) + sd s4, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + sd s8, 96(sp) + sd s9, 104(sp) + sd s10, 112(sp) + sd s11, 120(sp) + la t6, L_AES_base_td + la a6, L_AES_base_td4 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 16(sp) + srliw a2, a2, 4 + ld t2, 0(a3) + ld t3, 8(a3) +L_AES_CBC_decrypt_RISCV64_block: + beqz a2, L_AES_CBC_decrypt_RISCV64_end +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t4, 0(a0) +#else + andi a7, a0, 7 + bnez a7, L_ualn_ld5_w + ld t4, 0(a0) + j L_ualn_ld5_e +L_ualn_ld5_w: + andi a7, a7, 3 + bnez a7, L_ualn_ld5_h + lwu t4, 0(a0) + lwu a7, 4(a0) + slli a7, a7, 32 + or t4, t4, a7 + j L_ualn_ld5_e +L_ualn_ld5_h: + andi a7, a7, 1 + bnez a7, L_ualn_ld5_b + lhu t4, 0(a0) + lhu a7, 2(a0) + slli a7, a7, 16 + or t4, t4, a7 + lhu a7, 4(a0) + slli a7, a7, 32 + or t4, t4, a7 + lhu a7, 6(a0) + slli a7, a7, 48 + or t4, t4, a7 + j L_ualn_ld5_e +L_ualn_ld5_b: + lbu t4, 0(a0) + lbu a7, 1(a0) + slli a7, a7, 8 + or t4, t4, a7 + lbu a7, 2(a0) + slli a7, a7, 16 + or t4, t4, a7 + lbu a7, 3(a0) + slli a7, a7, 24 + or t4, t4, a7 + lbu a7, 4(a0) + slli a7, a7, 32 + or t4, t4, a7 + lbu a7, 5(a0) + slli a7, a7, 40 + or t4, t4, a7 + lbu a7, 6(a0) + slli a7, a7, 48 + or t4, t4, a7 + lbu a7, 7(a0) + slli a7, a7, 56 + or t4, t4, a7 +L_ualn_ld5_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 8(a0) +#else + andi a7, a0, 7 + bnez a7, L_ualn_ld6_w + ld t5, 8(a0) + j L_ualn_ld6_e +L_ualn_ld6_w: + andi a7, a7, 3 + bnez a7, L_ualn_ld6_h + lwu t5, 8(a0) + lwu a7, 12(a0) + slli a7, a7, 32 + or t5, t5, a7 + j L_ualn_ld6_e +L_ualn_ld6_h: + andi a7, a7, 1 + bnez a7, L_ualn_ld6_b + lhu t5, 8(a0) + lhu a7, 10(a0) + slli a7, a7, 16 + or t5, t5, a7 + lhu a7, 12(a0) + slli a7, a7, 32 + or t5, t5, a7 + lhu a7, 14(a0) + slli a7, a7, 48 + or t5, t5, a7 + j L_ualn_ld6_e +L_ualn_ld6_b: + lbu t5, 8(a0) + lbu a7, 9(a0) + slli a7, a7, 8 + or t5, t5, a7 + lbu a7, 10(a0) + slli a7, a7, 16 + or t5, t5, a7 + lbu a7, 11(a0) + slli a7, a7, 24 + or t5, t5, a7 + lbu a7, 12(a0) + slli a7, a7, 32 + or t5, t5, a7 + lbu a7, 13(a0) + slli a7, a7, 40 + or t5, t5, a7 + lbu a7, 14(a0) + slli a7, a7, 48 + or t5, t5, a7 + lbu a7, 15(a0) + slli a7, a7, 56 + or t5, t5, a7 +L_ualn_ld6_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t0, a0 + addi t1, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu a7, 0(t0) + lbu s1, 4(t0) + lbu s2, 8(t0) + lbu s3, 12(t0) + slli a7, a7, 8 + slli s1, s1, 8 + slli s2, s2, 8 + slli s3, s3, 8 + lbu s4, 1(t0) + or a7, a7, s4 + lbu s5, 5(t0) + or s1, s1, s5 + lbu s6, 9(t0) + or s2, s2, s6 + lbu s4, 13(t0) + or s3, s3, s4 + slli a7, a7, 8 + slli s1, s1, 8 + slli s2, s2, 8 + slli s3, s3, 8 + lbu s4, 2(t0) + or a7, a7, s4 + lbu s5, 6(t0) + or s1, s1, s5 + lbu s6, 10(t0) + or s2, s2, s6 + lbu s4, 14(t0) + or s3, s3, s4 + slli a7, a7, 8 + slli s1, s1, 8 + slli s2, s2, 8 + slli s3, s3, 8 + lbu s4, 3(t0) + or a7, a7, s4 + lbu s5, 7(t0) + or s1, s1, s5 + lbu s6, 11(t0) + or s2, s2, s6 + lbu s4, 15(t0) + or s3, s3, s4 +#else + ld s1, 0(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli a7, s1, 32 + ld s3, 8(t0) + # rev8 s3, s3 + .word 0x6b89d993 + srli s2, s3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s9, 0(a4) + lw s10, 4(a4) + lw s11, 8(a4) + lw s0, 12(a4) + xor s9, a7, s9 + xor s10, s1, s10 + xor s11, s2, s11 + xor s0, s3, s0 + srliw a7, s9, 24 + srliw s1, s10, 24 + srliw s2, s11, 24 + srliw s3, s0, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s5, 0(a7) + lw s6, 0(s1) + lw s7, 0(s2) + lw s8, 0(s3) + addi s4, t6, 1024 + srliw a7, s0, 14 + srliw s1, s9, 14 + srliw s2, s10, 14 + srliw s3, s11, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + srliw a7, s11, 6 + srliw s1, s0, 6 + srliw s2, s9, 6 + srliw s3, s10, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + andi a7, s10, 255 + andi s1, s11, 255 + andi s2, s0, 255 + andi s3, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + lw a7, 16(a4) + lw s1, 20(a4) + lw s2, 24(a4) + lw s3, 28(a4) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + srliw a7, s5, 24 + srliw s1, s6, 24 + srliw s2, s7, 24 + srliw s3, s8, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s9, 0(a7) + lw s10, 0(s1) + lw s11, 0(s2) + lw s0, 0(s3) + addi s4, t6, 1024 + srliw a7, s8, 14 + srliw s1, s5, 14 + srliw s2, s6, 14 + srliw s3, s7, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + srliw a7, s7, 6 + srliw s1, s8, 6 + srliw s2, s5, 6 + srliw s3, s6, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + andi a7, s6, 255 + andi s1, s7, 255 + andi s2, s8, 255 + andi s3, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + lw a7, 32(a4) + lw s1, 36(a4) + lw s2, 40(a4) + lw s3, 44(a4) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + srliw a7, s9, 24 + srliw s1, s10, 24 + srliw s2, s11, 24 + srliw s3, s0, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s5, 0(a7) + lw s6, 0(s1) + lw s7, 0(s2) + lw s8, 0(s3) + addi s4, t6, 1024 + srliw a7, s0, 14 + srliw s1, s9, 14 + srliw s2, s10, 14 + srliw s3, s11, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + srliw a7, s11, 6 + srliw s1, s0, 6 + srliw s2, s9, 6 + srliw s3, s10, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + andi a7, s10, 255 + andi s1, s11, 255 + andi s2, s0, 255 + andi s3, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + lw a7, 48(a4) + lw s1, 52(a4) + lw s2, 56(a4) + lw s3, 60(a4) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + srliw a7, s5, 24 + srliw s1, s6, 24 + srliw s2, s7, 24 + srliw s3, s8, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s9, 0(a7) + lw s10, 0(s1) + lw s11, 0(s2) + lw s0, 0(s3) + addi s4, t6, 1024 + srliw a7, s8, 14 + srliw s1, s5, 14 + srliw s2, s6, 14 + srliw s3, s7, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + srliw a7, s7, 6 + srliw s1, s8, 6 + srliw s2, s5, 6 + srliw s3, s6, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + andi a7, s6, 255 + andi s1, s7, 255 + andi s2, s8, 255 + andi s3, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + lw a7, 64(a4) + lw s1, 68(a4) + lw s2, 72(a4) + lw s3, 76(a4) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + srliw a7, s9, 24 + srliw s1, s10, 24 + srliw s2, s11, 24 + srliw s3, s0, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s5, 0(a7) + lw s6, 0(s1) + lw s7, 0(s2) + lw s8, 0(s3) + addi s4, t6, 1024 + srliw a7, s0, 14 + srliw s1, s9, 14 + srliw s2, s10, 14 + srliw s3, s11, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + srliw a7, s11, 6 + srliw s1, s0, 6 + srliw s2, s9, 6 + srliw s3, s10, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + andi a7, s10, 255 + andi s1, s11, 255 + andi s2, s0, 255 + andi s3, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + lw a7, 80(a4) + lw s1, 84(a4) + lw s2, 88(a4) + lw s3, 92(a4) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + srliw a7, s5, 24 + srliw s1, s6, 24 + srliw s2, s7, 24 + srliw s3, s8, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s9, 0(a7) + lw s10, 0(s1) + lw s11, 0(s2) + lw s0, 0(s3) + addi s4, t6, 1024 + srliw a7, s8, 14 + srliw s1, s5, 14 + srliw s2, s6, 14 + srliw s3, s7, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + srliw a7, s7, 6 + srliw s1, s8, 6 + srliw s2, s5, 6 + srliw s3, s6, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + andi a7, s6, 255 + andi s1, s7, 255 + andi s2, s8, 255 + andi s3, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + lw a7, 96(a4) + lw s1, 100(a4) + lw s2, 104(a4) + lw s3, 108(a4) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + srliw a7, s9, 24 + srliw s1, s10, 24 + srliw s2, s11, 24 + srliw s3, s0, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s5, 0(a7) + lw s6, 0(s1) + lw s7, 0(s2) + lw s8, 0(s3) + addi s4, t6, 1024 + srliw a7, s0, 14 + srliw s1, s9, 14 + srliw s2, s10, 14 + srliw s3, s11, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + srliw a7, s11, 6 + srliw s1, s0, 6 + srliw s2, s9, 6 + srliw s3, s10, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + andi a7, s10, 255 + andi s1, s11, 255 + andi s2, s0, 255 + andi s3, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + lw a7, 112(a4) + lw s1, 116(a4) + lw s2, 120(a4) + lw s3, 124(a4) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + srliw a7, s5, 24 + srliw s1, s6, 24 + srliw s2, s7, 24 + srliw s3, s8, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s9, 0(a7) + lw s10, 0(s1) + lw s11, 0(s2) + lw s0, 0(s3) + addi s4, t6, 1024 + srliw a7, s8, 14 + srliw s1, s5, 14 + srliw s2, s6, 14 + srliw s3, s7, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + srliw a7, s7, 6 + srliw s1, s8, 6 + srliw s2, s5, 6 + srliw s3, s6, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + andi a7, s6, 255 + andi s1, s7, 255 + andi s2, s8, 255 + andi s3, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + lw a7, 128(a4) + lw s1, 132(a4) + lw s2, 136(a4) + lw s3, 140(a4) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + srliw a7, s9, 24 + srliw s1, s10, 24 + srliw s2, s11, 24 + srliw s3, s0, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s5, 0(a7) + lw s6, 0(s1) + lw s7, 0(s2) + lw s8, 0(s3) + addi s4, t6, 1024 + srliw a7, s0, 14 + srliw s1, s9, 14 + srliw s2, s10, 14 + srliw s3, s11, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + srliw a7, s11, 6 + srliw s1, s0, 6 + srliw s2, s9, 6 + srliw s3, s10, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + andi a7, s10, 255 + andi s1, s11, 255 + andi s2, s0, 255 + andi s3, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + lw a7, 144(a4) + lw s1, 148(a4) + lw s2, 152(a4) + lw s3, 156(a4) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + li s4, 10 + ble a5, s4, L_AES_dec_block_4_done + srliw a7, s5, 24 + srliw s1, s6, 24 + srliw s2, s7, 24 + srliw s3, s8, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s9, 0(a7) + lw s10, 0(s1) + lw s11, 0(s2) + lw s0, 0(s3) + addi s4, t6, 1024 + srliw a7, s8, 14 + srliw s1, s5, 14 + srliw s2, s6, 14 + srliw s3, s7, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + srliw a7, s7, 6 + srliw s1, s8, 6 + srliw s2, s5, 6 + srliw s3, s6, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + andi a7, s6, 255 + andi s1, s7, 255 + andi s2, s8, 255 + andi s3, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + lw a7, 160(a4) + lw s1, 164(a4) + lw s2, 168(a4) + lw s3, 172(a4) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + srliw a7, s9, 24 + srliw s1, s10, 24 + srliw s2, s11, 24 + srliw s3, s0, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s5, 0(a7) + lw s6, 0(s1) + lw s7, 0(s2) + lw s8, 0(s3) + addi s4, t6, 1024 + srliw a7, s0, 14 + srliw s1, s9, 14 + srliw s2, s10, 14 + srliw s3, s11, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + srliw a7, s11, 6 + srliw s1, s0, 6 + srliw s2, s9, 6 + srliw s3, s10, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + andi a7, s10, 255 + andi s1, s11, 255 + andi s2, s0, 255 + andi s3, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + lw a7, 176(a4) + lw s1, 180(a4) + lw s2, 184(a4) + lw s3, 188(a4) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + li s4, 12 + ble a5, s4, L_AES_dec_block_4_done + srliw a7, s5, 24 + srliw s1, s6, 24 + srliw s2, s7, 24 + srliw s3, s8, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s9, 0(a7) + lw s10, 0(s1) + lw s11, 0(s2) + lw s0, 0(s3) + addi s4, t6, 1024 + srliw a7, s8, 14 + srliw s1, s5, 14 + srliw s2, s6, 14 + srliw s3, s7, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + srliw a7, s7, 6 + srliw s1, s8, 6 + srliw s2, s5, 6 + srliw s3, s6, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + addi s4, s4, 1024 + andi a7, s6, 255 + andi s1, s7, 255 + andi s2, s8, 255 + andi s3, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + lw a7, 192(a4) + lw s1, 196(a4) + lw s2, 200(a4) + lw s3, 204(a4) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + srliw a7, s9, 24 + srliw s1, s10, 24 + srliw s2, s11, 24 + srliw s3, s0, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, t6 + sh2add s1, s1, t6 + sh2add s2, s2, t6 + sh2add s3, s3, t6 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, t6 + add s1, s1, t6 + add s2, s2, t6 + add s3, s3, t6 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s5, 0(a7) + lw s6, 0(s1) + lw s7, 0(s2) + lw s8, 0(s3) + addi s4, t6, 1024 + srliw a7, s0, 14 + srliw s1, s9, 14 + srliw s2, s10, 14 + srliw s3, s11, 14 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + srliw a7, s11, 6 + srliw s1, s0, 6 + srliw s2, s9, 6 + srliw s3, s10, 6 + andi a7, a7, 1020 + andi s1, s1, 1020 + andi s2, s2, 1020 + andi s3, s3, 1020 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + addi s4, s4, 1024 + andi a7, s10, 255 + andi s1, s11, 255 + andi s2, s0, 255 + andi s3, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add a7, a7, s4 + sh2add s1, s1, s4 + sh2add s2, s2, s4 + sh2add s3, s3, s4 +#else + slliw a7, a7, 2 + slliw s1, s1, 2 + slliw s2, s2, 2 + slliw s3, s3, 2 + add a7, a7, s4 + add s1, s1, s4 + add s2, s2, s4 + add s3, s3, s4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a7, 0(a7) + lw s1, 0(s1) + lw s2, 0(s2) + lw s3, 0(s3) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 + lw a7, 208(a4) + lw s1, 212(a4) + lw s2, 216(a4) + lw s3, 220(a4) + xor s5, s5, a7 + xor s6, s6, s1 + xor s7, s7, s2 + xor s8, s8, s3 +L_AES_dec_block_4_done: + srliw a7, s5, 24 + srliw s1, s6, 24 + srliw s2, s7, 24 + srliw s3, s8, 24 + add a7, a7, a6 + add s1, s1, a6 + add s2, s2, a6 + add s3, s3, a6 + lbu s9, 0(a7) + lbu s10, 0(s1) + lbu s11, 0(s2) + lbu s0, 0(s3) + slli s9, s9, 24 + slli s10, s10, 24 + slli s11, s11, 24 + slli s0, s0, 24 + srliw a7, s8, 16 + srliw s1, s5, 16 + srliw s2, s6, 16 + srliw s3, s7, 16 + andi a7, a7, 255 + andi s1, s1, 255 + andi s2, s2, 255 + andi s3, s3, 255 + add a7, a7, a6 + add s1, s1, a6 + add s2, s2, a6 + add s3, s3, a6 + lbu a7, 0(a7) + lbu s1, 0(s1) + lbu s2, 0(s2) + lbu s3, 0(s3) + slli a7, a7, 16 + slli s1, s1, 16 + slli s2, s2, 16 + slli s3, s3, 16 + or s9, s9, a7 + or s10, s10, s1 + or s11, s11, s2 + or s0, s0, s3 + srliw a7, s7, 8 + srliw s1, s8, 8 + srliw s2, s5, 8 + srliw s3, s6, 8 + andi a7, a7, 255 + andi s1, s1, 255 + andi s2, s2, 255 + andi s3, s3, 255 + add a7, a7, a6 + add s1, s1, a6 + add s2, s2, a6 + add s3, s3, a6 + lbu a7, 0(a7) + lbu s1, 0(s1) + lbu s2, 0(s2) + lbu s3, 0(s3) + slli a7, a7, 8 + slli s1, s1, 8 + slli s2, s2, 8 + slli s3, s3, 8 + or s9, s9, a7 + or s10, s10, s1 + or s11, s11, s2 + or s0, s0, s3 + andi a7, s6, 255 + andi s1, s7, 255 + andi s2, s8, 255 + andi s3, s5, 255 + add a7, a7, a6 + add s1, s1, a6 + add s2, s2, a6 + add s3, s3, a6 + lbu a7, 0(a7) + lbu s1, 0(s1) + lbu s2, 0(s2) + lbu s3, 0(s3) + or s9, s9, a7 + or s10, s10, s1 + or s11, s11, s2 + or s0, s0, s3 + slli s4, a5, 4 + add s4, a4, s4 + lw a7, 0(s4) + lw s1, 4(s4) + lw s2, 8(s4) + lw s3, 12(s4) + xor s9, s9, a7 + xor s10, s10, s1 + xor s11, s11, s2 + xor s0, s0, s3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli a7, s9, 24 + srli s1, s10, 24 + srli s2, s11, 24 + srli s3, s0, 24 + sb a7, 0(t1) + sb s1, 4(t1) + sb s2, 8(t1) + sb s3, 12(t1) + srli a7, s9, 16 + srli s1, s10, 16 + srli s2, s11, 16 + srli s3, s0, 16 + sb a7, 1(t1) + sb s1, 5(t1) + sb s2, 9(t1) + sb s3, 13(t1) + srli a7, s9, 8 + srli s1, s10, 8 + srli s2, s11, 8 + srli s3, s0, 8 + sb a7, 2(t1) + sb s1, 6(t1) + sb s2, 10(t1) + sb s3, 14(t1) + sb s9, 3(t1) + sb s10, 7(t1) + sb s11, 11(t1) + sb s0, 15(t1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli a7, s9, 32 + slli s1, s10, 32 + slli s2, s11, 32 + slli s3, s0, 32 + srli s1, s1, 32 + srli s3, s3, 32 + or s1, s1, a7 + or s3, s3, s2 +#else + # pack s1, s10, s9 + .word 0x099d44b3 + # pack s3, s0, s11 + .word 0x09b449b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 s1, s1 + .word 0x6b84d493 + # rev8 s3, s3 + .word 0x6b89d993 + sd s1, 0(t1) + sd s3, 8(t1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld a7, 0(sp) + ld s1, 8(sp) + xor a7, a7, t2 + xor s1, s1, t3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd a7, 0(a1) +#else + andi s2, a1, 7 + bnez s2, L_ualn_sd7_w + sd a7, 0(a1) + j L_ualn_sd7_e +L_ualn_sd7_w: + andi s2, s2, 3 + bnez s2, L_ualn_sd7_h + sw a7, 0(a1) + srli s2, a7, 32 + sw s2, 4(a1) + j L_ualn_sd7_e +L_ualn_sd7_h: + andi s2, s2, 1 + bnez s2, L_ualn_sd7_b + sh a7, 0(a1) + srli s2, a7, 16 + sh s2, 2(a1) + srli s2, a7, 32 + sh s2, 4(a1) + srli s2, a7, 48 + sh s2, 6(a1) + j L_ualn_sd7_e +L_ualn_sd7_b: + sb a7, 0(a1) + srli s2, a7, 8 + sb s2, 1(a1) + srli s2, a7, 16 + sb s2, 2(a1) + srli s2, a7, 24 + sb s2, 3(a1) + srli s2, a7, 32 + sb s2, 4(a1) + srli s2, a7, 40 + sb s2, 5(a1) + srli s2, a7, 48 + sb s2, 6(a1) + srli s2, a7, 56 + sb s2, 7(a1) +L_ualn_sd7_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd s1, 8(a1) +#else + andi s2, a1, 7 + bnez s2, L_ualn_sd8_w + sd s1, 8(a1) + j L_ualn_sd8_e +L_ualn_sd8_w: + andi s2, s2, 3 + bnez s2, L_ualn_sd8_h + sw s1, 8(a1) + srli s2, s1, 32 + sw s2, 12(a1) + j L_ualn_sd8_e +L_ualn_sd8_h: + andi s2, s2, 1 + bnez s2, L_ualn_sd8_b + sh s1, 8(a1) + srli s2, s1, 16 + sh s2, 10(a1) + srli s2, s1, 32 + sh s2, 12(a1) + srli s2, s1, 48 + sh s2, 14(a1) + j L_ualn_sd8_e +L_ualn_sd8_b: + sb s1, 8(a1) + srli s2, s1, 8 + sb s2, 9(a1) + srli s2, s1, 16 + sb s2, 10(a1) + srli s2, s1, 24 + sb s2, 11(a1) + srli s2, s1, 32 + sb s2, 12(a1) + srli s2, s1, 40 + sb s2, 13(a1) + srli s2, s1, 48 + sb s2, 14(a1) + srli s2, s1, 56 + sb s2, 15(a1) +L_ualn_sd8_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv t2, t4 + mv t3, t5 + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -1 + j L_AES_CBC_decrypt_RISCV64_block +L_AES_CBC_decrypt_RISCV64_end: + sd t2, 0(a3) + sd t3, 8(a3) + ld ra, 16(sp) + ld s0, 32(sp) + ld s1, 40(sp) + ld s2, 48(sp) + ld s3, 56(sp) + ld s4, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + ld s8, 96(sp) + ld s9, 104(sp) + ld s10, 112(sp) + ld s11, 120(sp) + addi sp, sp, 128 + ret + .size AES_CBC_decrypt_RISCV64,.-AES_CBC_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER + .text + .globl AES_CTR_encrypt_RISCV64 + .type AES_CTR_encrypt_RISCV64,@function + .align 2 +AES_CTR_encrypt_RISCV64: + addi sp, sp, -112 + sd s1, 32(sp) + sd s2, 40(sp) + sd s3, 48(sp) + sd s4, 56(sp) + sd s5, 64(sp) + sd s6, 72(sp) + sd s7, 80(sp) + sd s8, 88(sp) + sd s9, 96(sp) + sd s10, 104(sp) + la t3, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 16(sp) + lw t2, 0(a6) +L_AES_CTR_encrypt_RISCV64_leftover: + beqz t2, L_AES_CTR_encrypt_RISCV64_leftover_done + beqz a2, L_AES_CTR_encrypt_RISCV64_leftover_done + li t4, 16 + sub t4, t4, t2 + add t4, t4, a5 + lb t5, 0(t4) + lb t6, 0(a0) + xor t5, t5, t6 + sb t5, 0(a1) + addi a0, a0, 1 + addi a1, a1, 1 + addiw t2, t2, -1 + addiw a2, a2, -1 + j L_AES_CTR_encrypt_RISCV64_leftover +L_AES_CTR_encrypt_RISCV64_leftover_done: + sw t2, 0(a6) +L_AES_CTR_encrypt_RISCV64_block_loop: + li t4, 16 + bltu a2, t4, L_AES_CTR_encrypt_RISCV64_tail + mv t0, a3 + addi t1, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu s1, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(t0) + or t4, t4, s2 + lbu s3, 5(t0) + or t5, t5, s3 + lbu s4, 9(t0) + or t6, t6, s4 + lbu s2, 13(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(t0) + or t4, t4, s2 + lbu s3, 6(t0) + or t5, t5, s3 + lbu s4, 10(t0) + or t6, t6, s4 + lbu s2, 14(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(t0) + or t4, t4, s2 + lbu s3, 7(t0) + or t5, t5, s3 + lbu s4, 11(t0) + or t6, t6, s4 + lbu s2, 15(t0) + or s1, s1, s2 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a4) + lw s8, 4(a4) + lw s9, 8(a4) + lw s10, 12(a4) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a4) + lw t5, 20(a4) + lw t6, 24(a4) + lw s1, 28(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a4) + lw t5, 36(a4) + lw t6, 40(a4) + lw s1, 44(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a4) + lw t5, 52(a4) + lw t6, 56(a4) + lw s1, 60(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a4) + lw t5, 68(a4) + lw t6, 72(a4) + lw s1, 76(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a4) + lw t5, 84(a4) + lw t6, 88(a4) + lw s1, 92(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a4) + lw t5, 100(a4) + lw t6, 104(a4) + lw s1, 108(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a4) + lw t5, 116(a4) + lw t6, 120(a4) + lw s1, 124(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a4) + lw t5, 132(a4) + lw t6, 136(a4) + lw s1, 140(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a4) + lw t5, 148(a4) + lw t6, 152(a4) + lw s1, 156(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_enc_block_5_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a4) + lw t5, 164(a4) + lw t6, 168(a4) + lw s1, 172(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a4) + lw t5, 180(a4) + lw t6, 184(a4) + lw s1, 188(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_enc_block_5_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a4) + lw t5, 196(a4) + lw t6, 200(a4) + lw s1, 204(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a4) + lw t5, 212(a4) + lw t6, 216(a4) + lw s1, 220(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_enc_block_5_done: + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + li s2, 65280 + and s7, s7, s2 + and s8, s8, s2 + and s9, s9, s2 + and s10, s10, s2 + addi s2, t3, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 4278190080 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + li s2, 3072 + add s2, t3, s2 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 16711680 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a4, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t1) + sb t5, 4(t1) + sb t6, 8(t1) + sb s1, 12(t1) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t1) + sb t5, 5(t1) + sb t6, 9(t1) + sb s1, 13(t1) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t1) + sb t5, 6(t1) + sb t6, 10(t1) + sb s1, 14(t1) + sb s7, 3(t1) + sb s8, 7(t1) + sb s9, 11(t1) + sb s10, 15(t1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t1) + sd s1, 8(t1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t6, 0(a0) +#else + andi s2, a0, 7 + bnez s2, L_ualn_ld9_w + ld t6, 0(a0) + j L_ualn_ld9_e +L_ualn_ld9_w: + andi s2, s2, 3 + bnez s2, L_ualn_ld9_h + lwu t6, 0(a0) + lwu s2, 4(a0) + slli s2, s2, 32 + or t6, t6, s2 + j L_ualn_ld9_e +L_ualn_ld9_h: + andi s2, s2, 1 + bnez s2, L_ualn_ld9_b + lhu t6, 0(a0) + lhu s2, 2(a0) + slli s2, s2, 16 + or t6, t6, s2 + lhu s2, 4(a0) + slli s2, s2, 32 + or t6, t6, s2 + lhu s2, 6(a0) + slli s2, s2, 48 + or t6, t6, s2 + j L_ualn_ld9_e +L_ualn_ld9_b: + lbu t6, 0(a0) + lbu s2, 1(a0) + slli s2, s2, 8 + or t6, t6, s2 + lbu s2, 2(a0) + slli s2, s2, 16 + or t6, t6, s2 + lbu s2, 3(a0) + slli s2, s2, 24 + or t6, t6, s2 + lbu s2, 4(a0) + slli s2, s2, 32 + or t6, t6, s2 + lbu s2, 5(a0) + slli s2, s2, 40 + or t6, t6, s2 + lbu s2, 6(a0) + slli s2, s2, 48 + or t6, t6, s2 + lbu s2, 7(a0) + slli s2, s2, 56 + or t6, t6, s2 +L_ualn_ld9_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s1, 8(a0) +#else + andi s2, a0, 7 + bnez s2, L_ualn_ld10_w + ld s1, 8(a0) + j L_ualn_ld10_e +L_ualn_ld10_w: + andi s2, s2, 3 + bnez s2, L_ualn_ld10_h + lwu s1, 8(a0) + lwu s2, 12(a0) + slli s2, s2, 32 + or s1, s1, s2 + j L_ualn_ld10_e +L_ualn_ld10_h: + andi s2, s2, 1 + bnez s2, L_ualn_ld10_b + lhu s1, 8(a0) + lhu s2, 10(a0) + slli s2, s2, 16 + or s1, s1, s2 + lhu s2, 12(a0) + slli s2, s2, 32 + or s1, s1, s2 + lhu s2, 14(a0) + slli s2, s2, 48 + or s1, s1, s2 + j L_ualn_ld10_e +L_ualn_ld10_b: + lbu s1, 8(a0) + lbu s2, 9(a0) + slli s2, s2, 8 + or s1, s1, s2 + lbu s2, 10(a0) + slli s2, s2, 16 + or s1, s1, s2 + lbu s2, 11(a0) + slli s2, s2, 24 + or s1, s1, s2 + lbu s2, 12(a0) + slli s2, s2, 32 + or s1, s1, s2 + lbu s2, 13(a0) + slli s2, s2, 40 + or s1, s1, s2 + lbu s2, 14(a0) + slli s2, s2, 48 + or s1, s1, s2 + lbu s2, 15(a0) + slli s2, s2, 56 + or s1, s1, s2 +L_ualn_ld10_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t4, t4, t6 + xor t5, t5, s1 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t4, 0(a1) +#else + andi s2, a1, 7 + bnez s2, L_ualn_sd11_w + sd t4, 0(a1) + j L_ualn_sd11_e +L_ualn_sd11_w: + andi s2, s2, 3 + bnez s2, L_ualn_sd11_h + sw t4, 0(a1) + srli s2, t4, 32 + sw s2, 4(a1) + j L_ualn_sd11_e +L_ualn_sd11_h: + andi s2, s2, 1 + bnez s2, L_ualn_sd11_b + sh t4, 0(a1) + srli s2, t4, 16 + sh s2, 2(a1) + srli s2, t4, 32 + sh s2, 4(a1) + srli s2, t4, 48 + sh s2, 6(a1) + j L_ualn_sd11_e +L_ualn_sd11_b: + sb t4, 0(a1) + srli s2, t4, 8 + sb s2, 1(a1) + srli s2, t4, 16 + sb s2, 2(a1) + srli s2, t4, 24 + sb s2, 3(a1) + srli s2, t4, 32 + sb s2, 4(a1) + srli s2, t4, 40 + sb s2, 5(a1) + srli s2, t4, 48 + sb s2, 6(a1) + srli s2, t4, 56 + sb s2, 7(a1) +L_ualn_sd11_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t5, 8(a1) +#else + andi s2, a1, 7 + bnez s2, L_ualn_sd12_w + sd t5, 8(a1) + j L_ualn_sd12_e +L_ualn_sd12_w: + andi s2, s2, 3 + bnez s2, L_ualn_sd12_h + sw t5, 8(a1) + srli s2, t5, 32 + sw s2, 12(a1) + j L_ualn_sd12_e +L_ualn_sd12_h: + andi s2, s2, 1 + bnez s2, L_ualn_sd12_b + sh t5, 8(a1) + srli s2, t5, 16 + sh s2, 10(a1) + srli s2, t5, 32 + sh s2, 12(a1) + srli s2, t5, 48 + sh s2, 14(a1) + j L_ualn_sd12_e +L_ualn_sd12_b: + sb t5, 8(a1) + srli s2, t5, 8 + sb s2, 9(a1) + srli s2, t5, 16 + sb s2, 10(a1) + srli s2, t5, 24 + sb s2, 11(a1) + srli s2, t5, 32 + sb s2, 12(a1) + srli s2, t5, 40 + sb s2, 13(a1) + srli s2, t5, 48 + sb s2, 14(a1) + srli s2, t5, 56 + sb s2, 15(a1) +L_ualn_sd12_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + li t5, 15 +L_AES_CTR_encrypt_RISCV64_carry0: + add s1, a3, t5 + lbu t4, 0(s1) + addi t4, t4, 1 + sb t4, 0(s1) + andi t6, t4, 256 + beqz t6, L_AES_CTR_encrypt_RISCV64_carry_done0 + addi t5, t5, -1 + bgez t5, L_AES_CTR_encrypt_RISCV64_carry0 +L_AES_CTR_encrypt_RISCV64_carry_done0: + addi a0, a0, 16 + addi a1, a1, 16 + addiw a2, a2, -16 + j L_AES_CTR_encrypt_RISCV64_block_loop +L_AES_CTR_encrypt_RISCV64_tail: + beqz a2, L_AES_CTR_encrypt_RISCV64_done + mv t0, a3 + addi t1, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu s1, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(t0) + or t4, t4, s2 + lbu s3, 5(t0) + or t5, t5, s3 + lbu s4, 9(t0) + or t6, t6, s4 + lbu s2, 13(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(t0) + or t4, t4, s2 + lbu s3, 6(t0) + or t5, t5, s3 + lbu s4, 10(t0) + or t6, t6, s4 + lbu s2, 14(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(t0) + or t4, t4, s2 + lbu s3, 7(t0) + or t5, t5, s3 + lbu s4, 11(t0) + or t6, t6, s4 + lbu s2, 15(t0) + or s1, s1, s2 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a4) + lw s8, 4(a4) + lw s9, 8(a4) + lw s10, 12(a4) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a4) + lw t5, 20(a4) + lw t6, 24(a4) + lw s1, 28(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a4) + lw t5, 36(a4) + lw t6, 40(a4) + lw s1, 44(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a4) + lw t5, 52(a4) + lw t6, 56(a4) + lw s1, 60(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a4) + lw t5, 68(a4) + lw t6, 72(a4) + lw s1, 76(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a4) + lw t5, 84(a4) + lw t6, 88(a4) + lw s1, 92(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a4) + lw t5, 100(a4) + lw t6, 104(a4) + lw s1, 108(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a4) + lw t5, 116(a4) + lw t6, 120(a4) + lw s1, 124(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a4) + lw t5, 132(a4) + lw t6, 136(a4) + lw s1, 140(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a4) + lw t5, 148(a4) + lw t6, 152(a4) + lw s1, 156(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_enc_block_6_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a4) + lw t5, 164(a4) + lw t6, 168(a4) + lw s1, 172(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a4) + lw t5, 180(a4) + lw t6, 184(a4) + lw s1, 188(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_enc_block_6_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a4) + lw t5, 196(a4) + lw t6, 200(a4) + lw s1, 204(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a4) + lw t5, 212(a4) + lw t6, 216(a4) + lw s1, 220(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_enc_block_6_done: + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + li s2, 65280 + and s7, s7, s2 + and s8, s8, s2 + and s9, s9, s2 + and s10, s10, s2 + addi s2, t3, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 4278190080 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + li s2, 3072 + add s2, t3, s2 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 16711680 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a4, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t1) + sb t5, 4(t1) + sb t6, 8(t1) + sb s1, 12(t1) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t1) + sb t5, 5(t1) + sb t6, 9(t1) + sb s1, 13(t1) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t1) + sb t5, 6(t1) + sb t6, 10(t1) + sb s1, 14(t1) + sb s7, 3(t1) + sb s8, 7(t1) + sb s9, 11(t1) + sb s10, 15(t1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t1) + sd s1, 8(t1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + sd t4, 0(a5) + sd t5, 8(a5) + li t5, 15 +L_AES_CTR_encrypt_RISCV64_carry1: + add s1, a3, t5 + lbu t4, 0(s1) + addi t4, t4, 1 + sb t4, 0(s1) + andi t6, t4, 256 + beqz t6, L_AES_CTR_encrypt_RISCV64_carry_done1 + addi t5, t5, -1 + bgez t5, L_AES_CTR_encrypt_RISCV64_carry1 +L_AES_CTR_encrypt_RISCV64_carry_done1: + li t4, 16 + subw t4, t4, a2 + sw t4, 0(a6) + mv s2, a5 +L_AES_CTR_encrypt_RISCV64_tail_byte: + lb t4, 0(a0) + lb t5, 0(s2) + xor t4, t4, t5 + sb t4, 0(a1) + addi a0, a0, 1 + addi a1, a1, 1 + addi s2, s2, 1 + addiw a2, a2, -1 + bnez a2, L_AES_CTR_encrypt_RISCV64_tail_byte +L_AES_CTR_encrypt_RISCV64_done: + ld ra, 16(sp) + ld s1, 32(sp) + ld s2, 40(sp) + ld s3, 48(sp) + ld s4, 56(sp) + ld s5, 64(sp) + ld s6, 72(sp) + ld s7, 80(sp) + ld s8, 88(sp) + ld s9, 96(sp) + ld s10, 104(sp) + addi sp, sp, 112 + ret + .size AES_CTR_encrypt_RISCV64,.-AES_CTR_encrypt_RISCV64 +#endif /* WOLFSSL_AES_COUNTER */ +#ifdef WOLFSSL_AES_XTS + .text + .globl AES_XTS_encrypt_RISCV64 + .type AES_XTS_encrypt_RISCV64,@function + .align 2 +AES_XTS_encrypt_RISCV64: + addi sp, sp, -128 + sd s1, 48(sp) + sd s2, 56(sp) + sd s3, 64(sp) + sd s4, 72(sp) + sd s5, 80(sp) + sd s6, 88(sp) + sd s7, 96(sp) + sd s8, 104(sp) + sd s9, 112(sp) + sd s10, 120(sp) + la t3, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 16(sp) + addi t0, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(a3) + lbu t5, 4(a3) + lbu t6, 8(a3) + lbu s1, 12(a3) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(a3) + or t4, t4, s2 + lbu s3, 5(a3) + or t5, t5, s3 + lbu s4, 9(a3) + or t6, t6, s4 + lbu s2, 13(a3) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(a3) + or t4, t4, s2 + lbu s3, 6(a3) + or t5, t5, s3 + lbu s4, 10(a3) + or t6, t6, s4 + lbu s2, 14(a3) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(a3) + or t4, t4, s2 + lbu s3, 7(a3) + or t5, t5, s3 + lbu s4, 11(a3) + or t6, t6, s4 + lbu s2, 15(a3) + or s1, s1, s2 +#else + ld t5, 0(a3) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(a3) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a5) + lw s8, 4(a5) + lw s9, 8(a5) + lw s10, 12(a5) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a5) + lw t5, 20(a5) + lw t6, 24(a5) + lw s1, 28(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a5) + lw t5, 36(a5) + lw t6, 40(a5) + lw s1, 44(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a5) + lw t5, 52(a5) + lw t6, 56(a5) + lw s1, 60(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a5) + lw t5, 68(a5) + lw t6, 72(a5) + lw s1, 76(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a5) + lw t5, 84(a5) + lw t6, 88(a5) + lw s1, 92(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a5) + lw t5, 100(a5) + lw t6, 104(a5) + lw s1, 108(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a5) + lw t5, 116(a5) + lw t6, 120(a5) + lw s1, 124(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a5) + lw t5, 132(a5) + lw t6, 136(a5) + lw s1, 140(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a5) + lw t5, 148(a5) + lw t6, 152(a5) + lw s1, 156(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_enc_block_7_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a5) + lw t5, 164(a5) + lw t6, 168(a5) + lw s1, 172(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a5) + lw t5, 180(a5) + lw t6, 184(a5) + lw s1, 188(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_enc_block_7_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a5) + lw t5, 196(a5) + lw t6, 200(a5) + lw s1, 204(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a5) + lw t5, 212(a5) + lw t6, 216(a5) + lw s1, 220(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_enc_block_7_done: + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + li s2, 65280 + and s7, s7, s2 + and s8, s8, s2 + and s9, s9, s2 + and s10, s10, s2 + addi s2, t3, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 4278190080 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + li s2, 3072 + add s2, t3, s2 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 16711680 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a5, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t0) + sb t5, 4(t0) + sb t6, 8(t0) + sb s1, 12(t0) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t0) + sb t5, 5(t0) + sb t6, 9(t0) + sb s1, 13(t0) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t0) + sb t5, 6(t0) + sb t6, 10(t0) + sb s1, 14(t0) + sb s7, 3(t0) + sb s8, 7(t0) + sb s9, 11(t0) + sb s10, 15(t0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t0) + sd s1, 8(t0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t1, 0(sp) + ld t2, 8(sp) + srliw a3, a2, 4 + andi a2, a2, 15 +L_AES_XTS_encrypt_RISCV64_block: + beqz a3, L_AES_XTS_encrypt_RISCV64_last +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t4, 0(a0) +#else + andi t6, a0, 7 + bnez t6, L_ualn_ld13_w + ld t4, 0(a0) + j L_ualn_ld13_e +L_ualn_ld13_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld13_h + lwu t4, 0(a0) + lwu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + j L_ualn_ld13_e +L_ualn_ld13_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld13_b + lhu t4, 0(a0) + lhu t6, 2(a0) + slli t6, t6, 16 + or t4, t4, t6 + lhu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + lhu t6, 6(a0) + slli t6, t6, 48 + or t4, t4, t6 + j L_ualn_ld13_e +L_ualn_ld13_b: + lbu t4, 0(a0) + lbu t6, 1(a0) + slli t6, t6, 8 + or t4, t4, t6 + lbu t6, 2(a0) + slli t6, t6, 16 + or t4, t4, t6 + lbu t6, 3(a0) + slli t6, t6, 24 + or t4, t4, t6 + lbu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + lbu t6, 5(a0) + slli t6, t6, 40 + or t4, t4, t6 + lbu t6, 6(a0) + slli t6, t6, 48 + or t4, t4, t6 + lbu t6, 7(a0) + slli t6, t6, 56 + or t4, t4, t6 +L_ualn_ld13_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 8(a0) +#else + andi t6, a0, 7 + bnez t6, L_ualn_ld14_w + ld t5, 8(a0) + j L_ualn_ld14_e +L_ualn_ld14_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld14_h + lwu t5, 8(a0) + lwu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + j L_ualn_ld14_e +L_ualn_ld14_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld14_b + lhu t5, 8(a0) + lhu t6, 10(a0) + slli t6, t6, 16 + or t5, t5, t6 + lhu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + lhu t6, 14(a0) + slli t6, t6, 48 + or t5, t5, t6 + j L_ualn_ld14_e +L_ualn_ld14_b: + lbu t5, 8(a0) + lbu t6, 9(a0) + slli t6, t6, 8 + or t5, t5, t6 + lbu t6, 10(a0) + slli t6, t6, 16 + or t5, t5, t6 + lbu t6, 11(a0) + slli t6, t6, 24 + or t5, t5, t6 + lbu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + lbu t6, 13(a0) + slli t6, t6, 40 + or t5, t5, t6 + lbu t6, 14(a0) + slli t6, t6, 48 + or t5, t5, t6 + lbu t6, 15(a0) + slli t6, t6, 56 + or t5, t5, t6 +L_ualn_ld14_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t4, t4, t1 + xor t5, t5, t2 + sd t4, 0(sp) + sd t5, 8(sp) + addi t0, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu s1, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(t0) + or t4, t4, s2 + lbu s3, 5(t0) + or t5, t5, s3 + lbu s4, 9(t0) + or t6, t6, s4 + lbu s2, 13(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(t0) + or t4, t4, s2 + lbu s3, 6(t0) + or t5, t5, s3 + lbu s4, 10(t0) + or t6, t6, s4 + lbu s2, 14(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(t0) + or t4, t4, s2 + lbu s3, 7(t0) + or t5, t5, s3 + lbu s4, 11(t0) + or t6, t6, s4 + lbu s2, 15(t0) + or s1, s1, s2 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a4) + lw s8, 4(a4) + lw s9, 8(a4) + lw s10, 12(a4) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a4) + lw t5, 20(a4) + lw t6, 24(a4) + lw s1, 28(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a4) + lw t5, 36(a4) + lw t6, 40(a4) + lw s1, 44(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a4) + lw t5, 52(a4) + lw t6, 56(a4) + lw s1, 60(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a4) + lw t5, 68(a4) + lw t6, 72(a4) + lw s1, 76(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a4) + lw t5, 84(a4) + lw t6, 88(a4) + lw s1, 92(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a4) + lw t5, 100(a4) + lw t6, 104(a4) + lw s1, 108(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a4) + lw t5, 116(a4) + lw t6, 120(a4) + lw s1, 124(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a4) + lw t5, 132(a4) + lw t6, 136(a4) + lw s1, 140(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a4) + lw t5, 148(a4) + lw t6, 152(a4) + lw s1, 156(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_enc_block_8_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a4) + lw t5, 164(a4) + lw t6, 168(a4) + lw s1, 172(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a4) + lw t5, 180(a4) + lw t6, 184(a4) + lw s1, 188(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_enc_block_8_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a4) + lw t5, 196(a4) + lw t6, 200(a4) + lw s1, 204(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a4) + lw t5, 212(a4) + lw t6, 216(a4) + lw s1, 220(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_enc_block_8_done: + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + li s2, 65280 + and s7, s7, s2 + and s8, s8, s2 + and s9, s9, s2 + and s10, s10, s2 + addi s2, t3, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 4278190080 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + li s2, 3072 + add s2, t3, s2 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 16711680 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a4, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t0) + sb t5, 4(t0) + sb t6, 8(t0) + sb s1, 12(t0) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t0) + sb t5, 5(t0) + sb t6, 9(t0) + sb s1, 13(t0) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t0) + sb t5, 6(t0) + sb t6, 10(t0) + sb s1, 14(t0) + sb s7, 3(t0) + sb s8, 7(t0) + sb s9, 11(t0) + sb s10, 15(t0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t0) + sd s1, 8(t0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + xor t4, t4, t1 + xor t5, t5, t2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t4, 0(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd15_w + sd t4, 0(a1) + j L_ualn_sd15_e +L_ualn_sd15_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd15_h + sw t4, 0(a1) + srli t6, t4, 32 + sw t6, 4(a1) + j L_ualn_sd15_e +L_ualn_sd15_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd15_b + sh t4, 0(a1) + srli t6, t4, 16 + sh t6, 2(a1) + srli t6, t4, 32 + sh t6, 4(a1) + srli t6, t4, 48 + sh t6, 6(a1) + j L_ualn_sd15_e +L_ualn_sd15_b: + sb t4, 0(a1) + srli t6, t4, 8 + sb t6, 1(a1) + srli t6, t4, 16 + sb t6, 2(a1) + srli t6, t4, 24 + sb t6, 3(a1) + srli t6, t4, 32 + sb t6, 4(a1) + srli t6, t4, 40 + sb t6, 5(a1) + srli t6, t4, 48 + sb t6, 6(a1) + srli t6, t4, 56 + sb t6, 7(a1) +L_ualn_sd15_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t5, 8(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd16_w + sd t5, 8(a1) + j L_ualn_sd16_e +L_ualn_sd16_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd16_h + sw t5, 8(a1) + srli t6, t5, 32 + sw t6, 12(a1) + j L_ualn_sd16_e +L_ualn_sd16_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd16_b + sh t5, 8(a1) + srli t6, t5, 16 + sh t6, 10(a1) + srli t6, t5, 32 + sh t6, 12(a1) + srli t6, t5, 48 + sh t6, 14(a1) + j L_ualn_sd16_e +L_ualn_sd16_b: + sb t5, 8(a1) + srli t6, t5, 8 + sb t6, 9(a1) + srli t6, t5, 16 + sb t6, 10(a1) + srli t6, t5, 24 + sb t6, 11(a1) + srli t6, t5, 32 + sb t6, 12(a1) + srli t6, t5, 40 + sb t6, 13(a1) + srli t6, t5, 48 + sb t6, 14(a1) + srli t6, t5, 56 + sb t6, 15(a1) +L_ualn_sd16_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + srli t4, t1, 63 + srli t5, t2, 63 + slli t2, t2, 1 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t5, t5 + and t4, t4, t5 + xor t1, t1, t4 + addi a0, a0, 16 + addi a1, a1, 16 + addiw a3, a3, -1 + j L_AES_XTS_encrypt_RISCV64_block +L_AES_XTS_encrypt_RISCV64_last: + beqz a2, L_AES_XTS_encrypt_RISCV64_done + addi s2, a1, -16 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t4, 0(s2) +#else + andi t6, s2, 7 + bnez t6, L_ualn_ld17_w + ld t4, 0(s2) + j L_ualn_ld17_e +L_ualn_ld17_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld17_h + lwu t4, 0(s2) + lwu t6, 4(s2) + slli t6, t6, 32 + or t4, t4, t6 + j L_ualn_ld17_e +L_ualn_ld17_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld17_b + lhu t4, 0(s2) + lhu t6, 2(s2) + slli t6, t6, 16 + or t4, t4, t6 + lhu t6, 4(s2) + slli t6, t6, 32 + or t4, t4, t6 + lhu t6, 6(s2) + slli t6, t6, 48 + or t4, t4, t6 + j L_ualn_ld17_e +L_ualn_ld17_b: + lbu t4, 0(s2) + lbu t6, 1(s2) + slli t6, t6, 8 + or t4, t4, t6 + lbu t6, 2(s2) + slli t6, t6, 16 + or t4, t4, t6 + lbu t6, 3(s2) + slli t6, t6, 24 + or t4, t4, t6 + lbu t6, 4(s2) + slli t6, t6, 32 + or t4, t4, t6 + lbu t6, 5(s2) + slli t6, t6, 40 + or t4, t4, t6 + lbu t6, 6(s2) + slli t6, t6, 48 + or t4, t4, t6 + lbu t6, 7(s2) + slli t6, t6, 56 + or t4, t4, t6 +L_ualn_ld17_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 8(s2) +#else + andi t6, s2, 7 + bnez t6, L_ualn_ld18_w + ld t5, 8(s2) + j L_ualn_ld18_e +L_ualn_ld18_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld18_h + lwu t5, 8(s2) + lwu t6, 12(s2) + slli t6, t6, 32 + or t5, t5, t6 + j L_ualn_ld18_e +L_ualn_ld18_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld18_b + lhu t5, 8(s2) + lhu t6, 10(s2) + slli t6, t6, 16 + or t5, t5, t6 + lhu t6, 12(s2) + slli t6, t6, 32 + or t5, t5, t6 + lhu t6, 14(s2) + slli t6, t6, 48 + or t5, t5, t6 + j L_ualn_ld18_e +L_ualn_ld18_b: + lbu t5, 8(s2) + lbu t6, 9(s2) + slli t6, t6, 8 + or t5, t5, t6 + lbu t6, 10(s2) + slli t6, t6, 16 + or t5, t5, t6 + lbu t6, 11(s2) + slli t6, t6, 24 + or t5, t5, t6 + lbu t6, 12(s2) + slli t6, t6, 32 + or t5, t5, t6 + lbu t6, 13(s2) + slli t6, t6, 40 + or t5, t5, t6 + lbu t6, 14(s2) + slli t6, t6, 48 + or t5, t5, t6 + lbu t6, 15(s2) + slli t6, t6, 56 + or t5, t5, t6 +L_ualn_ld18_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t4, 0(a6) + sd t5, 8(a6) + mv s2, a6 + mv s1, a2 +L_AES_XTS_encrypt_RISCV64_steal: + lbu t4, 0(s2) + lbu t5, 0(a0) + sb t4, 0(a1) + sb t5, 0(s2) + addi s2, s2, 1 + addi a0, a0, 1 + addi a1, a1, 1 + addiw s1, s1, -1 + bnez s1, L_AES_XTS_encrypt_RISCV64_steal + sub a1, a1, a2 + addi a1, a1, -16 + ld t4, 0(a6) + ld t5, 8(a6) + xor t4, t4, t1 + xor t5, t5, t2 + sd t4, 0(sp) + sd t5, 8(sp) + addi t0, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu s1, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(t0) + or t4, t4, s2 + lbu s3, 5(t0) + or t5, t5, s3 + lbu s4, 9(t0) + or t6, t6, s4 + lbu s2, 13(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(t0) + or t4, t4, s2 + lbu s3, 6(t0) + or t5, t5, s3 + lbu s4, 10(t0) + or t6, t6, s4 + lbu s2, 14(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(t0) + or t4, t4, s2 + lbu s3, 7(t0) + or t5, t5, s3 + lbu s4, 11(t0) + or t6, t6, s4 + lbu s2, 15(t0) + or s1, s1, s2 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a4) + lw s8, 4(a4) + lw s9, 8(a4) + lw s10, 12(a4) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a4) + lw t5, 20(a4) + lw t6, 24(a4) + lw s1, 28(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a4) + lw t5, 36(a4) + lw t6, 40(a4) + lw s1, 44(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a4) + lw t5, 52(a4) + lw t6, 56(a4) + lw s1, 60(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a4) + lw t5, 68(a4) + lw t6, 72(a4) + lw s1, 76(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a4) + lw t5, 84(a4) + lw t6, 88(a4) + lw s1, 92(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a4) + lw t5, 100(a4) + lw t6, 104(a4) + lw s1, 108(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a4) + lw t5, 116(a4) + lw t6, 120(a4) + lw s1, 124(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a4) + lw t5, 132(a4) + lw t6, 136(a4) + lw s1, 140(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a4) + lw t5, 148(a4) + lw t6, 152(a4) + lw s1, 156(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_enc_block_9_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a4) + lw t5, 164(a4) + lw t6, 168(a4) + lw s1, 172(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a4) + lw t5, 180(a4) + lw t6, 184(a4) + lw s1, 188(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_enc_block_9_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a4) + lw t5, 196(a4) + lw t6, 200(a4) + lw s1, 204(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a4) + lw t5, 212(a4) + lw t6, 216(a4) + lw s1, 220(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_enc_block_9_done: + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + li s2, 65280 + and s7, s7, s2 + and s8, s8, s2 + and s9, s9, s2 + and s10, s10, s2 + addi s2, t3, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 4278190080 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + li s2, 3072 + add s2, t3, s2 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 16711680 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a4, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t0) + sb t5, 4(t0) + sb t6, 8(t0) + sb s1, 12(t0) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t0) + sb t5, 5(t0) + sb t6, 9(t0) + sb s1, 13(t0) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t0) + sb t5, 6(t0) + sb t6, 10(t0) + sb s1, 14(t0) + sb s7, 3(t0) + sb s8, 7(t0) + sb s9, 11(t0) + sb s10, 15(t0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t0) + sd s1, 8(t0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + xor t4, t4, t1 + xor t5, t5, t2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t4, 0(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd19_w + sd t4, 0(a1) + j L_ualn_sd19_e +L_ualn_sd19_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd19_h + sw t4, 0(a1) + srli t6, t4, 32 + sw t6, 4(a1) + j L_ualn_sd19_e +L_ualn_sd19_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd19_b + sh t4, 0(a1) + srli t6, t4, 16 + sh t6, 2(a1) + srli t6, t4, 32 + sh t6, 4(a1) + srli t6, t4, 48 + sh t6, 6(a1) + j L_ualn_sd19_e +L_ualn_sd19_b: + sb t4, 0(a1) + srli t6, t4, 8 + sb t6, 1(a1) + srli t6, t4, 16 + sb t6, 2(a1) + srli t6, t4, 24 + sb t6, 3(a1) + srli t6, t4, 32 + sb t6, 4(a1) + srli t6, t4, 40 + sb t6, 5(a1) + srli t6, t4, 48 + sb t6, 6(a1) + srli t6, t4, 56 + sb t6, 7(a1) +L_ualn_sd19_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t5, 8(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd20_w + sd t5, 8(a1) + j L_ualn_sd20_e +L_ualn_sd20_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd20_h + sw t5, 8(a1) + srli t6, t5, 32 + sw t6, 12(a1) + j L_ualn_sd20_e +L_ualn_sd20_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd20_b + sh t5, 8(a1) + srli t6, t5, 16 + sh t6, 10(a1) + srli t6, t5, 32 + sh t6, 12(a1) + srli t6, t5, 48 + sh t6, 14(a1) + j L_ualn_sd20_e +L_ualn_sd20_b: + sb t5, 8(a1) + srli t6, t5, 8 + sb t6, 9(a1) + srli t6, t5, 16 + sb t6, 10(a1) + srli t6, t5, 24 + sb t6, 11(a1) + srli t6, t5, 32 + sb t6, 12(a1) + srli t6, t5, 40 + sb t6, 13(a1) + srli t6, t5, 48 + sb t6, 14(a1) + srli t6, t5, 56 + sb t6, 15(a1) +L_ualn_sd20_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +L_AES_XTS_encrypt_RISCV64_done: + ld ra, 16(sp) + ld s1, 48(sp) + ld s2, 56(sp) + ld s3, 64(sp) + ld s4, 72(sp) + ld s5, 80(sp) + ld s6, 88(sp) + ld s7, 96(sp) + ld s8, 104(sp) + ld s9, 112(sp) + ld s10, 120(sp) + addi sp, sp, 128 + ret + .size AES_XTS_encrypt_RISCV64,.-AES_XTS_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_XTS_decrypt_RISCV64 + .type AES_XTS_decrypt_RISCV64,@function + .align 2 +AES_XTS_decrypt_RISCV64: + addi sp, sp, -128 + sd s1, 48(sp) + sd s2, 56(sp) + sd s3, 64(sp) + sd s4, 72(sp) + sd s5, 80(sp) + sd s6, 88(sp) + sd s7, 96(sp) + sd s8, 104(sp) + sd s9, 112(sp) + sd s10, 120(sp) + la t3, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 16(sp) + addi t0, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(a3) + lbu t5, 4(a3) + lbu t6, 8(a3) + lbu s1, 12(a3) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(a3) + or t4, t4, s2 + lbu s3, 5(a3) + or t5, t5, s3 + lbu s4, 9(a3) + or t6, t6, s4 + lbu s2, 13(a3) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(a3) + or t4, t4, s2 + lbu s3, 6(a3) + or t5, t5, s3 + lbu s4, 10(a3) + or t6, t6, s4 + lbu s2, 14(a3) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(a3) + or t4, t4, s2 + lbu s3, 7(a3) + or t5, t5, s3 + lbu s4, 11(a3) + or t6, t6, s4 + lbu s2, 15(a3) + or s1, s1, s2 +#else + ld t5, 0(a3) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(a3) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a5) + lw s8, 4(a5) + lw s9, 8(a5) + lw s10, 12(a5) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a5) + lw t5, 20(a5) + lw t6, 24(a5) + lw s1, 28(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a5) + lw t5, 36(a5) + lw t6, 40(a5) + lw s1, 44(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a5) + lw t5, 52(a5) + lw t6, 56(a5) + lw s1, 60(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a5) + lw t5, 68(a5) + lw t6, 72(a5) + lw s1, 76(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a5) + lw t5, 84(a5) + lw t6, 88(a5) + lw s1, 92(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a5) + lw t5, 100(a5) + lw t6, 104(a5) + lw s1, 108(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a5) + lw t5, 116(a5) + lw t6, 120(a5) + lw s1, 124(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a5) + lw t5, 132(a5) + lw t6, 136(a5) + lw s1, 140(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a5) + lw t5, 148(a5) + lw t6, 152(a5) + lw s1, 156(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_enc_block_10_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a5) + lw t5, 164(a5) + lw t6, 168(a5) + lw s1, 172(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a5) + lw t5, 180(a5) + lw t6, 184(a5) + lw s1, 188(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_enc_block_10_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a5) + lw t5, 196(a5) + lw t6, 200(a5) + lw s1, 204(a5) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s8, 14 + srliw t5, s9, 14 + srliw t6, s10, 14 + srliw s1, s7, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s10, 255 + andi t5, s7, 255 + andi t6, s8, 255 + andi s1, s9, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a5) + lw t5, 212(a5) + lw t6, 216(a5) + lw s1, 220(a5) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_enc_block_10_done: + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + li s2, 65280 + and s7, s7, s2 + and s8, s8, s2 + and s9, s9, s2 + and s10, s10, s2 + addi s2, t3, 1024 + andi t4, s6, 255 + andi t5, s3, 255 + andi t6, s4, 255 + andi s1, s5, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slli t4, t4, 2 + slli t5, t5, 2 + slli t6, t6, 2 + slli s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 4278190080 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + li s2, 3072 + add s2, t3, s2 + srliw t4, s4, 14 + srliw t5, s5, 14 + srliw t6, s6, 14 + srliw s1, s3, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + li s2, 16711680 + and t4, t4, s2 + and t5, t5, s2 + and t6, t6, s2 + and s1, s1, s2 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a5, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t0) + sb t5, 4(t0) + sb t6, 8(t0) + sb s1, 12(t0) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t0) + sb t5, 5(t0) + sb t6, 9(t0) + sb s1, 13(t0) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t0) + sb t5, 6(t0) + sb t6, 10(t0) + sb s1, 14(t0) + sb s7, 3(t0) + sb s8, 7(t0) + sb s9, 11(t0) + sb s10, 15(t0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t0) + sd s1, 8(t0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t1, 0(sp) + ld t2, 8(sp) + la t3, L_AES_base_td + la a5, L_AES_base_td4 + srliw a3, a2, 4 + andi a2, a2, 15 + beqz a2, L_AES_XTS_decrypt_RISCV64_full + addiw a3, a3, -1 +L_AES_XTS_decrypt_RISCV64_full: +L_AES_XTS_decrypt_RISCV64_block: + beqz a3, L_AES_XTS_decrypt_RISCV64_last +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t4, 0(a0) +#else + andi t6, a0, 7 + bnez t6, L_ualn_ld21_w + ld t4, 0(a0) + j L_ualn_ld21_e +L_ualn_ld21_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld21_h + lwu t4, 0(a0) + lwu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + j L_ualn_ld21_e +L_ualn_ld21_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld21_b + lhu t4, 0(a0) + lhu t6, 2(a0) + slli t6, t6, 16 + or t4, t4, t6 + lhu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + lhu t6, 6(a0) + slli t6, t6, 48 + or t4, t4, t6 + j L_ualn_ld21_e +L_ualn_ld21_b: + lbu t4, 0(a0) + lbu t6, 1(a0) + slli t6, t6, 8 + or t4, t4, t6 + lbu t6, 2(a0) + slli t6, t6, 16 + or t4, t4, t6 + lbu t6, 3(a0) + slli t6, t6, 24 + or t4, t4, t6 + lbu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + lbu t6, 5(a0) + slli t6, t6, 40 + or t4, t4, t6 + lbu t6, 6(a0) + slli t6, t6, 48 + or t4, t4, t6 + lbu t6, 7(a0) + slli t6, t6, 56 + or t4, t4, t6 +L_ualn_ld21_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 8(a0) +#else + andi t6, a0, 7 + bnez t6, L_ualn_ld22_w + ld t5, 8(a0) + j L_ualn_ld22_e +L_ualn_ld22_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld22_h + lwu t5, 8(a0) + lwu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + j L_ualn_ld22_e +L_ualn_ld22_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld22_b + lhu t5, 8(a0) + lhu t6, 10(a0) + slli t6, t6, 16 + or t5, t5, t6 + lhu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + lhu t6, 14(a0) + slli t6, t6, 48 + or t5, t5, t6 + j L_ualn_ld22_e +L_ualn_ld22_b: + lbu t5, 8(a0) + lbu t6, 9(a0) + slli t6, t6, 8 + or t5, t5, t6 + lbu t6, 10(a0) + slli t6, t6, 16 + or t5, t5, t6 + lbu t6, 11(a0) + slli t6, t6, 24 + or t5, t5, t6 + lbu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + lbu t6, 13(a0) + slli t6, t6, 40 + or t5, t5, t6 + lbu t6, 14(a0) + slli t6, t6, 48 + or t5, t5, t6 + lbu t6, 15(a0) + slli t6, t6, 56 + or t5, t5, t6 +L_ualn_ld22_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t4, t4, t1 + xor t5, t5, t2 + sd t4, 0(sp) + sd t5, 8(sp) + addi t0, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu s1, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(t0) + or t4, t4, s2 + lbu s3, 5(t0) + or t5, t5, s3 + lbu s4, 9(t0) + or t6, t6, s4 + lbu s2, 13(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(t0) + or t4, t4, s2 + lbu s3, 6(t0) + or t5, t5, s3 + lbu s4, 10(t0) + or t6, t6, s4 + lbu s2, 14(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(t0) + or t4, t4, s2 + lbu s3, 7(t0) + or t5, t5, s3 + lbu s4, 11(t0) + or t6, t6, s4 + lbu s2, 15(t0) + or s1, s1, s2 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a4) + lw s8, 4(a4) + lw s9, 8(a4) + lw s10, 12(a4) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a4) + lw t5, 20(a4) + lw t6, 24(a4) + lw s1, 28(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a4) + lw t5, 36(a4) + lw t6, 40(a4) + lw s1, 44(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a4) + lw t5, 52(a4) + lw t6, 56(a4) + lw s1, 60(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a4) + lw t5, 68(a4) + lw t6, 72(a4) + lw s1, 76(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a4) + lw t5, 84(a4) + lw t6, 88(a4) + lw s1, 92(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a4) + lw t5, 100(a4) + lw t6, 104(a4) + lw s1, 108(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a4) + lw t5, 116(a4) + lw t6, 120(a4) + lw s1, 124(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a4) + lw t5, 132(a4) + lw t6, 136(a4) + lw s1, 140(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a4) + lw t5, 148(a4) + lw t6, 152(a4) + lw s1, 156(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_dec_block_11_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a4) + lw t5, 164(a4) + lw t6, 168(a4) + lw s1, 172(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a4) + lw t5, 180(a4) + lw t6, 184(a4) + lw s1, 188(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_dec_block_11_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a4) + lw t5, 196(a4) + lw t6, 200(a4) + lw s1, 204(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a4) + lw t5, 212(a4) + lw t6, 216(a4) + lw s1, 220(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_dec_block_11_done: + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu s7, 0(t4) + lbu s8, 0(t5) + lbu s9, 0(t6) + lbu s10, 0(s1) + slli s7, s7, 24 + slli s8, s8, 24 + slli s9, s9, 24 + slli s10, s10, 24 + srliw t4, s6, 16 + srliw t5, s3, 16 + srliw t6, s4, 16 + srliw s1, s5, 16 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi s1, s1, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + slli t4, t4, 16 + slli t5, t5, 16 + slli t6, t6, 16 + slli s1, s1, 16 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + srliw t4, s5, 8 + srliw t5, s6, 8 + srliw t6, s3, 8 + srliw s1, s4, 8 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi s1, s1, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a4, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t0) + sb t5, 4(t0) + sb t6, 8(t0) + sb s1, 12(t0) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t0) + sb t5, 5(t0) + sb t6, 9(t0) + sb s1, 13(t0) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t0) + sb t5, 6(t0) + sb t6, 10(t0) + sb s1, 14(t0) + sb s7, 3(t0) + sb s8, 7(t0) + sb s9, 11(t0) + sb s10, 15(t0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t0) + sd s1, 8(t0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + xor t4, t4, t1 + xor t5, t5, t2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t4, 0(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd23_w + sd t4, 0(a1) + j L_ualn_sd23_e +L_ualn_sd23_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd23_h + sw t4, 0(a1) + srli t6, t4, 32 + sw t6, 4(a1) + j L_ualn_sd23_e +L_ualn_sd23_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd23_b + sh t4, 0(a1) + srli t6, t4, 16 + sh t6, 2(a1) + srli t6, t4, 32 + sh t6, 4(a1) + srli t6, t4, 48 + sh t6, 6(a1) + j L_ualn_sd23_e +L_ualn_sd23_b: + sb t4, 0(a1) + srli t6, t4, 8 + sb t6, 1(a1) + srli t6, t4, 16 + sb t6, 2(a1) + srli t6, t4, 24 + sb t6, 3(a1) + srli t6, t4, 32 + sb t6, 4(a1) + srli t6, t4, 40 + sb t6, 5(a1) + srli t6, t4, 48 + sb t6, 6(a1) + srli t6, t4, 56 + sb t6, 7(a1) +L_ualn_sd23_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t5, 8(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd24_w + sd t5, 8(a1) + j L_ualn_sd24_e +L_ualn_sd24_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd24_h + sw t5, 8(a1) + srli t6, t5, 32 + sw t6, 12(a1) + j L_ualn_sd24_e +L_ualn_sd24_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd24_b + sh t5, 8(a1) + srli t6, t5, 16 + sh t6, 10(a1) + srli t6, t5, 32 + sh t6, 12(a1) + srli t6, t5, 48 + sh t6, 14(a1) + j L_ualn_sd24_e +L_ualn_sd24_b: + sb t5, 8(a1) + srli t6, t5, 8 + sb t6, 9(a1) + srli t6, t5, 16 + sb t6, 10(a1) + srli t6, t5, 24 + sb t6, 11(a1) + srli t6, t5, 32 + sb t6, 12(a1) + srli t6, t5, 40 + sb t6, 13(a1) + srli t6, t5, 48 + sb t6, 14(a1) + srli t6, t5, 56 + sb t6, 15(a1) +L_ualn_sd24_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + srli t4, t1, 63 + srli t5, t2, 63 + slli t2, t2, 1 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t5, t5 + and t4, t4, t5 + xor t1, t1, t4 + addi a0, a0, 16 + addi a1, a1, 16 + addiw a3, a3, -1 + j L_AES_XTS_decrypt_RISCV64_block +L_AES_XTS_decrypt_RISCV64_last: + beqz a2, L_AES_XTS_decrypt_RISCV64_done + sd t1, 24(sp) + sd t2, 32(sp) + srli t4, t1, 63 + srli t5, t2, 63 + slli t2, t2, 1 + or t2, t2, t4 + slli t1, t1, 1 + li t4, 135 + neg t5, t5 + and t4, t4, t5 + xor t1, t1, t4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t4, 0(a0) +#else + andi t6, a0, 7 + bnez t6, L_ualn_ld25_w + ld t4, 0(a0) + j L_ualn_ld25_e +L_ualn_ld25_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld25_h + lwu t4, 0(a0) + lwu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + j L_ualn_ld25_e +L_ualn_ld25_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld25_b + lhu t4, 0(a0) + lhu t6, 2(a0) + slli t6, t6, 16 + or t4, t4, t6 + lhu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + lhu t6, 6(a0) + slli t6, t6, 48 + or t4, t4, t6 + j L_ualn_ld25_e +L_ualn_ld25_b: + lbu t4, 0(a0) + lbu t6, 1(a0) + slli t6, t6, 8 + or t4, t4, t6 + lbu t6, 2(a0) + slli t6, t6, 16 + or t4, t4, t6 + lbu t6, 3(a0) + slli t6, t6, 24 + or t4, t4, t6 + lbu t6, 4(a0) + slli t6, t6, 32 + or t4, t4, t6 + lbu t6, 5(a0) + slli t6, t6, 40 + or t4, t4, t6 + lbu t6, 6(a0) + slli t6, t6, 48 + or t4, t4, t6 + lbu t6, 7(a0) + slli t6, t6, 56 + or t4, t4, t6 +L_ualn_ld25_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 8(a0) +#else + andi t6, a0, 7 + bnez t6, L_ualn_ld26_w + ld t5, 8(a0) + j L_ualn_ld26_e +L_ualn_ld26_w: + andi t6, t6, 3 + bnez t6, L_ualn_ld26_h + lwu t5, 8(a0) + lwu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + j L_ualn_ld26_e +L_ualn_ld26_h: + andi t6, t6, 1 + bnez t6, L_ualn_ld26_b + lhu t5, 8(a0) + lhu t6, 10(a0) + slli t6, t6, 16 + or t5, t5, t6 + lhu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + lhu t6, 14(a0) + slli t6, t6, 48 + or t5, t5, t6 + j L_ualn_ld26_e +L_ualn_ld26_b: + lbu t5, 8(a0) + lbu t6, 9(a0) + slli t6, t6, 8 + or t5, t5, t6 + lbu t6, 10(a0) + slli t6, t6, 16 + or t5, t5, t6 + lbu t6, 11(a0) + slli t6, t6, 24 + or t5, t5, t6 + lbu t6, 12(a0) + slli t6, t6, 32 + or t5, t5, t6 + lbu t6, 13(a0) + slli t6, t6, 40 + or t5, t5, t6 + lbu t6, 14(a0) + slli t6, t6, 48 + or t5, t5, t6 + lbu t6, 15(a0) + slli t6, t6, 56 + or t5, t5, t6 +L_ualn_ld26_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a0, a0, 16 + xor t4, t4, t1 + xor t5, t5, t2 + sd t4, 0(sp) + sd t5, 8(sp) + addi t0, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu s1, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(t0) + or t4, t4, s2 + lbu s3, 5(t0) + or t5, t5, s3 + lbu s4, 9(t0) + or t6, t6, s4 + lbu s2, 13(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(t0) + or t4, t4, s2 + lbu s3, 6(t0) + or t5, t5, s3 + lbu s4, 10(t0) + or t6, t6, s4 + lbu s2, 14(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(t0) + or t4, t4, s2 + lbu s3, 7(t0) + or t5, t5, s3 + lbu s4, 11(t0) + or t6, t6, s4 + lbu s2, 15(t0) + or s1, s1, s2 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a4) + lw s8, 4(a4) + lw s9, 8(a4) + lw s10, 12(a4) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a4) + lw t5, 20(a4) + lw t6, 24(a4) + lw s1, 28(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a4) + lw t5, 36(a4) + lw t6, 40(a4) + lw s1, 44(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a4) + lw t5, 52(a4) + lw t6, 56(a4) + lw s1, 60(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a4) + lw t5, 68(a4) + lw t6, 72(a4) + lw s1, 76(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a4) + lw t5, 84(a4) + lw t6, 88(a4) + lw s1, 92(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a4) + lw t5, 100(a4) + lw t6, 104(a4) + lw s1, 108(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a4) + lw t5, 116(a4) + lw t6, 120(a4) + lw s1, 124(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a4) + lw t5, 132(a4) + lw t6, 136(a4) + lw s1, 140(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a4) + lw t5, 148(a4) + lw t6, 152(a4) + lw s1, 156(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_dec_block_12_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a4) + lw t5, 164(a4) + lw t6, 168(a4) + lw s1, 172(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a4) + lw t5, 180(a4) + lw t6, 184(a4) + lw s1, 188(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_dec_block_12_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a4) + lw t5, 196(a4) + lw t6, 200(a4) + lw s1, 204(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a4) + lw t5, 212(a4) + lw t6, 216(a4) + lw s1, 220(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_dec_block_12_done: + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu s7, 0(t4) + lbu s8, 0(t5) + lbu s9, 0(t6) + lbu s10, 0(s1) + slli s7, s7, 24 + slli s8, s8, 24 + slli s9, s9, 24 + slli s10, s10, 24 + srliw t4, s6, 16 + srliw t5, s3, 16 + srliw t6, s4, 16 + srliw s1, s5, 16 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi s1, s1, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + slli t4, t4, 16 + slli t5, t5, 16 + slli t6, t6, 16 + slli s1, s1, 16 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + srliw t4, s5, 8 + srliw t5, s6, 8 + srliw t6, s3, 8 + srliw s1, s4, 8 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi s1, s1, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a4, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t0) + sb t5, 4(t0) + sb t6, 8(t0) + sb s1, 12(t0) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t0) + sb t5, 5(t0) + sb t6, 9(t0) + sb s1, 13(t0) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t0) + sb t5, 6(t0) + sb t6, 10(t0) + sb s1, 14(t0) + sb s7, 3(t0) + sb s8, 7(t0) + sb s9, 11(t0) + sb s10, 15(t0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t0) + sd s1, 8(t0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + xor t4, t4, t1 + xor t5, t5, t2 + sd t4, 0(a6) + sd t5, 8(a6) + addi a1, a1, 16 + mv s2, a6 + mv s1, a2 +L_AES_XTS_decrypt_RISCV64_steal: + lbu t4, 0(s2) + lbu t5, 0(a0) + sb t4, 0(a1) + sb t5, 0(s2) + addi s2, s2, 1 + addi a0, a0, 1 + addi a1, a1, 1 + addiw s1, s1, -1 + bnez s1, L_AES_XTS_decrypt_RISCV64_steal + sub a1, a1, a2 + addi a1, a1, -16 + ld t1, 24(sp) + ld t2, 32(sp) + ld t4, 0(a6) + ld t5, 8(a6) + xor t4, t4, t1 + xor t5, t5, t2 + sd t4, 0(sp) + sd t5, 8(sp) + addi t0, sp, 0 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t4, 0(t0) + lbu t5, 4(t0) + lbu t6, 8(t0) + lbu s1, 12(t0) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 1(t0) + or t4, t4, s2 + lbu s3, 5(t0) + or t5, t5, s3 + lbu s4, 9(t0) + or t6, t6, s4 + lbu s2, 13(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 2(t0) + or t4, t4, s2 + lbu s3, 6(t0) + or t5, t5, s3 + lbu s4, 10(t0) + or t6, t6, s4 + lbu s2, 14(t0) + or s1, s1, s2 + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + lbu s2, 3(t0) + or t4, t4, s2 + lbu s3, 7(t0) + or t5, t5, s3 + lbu s4, 11(t0) + or t6, t6, s4 + lbu s2, 15(t0) + or s1, s1, s2 +#else + ld t5, 0(t0) + # rev8 t5, t5 + .word 0x6b8f5f13 + srli t4, t5, 32 + ld s1, 8(t0) + # rev8 s1, s1 + .word 0x6b84d493 + srli t6, s1, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(a4) + lw s8, 4(a4) + lw s9, 8(a4) + lw s10, 12(a4) + xor s7, t4, s7 + xor s8, t5, s8 + xor s9, t6, s9 + xor s10, s1, s10 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 16(a4) + lw t5, 20(a4) + lw t6, 24(a4) + lw s1, 28(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 32(a4) + lw t5, 36(a4) + lw t6, 40(a4) + lw s1, 44(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 48(a4) + lw t5, 52(a4) + lw t6, 56(a4) + lw s1, 60(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 64(a4) + lw t5, 68(a4) + lw t6, 72(a4) + lw s1, 76(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 80(a4) + lw t5, 84(a4) + lw t6, 88(a4) + lw s1, 92(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 96(a4) + lw t5, 100(a4) + lw t6, 104(a4) + lw s1, 108(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 112(a4) + lw t5, 116(a4) + lw t6, 120(a4) + lw s1, 124(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 128(a4) + lw t5, 132(a4) + lw t6, 136(a4) + lw s1, 140(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 144(a4) + lw t5, 148(a4) + lw t6, 152(a4) + lw s1, 156(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 10 + ble a7, s2, L_AES_dec_block_13_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 160(a4) + lw t5, 164(a4) + lw t6, 168(a4) + lw s1, 172(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 176(a4) + lw t5, 180(a4) + lw t6, 184(a4) + lw s1, 188(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + li s2, 12 + ble a7, s2, L_AES_dec_block_13_done + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s7, 0(t4) + lw s8, 0(t5) + lw s9, 0(t6) + lw s10, 0(s1) + addi s2, t3, 1024 + srliw t4, s6, 14 + srliw t5, s3, 14 + srliw t6, s4, 14 + srliw s1, s5, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + srliw t4, s5, 6 + srliw t5, s6, 6 + srliw t6, s3, 6 + srliw s1, s4, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + addi s2, s2, 1024 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + lw t4, 192(a4) + lw t5, 196(a4) + lw t6, 200(a4) + lw s1, 204(a4) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + srliw t4, s7, 24 + srliw t5, s8, 24 + srliw t6, s9, 24 + srliw s1, s10, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, t3 + sh2add t5, t5, t3 + sh2add t6, t6, t3 + sh2add s1, s1, t3 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, t3 + add t5, t5, t3 + add t6, t6, t3 + add s1, s1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw s3, 0(t4) + lw s4, 0(t5) + lw s5, 0(t6) + lw s6, 0(s1) + addi s2, t3, 1024 + srliw t4, s10, 14 + srliw t5, s7, 14 + srliw t6, s8, 14 + srliw s1, s9, 14 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + srliw t4, s9, 6 + srliw t5, s10, 6 + srliw t6, s7, 6 + srliw s1, s8, 6 + andi t4, t4, 1020 + andi t5, t5, 1020 + andi t6, t6, 1020 + andi s1, s1, 1020 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + addi s2, s2, 1024 + andi t4, s8, 255 + andi t5, s9, 255 + andi t6, s10, 255 + andi s1, s7, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t4, t4, s2 + sh2add t5, t5, s2 + sh2add t6, t6, s2 + sh2add s1, s1, s2 +#else + slliw t4, t4, 2 + slliw t5, t5, 2 + slliw t6, t6, 2 + slliw s1, s1, 2 + add t4, t4, s2 + add t5, t5, s2 + add t6, t6, s2 + add s1, s1, s2 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t4, 0(t4) + lw t5, 0(t5) + lw t6, 0(t6) + lw s1, 0(s1) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 + lw t4, 208(a4) + lw t5, 212(a4) + lw t6, 216(a4) + lw s1, 220(a4) + xor s3, s3, t4 + xor s4, s4, t5 + xor s5, s5, t6 + xor s6, s6, s1 +L_AES_dec_block_13_done: + srliw t4, s3, 24 + srliw t5, s4, 24 + srliw t6, s5, 24 + srliw s1, s6, 24 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu s7, 0(t4) + lbu s8, 0(t5) + lbu s9, 0(t6) + lbu s10, 0(s1) + slli s7, s7, 24 + slli s8, s8, 24 + slli s9, s9, 24 + slli s10, s10, 24 + srliw t4, s6, 16 + srliw t5, s3, 16 + srliw t6, s4, 16 + srliw s1, s5, 16 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi s1, s1, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + slli t4, t4, 16 + slli t5, t5, 16 + slli t6, t6, 16 + slli s1, s1, 16 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + srliw t4, s5, 8 + srliw t5, s6, 8 + srliw t6, s3, 8 + srliw s1, s4, 8 + andi t4, t4, 255 + andi t5, t5, 255 + andi t6, t6, 255 + andi s1, s1, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + slli t4, t4, 8 + slli t5, t5, 8 + slli t6, t6, 8 + slli s1, s1, 8 + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + andi t4, s4, 255 + andi t5, s5, 255 + andi t6, s6, 255 + andi s1, s3, 255 + add t4, t4, a5 + add t5, t5, a5 + add t6, t6, a5 + add s1, s1, a5 + lbu t4, 0(t4) + lbu t5, 0(t5) + lbu t6, 0(t6) + lbu s1, 0(s1) + or s7, s7, t4 + or s8, s8, t5 + or s9, s9, t6 + or s10, s10, s1 + slli s2, a7, 4 + add s2, a4, s2 + lw t4, 0(s2) + lw t5, 4(s2) + lw t6, 8(s2) + lw s1, 12(s2) + xor s7, s7, t4 + xor s8, s8, t5 + xor s9, s9, t6 + xor s10, s10, s1 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t4, s7, 24 + srli t5, s8, 24 + srli t6, s9, 24 + srli s1, s10, 24 + sb t4, 0(t0) + sb t5, 4(t0) + sb t6, 8(t0) + sb s1, 12(t0) + srli t4, s7, 16 + srli t5, s8, 16 + srli t6, s9, 16 + srli s1, s10, 16 + sb t4, 1(t0) + sb t5, 5(t0) + sb t6, 9(t0) + sb s1, 13(t0) + srli t4, s7, 8 + srli t5, s8, 8 + srli t6, s9, 8 + srli s1, s10, 8 + sb t4, 2(t0) + sb t5, 6(t0) + sb t6, 10(t0) + sb s1, 14(t0) + sb s7, 3(t0) + sb s8, 7(t0) + sb s9, 11(t0) + sb s10, 15(t0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t4, s7, 32 + slli t5, s8, 32 + slli t6, s9, 32 + slli s1, s10, 32 + srli t5, t5, 32 + srli s1, s1, 32 + or t5, t5, t4 + or s1, s1, t6 +#else + # pack t5, s8, s7 + .word 0x097c4f33 + # pack s1, s10, s9 + .word 0x099d44b3 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t5, t5 + .word 0x6b8f5f13 + # rev8 s1, s1 + .word 0x6b84d493 + sd t5, 0(t0) + sd s1, 8(t0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + xor t4, t4, t1 + xor t5, t5, t2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t4, 0(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd27_w + sd t4, 0(a1) + j L_ualn_sd27_e +L_ualn_sd27_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd27_h + sw t4, 0(a1) + srli t6, t4, 32 + sw t6, 4(a1) + j L_ualn_sd27_e +L_ualn_sd27_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd27_b + sh t4, 0(a1) + srli t6, t4, 16 + sh t6, 2(a1) + srli t6, t4, 32 + sh t6, 4(a1) + srli t6, t4, 48 + sh t6, 6(a1) + j L_ualn_sd27_e +L_ualn_sd27_b: + sb t4, 0(a1) + srli t6, t4, 8 + sb t6, 1(a1) + srli t6, t4, 16 + sb t6, 2(a1) + srli t6, t4, 24 + sb t6, 3(a1) + srli t6, t4, 32 + sb t6, 4(a1) + srli t6, t4, 40 + sb t6, 5(a1) + srli t6, t4, 48 + sb t6, 6(a1) + srli t6, t4, 56 + sb t6, 7(a1) +L_ualn_sd27_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t5, 8(a1) +#else + andi t6, a1, 7 + bnez t6, L_ualn_sd28_w + sd t5, 8(a1) + j L_ualn_sd28_e +L_ualn_sd28_w: + andi t6, t6, 3 + bnez t6, L_ualn_sd28_h + sw t5, 8(a1) + srli t6, t5, 32 + sw t6, 12(a1) + j L_ualn_sd28_e +L_ualn_sd28_h: + andi t6, t6, 1 + bnez t6, L_ualn_sd28_b + sh t5, 8(a1) + srli t6, t5, 16 + sh t6, 10(a1) + srli t6, t5, 32 + sh t6, 12(a1) + srli t6, t5, 48 + sh t6, 14(a1) + j L_ualn_sd28_e +L_ualn_sd28_b: + sb t5, 8(a1) + srli t6, t5, 8 + sb t6, 9(a1) + srli t6, t5, 16 + sb t6, 10(a1) + srli t6, t5, 24 + sb t6, 11(a1) + srli t6, t5, 32 + sb t6, 12(a1) + srli t6, t5, 40 + sb t6, 13(a1) + srli t6, t5, 48 + sb t6, 14(a1) + srli t6, t5, 56 + sb t6, 15(a1) +L_ualn_sd28_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +L_AES_XTS_decrypt_RISCV64_done: + ld ra, 16(sp) + ld s1, 48(sp) + ld s2, 56(sp) + ld s3, 64(sp) + ld s4, 72(sp) + ld s5, 80(sp) + ld s6, 88(sp) + ld s7, 96(sp) + ld s8, 104(sp) + ld s9, 112(sp) + ld s10, 120(sp) + addi sp, sp, 128 + ret + .size AES_XTS_decrypt_RISCV64,.-AES_XTS_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_XTS */ +#ifdef HAVE_AESGCM + .text + .globl AES_GCM_encrypt_RISCV64 + .type AES_GCM_encrypt_RISCV64,@function + .align 2 +AES_GCM_encrypt_RISCV64: + addi sp, sp, -192 + sd s0, 96(sp) + sd s1, 104(sp) + sd s2, 112(sp) + sd s3, 120(sp) + sd s4, 128(sp) + sd s5, 136(sp) + sd s6, 144(sp) + sd s7, 152(sp) + sd s8, 160(sp) + sd s9, 168(sp) + sd s10, 176(sp) + sd s11, 184(sp) + la s6, L_AES_base_gcm_r + la s7, L_AES_base_te + ld s1, 200(sp) + ld s2, 208(sp) + ld s3, 216(sp) + ld s4, 224(sp) + ld s5, 232(sp) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 48(sp) + sd a3, 56(sp) + sd a4, 64(sp) + sd a5, 72(sp) + sd a6, 80(sp) + sd a7, 88(sp) + ld t0, 64(sp) + li t1, 12 + bne t0, t1, L_AES_GCM_encrypt_RISCV64_nonce_ghash + ld t2, 56(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 0(t2) +#else + andi t0, t2, 7 + bnez t0, L_ualn_ld29_w + ld t3, 0(t2) + j L_ualn_ld29_e +L_ualn_ld29_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld29_h + lwu t3, 0(t2) + lwu t0, 4(t2) + slli t0, t0, 32 + or t3, t3, t0 + j L_ualn_ld29_e +L_ualn_ld29_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld29_b + lhu t3, 0(t2) + lhu t0, 2(t2) + slli t0, t0, 16 + or t3, t3, t0 + lhu t0, 4(t2) + slli t0, t0, 32 + or t3, t3, t0 + lhu t0, 6(t2) + slli t0, t0, 48 + or t3, t3, t0 + j L_ualn_ld29_e +L_ualn_ld29_b: + lbu t3, 0(t2) + lbu t0, 1(t2) + slli t0, t0, 8 + or t3, t3, t0 + lbu t0, 2(t2) + slli t0, t0, 16 + or t3, t3, t0 + lbu t0, 3(t2) + slli t0, t0, 24 + or t3, t3, t0 + lbu t0, 4(t2) + slli t0, t0, 32 + or t3, t3, t0 + lbu t0, 5(t2) + slli t0, t0, 40 + or t3, t3, t0 + lbu t0, 6(t2) + slli t0, t0, 48 + or t3, t3, t0 + lbu t0, 7(t2) + slli t0, t0, 56 + or t3, t3, t0 +L_ualn_ld29_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t3, 0(s4) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t3, 8(t2) +#else + andi t0, t2, 3 + bnez t0, L_ualn_lw30_h + lw t3, 8(t2) + j L_ualn_lw30_e +L_ualn_lw30_h: + andi t0, t0, 1 + bnez t0, L_ualn_lw30_b + lhu t3, 8(t2) + lhu t0, 10(t2) + slli t0, t0, 16 + or t3, t3, t0 + addiw t3, t3, 0 + j L_ualn_lw30_e +L_ualn_lw30_b: + lbu t3, 8(t2) + lbu t0, 9(t2) + slli t0, t0, 8 + or t3, t3, t0 + lbu t0, 10(t2) + slli t0, t0, 16 + or t3, t3, t0 + lbu t0, 11(t2) + slli t0, t0, 24 + or t3, t3, t0 + addiw t3, t3, 0 +L_ualn_lw30_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t3, 8(s4) + sb zero, 12(s4) + sb zero, 13(s4) + sb zero, 14(s4) + li t3, 1 + sb t3, 15(s4) + j L_AES_GCM_encrypt_RISCV64_counter_done +L_AES_GCM_encrypt_RISCV64_nonce_ghash: + sd zero, 0(s3) + sd zero, 8(s3) + ld s9, 56(sp) + ld s10, 64(sp) +L_AES_GCM_encrypt_RISCV64_nonce_block_loop: + li t0, 16 + blt s10, t0, L_AES_GCM_encrypt_RISCV64_nonce_partial +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld31_w + ld t0, 0(s9) + j L_ualn_ld31_e +L_ualn_ld31_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld31_h + lwu t0, 0(s9) + lwu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld31_e +L_ualn_ld31_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld31_b + lhu t0, 0(s9) + lhu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld31_e +L_ualn_ld31_b: + lbu t0, 0(s9) + lbu t4, 1(s9) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s9) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s9) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s9) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld31_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld32_w + ld t1, 8(s9) + j L_ualn_ld32_e +L_ualn_ld32_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld32_h + lwu t1, 8(s9) + lwu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld32_e +L_ualn_ld32_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld32_b + lhu t1, 8(s9) + lhu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld32_e +L_ualn_ld32_b: + lbu t1, 8(s9) + lbu t4, 9(s9) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s9) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s9) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s9) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld32_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult0: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done0 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult0 +L_AES_GCM_gmult_done0: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult0: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done0 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult0 +L_AES_GCM_gmult_done0: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult0: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit0: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip0 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip0: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next0 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next0: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit0 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult0 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s9, s9, 16 + addi s10, s10, -16 + j L_AES_GCM_encrypt_RISCV64_nonce_block_loop +L_AES_GCM_encrypt_RISCV64_nonce_partial: + beqz s10, L_AES_GCM_encrypt_RISCV64_nonce_partial_done + sd zero, 32(sp) + sd zero, 40(sp) + li t1, 0 +L_AES_GCM_encrypt_RISCV64_nonce_partial_byte: + add t2, s9, t1 + lbu t2, 0(t2) + addi t3, sp, 32 + add t3, t3, t1 + sb t2, 0(t3) + addi t1, t1, 1 + blt t1, s10, L_AES_GCM_encrypt_RISCV64_nonce_partial_byte + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld33_w + ld t0, 0(s11) + j L_ualn_ld33_e +L_ualn_ld33_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld33_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld33_e +L_ualn_ld33_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld33_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld33_e +L_ualn_ld33_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld33_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld34_w + ld t1, 8(s11) + j L_ualn_ld34_e +L_ualn_ld34_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld34_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld34_e +L_ualn_ld34_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld34_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld34_e +L_ualn_ld34_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld34_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult1: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done1 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult1 +L_AES_GCM_gmult_done1: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult1: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done1 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult1 +L_AES_GCM_gmult_done1: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult1: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit1: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip1 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip1: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next1 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next1: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit1 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult1 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ +L_AES_GCM_encrypt_RISCV64_nonce_partial_done: + sd zero, 32(sp) + sd zero, 40(sp) + ld t0, 64(sp) + slli t0, t0, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 43(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 44(sp) + sb t2, 45(sp) + sb t3, 46(sp) + sb t0, 47(sp) + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld35_w + ld t0, 0(s11) + j L_ualn_ld35_e +L_ualn_ld35_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld35_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld35_e +L_ualn_ld35_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld35_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld35_e +L_ualn_ld35_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld35_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld36_w + ld t1, 8(s11) + j L_ualn_ld36_e +L_ualn_ld36_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld36_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld36_e +L_ualn_ld36_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld36_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld36_e +L_ualn_ld36_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld36_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult2: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done2 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult2 +L_AES_GCM_gmult_done2: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult2: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done2 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult2 +L_AES_GCM_gmult_done2: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult2: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit2: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip2 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip2: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next2 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next2: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit2 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult2 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld t0, 0(s3) + sd t0, 0(s4) + ld t0, 8(s3) + sd t0, 8(s4) +L_AES_GCM_encrypt_RISCV64_counter_done: + addi s0, sp, 0 + mv s8, a0 + mv a3, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s4) + lbu t1, 4(s4) + lbu t2, 8(s4) + lbu t3, 12(s4) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s4) + or t0, t0, t4 + lbu t5, 5(s4) + or t1, t1, t5 + lbu t6, 9(s4) + or t2, t2, t6 + lbu t4, 13(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s4) + or t0, t0, t4 + lbu t5, 6(s4) + or t1, t1, t5 + lbu t6, 10(s4) + or t2, t2, t6 + lbu t4, 14(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s4) + or t0, t0, t4 + lbu t5, 7(s4) + or t1, t1, t5 + lbu t6, 11(s4) + or t2, t2, t6 + lbu t4, 15(s4) + or t3, t3, t4 +#else + ld t1, 0(s4) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s4) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s1) + lw a5, 4(s1) + lw a6, 8(s1) + lw a7, 12(s1) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 16(s1) + lw t1, 20(s1) + lw t2, 24(s1) + lw t3, 28(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s1) + lw t1, 36(s1) + lw t2, 40(s1) + lw t3, 44(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 48(s1) + lw t1, 52(s1) + lw t2, 56(s1) + lw t3, 60(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s1) + lw t1, 68(s1) + lw t2, 72(s1) + lw t3, 76(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 80(s1) + lw t1, 84(s1) + lw t2, 88(s1) + lw t3, 92(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s1) + lw t1, 100(s1) + lw t2, 104(s1) + lw t3, 108(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 112(s1) + lw t1, 116(s1) + lw t2, 120(s1) + lw t3, 124(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s1) + lw t1, 132(s1) + lw t2, 136(s1) + lw t3, 140(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 144(s1) + lw t1, 148(s1) + lw t2, 152(s1) + lw t3, 156(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 10 + ble s5, t4, L_AES_enc_block_14_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s1) + lw t1, 164(s1) + lw t2, 168(s1) + lw t3, 172(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 176(s1) + lw t1, 180(s1) + lw t2, 184(s1) + lw t3, 188(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 12 + ble s5, t4, L_AES_enc_block_14_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s1) + lw t1, 196(s1) + lw t2, 200(s1) + lw t3, 204(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 208(s1) + lw t1, 212(s1) + lw t2, 216(s1) + lw t3, 220(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 +L_AES_enc_block_14_done: + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s7, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s7, t4 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s5, 4 + add t4, s1, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(s0) + sb t1, 4(s0) + sb t2, 8(s0) + sb t3, 12(s0) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(s0) + sb t1, 5(s0) + sb t2, 9(s0) + sb t3, 13(s0) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(s0) + sb t1, 6(s0) + sb t2, 10(s0) + sb t3, 14(s0) + sb a4, 3(s0) + sb a5, 7(s0) + sb a6, 11(s0) + sb a7, 15(s0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(s0) + sd t3, 8(s0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv a0, s8 + mv a1, a3 + ld t0, 0(sp) + sd t0, 16(sp) + ld t0, 8(sp) + sd t0, 24(sp) + sd zero, 0(s3) + sd zero, 8(s3) + ld s9, 88(sp) + ld s10, 192(sp) +L_AES_GCM_encrypt_RISCV64_aad_block_loop: + li t0, 16 + blt s10, t0, L_AES_GCM_encrypt_RISCV64_aad_partial +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld37_w + ld t0, 0(s9) + j L_ualn_ld37_e +L_ualn_ld37_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld37_h + lwu t0, 0(s9) + lwu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld37_e +L_ualn_ld37_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld37_b + lhu t0, 0(s9) + lhu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld37_e +L_ualn_ld37_b: + lbu t0, 0(s9) + lbu t4, 1(s9) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s9) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s9) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s9) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld37_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld38_w + ld t1, 8(s9) + j L_ualn_ld38_e +L_ualn_ld38_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld38_h + lwu t1, 8(s9) + lwu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld38_e +L_ualn_ld38_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld38_b + lhu t1, 8(s9) + lhu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld38_e +L_ualn_ld38_b: + lbu t1, 8(s9) + lbu t4, 9(s9) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s9) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s9) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s9) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld38_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult3: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done3 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult3 +L_AES_GCM_gmult_done3: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult3: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done3 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult3 +L_AES_GCM_gmult_done3: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult3: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit3: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip3 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip3: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next3 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next3: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit3 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult3 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s9, s9, 16 + addi s10, s10, -16 + j L_AES_GCM_encrypt_RISCV64_aad_block_loop +L_AES_GCM_encrypt_RISCV64_aad_partial: + beqz s10, L_AES_GCM_encrypt_RISCV64_aad_partial_done + sd zero, 32(sp) + sd zero, 40(sp) + li t1, 0 +L_AES_GCM_encrypt_RISCV64_aad_partial_byte: + add t2, s9, t1 + lbu t2, 0(t2) + addi t3, sp, 32 + add t3, t3, t1 + sb t2, 0(t3) + addi t1, t1, 1 + blt t1, s10, L_AES_GCM_encrypt_RISCV64_aad_partial_byte + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld39_w + ld t0, 0(s11) + j L_ualn_ld39_e +L_ualn_ld39_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld39_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld39_e +L_ualn_ld39_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld39_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld39_e +L_ualn_ld39_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld39_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld40_w + ld t1, 8(s11) + j L_ualn_ld40_e +L_ualn_ld40_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld40_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld40_e +L_ualn_ld40_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld40_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld40_e +L_ualn_ld40_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld40_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult4: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done4 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult4 +L_AES_GCM_gmult_done4: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult4: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult4 +L_AES_GCM_gmult_done4: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult4: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit4: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip4 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip4: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next4 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next4: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit4 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult4 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ +L_AES_GCM_encrypt_RISCV64_aad_partial_done: + srli s10, a2, 4 + beqz s10, L_AES_GCM_encrypt_RISCV64_blocks_done +L_AES_GCM_encrypt_RISCV64_block_loop: +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + lwu t0, 12(s4) + # rev8 t0, t0 + .word 0x6b82d293 + srli t0, t0, 32 + addi t0, t0, 1 + slli t0, t0, 32 + # rev8 t0, t0 + .word 0x6b82d293 + sw t0, 12(s4) +#else + lbu t0, 12(s4) + lbu t1, 13(s4) + lbu t2, 14(s4) + lbu t3, 15(s4) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s4) + sb t2, 13(s4) + sb t3, 14(s4) + sb t0, 15(s4) +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + addi s0, sp, 0 + mv s8, a0 + mv a3, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s4) + lbu t1, 4(s4) + lbu t2, 8(s4) + lbu t3, 12(s4) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s4) + or t0, t0, t4 + lbu t5, 5(s4) + or t1, t1, t5 + lbu t6, 9(s4) + or t2, t2, t6 + lbu t4, 13(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s4) + or t0, t0, t4 + lbu t5, 6(s4) + or t1, t1, t5 + lbu t6, 10(s4) + or t2, t2, t6 + lbu t4, 14(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s4) + or t0, t0, t4 + lbu t5, 7(s4) + or t1, t1, t5 + lbu t6, 11(s4) + or t2, t2, t6 + lbu t4, 15(s4) + or t3, t3, t4 +#else + ld t1, 0(s4) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s4) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s1) + lw a5, 4(s1) + lw a6, 8(s1) + lw a7, 12(s1) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 16(s1) + lw t1, 20(s1) + lw t2, 24(s1) + lw t3, 28(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s1) + lw t1, 36(s1) + lw t2, 40(s1) + lw t3, 44(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 48(s1) + lw t1, 52(s1) + lw t2, 56(s1) + lw t3, 60(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s1) + lw t1, 68(s1) + lw t2, 72(s1) + lw t3, 76(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 80(s1) + lw t1, 84(s1) + lw t2, 88(s1) + lw t3, 92(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s1) + lw t1, 100(s1) + lw t2, 104(s1) + lw t3, 108(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 112(s1) + lw t1, 116(s1) + lw t2, 120(s1) + lw t3, 124(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s1) + lw t1, 132(s1) + lw t2, 136(s1) + lw t3, 140(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 144(s1) + lw t1, 148(s1) + lw t2, 152(s1) + lw t3, 156(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 10 + ble s5, t4, L_AES_enc_block_15_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s1) + lw t1, 164(s1) + lw t2, 168(s1) + lw t3, 172(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 176(s1) + lw t1, 180(s1) + lw t2, 184(s1) + lw t3, 188(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 12 + ble s5, t4, L_AES_enc_block_15_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s1) + lw t1, 196(s1) + lw t2, 200(s1) + lw t3, 204(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 208(s1) + lw t1, 212(s1) + lw t2, 216(s1) + lw t3, 220(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 +L_AES_enc_block_15_done: + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s7, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s7, t4 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s5, 4 + add t4, s1, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(s0) + sb t1, 4(s0) + sb t2, 8(s0) + sb t3, 12(s0) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(s0) + sb t1, 5(s0) + sb t2, 9(s0) + sb t3, 13(s0) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(s0) + sb t1, 6(s0) + sb t2, 10(s0) + sb t3, 14(s0) + sb a4, 3(s0) + sb a5, 7(s0) + sb a6, 11(s0) + sb a7, 15(s0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(s0) + sd t3, 8(s0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv a0, s8 + mv a1, a3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t0, a0, 7 + bnez t0, L_ualn_ld41_w + ld t2, 0(a0) + j L_ualn_ld41_e +L_ualn_ld41_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld41_h + lwu t2, 0(a0) + lwu t0, 4(a0) + slli t0, t0, 32 + or t2, t2, t0 + j L_ualn_ld41_e +L_ualn_ld41_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld41_b + lhu t2, 0(a0) + lhu t0, 2(a0) + slli t0, t0, 16 + or t2, t2, t0 + lhu t0, 4(a0) + slli t0, t0, 32 + or t2, t2, t0 + lhu t0, 6(a0) + slli t0, t0, 48 + or t2, t2, t0 + j L_ualn_ld41_e +L_ualn_ld41_b: + lbu t2, 0(a0) + lbu t0, 1(a0) + slli t0, t0, 8 + or t2, t2, t0 + lbu t0, 2(a0) + slli t0, t0, 16 + or t2, t2, t0 + lbu t0, 3(a0) + slli t0, t0, 24 + or t2, t2, t0 + lbu t0, 4(a0) + slli t0, t0, 32 + or t2, t2, t0 + lbu t0, 5(a0) + slli t0, t0, 40 + or t2, t2, t0 + lbu t0, 6(a0) + slli t0, t0, 48 + or t2, t2, t0 + lbu t0, 7(a0) + slli t0, t0, 56 + or t2, t2, t0 +L_ualn_ld41_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t0, a0, 7 + bnez t0, L_ualn_ld42_w + ld t3, 8(a0) + j L_ualn_ld42_e +L_ualn_ld42_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld42_h + lwu t3, 8(a0) + lwu t0, 12(a0) + slli t0, t0, 32 + or t3, t3, t0 + j L_ualn_ld42_e +L_ualn_ld42_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld42_b + lhu t3, 8(a0) + lhu t0, 10(a0) + slli t0, t0, 16 + or t3, t3, t0 + lhu t0, 12(a0) + slli t0, t0, 32 + or t3, t3, t0 + lhu t0, 14(a0) + slli t0, t0, 48 + or t3, t3, t0 + j L_ualn_ld42_e +L_ualn_ld42_b: + lbu t3, 8(a0) + lbu t0, 9(a0) + slli t0, t0, 8 + or t3, t3, t0 + lbu t0, 10(a0) + slli t0, t0, 16 + or t3, t3, t0 + lbu t0, 11(a0) + slli t0, t0, 24 + or t3, t3, t0 + lbu t0, 12(a0) + slli t0, t0, 32 + or t3, t3, t0 + lbu t0, 13(a0) + slli t0, t0, 40 + or t3, t3, t0 + lbu t0, 14(a0) + slli t0, t0, 48 + or t3, t3, t0 + lbu t0, 15(a0) + slli t0, t0, 56 + or t3, t3, t0 +L_ualn_ld42_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + xor t2, t2, t4 + xor t3, t3, t5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_sd43_w + sd t2, 0(a1) + j L_ualn_sd43_e +L_ualn_sd43_w: + andi t0, t0, 3 + bnez t0, L_ualn_sd43_h + sw t2, 0(a1) + srli t0, t2, 32 + sw t0, 4(a1) + j L_ualn_sd43_e +L_ualn_sd43_h: + andi t0, t0, 1 + bnez t0, L_ualn_sd43_b + sh t2, 0(a1) + srli t0, t2, 16 + sh t0, 2(a1) + srli t0, t2, 32 + sh t0, 4(a1) + srli t0, t2, 48 + sh t0, 6(a1) + j L_ualn_sd43_e +L_ualn_sd43_b: + sb t2, 0(a1) + srli t0, t2, 8 + sb t0, 1(a1) + srli t0, t2, 16 + sb t0, 2(a1) + srli t0, t2, 24 + sb t0, 3(a1) + srli t0, t2, 32 + sb t0, 4(a1) + srli t0, t2, 40 + sb t0, 5(a1) + srli t0, t2, 48 + sb t0, 6(a1) + srli t0, t2, 56 + sb t0, 7(a1) +L_ualn_sd43_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_sd44_w + sd t3, 8(a1) + j L_ualn_sd44_e +L_ualn_sd44_w: + andi t0, t0, 3 + bnez t0, L_ualn_sd44_h + sw t3, 8(a1) + srli t0, t3, 32 + sw t0, 12(a1) + j L_ualn_sd44_e +L_ualn_sd44_h: + andi t0, t0, 1 + bnez t0, L_ualn_sd44_b + sh t3, 8(a1) + srli t0, t3, 16 + sh t0, 10(a1) + srli t0, t3, 32 + sh t0, 12(a1) + srli t0, t3, 48 + sh t0, 14(a1) + j L_ualn_sd44_e +L_ualn_sd44_b: + sb t3, 8(a1) + srli t0, t3, 8 + sb t0, 9(a1) + srli t0, t3, 16 + sb t0, 10(a1) + srli t0, t3, 24 + sb t0, 11(a1) + srli t0, t3, 32 + sb t0, 12(a1) + srli t0, t3, 40 + sb t0, 13(a1) + srli t0, t3, 48 + sb t0, 14(a1) + srli t0, t3, 56 + sb t0, 15(a1) +L_ualn_sd44_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t2, 32(sp) + sd t3, 40(sp) + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld45_w + ld t0, 0(s11) + j L_ualn_ld45_e +L_ualn_ld45_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld45_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld45_e +L_ualn_ld45_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld45_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld45_e +L_ualn_ld45_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld45_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld46_w + ld t1, 8(s11) + j L_ualn_ld46_e +L_ualn_ld46_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld46_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld46_e +L_ualn_ld46_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld46_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld46_e +L_ualn_ld46_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld46_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult5: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done5 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult5 +L_AES_GCM_gmult_done5: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult5: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done5 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult5 +L_AES_GCM_gmult_done5: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult5: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit5: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip5 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip5: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next5 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next5: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit5 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult5 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi a0, a0, 16 + addi a1, a1, 16 + addi s10, s10, -1 + bnez s10, L_AES_GCM_encrypt_RISCV64_block_loop +L_AES_GCM_encrypt_RISCV64_blocks_done: + andi s10, a2, 15 + beqz s10, L_AES_GCM_encrypt_RISCV64_partial_done +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + lwu t0, 12(s4) + # rev8 t0, t0 + .word 0x6b82d293 + srli t0, t0, 32 + addi t0, t0, 1 + slli t0, t0, 32 + # rev8 t0, t0 + .word 0x6b82d293 + sw t0, 12(s4) +#else + lbu t0, 12(s4) + lbu t1, 13(s4) + lbu t2, 14(s4) + lbu t3, 15(s4) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s4) + sb t2, 13(s4) + sb t3, 14(s4) + sb t0, 15(s4) +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + addi s0, sp, 0 + mv s8, a0 + mv a3, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s4) + lbu t1, 4(s4) + lbu t2, 8(s4) + lbu t3, 12(s4) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s4) + or t0, t0, t4 + lbu t5, 5(s4) + or t1, t1, t5 + lbu t6, 9(s4) + or t2, t2, t6 + lbu t4, 13(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s4) + or t0, t0, t4 + lbu t5, 6(s4) + or t1, t1, t5 + lbu t6, 10(s4) + or t2, t2, t6 + lbu t4, 14(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s4) + or t0, t0, t4 + lbu t5, 7(s4) + or t1, t1, t5 + lbu t6, 11(s4) + or t2, t2, t6 + lbu t4, 15(s4) + or t3, t3, t4 +#else + ld t1, 0(s4) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s4) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s1) + lw a5, 4(s1) + lw a6, 8(s1) + lw a7, 12(s1) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 16(s1) + lw t1, 20(s1) + lw t2, 24(s1) + lw t3, 28(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s1) + lw t1, 36(s1) + lw t2, 40(s1) + lw t3, 44(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 48(s1) + lw t1, 52(s1) + lw t2, 56(s1) + lw t3, 60(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s1) + lw t1, 68(s1) + lw t2, 72(s1) + lw t3, 76(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 80(s1) + lw t1, 84(s1) + lw t2, 88(s1) + lw t3, 92(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s1) + lw t1, 100(s1) + lw t2, 104(s1) + lw t3, 108(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 112(s1) + lw t1, 116(s1) + lw t2, 120(s1) + lw t3, 124(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s1) + lw t1, 132(s1) + lw t2, 136(s1) + lw t3, 140(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 144(s1) + lw t1, 148(s1) + lw t2, 152(s1) + lw t3, 156(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 10 + ble s5, t4, L_AES_enc_block_16_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s1) + lw t1, 164(s1) + lw t2, 168(s1) + lw t3, 172(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 176(s1) + lw t1, 180(s1) + lw t2, 184(s1) + lw t3, 188(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 12 + ble s5, t4, L_AES_enc_block_16_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s1) + lw t1, 196(s1) + lw t2, 200(s1) + lw t3, 204(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 208(s1) + lw t1, 212(s1) + lw t2, 216(s1) + lw t3, 220(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 +L_AES_enc_block_16_done: + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s7, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s7, t4 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s5, 4 + add t4, s1, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(s0) + sb t1, 4(s0) + sb t2, 8(s0) + sb t3, 12(s0) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(s0) + sb t1, 5(s0) + sb t2, 9(s0) + sb t3, 13(s0) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(s0) + sb t1, 6(s0) + sb t2, 10(s0) + sb t3, 14(s0) + sb a4, 3(s0) + sb a5, 7(s0) + sb a6, 11(s0) + sb a7, 15(s0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(s0) + sd t3, 8(s0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv a0, s8 + mv a1, a3 + sd zero, 32(sp) + sd zero, 40(sp) + li t1, 0 +L_AES_GCM_encrypt_RISCV64_partial_byte: + add t2, a0, t1 + lbu t2, 0(t2) + addi t3, sp, 0 + add t3, t3, t1 + lbu t3, 0(t3) + xor t4, t2, t3 + add t5, a1, t1 + sb t4, 0(t5) + addi t5, sp, 32 + add t5, t5, t1 + sb t4, 0(t5) + addi t1, t1, 1 + blt t1, s10, L_AES_GCM_encrypt_RISCV64_partial_byte + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld47_w + ld t0, 0(s11) + j L_ualn_ld47_e +L_ualn_ld47_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld47_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld47_e +L_ualn_ld47_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld47_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld47_e +L_ualn_ld47_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld47_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld48_w + ld t1, 8(s11) + j L_ualn_ld48_e +L_ualn_ld48_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld48_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld48_e +L_ualn_ld48_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld48_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld48_e +L_ualn_ld48_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld48_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult6: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done6 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult6 +L_AES_GCM_gmult_done6: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult6: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done6 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult6 +L_AES_GCM_gmult_done6: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult6: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit6: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip6 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip6: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next6 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next6: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit6 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult6 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ +L_AES_GCM_encrypt_RISCV64_partial_done: + sd zero, 32(sp) + sd zero, 40(sp) + ld t0, 192(sp) + slli t0, t0, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 35(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 36(sp) + sb t2, 37(sp) + sb t3, 38(sp) + sb t0, 39(sp) + slli t0, a2, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 43(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 44(sp) + sb t2, 45(sp) + sb t3, 46(sp) + sb t0, 47(sp) + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld49_w + ld t0, 0(s11) + j L_ualn_ld49_e +L_ualn_ld49_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld49_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld49_e +L_ualn_ld49_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld49_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld49_e +L_ualn_ld49_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld49_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld50_w + ld t1, 8(s11) + j L_ualn_ld50_e +L_ualn_ld50_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld50_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld50_e +L_ualn_ld50_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld50_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld50_e +L_ualn_ld50_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld50_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult7: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done7 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult7 +L_AES_GCM_gmult_done7: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult7: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done7 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult7 +L_AES_GCM_gmult_done7: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult7: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit7: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip7 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip7: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next7 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next7: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit7 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult7 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld t0, 0(s3) + ld t1, 8(s3) + ld t2, 16(sp) + ld t3, 24(sp) + xor t0, t0, t2 + xor t1, t1, t3 + sd t0, 32(sp) + sd t1, 40(sp) + ld a5, 72(sp) + ld a6, 80(sp) + li t2, 0 +L_AES_GCM_encrypt_RISCV64_store_tag: + addi t3, sp, 32 + add t3, t3, t2 + lbu t3, 0(t3) + add t4, a5, t2 + sb t3, 0(t4) + addi t2, t2, 1 + blt t2, a6, L_AES_GCM_encrypt_RISCV64_store_tag + ld ra, 48(sp) + ld s0, 96(sp) + ld s1, 104(sp) + ld s2, 112(sp) + ld s3, 120(sp) + ld s4, 128(sp) + ld s5, 136(sp) + ld s6, 144(sp) + ld s7, 152(sp) + ld s8, 160(sp) + ld s9, 168(sp) + ld s10, 176(sp) + ld s11, 184(sp) + addi sp, sp, 192 + ret + .size AES_GCM_encrypt_RISCV64,.-AES_GCM_encrypt_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_GCM_decrypt_RISCV64 + .type AES_GCM_decrypt_RISCV64,@function + .align 2 +AES_GCM_decrypt_RISCV64: + addi sp, sp, -192 + sd s0, 96(sp) + sd s1, 104(sp) + sd s2, 112(sp) + sd s3, 120(sp) + sd s4, 128(sp) + sd s5, 136(sp) + sd s6, 144(sp) + sd s7, 152(sp) + sd s8, 160(sp) + sd s9, 168(sp) + sd s10, 176(sp) + sd s11, 184(sp) + la s6, L_AES_base_gcm_r + la s7, L_AES_base_te + ld s1, 200(sp) + ld s2, 208(sp) + ld s3, 216(sp) + ld s4, 224(sp) + ld s5, 232(sp) +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 48(sp) + sd a3, 56(sp) + sd a4, 64(sp) + sd a5, 72(sp) + sd a6, 80(sp) + sd a7, 88(sp) + ld t0, 64(sp) + li t1, 12 + bne t0, t1, L_AES_GCM_decrypt_RISCV64_nonce_ghash + ld t2, 56(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 0(t2) +#else + andi t0, t2, 7 + bnez t0, L_ualn_ld51_w + ld t3, 0(t2) + j L_ualn_ld51_e +L_ualn_ld51_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld51_h + lwu t3, 0(t2) + lwu t0, 4(t2) + slli t0, t0, 32 + or t3, t3, t0 + j L_ualn_ld51_e +L_ualn_ld51_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld51_b + lhu t3, 0(t2) + lhu t0, 2(t2) + slli t0, t0, 16 + or t3, t3, t0 + lhu t0, 4(t2) + slli t0, t0, 32 + or t3, t3, t0 + lhu t0, 6(t2) + slli t0, t0, 48 + or t3, t3, t0 + j L_ualn_ld51_e +L_ualn_ld51_b: + lbu t3, 0(t2) + lbu t0, 1(t2) + slli t0, t0, 8 + or t3, t3, t0 + lbu t0, 2(t2) + slli t0, t0, 16 + or t3, t3, t0 + lbu t0, 3(t2) + slli t0, t0, 24 + or t3, t3, t0 + lbu t0, 4(t2) + slli t0, t0, 32 + or t3, t3, t0 + lbu t0, 5(t2) + slli t0, t0, 40 + or t3, t3, t0 + lbu t0, 6(t2) + slli t0, t0, 48 + or t3, t3, t0 + lbu t0, 7(t2) + slli t0, t0, 56 + or t3, t3, t0 +L_ualn_ld51_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t3, 0(s4) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t3, 8(t2) +#else + andi t0, t2, 3 + bnez t0, L_ualn_lw52_h + lw t3, 8(t2) + j L_ualn_lw52_e +L_ualn_lw52_h: + andi t0, t0, 1 + bnez t0, L_ualn_lw52_b + lhu t3, 8(t2) + lhu t0, 10(t2) + slli t0, t0, 16 + or t3, t3, t0 + addiw t3, t3, 0 + j L_ualn_lw52_e +L_ualn_lw52_b: + lbu t3, 8(t2) + lbu t0, 9(t2) + slli t0, t0, 8 + or t3, t3, t0 + lbu t0, 10(t2) + slli t0, t0, 16 + or t3, t3, t0 + lbu t0, 11(t2) + slli t0, t0, 24 + or t3, t3, t0 + addiw t3, t3, 0 +L_ualn_lw52_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t3, 8(s4) + sb zero, 12(s4) + sb zero, 13(s4) + sb zero, 14(s4) + li t3, 1 + sb t3, 15(s4) + j L_AES_GCM_decrypt_RISCV64_counter_done +L_AES_GCM_decrypt_RISCV64_nonce_ghash: + sd zero, 0(s3) + sd zero, 8(s3) + ld s9, 56(sp) + ld s10, 64(sp) +L_AES_GCM_decrypt_RISCV64_nonce_block_loop: + li t0, 16 + blt s10, t0, L_AES_GCM_decrypt_RISCV64_nonce_partial +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld53_w + ld t0, 0(s9) + j L_ualn_ld53_e +L_ualn_ld53_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld53_h + lwu t0, 0(s9) + lwu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld53_e +L_ualn_ld53_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld53_b + lhu t0, 0(s9) + lhu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld53_e +L_ualn_ld53_b: + lbu t0, 0(s9) + lbu t4, 1(s9) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s9) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s9) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s9) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld53_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld54_w + ld t1, 8(s9) + j L_ualn_ld54_e +L_ualn_ld54_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld54_h + lwu t1, 8(s9) + lwu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld54_e +L_ualn_ld54_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld54_b + lhu t1, 8(s9) + lhu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld54_e +L_ualn_ld54_b: + lbu t1, 8(s9) + lbu t4, 9(s9) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s9) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s9) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s9) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld54_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult8: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done8 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult8 +L_AES_GCM_gmult_done8: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult8: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done8 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult8 +L_AES_GCM_gmult_done8: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult8: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit8: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip8 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip8: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next8 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next8: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit8 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult8 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s9, s9, 16 + addi s10, s10, -16 + j L_AES_GCM_decrypt_RISCV64_nonce_block_loop +L_AES_GCM_decrypt_RISCV64_nonce_partial: + beqz s10, L_AES_GCM_decrypt_RISCV64_nonce_partial_done + sd zero, 32(sp) + sd zero, 40(sp) + li t1, 0 +L_AES_GCM_decrypt_RISCV64_nonce_partial_byte: + add t2, s9, t1 + lbu t2, 0(t2) + addi t3, sp, 32 + add t3, t3, t1 + sb t2, 0(t3) + addi t1, t1, 1 + blt t1, s10, L_AES_GCM_decrypt_RISCV64_nonce_partial_byte + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld55_w + ld t0, 0(s11) + j L_ualn_ld55_e +L_ualn_ld55_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld55_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld55_e +L_ualn_ld55_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld55_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld55_e +L_ualn_ld55_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld55_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld56_w + ld t1, 8(s11) + j L_ualn_ld56_e +L_ualn_ld56_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld56_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld56_e +L_ualn_ld56_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld56_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld56_e +L_ualn_ld56_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld56_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult9: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done9 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult9 +L_AES_GCM_gmult_done9: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult9: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done9 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult9 +L_AES_GCM_gmult_done9: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult9: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit9: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip9 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip9: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next9 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next9: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit9 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult9 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ +L_AES_GCM_decrypt_RISCV64_nonce_partial_done: + sd zero, 32(sp) + sd zero, 40(sp) + ld t0, 64(sp) + slli t0, t0, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 43(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 44(sp) + sb t2, 45(sp) + sb t3, 46(sp) + sb t0, 47(sp) + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld57_w + ld t0, 0(s11) + j L_ualn_ld57_e +L_ualn_ld57_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld57_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld57_e +L_ualn_ld57_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld57_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld57_e +L_ualn_ld57_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld57_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld58_w + ld t1, 8(s11) + j L_ualn_ld58_e +L_ualn_ld58_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld58_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld58_e +L_ualn_ld58_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld58_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld58_e +L_ualn_ld58_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld58_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult10: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done10 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult10 +L_AES_GCM_gmult_done10: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult10: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done10 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult10 +L_AES_GCM_gmult_done10: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult10: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit10: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip10 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip10: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next10 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next10: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit10 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult10 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld t0, 0(s3) + sd t0, 0(s4) + ld t0, 8(s3) + sd t0, 8(s4) +L_AES_GCM_decrypt_RISCV64_counter_done: + addi s0, sp, 0 + mv s8, a0 + mv a3, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s4) + lbu t1, 4(s4) + lbu t2, 8(s4) + lbu t3, 12(s4) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s4) + or t0, t0, t4 + lbu t5, 5(s4) + or t1, t1, t5 + lbu t6, 9(s4) + or t2, t2, t6 + lbu t4, 13(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s4) + or t0, t0, t4 + lbu t5, 6(s4) + or t1, t1, t5 + lbu t6, 10(s4) + or t2, t2, t6 + lbu t4, 14(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s4) + or t0, t0, t4 + lbu t5, 7(s4) + or t1, t1, t5 + lbu t6, 11(s4) + or t2, t2, t6 + lbu t4, 15(s4) + or t3, t3, t4 +#else + ld t1, 0(s4) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s4) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s1) + lw a5, 4(s1) + lw a6, 8(s1) + lw a7, 12(s1) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 16(s1) + lw t1, 20(s1) + lw t2, 24(s1) + lw t3, 28(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s1) + lw t1, 36(s1) + lw t2, 40(s1) + lw t3, 44(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 48(s1) + lw t1, 52(s1) + lw t2, 56(s1) + lw t3, 60(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s1) + lw t1, 68(s1) + lw t2, 72(s1) + lw t3, 76(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 80(s1) + lw t1, 84(s1) + lw t2, 88(s1) + lw t3, 92(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s1) + lw t1, 100(s1) + lw t2, 104(s1) + lw t3, 108(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 112(s1) + lw t1, 116(s1) + lw t2, 120(s1) + lw t3, 124(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s1) + lw t1, 132(s1) + lw t2, 136(s1) + lw t3, 140(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 144(s1) + lw t1, 148(s1) + lw t2, 152(s1) + lw t3, 156(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 10 + ble s5, t4, L_AES_enc_block_17_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s1) + lw t1, 164(s1) + lw t2, 168(s1) + lw t3, 172(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 176(s1) + lw t1, 180(s1) + lw t2, 184(s1) + lw t3, 188(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 12 + ble s5, t4, L_AES_enc_block_17_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s1) + lw t1, 196(s1) + lw t2, 200(s1) + lw t3, 204(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 208(s1) + lw t1, 212(s1) + lw t2, 216(s1) + lw t3, 220(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 +L_AES_enc_block_17_done: + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s7, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s7, t4 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s5, 4 + add t4, s1, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(s0) + sb t1, 4(s0) + sb t2, 8(s0) + sb t3, 12(s0) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(s0) + sb t1, 5(s0) + sb t2, 9(s0) + sb t3, 13(s0) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(s0) + sb t1, 6(s0) + sb t2, 10(s0) + sb t3, 14(s0) + sb a4, 3(s0) + sb a5, 7(s0) + sb a6, 11(s0) + sb a7, 15(s0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(s0) + sd t3, 8(s0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv a0, s8 + mv a1, a3 + ld t0, 0(sp) + sd t0, 16(sp) + ld t0, 8(sp) + sd t0, 24(sp) + sd zero, 0(s3) + sd zero, 8(s3) + ld s9, 88(sp) + ld s10, 192(sp) +L_AES_GCM_decrypt_RISCV64_aad_block_loop: + li t0, 16 + blt s10, t0, L_AES_GCM_decrypt_RISCV64_aad_partial +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld59_w + ld t0, 0(s9) + j L_ualn_ld59_e +L_ualn_ld59_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld59_h + lwu t0, 0(s9) + lwu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld59_e +L_ualn_ld59_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld59_b + lhu t0, 0(s9) + lhu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld59_e +L_ualn_ld59_b: + lbu t0, 0(s9) + lbu t4, 1(s9) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s9) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s9) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s9) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s9) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s9) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s9) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld59_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s9) +#else + andi t4, s9, 7 + bnez t4, L_ualn_ld60_w + ld t1, 8(s9) + j L_ualn_ld60_e +L_ualn_ld60_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld60_h + lwu t1, 8(s9) + lwu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld60_e +L_ualn_ld60_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld60_b + lhu t1, 8(s9) + lhu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld60_e +L_ualn_ld60_b: + lbu t1, 8(s9) + lbu t4, 9(s9) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s9) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s9) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s9) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s9) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s9) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s9) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld60_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult11: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done11 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult11 +L_AES_GCM_gmult_done11: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult11: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done11 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult11 +L_AES_GCM_gmult_done11: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult11: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit11: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip11 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip11: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next11 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next11: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit11 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult11 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s9, s9, 16 + addi s10, s10, -16 + j L_AES_GCM_decrypt_RISCV64_aad_block_loop +L_AES_GCM_decrypt_RISCV64_aad_partial: + beqz s10, L_AES_GCM_decrypt_RISCV64_aad_partial_done + sd zero, 32(sp) + sd zero, 40(sp) + li t1, 0 +L_AES_GCM_decrypt_RISCV64_aad_partial_byte: + add t2, s9, t1 + lbu t2, 0(t2) + addi t3, sp, 32 + add t3, t3, t1 + sb t2, 0(t3) + addi t1, t1, 1 + blt t1, s10, L_AES_GCM_decrypt_RISCV64_aad_partial_byte + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld61_w + ld t0, 0(s11) + j L_ualn_ld61_e +L_ualn_ld61_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld61_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld61_e +L_ualn_ld61_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld61_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld61_e +L_ualn_ld61_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld61_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld62_w + ld t1, 8(s11) + j L_ualn_ld62_e +L_ualn_ld62_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld62_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld62_e +L_ualn_ld62_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld62_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld62_e +L_ualn_ld62_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld62_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult12: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done12 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult12 +L_AES_GCM_gmult_done12: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult12: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done12 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult12 +L_AES_GCM_gmult_done12: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult12: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit12: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip12 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip12: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next12 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next12: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit12 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult12 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ +L_AES_GCM_decrypt_RISCV64_aad_partial_done: + srli s10, a2, 4 + beqz s10, L_AES_GCM_decrypt_RISCV64_blocks_done +L_AES_GCM_decrypt_RISCV64_block_loop: +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + lwu t0, 12(s4) + # rev8 t0, t0 + .word 0x6b82d293 + srli t0, t0, 32 + addi t0, t0, 1 + slli t0, t0, 32 + # rev8 t0, t0 + .word 0x6b82d293 + sw t0, 12(s4) +#else + lbu t0, 12(s4) + lbu t1, 13(s4) + lbu t2, 14(s4) + lbu t3, 15(s4) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s4) + sb t2, 13(s4) + sb t3, 14(s4) + sb t0, 15(s4) +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + addi s0, sp, 0 + mv s8, a0 + mv a3, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s4) + lbu t1, 4(s4) + lbu t2, 8(s4) + lbu t3, 12(s4) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s4) + or t0, t0, t4 + lbu t5, 5(s4) + or t1, t1, t5 + lbu t6, 9(s4) + or t2, t2, t6 + lbu t4, 13(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s4) + or t0, t0, t4 + lbu t5, 6(s4) + or t1, t1, t5 + lbu t6, 10(s4) + or t2, t2, t6 + lbu t4, 14(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s4) + or t0, t0, t4 + lbu t5, 7(s4) + or t1, t1, t5 + lbu t6, 11(s4) + or t2, t2, t6 + lbu t4, 15(s4) + or t3, t3, t4 +#else + ld t1, 0(s4) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s4) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s1) + lw a5, 4(s1) + lw a6, 8(s1) + lw a7, 12(s1) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 16(s1) + lw t1, 20(s1) + lw t2, 24(s1) + lw t3, 28(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s1) + lw t1, 36(s1) + lw t2, 40(s1) + lw t3, 44(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 48(s1) + lw t1, 52(s1) + lw t2, 56(s1) + lw t3, 60(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s1) + lw t1, 68(s1) + lw t2, 72(s1) + lw t3, 76(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 80(s1) + lw t1, 84(s1) + lw t2, 88(s1) + lw t3, 92(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s1) + lw t1, 100(s1) + lw t2, 104(s1) + lw t3, 108(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 112(s1) + lw t1, 116(s1) + lw t2, 120(s1) + lw t3, 124(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s1) + lw t1, 132(s1) + lw t2, 136(s1) + lw t3, 140(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 144(s1) + lw t1, 148(s1) + lw t2, 152(s1) + lw t3, 156(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 10 + ble s5, t4, L_AES_enc_block_18_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s1) + lw t1, 164(s1) + lw t2, 168(s1) + lw t3, 172(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 176(s1) + lw t1, 180(s1) + lw t2, 184(s1) + lw t3, 188(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 12 + ble s5, t4, L_AES_enc_block_18_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s1) + lw t1, 196(s1) + lw t2, 200(s1) + lw t3, 204(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 208(s1) + lw t1, 212(s1) + lw t2, 216(s1) + lw t3, 220(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 +L_AES_enc_block_18_done: + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s7, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s7, t4 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s5, 4 + add t4, s1, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(s0) + sb t1, 4(s0) + sb t2, 8(s0) + sb t3, 12(s0) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(s0) + sb t1, 5(s0) + sb t2, 9(s0) + sb t3, 13(s0) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(s0) + sb t1, 6(s0) + sb t2, 10(s0) + sb t3, 14(s0) + sb a4, 3(s0) + sb a5, 7(s0) + sb a6, 11(s0) + sb a7, 15(s0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(s0) + sd t3, 8(s0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv a0, s8 + mv a1, a3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t2, 0(a0) +#else + andi t0, a0, 7 + bnez t0, L_ualn_ld63_w + ld t2, 0(a0) + j L_ualn_ld63_e +L_ualn_ld63_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld63_h + lwu t2, 0(a0) + lwu t0, 4(a0) + slli t0, t0, 32 + or t2, t2, t0 + j L_ualn_ld63_e +L_ualn_ld63_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld63_b + lhu t2, 0(a0) + lhu t0, 2(a0) + slli t0, t0, 16 + or t2, t2, t0 + lhu t0, 4(a0) + slli t0, t0, 32 + or t2, t2, t0 + lhu t0, 6(a0) + slli t0, t0, 48 + or t2, t2, t0 + j L_ualn_ld63_e +L_ualn_ld63_b: + lbu t2, 0(a0) + lbu t0, 1(a0) + slli t0, t0, 8 + or t2, t2, t0 + lbu t0, 2(a0) + slli t0, t0, 16 + or t2, t2, t0 + lbu t0, 3(a0) + slli t0, t0, 24 + or t2, t2, t0 + lbu t0, 4(a0) + slli t0, t0, 32 + or t2, t2, t0 + lbu t0, 5(a0) + slli t0, t0, 40 + or t2, t2, t0 + lbu t0, 6(a0) + slli t0, t0, 48 + or t2, t2, t0 + lbu t0, 7(a0) + slli t0, t0, 56 + or t2, t2, t0 +L_ualn_ld63_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a0) +#else + andi t0, a0, 7 + bnez t0, L_ualn_ld64_w + ld t3, 8(a0) + j L_ualn_ld64_e +L_ualn_ld64_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld64_h + lwu t3, 8(a0) + lwu t0, 12(a0) + slli t0, t0, 32 + or t3, t3, t0 + j L_ualn_ld64_e +L_ualn_ld64_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld64_b + lhu t3, 8(a0) + lhu t0, 10(a0) + slli t0, t0, 16 + or t3, t3, t0 + lhu t0, 12(a0) + slli t0, t0, 32 + or t3, t3, t0 + lhu t0, 14(a0) + slli t0, t0, 48 + or t3, t3, t0 + j L_ualn_ld64_e +L_ualn_ld64_b: + lbu t3, 8(a0) + lbu t0, 9(a0) + slli t0, t0, 8 + or t3, t3, t0 + lbu t0, 10(a0) + slli t0, t0, 16 + or t3, t3, t0 + lbu t0, 11(a0) + slli t0, t0, 24 + or t3, t3, t0 + lbu t0, 12(a0) + slli t0, t0, 32 + or t3, t3, t0 + lbu t0, 13(a0) + slli t0, t0, 40 + or t3, t3, t0 + lbu t0, 14(a0) + slli t0, t0, 48 + or t3, t3, t0 + lbu t0, 15(a0) + slli t0, t0, 56 + or t3, t3, t0 +L_ualn_ld64_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t4, 0(sp) + ld t5, 8(sp) + xor t2, t2, t4 + xor t3, t3, t5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 0(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_sd65_w + sd t2, 0(a1) + j L_ualn_sd65_e +L_ualn_sd65_w: + andi t0, t0, 3 + bnez t0, L_ualn_sd65_h + sw t2, 0(a1) + srli t0, t2, 32 + sw t0, 4(a1) + j L_ualn_sd65_e +L_ualn_sd65_h: + andi t0, t0, 1 + bnez t0, L_ualn_sd65_b + sh t2, 0(a1) + srli t0, t2, 16 + sh t0, 2(a1) + srli t0, t2, 32 + sh t0, 4(a1) + srli t0, t2, 48 + sh t0, 6(a1) + j L_ualn_sd65_e +L_ualn_sd65_b: + sb t2, 0(a1) + srli t0, t2, 8 + sb t0, 1(a1) + srli t0, t2, 16 + sb t0, 2(a1) + srli t0, t2, 24 + sb t0, 3(a1) + srli t0, t2, 32 + sb t0, 4(a1) + srli t0, t2, 40 + sb t0, 5(a1) + srli t0, t2, 48 + sb t0, 6(a1) + srli t0, t2, 56 + sb t0, 7(a1) +L_ualn_sd65_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t3, 8(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_sd66_w + sd t3, 8(a1) + j L_ualn_sd66_e +L_ualn_sd66_w: + andi t0, t0, 3 + bnez t0, L_ualn_sd66_h + sw t3, 8(a1) + srli t0, t3, 32 + sw t0, 12(a1) + j L_ualn_sd66_e +L_ualn_sd66_h: + andi t0, t0, 1 + bnez t0, L_ualn_sd66_b + sh t3, 8(a1) + srli t0, t3, 16 + sh t0, 10(a1) + srli t0, t3, 32 + sh t0, 12(a1) + srli t0, t3, 48 + sh t0, 14(a1) + j L_ualn_sd66_e +L_ualn_sd66_b: + sb t3, 8(a1) + srli t0, t3, 8 + sb t0, 9(a1) + srli t0, t3, 16 + sb t0, 10(a1) + srli t0, t3, 24 + sb t0, 11(a1) + srli t0, t3, 32 + sb t0, 12(a1) + srli t0, t3, 40 + sb t0, 13(a1) + srli t0, t3, 48 + sb t0, 14(a1) + srli t0, t3, 56 + sb t0, 15(a1) +L_ualn_sd66_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld67_w + ld t0, 0(a0) + j L_ualn_ld67_e +L_ualn_ld67_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld67_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld67_e +L_ualn_ld67_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld67_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld67_e +L_ualn_ld67_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld67_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld68_w + ld t1, 8(a0) + j L_ualn_ld68_e +L_ualn_ld68_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld68_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld68_e +L_ualn_ld68_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld68_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld68_e +L_ualn_ld68_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld68_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult13: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done13 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult13 +L_AES_GCM_gmult_done13: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult13: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done13 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult13 +L_AES_GCM_gmult_done13: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult13: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit13: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip13 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip13: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next13 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next13: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit13 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult13 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi a0, a0, 16 + addi a1, a1, 16 + addi s10, s10, -1 + bnez s10, L_AES_GCM_decrypt_RISCV64_block_loop +L_AES_GCM_decrypt_RISCV64_blocks_done: + andi s10, a2, 15 + beqz s10, L_AES_GCM_decrypt_RISCV64_partial_done +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + lwu t0, 12(s4) + # rev8 t0, t0 + .word 0x6b82d293 + srli t0, t0, 32 + addi t0, t0, 1 + slli t0, t0, 32 + # rev8 t0, t0 + .word 0x6b82d293 + sw t0, 12(s4) +#else + lbu t0, 12(s4) + lbu t1, 13(s4) + lbu t2, 14(s4) + lbu t3, 15(s4) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s4) + sb t2, 13(s4) + sb t3, 14(s4) + sb t0, 15(s4) +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + addi s0, sp, 0 + mv s8, a0 + mv a3, a1 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s4) + lbu t1, 4(s4) + lbu t2, 8(s4) + lbu t3, 12(s4) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s4) + or t0, t0, t4 + lbu t5, 5(s4) + or t1, t1, t5 + lbu t6, 9(s4) + or t2, t2, t6 + lbu t4, 13(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s4) + or t0, t0, t4 + lbu t5, 6(s4) + or t1, t1, t5 + lbu t6, 10(s4) + or t2, t2, t6 + lbu t4, 14(s4) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s4) + or t0, t0, t4 + lbu t5, 7(s4) + or t1, t1, t5 + lbu t6, 11(s4) + or t2, t2, t6 + lbu t4, 15(s4) + or t3, t3, t4 +#else + ld t1, 0(s4) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s4) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s1) + lw a5, 4(s1) + lw a6, 8(s1) + lw a7, 12(s1) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 16(s1) + lw t1, 20(s1) + lw t2, 24(s1) + lw t3, 28(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s1) + lw t1, 36(s1) + lw t2, 40(s1) + lw t3, 44(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 48(s1) + lw t1, 52(s1) + lw t2, 56(s1) + lw t3, 60(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s1) + lw t1, 68(s1) + lw t2, 72(s1) + lw t3, 76(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 80(s1) + lw t1, 84(s1) + lw t2, 88(s1) + lw t3, 92(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s1) + lw t1, 100(s1) + lw t2, 104(s1) + lw t3, 108(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 112(s1) + lw t1, 116(s1) + lw t2, 120(s1) + lw t3, 124(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s1) + lw t1, 132(s1) + lw t2, 136(s1) + lw t3, 140(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 144(s1) + lw t1, 148(s1) + lw t2, 152(s1) + lw t3, 156(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 10 + ble s5, t4, L_AES_enc_block_19_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s1) + lw t1, 164(s1) + lw t2, 168(s1) + lw t3, 172(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 176(s1) + lw t1, 180(s1) + lw t2, 184(s1) + lw t3, 188(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + li t4, 12 + ble s5, t4, L_AES_enc_block_19_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s7, 1024 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s1) + lw t1, 196(s1) + lw t2, 200(s1) + lw t3, 204(s1) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s7 + sh2add t1, t1, s7 + sh2add t2, t2, s7 + sh2add t3, t3, s7 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw a0, 0(t2) + lw a1, 0(t3) + addi t4, s7, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 + lw t0, 208(s1) + lw t1, 212(s1) + lw t2, 216(s1) + lw t3, 220(s1) + xor t5, t5, t0 + xor t6, t6, t1 + xor a0, a0, t2 + xor a1, a1, t3 +L_AES_enc_block_19_done: + srliw t0, a0, 6 + srliw t1, a1, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s7 + add t1, t1, s7 + add t2, t2, s7 + add t3, t3, s7 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s7, 1024 + andi t0, a1, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, a0, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, a0, 24 + srliw t3, a1, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s7, t4 + srliw t0, t6, 14 + srliw t1, a0, 14 + srliw t2, a1, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s5, 4 + add t4, s1, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(s0) + sb t1, 4(s0) + sb t2, 8(s0) + sb t3, 12(s0) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(s0) + sb t1, 5(s0) + sb t2, 9(s0) + sb t3, 13(s0) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(s0) + sb t1, 6(s0) + sb t2, 10(s0) + sb t3, 14(s0) + sb a4, 3(s0) + sb a5, 7(s0) + sb a6, 11(s0) + sb a7, 15(s0) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(s0) + sd t3, 8(s0) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv a0, s8 + mv a1, a3 + sd zero, 32(sp) + sd zero, 40(sp) + li t1, 0 +L_AES_GCM_decrypt_RISCV64_partial_byte: + add t2, a0, t1 + lbu t2, 0(t2) + addi t3, sp, 0 + add t3, t3, t1 + lbu t3, 0(t3) + xor t4, t2, t3 + add t5, a1, t1 + sb t4, 0(t5) + addi t5, sp, 32 + add t5, t5, t1 + sb t2, 0(t5) + addi t1, t1, 1 + blt t1, s10, L_AES_GCM_decrypt_RISCV64_partial_byte + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld69_w + ld t0, 0(s11) + j L_ualn_ld69_e +L_ualn_ld69_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld69_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld69_e +L_ualn_ld69_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld69_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld69_e +L_ualn_ld69_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld69_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld70_w + ld t1, 8(s11) + j L_ualn_ld70_e +L_ualn_ld70_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld70_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld70_e +L_ualn_ld70_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld70_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld70_e +L_ualn_ld70_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld70_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult14: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done14 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult14 +L_AES_GCM_gmult_done14: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult14: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done14 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult14 +L_AES_GCM_gmult_done14: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult14: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit14: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip14 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip14: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next14 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next14: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit14 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult14 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ +L_AES_GCM_decrypt_RISCV64_partial_done: + sd zero, 32(sp) + sd zero, 40(sp) + ld t0, 192(sp) + slli t0, t0, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 35(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 36(sp) + sb t2, 37(sp) + sb t3, 38(sp) + sb t0, 39(sp) + slli t0, a2, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 43(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 44(sp) + sb t2, 45(sp) + sb t3, 46(sp) + sb t0, 47(sp) + addi s11, sp, 32 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld71_w + ld t0, 0(s11) + j L_ualn_ld71_e +L_ualn_ld71_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld71_h + lwu t0, 0(s11) + lwu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld71_e +L_ualn_ld71_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld71_b + lhu t0, 0(s11) + lhu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld71_e +L_ualn_ld71_b: + lbu t0, 0(s11) + lbu t4, 1(s11) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s11) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s11) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s11) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s11) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s11) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s11) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld71_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s11) +#else + andi t4, s11, 7 + bnez t4, L_ualn_ld72_w + ld t1, 8(s11) + j L_ualn_ld72_e +L_ualn_ld72_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld72_h + lwu t1, 8(s11) + lwu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld72_e +L_ualn_ld72_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld72_b + lhu t1, 8(s11) + lhu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld72_e +L_ualn_ld72_b: + lbu t1, 8(s11) + lbu t4, 9(s11) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s11) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s11) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s11) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s11) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s11) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s11) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld72_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s3) + ld t3, 8(s3) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s3) + sd t3, 8(s3) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult15: + add t2, s3, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done15 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult15 +L_AES_GCM_gmult_done15: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult15: + add t2, s3, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s2, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done15 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s6, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult15 +L_AES_GCM_gmult_done15: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s3) + ld t1, 8(s3) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult15: + add t0, s2, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit15: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip15 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip15: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next15 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next15: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit15 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult15 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s3) + sd t1, 8(s3) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld t0, 0(s3) + ld t1, 8(s3) + ld t2, 16(sp) + ld t3, 24(sp) + xor t0, t0, t2 + xor t1, t1, t3 + sd t0, 32(sp) + sd t1, 40(sp) + ld a5, 72(sp) + ld a6, 80(sp) + li t2, 0 + li t5, 0 +L_AES_GCM_decrypt_RISCV64_check_tag: + addi t3, sp, 32 + add t3, t3, t2 + lbu t3, 0(t3) + add t4, a5, t2 + lbu t4, 0(t4) + xor t3, t3, t4 + or t5, t5, t3 + addi t2, t2, 1 + blt t2, a6, L_AES_GCM_decrypt_RISCV64_check_tag + negw t5, t5 + sraiw t5, t5, 31 + andi a0, t5, -180 + mv a0, a0 + ld ra, 48(sp) + ld s0, 96(sp) + ld s1, 104(sp) + ld s2, 112(sp) + ld s3, 120(sp) + ld s4, 128(sp) + ld s5, 136(sp) + ld s6, 144(sp) + ld s7, 152(sp) + ld s8, 160(sp) + ld s9, 168(sp) + ld s10, 176(sp) + ld s11, 184(sp) + addi sp, sp, 192 + ret + .size AES_GCM_decrypt_RISCV64,.-AES_GCM_decrypt_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#ifdef WOLFSSL_AESGCM_STREAM + .text + .globl AES_GCM_init_RISCV64 + .type AES_GCM_init_RISCV64,@function + .align 2 +AES_GCM_init_RISCV64: + addi sp, sp, -128 + sd s0, 56(sp) + sd s2, 64(sp) + sd s3, 72(sp) + sd s4, 80(sp) + sd s5, 88(sp) + sd s6, 96(sp) + sd s7, 104(sp) + sd s8, 112(sp) + sd s9, 120(sp) + mv s3, a0 + mv s6, a1 + mv s5, a2 + mv s7, a3 + mv s4, a4 + mv s2, a5 + mv s9, a6 + la s8, L_AES_base_gcm_r + la s0, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 32(sp) + li t0, 12 + bne s7, t0, L_AES_GCM_init_RISCV64_nonce_ghash +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 0(s5) +#else + andi t0, s5, 7 + bnez t0, L_ualn_ld73_w + ld t1, 0(s5) + j L_ualn_ld73_e +L_ualn_ld73_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld73_h + lwu t1, 0(s5) + lwu t0, 4(s5) + slli t0, t0, 32 + or t1, t1, t0 + j L_ualn_ld73_e +L_ualn_ld73_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld73_b + lhu t1, 0(s5) + lhu t0, 2(s5) + slli t0, t0, 16 + or t1, t1, t0 + lhu t0, 4(s5) + slli t0, t0, 32 + or t1, t1, t0 + lhu t0, 6(s5) + slli t0, t0, 48 + or t1, t1, t0 + j L_ualn_ld73_e +L_ualn_ld73_b: + lbu t1, 0(s5) + lbu t0, 1(s5) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 2(s5) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 3(s5) + slli t0, t0, 24 + or t1, t1, t0 + lbu t0, 4(s5) + slli t0, t0, 32 + or t1, t1, t0 + lbu t0, 5(s5) + slli t0, t0, 40 + or t1, t1, t0 + lbu t0, 6(s5) + slli t0, t0, 48 + or t1, t1, t0 + lbu t0, 7(s5) + slli t0, t0, 56 + or t1, t1, t0 +L_ualn_ld73_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t1, 0(s2) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 8(s5) +#else + andi t0, s5, 3 + bnez t0, L_ualn_lw74_h + lw t1, 8(s5) + j L_ualn_lw74_e +L_ualn_lw74_h: + andi t0, t0, 1 + bnez t0, L_ualn_lw74_b + lhu t1, 8(s5) + lhu t0, 10(s5) + slli t0, t0, 16 + or t1, t1, t0 + addiw t1, t1, 0 + j L_ualn_lw74_e +L_ualn_lw74_b: + lbu t1, 8(s5) + lbu t0, 9(s5) + slli t0, t0, 8 + or t1, t1, t0 + lbu t0, 10(s5) + slli t0, t0, 16 + or t1, t1, t0 + lbu t0, 11(s5) + slli t0, t0, 24 + or t1, t1, t0 + addiw t1, t1, 0 +L_ualn_lw74_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 8(s2) + sb zero, 12(s2) + sb zero, 13(s2) + sb zero, 14(s2) + li t1, 1 + sb t1, 15(s2) + j L_AES_GCM_init_RISCV64_counter_done +L_AES_GCM_init_RISCV64_nonce_ghash: + addi s10, sp, 0 + sd zero, 0(s10) + sd zero, 8(s10) + srli s11, s7, 4 +L_AES_GCM_init_RISCV64_nonce_loop: + beqz s11, L_AES_GCM_init_RISCV64_nonce_partial +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_ld75_w + ld t0, 0(s5) + j L_ualn_ld75_e +L_ualn_ld75_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld75_h + lwu t0, 0(s5) + lwu t4, 4(s5) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld75_e +L_ualn_ld75_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld75_b + lhu t0, 0(s5) + lhu t4, 2(s5) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s5) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s5) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld75_e +L_ualn_ld75_b: + lbu t0, 0(s5) + lbu t4, 1(s5) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s5) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s5) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s5) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s5) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s5) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s5) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld75_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_ld76_w + ld t1, 8(s5) + j L_ualn_ld76_e +L_ualn_ld76_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld76_h + lwu t1, 8(s5) + lwu t4, 12(s5) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld76_e +L_ualn_ld76_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld76_b + lhu t1, 8(s5) + lhu t4, 10(s5) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s5) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s5) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld76_e +L_ualn_ld76_b: + lbu t1, 8(s5) + lbu t4, 9(s5) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s5) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s5) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s5) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s5) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s5) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s5) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld76_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s10) + ld t3, 8(s10) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s10) + sd t3, 8(s10) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult16: + add t2, s10, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done16 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult16 +L_AES_GCM_gmult_done16: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult16: + add t2, s10, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done16 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult16 +L_AES_GCM_gmult_done16: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s10) + ld t1, 8(s10) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult16: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit16: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip16 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip16: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next16 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next16: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit16 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult16 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s5, s5, 16 + addi s11, s11, -1 + j L_AES_GCM_init_RISCV64_nonce_loop +L_AES_GCM_init_RISCV64_nonce_partial: + andi s11, s7, 15 + beqz s11, L_AES_GCM_init_RISCV64_nonce_len + addi a0, sp, 16 + sd zero, 0(a0) + sd zero, 8(a0) + li t1, 0 +L_AES_GCM_init_RISCV64_nonce_byte: + add t2, s5, t1 + lbu t2, 0(t2) + addi t3, sp, 16 + add t3, t3, t1 + sb t2, 0(t3) + addi t1, t1, 1 + blt t1, s11, L_AES_GCM_init_RISCV64_nonce_byte + addi a0, sp, 16 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld77_w + ld t0, 0(a0) + j L_ualn_ld77_e +L_ualn_ld77_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld77_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld77_e +L_ualn_ld77_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld77_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld77_e +L_ualn_ld77_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld77_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld78_w + ld t1, 8(a0) + j L_ualn_ld78_e +L_ualn_ld78_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld78_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld78_e +L_ualn_ld78_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld78_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld78_e +L_ualn_ld78_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld78_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s10) + ld t3, 8(s10) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s10) + sd t3, 8(s10) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult17: + add t2, s10, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done17 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult17 +L_AES_GCM_gmult_done17: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult17: + add t2, s10, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done17 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult17 +L_AES_GCM_gmult_done17: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s10) + ld t1, 8(s10) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult17: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit17: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip17 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip17: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next17 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next17: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit17 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult17 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ +L_AES_GCM_init_RISCV64_nonce_len: + addi a0, sp, 16 + sd zero, 0(a0) + sd zero, 8(a0) + slli t0, s7, 3 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 28(sp) + sb t2, 29(sp) + sb t3, 30(sp) + sb t0, 31(sp) + addi a0, sp, 16 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld79_w + ld t0, 0(a0) + j L_ualn_ld79_e +L_ualn_ld79_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld79_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld79_e +L_ualn_ld79_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld79_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld79_e +L_ualn_ld79_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld79_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld80_w + ld t1, 8(a0) + j L_ualn_ld80_e +L_ualn_ld80_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld80_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld80_e +L_ualn_ld80_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld80_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld80_e +L_ualn_ld80_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld80_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s10) + ld t3, 8(s10) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s10) + sd t3, 8(s10) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult18: + add t2, s10, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done18 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult18 +L_AES_GCM_gmult_done18: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult18: + add t2, s10, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done18 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult18 +L_AES_GCM_gmult_done18: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s10) + ld t1, 8(s10) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult18: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit18: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip18 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip18: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next18 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next18: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit18 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult18 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s10) + sd t1, 8(s10) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld t0, 0(s10) + sd t0, 0(s2) + ld t0, 8(s10) + sd t0, 8(s2) +L_AES_GCM_init_RISCV64_counter_done: + addi a1, sp, 16 + mv a2, s1 + mv a3, s2 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s2) + lbu t1, 4(s2) + lbu t2, 8(s2) + lbu t3, 12(s2) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s2) + or t0, t0, t4 + lbu t5, 5(s2) + or t1, t1, t5 + lbu t6, 9(s2) + or t2, t2, t6 + lbu t4, 13(s2) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s2) + or t0, t0, t4 + lbu t5, 6(s2) + or t1, t1, t5 + lbu t6, 10(s2) + or t2, t2, t6 + lbu t4, 14(s2) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s2) + or t0, t0, t4 + lbu t5, 7(s2) + or t1, t1, t5 + lbu t6, 11(s2) + or t2, t2, t6 + lbu t4, 15(s2) + or t3, t3, t4 +#else + ld t1, 0(s2) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s2) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s3) + lw a5, 4(s3) + lw a6, 8(s3) + lw a7, 12(s3) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 16(s3) + lw t1, 20(s3) + lw t2, 24(s3) + lw t3, 28(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s3) + lw t1, 36(s3) + lw t2, 40(s3) + lw t3, 44(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 48(s3) + lw t1, 52(s3) + lw t2, 56(s3) + lw t3, 60(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s3) + lw t1, 68(s3) + lw t2, 72(s3) + lw t3, 76(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 80(s3) + lw t1, 84(s3) + lw t2, 88(s3) + lw t3, 92(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s3) + lw t1, 100(s3) + lw t2, 104(s3) + lw t3, 108(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 112(s3) + lw t1, 116(s3) + lw t2, 120(s3) + lw t3, 124(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s3) + lw t1, 132(s3) + lw t2, 136(s3) + lw t3, 140(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 144(s3) + lw t1, 148(s3) + lw t2, 152(s3) + lw t3, 156(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 10 + ble s6, t4, L_AES_enc_block_20_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s3) + lw t1, 164(s3) + lw t2, 168(s3) + lw t3, 172(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 176(s3) + lw t1, 180(s3) + lw t2, 184(s3) + lw t3, 188(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 12 + ble s6, t4, L_AES_enc_block_20_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s3) + lw t1, 196(s3) + lw t2, 200(s3) + lw t3, 204(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 208(s3) + lw t1, 212(s3) + lw t2, 216(s3) + lw t3, 220(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 +L_AES_enc_block_20_done: + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s0, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s0, t4 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s6, 4 + add t4, s3, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(a1) + sb t1, 4(a1) + sb t2, 8(a1) + sb t3, 12(a1) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(a1) + sb t1, 5(a1) + sb t2, 9(a1) + sb t3, 13(a1) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(a1) + sb t1, 6(a1) + sb t2, 10(a1) + sb t3, 14(a1) + sb a4, 3(a1) + sb a5, 7(a1) + sb a6, 11(a1) + sb a7, 15(a1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(a1) + sd t3, 8(a1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv s1, a2 + mv s2, a3 + addi a1, sp, 16 + ld t0, 0(a1) + sd t0, 0(s9) + ld t0, 8(a1) + sd t0, 8(s9) + ld ra, 32(sp) + ld s0, 56(sp) + ld s2, 64(sp) + ld s3, 72(sp) + ld s4, 80(sp) + ld s5, 88(sp) + ld s6, 96(sp) + ld s7, 104(sp) + ld s8, 112(sp) + ld s9, 120(sp) + addi sp, sp, 128 + ret + .size AES_GCM_init_RISCV64,.-AES_GCM_init_RISCV64 + .text + .globl AES_GCM_ghash_block_RISCV64 + .type AES_GCM_ghash_block_RISCV64,@function + .align 2 +AES_GCM_ghash_block_RISCV64: + addi sp, sp, -32 + sd s2, 8(sp) + sd s4, 16(sp) + sd s8, 24(sp) + mv s2, a1 + mv s4, a2 + la s8, L_AES_base_gcm_r +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld81_w + ld t0, 0(a0) + j L_ualn_ld81_e +L_ualn_ld81_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld81_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld81_e +L_ualn_ld81_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld81_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld81_e +L_ualn_ld81_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld81_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld82_w + ld t1, 8(a0) + j L_ualn_ld82_e +L_ualn_ld82_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld82_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld82_e +L_ualn_ld82_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld82_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld82_e +L_ualn_ld82_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld82_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s2) + sd t3, 8(s2) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult19: + add t2, s2, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done19 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult19 +L_AES_GCM_gmult_done19: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult19: + add t2, s2, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done19 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult19 +L_AES_GCM_gmult_done19: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s2) + ld t1, 8(s2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult19: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit19: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip19 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip19: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next19 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next19: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit19 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult19 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld s2, 8(sp) + ld s4, 16(sp) + ld s8, 24(sp) + addi sp, sp, 32 + ret + .size AES_GCM_ghash_block_RISCV64,.-AES_GCM_ghash_block_RISCV64 + .text + .globl AES_GCM_aad_update_RISCV64 + .type AES_GCM_aad_update_RISCV64,@function + .align 2 +AES_GCM_aad_update_RISCV64: + addi sp, sp, -48 + sd s2, 0(sp) + sd s4, 8(sp) + sd s5, 16(sp) + sd s8, 24(sp) + sd s9, 32(sp) + sd s10, 40(sp) + mv s5, a0 + mv s9, a1 + mv s2, a2 + mv s4, a3 + la s8, L_AES_base_gcm_r + srli s10, s9, 4 + beqz s10, L_AES_GCM_aad_update_RISCV64_done +L_AES_GCM_aad_update_RISCV64_loop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_ld83_w + ld t0, 0(s5) + j L_ualn_ld83_e +L_ualn_ld83_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld83_h + lwu t0, 0(s5) + lwu t4, 4(s5) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld83_e +L_ualn_ld83_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld83_b + lhu t0, 0(s5) + lhu t4, 2(s5) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s5) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s5) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld83_e +L_ualn_ld83_b: + lbu t0, 0(s5) + lbu t4, 1(s5) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s5) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s5) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s5) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s5) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s5) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s5) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld83_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_ld84_w + ld t1, 8(s5) + j L_ualn_ld84_e +L_ualn_ld84_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld84_h + lwu t1, 8(s5) + lwu t4, 12(s5) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld84_e +L_ualn_ld84_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld84_b + lhu t1, 8(s5) + lhu t4, 10(s5) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s5) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s5) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld84_e +L_ualn_ld84_b: + lbu t1, 8(s5) + lbu t4, 9(s5) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s5) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s5) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s5) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s5) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s5) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s5) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld84_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s2) + sd t3, 8(s2) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult20: + add t2, s2, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done20 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult20 +L_AES_GCM_gmult_done20: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult20: + add t2, s2, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done20 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult20 +L_AES_GCM_gmult_done20: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s2) + ld t1, 8(s2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult20: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit20: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip20 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip20: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next20 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next20: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit20 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult20 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s5, s5, 16 + addi s10, s10, -1 + bnez s10, L_AES_GCM_aad_update_RISCV64_loop +L_AES_GCM_aad_update_RISCV64_done: + ld s2, 0(sp) + ld s4, 8(sp) + ld s5, 16(sp) + ld s8, 24(sp) + ld s9, 32(sp) + ld s10, 40(sp) + addi sp, sp, 48 + ret + .size AES_GCM_aad_update_RISCV64,.-AES_GCM_aad_update_RISCV64 + .text + .globl AES_GCM_encrypt_block_RISCV64 + .type AES_GCM_encrypt_block_RISCV64,@function + .align 2 +AES_GCM_encrypt_block_RISCV64: + addi sp, sp, -96 + sd s0, 48(sp) + sd s2, 56(sp) + sd s3, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + mv s3, a0 + mv s6, a1 + mv s5, a2 + mv s7, a3 + mv s2, a4 + la s0, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 32(sp) +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + lwu t0, 12(s2) + # rev8 t0, t0 + .word 0x6b82d293 + srli t0, t0, 32 + addi t0, t0, 1 + slli t0, t0, 32 + # rev8 t0, t0 + .word 0x6b82d293 + sw t0, 12(s2) +#else + lbu t0, 12(s2) + lbu t1, 13(s2) + lbu t2, 14(s2) + lbu t3, 15(s2) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s2) + sb t2, 13(s2) + sb t3, 14(s2) + sb t0, 15(s2) +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + addi a1, sp, 16 + mv a2, s1 + mv a3, s2 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s2) + lbu t1, 4(s2) + lbu t2, 8(s2) + lbu t3, 12(s2) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s2) + or t0, t0, t4 + lbu t5, 5(s2) + or t1, t1, t5 + lbu t6, 9(s2) + or t2, t2, t6 + lbu t4, 13(s2) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s2) + or t0, t0, t4 + lbu t5, 6(s2) + or t1, t1, t5 + lbu t6, 10(s2) + or t2, t2, t6 + lbu t4, 14(s2) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s2) + or t0, t0, t4 + lbu t5, 7(s2) + or t1, t1, t5 + lbu t6, 11(s2) + or t2, t2, t6 + lbu t4, 15(s2) + or t3, t3, t4 +#else + ld t1, 0(s2) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s2) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s3) + lw a5, 4(s3) + lw a6, 8(s3) + lw a7, 12(s3) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 16(s3) + lw t1, 20(s3) + lw t2, 24(s3) + lw t3, 28(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s3) + lw t1, 36(s3) + lw t2, 40(s3) + lw t3, 44(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 48(s3) + lw t1, 52(s3) + lw t2, 56(s3) + lw t3, 60(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s3) + lw t1, 68(s3) + lw t2, 72(s3) + lw t3, 76(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 80(s3) + lw t1, 84(s3) + lw t2, 88(s3) + lw t3, 92(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s3) + lw t1, 100(s3) + lw t2, 104(s3) + lw t3, 108(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 112(s3) + lw t1, 116(s3) + lw t2, 120(s3) + lw t3, 124(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s3) + lw t1, 132(s3) + lw t2, 136(s3) + lw t3, 140(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 144(s3) + lw t1, 148(s3) + lw t2, 152(s3) + lw t3, 156(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 10 + ble s6, t4, L_AES_enc_block_21_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s3) + lw t1, 164(s3) + lw t2, 168(s3) + lw t3, 172(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 176(s3) + lw t1, 180(s3) + lw t2, 184(s3) + lw t3, 188(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 12 + ble s6, t4, L_AES_enc_block_21_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s3) + lw t1, 196(s3) + lw t2, 200(s3) + lw t3, 204(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 208(s3) + lw t1, 212(s3) + lw t2, 216(s3) + lw t3, 220(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 +L_AES_enc_block_21_done: + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s0, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s0, t4 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s6, 4 + add t4, s3, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(a1) + sb t1, 4(a1) + sb t2, 8(a1) + sb t3, 12(a1) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(a1) + sb t1, 5(a1) + sb t2, 9(a1) + sb t3, 13(a1) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(a1) + sb t1, 6(a1) + sb t2, 10(a1) + sb t3, 14(a1) + sb a4, 3(a1) + sb a5, 7(a1) + sb a6, 11(a1) + sb a7, 15(a1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(a1) + sd t3, 8(a1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv s1, a2 + mv s2, a3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld85_w + ld t0, 0(s7) + j L_ualn_ld85_e +L_ualn_ld85_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld85_h + lwu t0, 0(s7) + lwu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld85_e +L_ualn_ld85_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld85_b + lhu t0, 0(s7) + lhu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld85_e +L_ualn_ld85_b: + lbu t0, 0(s7) + lbu t4, 1(s7) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s7) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s7) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s7) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld85_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld86_w + ld t1, 8(s7) + j L_ualn_ld86_e +L_ualn_ld86_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld86_h + lwu t1, 8(s7) + lwu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld86_e +L_ualn_ld86_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld86_b + lhu t1, 8(s7) + lhu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld86_e +L_ualn_ld86_b: + lbu t1, 8(s7) + lbu t4, 9(s7) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s7) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s7) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s7) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld86_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 16(sp) + ld t3, 24(sp) + xor t0, t0, t2 + xor t1, t1, t3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t0, 0(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_sd87_w + sd t0, 0(s5) + j L_ualn_sd87_e +L_ualn_sd87_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd87_h + sw t0, 0(s5) + srli t4, t0, 32 + sw t4, 4(s5) + j L_ualn_sd87_e +L_ualn_sd87_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd87_b + sh t0, 0(s5) + srli t4, t0, 16 + sh t4, 2(s5) + srli t4, t0, 32 + sh t4, 4(s5) + srli t4, t0, 48 + sh t4, 6(s5) + j L_ualn_sd87_e +L_ualn_sd87_b: + sb t0, 0(s5) + srli t4, t0, 8 + sb t4, 1(s5) + srli t4, t0, 16 + sb t4, 2(s5) + srli t4, t0, 24 + sb t4, 3(s5) + srli t4, t0, 32 + sb t4, 4(s5) + srli t4, t0, 40 + sb t4, 5(s5) + srli t4, t0, 48 + sb t4, 6(s5) + srli t4, t0, 56 + sb t4, 7(s5) +L_ualn_sd87_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t1, 8(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_sd88_w + sd t1, 8(s5) + j L_ualn_sd88_e +L_ualn_sd88_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd88_h + sw t1, 8(s5) + srli t4, t1, 32 + sw t4, 12(s5) + j L_ualn_sd88_e +L_ualn_sd88_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd88_b + sh t1, 8(s5) + srli t4, t1, 16 + sh t4, 10(s5) + srli t4, t1, 32 + sh t4, 12(s5) + srli t4, t1, 48 + sh t4, 14(s5) + j L_ualn_sd88_e +L_ualn_sd88_b: + sb t1, 8(s5) + srli t4, t1, 8 + sb t4, 9(s5) + srli t4, t1, 16 + sb t4, 10(s5) + srli t4, t1, 24 + sb t4, 11(s5) + srli t4, t1, 32 + sb t4, 12(s5) + srli t4, t1, 40 + sb t4, 13(s5) + srli t4, t1, 48 + sb t4, 14(s5) + srli t4, t1, 56 + sb t4, 15(s5) +L_ualn_sd88_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld ra, 32(sp) + ld s0, 48(sp) + ld s2, 56(sp) + ld s3, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + addi sp, sp, 96 + ret + .size AES_GCM_encrypt_block_RISCV64,.-AES_GCM_encrypt_block_RISCV64 + .text + .globl AES_GCM_encrypt_update_RISCV64 + .type AES_GCM_encrypt_update_RISCV64,@function + .align 2 +AES_GCM_encrypt_update_RISCV64: + addi sp, sp, -144 + sd s0, 56(sp) + sd s1, 64(sp) + sd s2, 72(sp) + sd s3, 80(sp) + sd s4, 88(sp) + sd s5, 96(sp) + sd s6, 104(sp) + sd s7, 112(sp) + sd s8, 120(sp) + sd s9, 128(sp) + sd s10, 136(sp) + mv s3, a0 + mv s6, a1 + mv s5, a2 + mv s7, a3 + mv s9, a4 + mv s2, a5 + mv s4, a6 + mv s1, a7 + la s8, L_AES_base_gcm_r + la s0, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 32(sp) + srli s10, s9, 4 + beqz s10, L_AES_GCM_encrypt_update_RISCV64_done +L_AES_GCM_encrypt_update_RISCV64_loop: +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + lwu t0, 12(s1) + # rev8 t0, t0 + .word 0x6b82d293 + srli t0, t0, 32 + addi t0, t0, 1 + slli t0, t0, 32 + # rev8 t0, t0 + .word 0x6b82d293 + sw t0, 12(s1) +#else + lbu t0, 12(s1) + lbu t1, 13(s1) + lbu t2, 14(s1) + lbu t3, 15(s1) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s1) + sb t2, 13(s1) + sb t3, 14(s1) + sb t0, 15(s1) +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + addi a1, sp, 16 + mv a2, s1 + mv a3, s2 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s1) + lbu t1, 4(s1) + lbu t2, 8(s1) + lbu t3, 12(s1) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s1) + or t0, t0, t4 + lbu t5, 5(s1) + or t1, t1, t5 + lbu t6, 9(s1) + or t2, t2, t6 + lbu t4, 13(s1) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s1) + or t0, t0, t4 + lbu t5, 6(s1) + or t1, t1, t5 + lbu t6, 10(s1) + or t2, t2, t6 + lbu t4, 14(s1) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s1) + or t0, t0, t4 + lbu t5, 7(s1) + or t1, t1, t5 + lbu t6, 11(s1) + or t2, t2, t6 + lbu t4, 15(s1) + or t3, t3, t4 +#else + ld t1, 0(s1) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s1) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s3) + lw a5, 4(s3) + lw a6, 8(s3) + lw a7, 12(s3) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 16(s3) + lw t1, 20(s3) + lw t2, 24(s3) + lw t3, 28(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s3) + lw t1, 36(s3) + lw t2, 40(s3) + lw t3, 44(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 48(s3) + lw t1, 52(s3) + lw t2, 56(s3) + lw t3, 60(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s3) + lw t1, 68(s3) + lw t2, 72(s3) + lw t3, 76(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 80(s3) + lw t1, 84(s3) + lw t2, 88(s3) + lw t3, 92(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s3) + lw t1, 100(s3) + lw t2, 104(s3) + lw t3, 108(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 112(s3) + lw t1, 116(s3) + lw t2, 120(s3) + lw t3, 124(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s3) + lw t1, 132(s3) + lw t2, 136(s3) + lw t3, 140(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 144(s3) + lw t1, 148(s3) + lw t2, 152(s3) + lw t3, 156(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 10 + ble s6, t4, L_AES_enc_block_22_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s3) + lw t1, 164(s3) + lw t2, 168(s3) + lw t3, 172(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 176(s3) + lw t1, 180(s3) + lw t2, 184(s3) + lw t3, 188(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 12 + ble s6, t4, L_AES_enc_block_22_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s3) + lw t1, 196(s3) + lw t2, 200(s3) + lw t3, 204(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 208(s3) + lw t1, 212(s3) + lw t2, 216(s3) + lw t3, 220(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 +L_AES_enc_block_22_done: + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s0, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s0, t4 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s6, 4 + add t4, s3, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(a1) + sb t1, 4(a1) + sb t2, 8(a1) + sb t3, 12(a1) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(a1) + sb t1, 5(a1) + sb t2, 9(a1) + sb t3, 13(a1) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(a1) + sb t1, 6(a1) + sb t2, 10(a1) + sb t3, 14(a1) + sb a4, 3(a1) + sb a5, 7(a1) + sb a6, 11(a1) + sb a7, 15(a1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(a1) + sd t3, 8(a1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv s1, a2 + mv s2, a3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld89_w + ld t0, 0(s7) + j L_ualn_ld89_e +L_ualn_ld89_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld89_h + lwu t0, 0(s7) + lwu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld89_e +L_ualn_ld89_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld89_b + lhu t0, 0(s7) + lhu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld89_e +L_ualn_ld89_b: + lbu t0, 0(s7) + lbu t4, 1(s7) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s7) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s7) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s7) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld89_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld90_w + ld t1, 8(s7) + j L_ualn_ld90_e +L_ualn_ld90_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld90_h + lwu t1, 8(s7) + lwu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld90_e +L_ualn_ld90_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld90_b + lhu t1, 8(s7) + lhu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld90_e +L_ualn_ld90_b: + lbu t1, 8(s7) + lbu t4, 9(s7) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s7) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s7) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s7) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld90_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 16(sp) + ld t3, 24(sp) + xor t0, t0, t2 + xor t1, t1, t3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t0, 0(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_sd91_w + sd t0, 0(s5) + j L_ualn_sd91_e +L_ualn_sd91_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd91_h + sw t0, 0(s5) + srli t4, t0, 32 + sw t4, 4(s5) + j L_ualn_sd91_e +L_ualn_sd91_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd91_b + sh t0, 0(s5) + srli t4, t0, 16 + sh t4, 2(s5) + srli t4, t0, 32 + sh t4, 4(s5) + srli t4, t0, 48 + sh t4, 6(s5) + j L_ualn_sd91_e +L_ualn_sd91_b: + sb t0, 0(s5) + srli t4, t0, 8 + sb t4, 1(s5) + srli t4, t0, 16 + sb t4, 2(s5) + srli t4, t0, 24 + sb t4, 3(s5) + srli t4, t0, 32 + sb t4, 4(s5) + srli t4, t0, 40 + sb t4, 5(s5) + srli t4, t0, 48 + sb t4, 6(s5) + srli t4, t0, 56 + sb t4, 7(s5) +L_ualn_sd91_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t1, 8(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_sd92_w + sd t1, 8(s5) + j L_ualn_sd92_e +L_ualn_sd92_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd92_h + sw t1, 8(s5) + srli t4, t1, 32 + sw t4, 12(s5) + j L_ualn_sd92_e +L_ualn_sd92_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd92_b + sh t1, 8(s5) + srli t4, t1, 16 + sh t4, 10(s5) + srli t4, t1, 32 + sh t4, 12(s5) + srli t4, t1, 48 + sh t4, 14(s5) + j L_ualn_sd92_e +L_ualn_sd92_b: + sb t1, 8(s5) + srli t4, t1, 8 + sb t4, 9(s5) + srli t4, t1, 16 + sb t4, 10(s5) + srli t4, t1, 24 + sb t4, 11(s5) + srli t4, t1, 32 + sb t4, 12(s5) + srli t4, t1, 40 + sb t4, 13(s5) + srli t4, t1, 48 + sb t4, 14(s5) + srli t4, t1, 56 + sb t4, 15(s5) +L_ualn_sd92_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a1, sp, 16 + sd t0, 0(a1) + sd t1, 8(a1) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_ld93_w + ld t0, 0(a1) + j L_ualn_ld93_e +L_ualn_ld93_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld93_h + lwu t0, 0(a1) + lwu t4, 4(a1) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld93_e +L_ualn_ld93_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld93_b + lhu t0, 0(a1) + lhu t4, 2(a1) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a1) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a1) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld93_e +L_ualn_ld93_b: + lbu t0, 0(a1) + lbu t4, 1(a1) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a1) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a1) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a1) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a1) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a1) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a1) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld93_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a1) +#else + andi t4, a1, 7 + bnez t4, L_ualn_ld94_w + ld t1, 8(a1) + j L_ualn_ld94_e +L_ualn_ld94_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld94_h + lwu t1, 8(a1) + lwu t4, 12(a1) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld94_e +L_ualn_ld94_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld94_b + lhu t1, 8(a1) + lhu t4, 10(a1) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a1) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a1) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld94_e +L_ualn_ld94_b: + lbu t1, 8(a1) + lbu t4, 9(a1) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a1) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a1) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a1) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a1) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a1) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a1) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld94_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s2) + sd t3, 8(s2) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult21: + add t2, s2, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done21 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult21 +L_AES_GCM_gmult_done21: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult21: + add t2, s2, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done21 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult21 +L_AES_GCM_gmult_done21: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s2) + ld t1, 8(s2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult21: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit21: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip21 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip21: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next21 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next21: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit21 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult21 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s7, s7, 16 + addi s5, s5, 16 + addi s10, s10, -1 + bnez s10, L_AES_GCM_encrypt_update_RISCV64_loop +L_AES_GCM_encrypt_update_RISCV64_done: + ld ra, 32(sp) + ld s0, 56(sp) + ld s1, 64(sp) + ld s2, 72(sp) + ld s3, 80(sp) + ld s4, 88(sp) + ld s5, 96(sp) + ld s6, 104(sp) + ld s7, 112(sp) + ld s8, 120(sp) + ld s9, 128(sp) + ld s10, 136(sp) + addi sp, sp, 144 + ret + .size AES_GCM_encrypt_update_RISCV64,.-AES_GCM_encrypt_update_RISCV64 + .text + .globl AES_GCM_encrypt_final_RISCV64 + .type AES_GCM_encrypt_final_RISCV64,@function + .align 2 +AES_GCM_encrypt_final_RISCV64: + addi sp, sp, -80 + sd s1, 16(sp) + sd s2, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + mv s2, a0 + mv s5, a1 + mv s6, a2 + mv s9, a3 + mv s1, a4 + mv s4, a5 + mv s7, a6 + la s8, L_AES_base_gcm_r + sd zero, 0(sp) + sd zero, 8(sp) + slli t0, s1, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 3(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 4(sp) + sb t2, 5(sp) + sb t3, 6(sp) + sb t0, 7(sp) + slli t0, s9, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 11(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(sp) + sb t2, 13(sp) + sb t3, 14(sp) + sb t0, 15(sp) + addi a0, sp, 0 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld95_w + ld t0, 0(a0) + j L_ualn_ld95_e +L_ualn_ld95_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld95_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld95_e +L_ualn_ld95_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld95_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld95_e +L_ualn_ld95_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld95_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld96_w + ld t1, 8(a0) + j L_ualn_ld96_e +L_ualn_ld96_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld96_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld96_e +L_ualn_ld96_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld96_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld96_e +L_ualn_ld96_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld96_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s2) + sd t3, 8(s2) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult22: + add t2, s2, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done22 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult22 +L_AES_GCM_gmult_done22: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult22: + add t2, s2, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done22 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult22 +L_AES_GCM_gmult_done22: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s2) + ld t1, 8(s2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult22: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit22: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip22 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip22: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next22 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next22: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit22 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult22 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld t0, 0(s2) + ld t1, 8(s2) + ld t2, 0(s7) + ld t3, 8(s7) + xor t0, t0, t2 + xor t1, t1, t3 + sd t0, 0(s2) + sd t1, 8(s2) + li t2, 0 +L_AES_GCM_encrypt_final_RISCV64_store_tag: + add t3, s2, t2 + lbu t3, 0(t3) + add t4, s5, t2 + sb t3, 0(t4) + addi t2, t2, 1 + blt t2, s6, L_AES_GCM_encrypt_final_RISCV64_store_tag + ld s1, 16(sp) + ld s2, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + addi sp, sp, 80 + ret + .size AES_GCM_encrypt_final_RISCV64,.-AES_GCM_encrypt_final_RISCV64 +#ifdef HAVE_AES_DECRYPT + .text + .globl AES_GCM_decrypt_update_RISCV64 + .type AES_GCM_decrypt_update_RISCV64,@function + .align 2 +AES_GCM_decrypt_update_RISCV64: + addi sp, sp, -144 + sd s0, 56(sp) + sd s1, 64(sp) + sd s2, 72(sp) + sd s3, 80(sp) + sd s4, 88(sp) + sd s5, 96(sp) + sd s6, 104(sp) + sd s7, 112(sp) + sd s8, 120(sp) + sd s9, 128(sp) + sd s10, 136(sp) + mv s3, a0 + mv s6, a1 + mv s5, a2 + mv s7, a3 + mv s9, a4 + mv s2, a5 + mv s4, a6 + mv s1, a7 + la s8, L_AES_base_gcm_r + la s0, L_AES_base_te +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + .option arch, +zba +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + sd ra, 32(sp) + srli s10, s9, 4 + beqz s10, L_AES_GCM_decrypt_update_RISCV64_done +L_AES_GCM_decrypt_update_RISCV64_loop: +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + lwu t0, 12(s1) + # rev8 t0, t0 + .word 0x6b82d293 + srli t0, t0, 32 + addi t0, t0, 1 + slli t0, t0, 32 + # rev8 t0, t0 + .word 0x6b82d293 + sw t0, 12(s1) +#else + lbu t0, 12(s1) + lbu t1, 13(s1) + lbu t2, 14(s1) + lbu t3, 15(s1) + slli t0, t0, 24 + slli t1, t1, 16 + slli t2, t2, 8 + or t0, t0, t1 + or t0, t0, t2 + or t0, t0, t3 + addi t0, t0, 1 + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(s1) + sb t2, 13(s1) + sb t3, 14(s1) + sb t0, 15(s1) +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + addi a1, sp, 16 + mv a2, s1 + mv a3, s2 + # Load input block (big endian) and AddRoundKey +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu t0, 0(s1) + lbu t1, 4(s1) + lbu t2, 8(s1) + lbu t3, 12(s1) + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 1(s1) + or t0, t0, t4 + lbu t5, 5(s1) + or t1, t1, t5 + lbu t6, 9(s1) + or t2, t2, t6 + lbu t4, 13(s1) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 2(s1) + or t0, t0, t4 + lbu t5, 6(s1) + or t1, t1, t5 + lbu t6, 10(s1) + or t2, t2, t6 + lbu t4, 14(s1) + or t3, t3, t4 + slli t0, t0, 8 + slli t1, t1, 8 + slli t2, t2, 8 + slli t3, t3, 8 + lbu t4, 3(s1) + or t0, t0, t4 + lbu t5, 7(s1) + or t1, t1, t5 + lbu t6, 11(s1) + or t2, t2, t6 + lbu t4, 15(s1) + or t3, t3, t4 +#else + ld t1, 0(s1) + # rev8 t1, t1 + .word 0x6b835313 + srli t0, t1, 32 + ld t3, 8(s1) + # rev8 t3, t3 + .word 0x6b8e5e13 + srli t2, t3, 32 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw a4, 0(s3) + lw a5, 4(s3) + lw a6, 8(s3) + lw a7, 12(s3) + xor a4, t0, a4 + xor a5, t1, a5 + xor a6, t2, a6 + xor a7, t3, a7 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 16(s3) + lw t1, 20(s3) + lw t2, 24(s3) + lw t3, 28(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 32(s3) + lw t1, 36(s3) + lw t2, 40(s3) + lw t3, 44(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 48(s3) + lw t1, 52(s3) + lw t2, 56(s3) + lw t3, 60(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 64(s3) + lw t1, 68(s3) + lw t2, 72(s3) + lw t3, 76(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 80(s3) + lw t1, 84(s3) + lw t2, 88(s3) + lw t3, 92(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 96(s3) + lw t1, 100(s3) + lw t2, 104(s3) + lw t3, 108(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 112(s3) + lw t1, 116(s3) + lw t2, 120(s3) + lw t3, 124(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 128(s3) + lw t1, 132(s3) + lw t2, 136(s3) + lw t3, 140(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 144(s3) + lw t1, 148(s3) + lw t2, 152(s3) + lw t3, 156(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 10 + ble s6, t4, L_AES_enc_block_23_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 160(s3) + lw t1, 164(s3) + lw t2, 168(s3) + lw t3, 172(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 176(s3) + lw t1, 180(s3) + lw t2, 184(s3) + lw t3, 188(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + li t4, 12 + ble s6, t4, L_AES_enc_block_23_done + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + addi t4, s0, 1024 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + addi t4, t4, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + lw t0, 192(s3) + lw t1, 196(s3) + lw t2, 200(s3) + lw t3, 204(s3) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + srliw t0, a4, 24 + srliw t1, a5, 24 + srliw t2, a6, 24 + srliw t3, a7, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, s0 + sh2add t1, t1, s0 + sh2add t2, t2, s0 + sh2add t3, t3, s0 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t5, 0(t0) + lw t6, 0(t1) + lw s1, 0(t2) + lw s2, 0(t3) + addi t4, s0, 1024 + srliw t0, a5, 14 + srliw t1, a6, 14 + srliw t2, a7, 14 + srliw t3, a4, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + srliw t0, a6, 6 + srliw t1, a7, 6 + srliw t2, a4, 6 + srliw t3, a5, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + addi t4, t4, 1024 + andi t0, a7, 255 + andi t1, a4, 255 + andi t2, a5, 255 + andi t3, a6, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slliw t0, t0, 2 + slliw t1, t1, 2 + slliw t2, t2, 2 + slliw t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 + lw t0, 208(s3) + lw t1, 212(s3) + lw t2, 216(s3) + lw t3, 220(s3) + xor t5, t5, t0 + xor t6, t6, t1 + xor s1, s1, t2 + xor s2, s2, t3 +L_AES_enc_block_23_done: + srliw t0, s1, 6 + srliw t1, s2, 6 + srliw t2, t5, 6 + srliw t3, t6, 6 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, s0 + add t1, t1, s0 + add t2, t2, s0 + add t3, t3, s0 + lw a4, 0(t0) + lw a5, 0(t1) + lw a6, 0(t2) + lw a7, 0(t3) + li t4, 65280 + and a4, a4, t4 + and a5, a5, t4 + and a6, a6, t4 + and a7, a7, t4 + addi t4, s0, 1024 + andi t0, s2, 255 + andi t1, t5, 255 + andi t2, t6, 255 + andi t3, s1, 255 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lbu t0, 0(t0) + lbu t1, 0(t1) + lbu t2, 0(t2) + lbu t3, 0(t3) + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + addi t4, t4, 1024 + srliw t0, t5, 24 + srliw t1, t6, 24 + srliw t2, s1, 24 + srliw t3, s2, 24 +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + sh2add t0, t0, t4 + sh2add t1, t1, t4 + sh2add t2, t2, t4 + sh2add t3, t3, t4 +#else + slli t0, t0, 2 + slli t1, t1, 2 + slli t2, t2, 2 + slli t3, t3, 2 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 4278190080 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + li t4, 3072 + add t4, s0, t4 + srliw t0, t6, 14 + srliw t1, s1, 14 + srliw t2, s2, 14 + srliw t3, t5, 14 + andi t0, t0, 1020 + andi t1, t1, 1020 + andi t2, t2, 1020 + andi t3, t3, 1020 + add t0, t0, t4 + add t1, t1, t4 + add t2, t2, t4 + add t3, t3, t4 + lw t0, 0(t0) + lw t1, 0(t1) + lw t2, 0(t2) + lw t3, 0(t3) + li t4, 16711680 + and t0, t0, t4 + and t1, t1, t4 + and t2, t2, t4 + and t3, t3, t4 + or a4, a4, t0 + or a5, a5, t1 + or a6, a6, t2 + or a7, a7, t3 + slli t4, s6, 4 + add t4, s3, t4 + lw t0, 0(t4) + lw t1, 4(t4) + lw t2, 8(t4) + lw t3, 12(t4) + xor a4, a4, t0 + xor a5, a5, t1 + xor a6, a6, t2 + xor a7, a7, t3 + # Store output block (big endian) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + srli t0, a4, 24 + srli t1, a5, 24 + srli t2, a6, 24 + srli t3, a7, 24 + sb t0, 0(a1) + sb t1, 4(a1) + sb t2, 8(a1) + sb t3, 12(a1) + srli t0, a4, 16 + srli t1, a5, 16 + srli t2, a6, 16 + srli t3, a7, 16 + sb t0, 1(a1) + sb t1, 5(a1) + sb t2, 9(a1) + sb t3, 13(a1) + srli t0, a4, 8 + srli t1, a5, 8 + srli t2, a6, 8 + srli t3, a7, 8 + sb t0, 2(a1) + sb t1, 6(a1) + sb t2, 10(a1) + sb t3, 14(a1) + sb a4, 3(a1) + sb a5, 7(a1) + sb a6, 11(a1) + sb a7, 15(a1) +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + slli t0, a4, 32 + slli t1, a5, 32 + slli t2, a6, 32 + slli t3, a7, 32 + srli t1, t1, 32 + srli t3, t3, 32 + or t1, t1, t0 + or t3, t3, t2 +#else + # pack t1, a5, a4 + .word 0x08e7c333 + # pack t3, a7, a6 + .word 0x0908ce33 +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + # rev8 t1, t1 + .word 0x6b835313 + # rev8 t3, t3 + .word 0x6b8e5e13 + sd t1, 0(a1) + sd t3, 8(a1) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + mv s1, a2 + mv s2, a3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld97_w + ld t0, 0(s7) + j L_ualn_ld97_e +L_ualn_ld97_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld97_h + lwu t0, 0(s7) + lwu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld97_e +L_ualn_ld97_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld97_b + lhu t0, 0(s7) + lhu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld97_e +L_ualn_ld97_b: + lbu t0, 0(s7) + lbu t4, 1(s7) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s7) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s7) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s7) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld97_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld98_w + ld t1, 8(s7) + j L_ualn_ld98_e +L_ualn_ld98_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld98_h + lwu t1, 8(s7) + lwu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld98_e +L_ualn_ld98_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld98_b + lhu t1, 8(s7) + lhu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld98_e +L_ualn_ld98_b: + lbu t1, 8(s7) + lbu t4, 9(s7) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s7) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s7) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s7) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld98_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 16(sp) + ld t3, 24(sp) + xor t0, t0, t2 + xor t1, t1, t3 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t0, 0(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_sd99_w + sd t0, 0(s5) + j L_ualn_sd99_e +L_ualn_sd99_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd99_h + sw t0, 0(s5) + srli t4, t0, 32 + sw t4, 4(s5) + j L_ualn_sd99_e +L_ualn_sd99_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd99_b + sh t0, 0(s5) + srli t4, t0, 16 + sh t4, 2(s5) + srli t4, t0, 32 + sh t4, 4(s5) + srli t4, t0, 48 + sh t4, 6(s5) + j L_ualn_sd99_e +L_ualn_sd99_b: + sb t0, 0(s5) + srli t4, t0, 8 + sb t4, 1(s5) + srli t4, t0, 16 + sb t4, 2(s5) + srli t4, t0, 24 + sb t4, 3(s5) + srli t4, t0, 32 + sb t4, 4(s5) + srli t4, t0, 40 + sb t4, 5(s5) + srli t4, t0, 48 + sb t4, 6(s5) + srli t4, t0, 56 + sb t4, 7(s5) +L_ualn_sd99_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t1, 8(s5) +#else + andi t4, s5, 7 + bnez t4, L_ualn_sd100_w + sd t1, 8(s5) + j L_ualn_sd100_e +L_ualn_sd100_w: + andi t4, t4, 3 + bnez t4, L_ualn_sd100_h + sw t1, 8(s5) + srli t4, t1, 32 + sw t4, 12(s5) + j L_ualn_sd100_e +L_ualn_sd100_h: + andi t4, t4, 1 + bnez t4, L_ualn_sd100_b + sh t1, 8(s5) + srli t4, t1, 16 + sh t4, 10(s5) + srli t4, t1, 32 + sh t4, 12(s5) + srli t4, t1, 48 + sh t4, 14(s5) + j L_ualn_sd100_e +L_ualn_sd100_b: + sb t1, 8(s5) + srli t4, t1, 8 + sb t4, 9(s5) + srli t4, t1, 16 + sb t4, 10(s5) + srli t4, t1, 24 + sb t4, 11(s5) + srli t4, t1, 32 + sb t4, 12(s5) + srli t4, t1, 40 + sb t4, 13(s5) + srli t4, t1, 48 + sb t4, 14(s5) + srli t4, t1, 56 + sb t4, 15(s5) +L_ualn_sd100_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld101_w + ld t0, 0(s7) + j L_ualn_ld101_e +L_ualn_ld101_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld101_h + lwu t0, 0(s7) + lwu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld101_e +L_ualn_ld101_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld101_b + lhu t0, 0(s7) + lhu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld101_e +L_ualn_ld101_b: + lbu t0, 0(s7) + lbu t4, 1(s7) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(s7) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(s7) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(s7) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(s7) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(s7) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(s7) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld101_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(s7) +#else + andi t4, s7, 7 + bnez t4, L_ualn_ld102_w + ld t1, 8(s7) + j L_ualn_ld102_e +L_ualn_ld102_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld102_h + lwu t1, 8(s7) + lwu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld102_e +L_ualn_ld102_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld102_b + lhu t1, 8(s7) + lhu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld102_e +L_ualn_ld102_b: + lbu t1, 8(s7) + lbu t4, 9(s7) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(s7) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(s7) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(s7) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(s7) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(s7) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(s7) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld102_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s2) + sd t3, 8(s2) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult23: + add t2, s2, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done23 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult23 +L_AES_GCM_gmult_done23: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult23: + add t2, s2, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done23 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult23 +L_AES_GCM_gmult_done23: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s2) + ld t1, 8(s2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult23: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit23: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip23 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip23: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next23 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next23: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit23 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult23 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + addi s7, s7, 16 + addi s5, s5, 16 + addi s10, s10, -1 + bnez s10, L_AES_GCM_decrypt_update_RISCV64_loop +L_AES_GCM_decrypt_update_RISCV64_done: + ld ra, 32(sp) + ld s0, 56(sp) + ld s1, 64(sp) + ld s2, 72(sp) + ld s3, 80(sp) + ld s4, 88(sp) + ld s5, 96(sp) + ld s6, 104(sp) + ld s7, 112(sp) + ld s8, 120(sp) + ld s9, 128(sp) + ld s10, 136(sp) + addi sp, sp, 144 + ret + .size AES_GCM_decrypt_update_RISCV64,.-AES_GCM_decrypt_update_RISCV64 + .text + .globl AES_GCM_decrypt_final_RISCV64 + .type AES_GCM_decrypt_final_RISCV64,@function + .align 2 +AES_GCM_decrypt_final_RISCV64: + addi sp, sp, -96 + sd s1, 24(sp) + sd s2, 32(sp) + sd s3, 40(sp) + sd s4, 48(sp) + sd s5, 56(sp) + sd s6, 64(sp) + sd s7, 72(sp) + sd s8, 80(sp) + sd s9, 88(sp) + mv s2, a0 + mv s5, a1 + mv s6, a2 + mv s9, a3 + mv s1, a4 + mv s4, a5 + mv s7, a6 + mv s3, a7 + la s8, L_AES_base_gcm_r + sd zero, 0(sp) + sd zero, 8(sp) + slli t0, s1, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 3(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 4(sp) + sb t2, 5(sp) + sb t3, 6(sp) + sb t0, 7(sp) + slli t0, s9, 3 + srli t1, t0, 32 + andi t1, t1, 7 + sb t1, 11(sp) + srli t1, t0, 24 + srli t2, t0, 16 + srli t3, t0, 8 + sb t1, 12(sp) + sb t2, 13(sp) + sb t3, 14(sp) + sb t0, 15(sp) + addi a0, sp, 0 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld103_w + ld t0, 0(a0) + j L_ualn_ld103_e +L_ualn_ld103_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld103_h + lwu t0, 0(a0) + lwu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + j L_ualn_ld103_e +L_ualn_ld103_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld103_b + lhu t0, 0(a0) + lhu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lhu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lhu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + j L_ualn_ld103_e +L_ualn_ld103_b: + lbu t0, 0(a0) + lbu t4, 1(a0) + slli t4, t4, 8 + or t0, t0, t4 + lbu t4, 2(a0) + slli t4, t4, 16 + or t0, t0, t4 + lbu t4, 3(a0) + slli t4, t4, 24 + or t0, t0, t4 + lbu t4, 4(a0) + slli t4, t4, 32 + or t0, t0, t4 + lbu t4, 5(a0) + slli t4, t4, 40 + or t0, t0, t4 + lbu t4, 6(a0) + slli t4, t4, 48 + or t0, t0, t4 + lbu t4, 7(a0) + slli t4, t4, 56 + or t0, t0, t4 +L_ualn_ld103_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a0) +#else + andi t4, a0, 7 + bnez t4, L_ualn_ld104_w + ld t1, 8(a0) + j L_ualn_ld104_e +L_ualn_ld104_w: + andi t4, t4, 3 + bnez t4, L_ualn_ld104_h + lwu t1, 8(a0) + lwu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + j L_ualn_ld104_e +L_ualn_ld104_h: + andi t4, t4, 1 + bnez t4, L_ualn_ld104_b + lhu t1, 8(a0) + lhu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lhu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lhu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + j L_ualn_ld104_e +L_ualn_ld104_b: + lbu t1, 8(a0) + lbu t4, 9(a0) + slli t4, t4, 8 + or t1, t1, t4 + lbu t4, 10(a0) + slli t4, t4, 16 + or t1, t1, t4 + lbu t4, 11(a0) + slli t4, t4, 24 + or t1, t1, t4 + lbu t4, 12(a0) + slli t4, t4, 32 + or t1, t1, t4 + lbu t4, 13(a0) + slli t4, t4, 40 + or t1, t1, t4 + lbu t4, 14(a0) + slli t4, t4, 48 + or t1, t1, t4 + lbu t4, 15(a0) + slli t4, t4, 56 + or t1, t1, t4 +L_ualn_ld104_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t2, 0(s2) + ld t3, 8(s2) + xor t2, t2, t0 + xor t3, t3, t1 + sd t2, 0(s2) + sd t3, 8(s2) +#ifdef GCM_TABLE + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult24: + add t2, s2, a6 + lbu t2, 0(t2) + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done24 + andi t2, a5, 255 + srli t3, a5, 8 + slli t4, a4, 56 + or a5, t3, t4 + srli a4, a4, 8 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + or a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult24 +L_AES_GCM_gmult_done24: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else +#ifdef GCM_TABLE_4BIT + li a4, 0 + li a5, 0 + li a6, 15 +L_AES_GCM_gmult24: + add t2, s2, a6 + lbu a7, 0(t2) + andi t2, a7, 15 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + srli t2, a7, 4 + slli t2, t2, 4 + add t2, s4, t2 + ld t3, 0(t2) + ld t4, 8(t2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t3, t3 + .word 0x6b8e5e13 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 8 + srli t3, t3, 8 + and t3, t3, t0 + or t3, t3, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t3, t0 + slli t1, t1, 16 + srli t3, t3, 16 + and t3, t3, t0 + or t3, t3, t1 + slli t1, t3, 32 + srli t3, t3, 32 + or t3, t3, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t4, t4 + .word 0x6b8ede93 +#else + li t0, 255 + slli t1, t0, 16 + or t0, t0, t1 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 8 + srli t4, t4, 8 + and t4, t4, t0 + or t4, t4, t1 + li t0, 65535 + slli t1, t0, 32 + or t0, t0, t1 + and t1, t4, t0 + slli t1, t1, 16 + srli t4, t4, 16 + and t4, t4, t0 + or t4, t4, t1 + slli t1, t4, 32 + srli t4, t4, 32 + or t4, t4, t1 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, t3 + xor a5, a5, t4 + beqz a6, L_AES_GCM_gmult_done24 + andi t2, a5, 15 + srli t3, a5, 4 + slli t4, a4, 60 + or a5, t3, t4 + srli a4, a4, 4 + slli t2, t2, 1 + add t2, s8, t2 + lbu t3, 0(t2) + lbu t4, 1(t2) + slli t3, t3, 56 + xor a4, a4, t3 + slli t4, t4, 48 + xor a4, a4, t4 + addi a6, a6, -1 + j L_AES_GCM_gmult24 +L_AES_GCM_gmult_done24: +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a4 + .word 0x6b875293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 8 + srli t0, a4, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, a5 + .word 0x6b87d313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 8 + srli t1, a5, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) +#else + addi sp, sp, -16 + sd t5, 0(sp) + ld t0, 0(s2) + ld t1, 8(s2) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a4, t0 + .word 0x6b82d713 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 8 + srli a4, t0, 8 + and a4, a4, t2 + or a4, a4, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a4, t2 + slli t3, t3, 16 + srli a4, a4, 16 + and a4, a4, t2 + or a4, a4, t3 + slli t3, a4, 32 + srli a4, a4, 32 + or a4, a4, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 a5, t1 + .word 0x6b835793 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 8 + srli a5, t1, 8 + and a5, a5, t2 + or a5, a5, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a5, t2 + slli t3, t3, 16 + srli a5, a5, 16 + and a5, a5, t2 + or a5, a5, t3 + slli t3, a5, 32 + srli a5, a5, 32 + or a5, a5, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + li a6, 0 + li t4, 0 + li t2, 0 +L_AES_GCM_gmult24: + add t0, s4, t2 + lbu t3, 0(t0) + li t1, 8 +L_AES_GCM_gmult_bit24: + andi t0, t3, 128 + beqz t0, L_AES_GCM_gmult_skip24 + xor a6, a6, a4 + xor t4, t4, a5 +L_AES_GCM_gmult_skip24: + andi t0, a5, 1 + slli t5, a4, 63 + srli a5, a5, 1 + or a5, a5, t5 + srli a4, a4, 1 + beqz t0, L_AES_GCM_gmult_next24 + li t5, 225 + slli t5, t5, 56 + xor a4, a4, t5 +L_AES_GCM_gmult_next24: + slli t3, t3, 1 + addi t1, t1, -1 + bnez t1, L_AES_GCM_gmult_bit24 + addi t2, t2, 1 + li t0, 16 + blt t2, t0, L_AES_GCM_gmult24 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t0, a6 + .word 0x6b885293 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, a6, t2 + slli t3, t3, 8 + srli t0, a6, 8 + and t0, t0, t2 + or t0, t0, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t0, t2 + slli t3, t3, 16 + srli t0, t0, 16 + and t0, t0, t2 + or t0, t0, t3 + slli t3, t0, 32 + srli t0, t0, 32 + or t0, t0, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rev8 t1, t4 + .word 0x6b8ed313 +#else + li t2, 255 + slli t3, t2, 16 + or t2, t2, t3 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t4, t2 + slli t3, t3, 8 + srli t1, t4, 8 + and t1, t1, t2 + or t1, t1, t3 + li t2, 65535 + slli t3, t2, 32 + or t2, t2, t3 + and t3, t1, t2 + slli t3, t3, 16 + srli t1, t1, 16 + and t1, t1, t2 + or t1, t1, t3 + slli t3, t1, 32 + srli t1, t1, 32 + or t1, t1, t3 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd t0, 0(s2) + sd t1, 8(s2) + ld t5, 0(sp) + addi sp, sp, 16 +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + ld t0, 0(s2) + ld t1, 8(s2) + ld t2, 0(s7) + ld t3, 8(s7) + xor t0, t0, t2 + xor t1, t1, t3 + sd t0, 0(s2) + sd t1, 8(s2) + li t2, 0 + li t5, 0 +L_AES_GCM_decrypt_final_RISCV64_check_tag: + add t3, s2, t2 + lbu t3, 0(t3) + add t4, s5, t2 + lbu t4, 0(t4) + xor t3, t3, t4 + or t5, t5, t3 + addi t2, t2, 1 + blt t2, s6, L_AES_GCM_decrypt_final_RISCV64_check_tag + sltiu t5, t5, 1 + sw t5, 0(s3) + ld s1, 24(sp) + ld s2, 32(sp) + ld s3, 40(sp) + ld s4, 48(sp) + ld s5, 56(sp) + ld s6, 64(sp) + ld s7, 72(sp) + ld s8, 80(sp) + ld s9, 88(sp) + addi sp, sp, 96 + ret + .size AES_GCM_decrypt_final_RISCV64,.-AES_GCM_decrypt_final_RISCV64 +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AESGCM_STREAM */ +#endif /* HAVE_AESGCM */ +#endif /* WOLFSSL_RISCV_SCALAR_CRYPTO_ASM */ +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-aes-asm_c.c b/wolfcrypt/src/port/riscv64/riscv-64-aes-asm_c.c new file mode 100644 index 00000000000..69411bb1594 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-aes-asm_c.c @@ -0,0 +1,81591 @@ +/* riscv-64-aes-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./aes/aes.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-aes-asm.c + */ +#ifdef WOLFSSL_RISCV_ASM +#ifdef WOLFSSL_RISCV_ASM_INLINE +#include + +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM +void AES_set_key_RISCV64(const byte* userKey, int keylen, byte* key, int dir) +{ + __asm__ __volatile__ ( + "li t0, 24\n\t" + "beq %[keylen], t0, L_AES_set_key_RISCV64_192\n\t" + "li t0, 32\n\t" + "beq %[keylen], t0, L_AES_set_key_RISCV64_256\n\t" + /* AES-128 key schedule. */ + "bnez %[dir], L_AES_set_key_RISCV64_128_dec\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[userKey]\n\t" + /* vl1re32.v v0, (t0) */ + ".word 0x0282e007\n\t" + "mv t0, %[key]\n\t" + /* vaeskf1.vi v1, v0, 1 */ + ".word 0x8a00a0f7\n\t" + /* vaeskf1.vi v2, v1, 2 */ + ".word 0x8a112177\n\t" + /* vaeskf1.vi v3, v2, 3 */ + ".word 0x8a21a1f7\n\t" + /* vaeskf1.vi v4, v3, 4 */ + ".word 0x8a322277\n\t" + /* vaeskf1.vi v5, v4, 5 */ + ".word 0x8a42a2f7\n\t" + /* vaeskf1.vi v6, v5, 6 */ + ".word 0x8a532377\n\t" + /* vaeskf1.vi v7, v6, 7 */ + ".word 0x8a63a3f7\n\t" + /* vaeskf1.vi v8, v7, 8 */ + ".word 0x8a742477\n\t" + /* vaeskf1.vi v9, v8, 9 */ + ".word 0x8a84a4f7\n\t" + /* vaeskf1.vi v10, v9, 10 */ + ".word 0x8a952577\n\t" + /* vs8r.v v0, (t0) */ + ".word 0xe2828027\n\t" + "add t0, t0, 128\n\t" + /* vs2r.v v8, (t0) */ + ".word 0x22828427\n\t" + "add t0, t0, 96\n\t" + /* vs1r.v v10, (t0) */ + ".word 0x02828527\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + "\n" + "L_AES_set_key_RISCV64_128_dec:\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[userKey]\n\t" + /* vl1re32.v v10, (t0) */ + ".word 0x0282e507\n\t" + "mv t0, %[key]\n\t" + /* vaeskf1.vi v9, v10, 1 */ + ".word 0x8aa0a4f7\n\t" + /* vaeskf1.vi v8, v9, 2 */ + ".word 0x8a912477\n\t" + /* vaeskf1.vi v7, v8, 3 */ + ".word 0x8a81a3f7\n\t" + /* vaeskf1.vi v6, v7, 4 */ + ".word 0x8a722377\n\t" + /* vaeskf1.vi v5, v6, 5 */ + ".word 0x8a62a2f7\n\t" + /* vaeskf1.vi v4, v5, 6 */ + ".word 0x8a532277\n\t" + /* vaeskf1.vi v3, v4, 7 */ + ".word 0x8a43a1f7\n\t" + /* vaeskf1.vi v2, v3, 8 */ + ".word 0x8a342177\n\t" + /* vaeskf1.vi v1, v2, 9 */ + ".word 0x8a24a0f7\n\t" + /* vaeskf1.vi v0, v1, 10 */ + ".word 0x8a152077\n\t" + /* vs8r.v v0, (t0) */ + ".word 0xe2828027\n\t" + "add t0, t0, 128\n\t" + /* vs2r.v v8, (t0) */ + ".word 0x22828427\n\t" + "add t0, t0, 96\n\t" + /* vs1r.v v10, (t0) */ + ".word 0x02828527\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + /* AES-192 key schedule. */ + "\n" + "L_AES_set_key_RISCV64_192:\n\t" + "bnez %[dir], L_AES_set_key_RISCV64_192_dec\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[userKey]\n\t" + /* vl1re32.v v0, (t0) */ + ".word 0x0282e007\n\t" + /* vsetivli zero, 1, e32, m1, ta, ma */ + ".word 0xcd00f057\n\t" + "addi t0, t0, 16\n\t" + /* vl1re32.v v13, (t0) */ + ".word 0x0282e687\n\t" + "addi t0, t0, 4\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + /* vxor.vv v16, v16, v16 */ + ".word 0x2f080857\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 1 */ + ".word 0x8a00a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 2 */ + ".word 0x8a112077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 3 */ + ".word 0x8a01a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 4 */ + ".word 0x8a122077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 5 */ + ".word 0x8a02a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 6 */ + ".word 0x8a132077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 7 */ + ".word 0x8a03a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 8 */ + ".word 0x8a142077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + "addi t0, t0, 32\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + "\n" + "L_AES_set_key_RISCV64_192_dec:\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[userKey]\n\t" + /* vl1re32.v v0, (t0) */ + ".word 0x0282e007\n\t" + /* vsetivli zero, 1, e32, m1, ta, ma */ + ".word 0xcd00f057\n\t" + "addi t0, t0, 16\n\t" + /* vl1re32.v v13, (t0) */ + ".word 0x0282e687\n\t" + "addi t0, t0, 4\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vxor.vv v16, v16, v16 */ + ".word 0x2f080857\n\t" + "addi t0, %[key], 224\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "mv t0, %[key]\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 1 */ + ".word 0x8a00a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 2 */ + ".word 0x8a112077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 3 */ + ".word 0x8a01a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 4 */ + ".word 0x8a122077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 5 */ + ".word 0x8a02a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 6 */ + ".word 0x8a132077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v0, 3 */ + ".word 0x3e01b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v0, v14, 3 */ + ".word 0x3ae1b057\n\t" + /* vaeskf1.vi v1, v0, 7 */ + ".word 0x8a03a0f7\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v1, v1, v16 */ + ".word 0x2f0080d7\n\t" + /* vslidedown.vi v15, v1, 3 */ + ".word 0x3e11b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v1, (t0) */ + ".word 0x028280a7\n\t" + "addi t0, t0, 16\n\t" + /* vslideup.vi v13, v14, 1 */ + ".word 0x3ae0b6d7\n\t" + /* vsetivli zero, 2, e32, m1, ta, ma */ + ".word 0xcd017057\n\t" + /* vs1r.v v13, (t0) */ + ".word 0x028286a7\n\t" + "addi t0, t0, 8\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vslidedown.vi v17, v1, 3 */ + ".word 0x3e11b8d7\n\t" + /* vslideup.vi v16, v17, 3 */ + ".word 0x3b11b857\n\t" + /* vslideup.vi v1, v14, 3 */ + ".word 0x3ae1b0d7\n\t" + /* vaeskf1.vi v0, v1, 8 */ + ".word 0x8a142077\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslideup.vi v16, v14, 3 */ + ".word 0x3ae1b857\n\t" + /* vxor.vv v0, v0, v16 */ + ".word 0x2f000057\n\t" + /* vslidedown.vi v15, v0, 3 */ + ".word 0x3e01b7d7\n\t" + /* vxor.vv v13, v13, v15 */ + ".word 0x2ef686d7\n\t" + /* vxor.vv v14, v14, v13 */ + ".word 0x2ed70757\n\t" + /* vs1r.v v0, (t0) */ + ".word 0x02828027\n\t" + "mv t0, %[key]\n\t" + /* vl4re32.v v0, (t0) */ + ".word 0x6282e007\n\t" + "addi t0, %[key], 64\n\t" + /* vl2re32.v v4, (t0) */ + ".word 0x2282e207\n\t" + "addi t1, %[key], 112\n\t" + /* vl4re32.v v8, (t1) */ + ".word 0x62836407\n\t" + "addi t1, %[key], 176\n\t" + /* vl2re32.v v12, (t1) */ + ".word 0x22836607\n\t" + /* vmv.v.v v21, v0 */ + ".word 0x5e000ad7\n\t" + /* vmv.v.v v20, v1 */ + ".word 0x5e008a57\n\t" + /* vmv.v.v v19, v2 */ + ".word 0x5e0109d7\n\t" + /* vmv.v.v v18, v3 */ + ".word 0x5e018957\n\t" + /* vmv.v.v v17, v4 */ + ".word 0x5e0208d7\n\t" + /* vmv.v.v v16, v5 */ + ".word 0x5e028857\n\t" + /* vmv.v.v v5, v8 */ + ".word 0x5e0402d7\n\t" + /* vmv.v.v v4, v9 */ + ".word 0x5e048257\n\t" + /* vmv.v.v v3, v10 */ + ".word 0x5e0501d7\n\t" + /* vmv.v.v v2, v11 */ + ".word 0x5e058157\n\t" + /* vmv.v.v v1, v12 */ + ".word 0x5e0600d7\n\t" + /* vmv.v.v v0, v13 */ + ".word 0x5e068057\n\t" + "mv t0, %[key]\n\t" + /* vs4r.v v0, (t0) */ + ".word 0x62828027\n\t" + "addi t0, %[key], 64\n\t" + /* vs2r.v v4, (t0) */ + ".word 0x22828227\n\t" + "addi t1, %[key], 112\n\t" + /* vs4r.v v16, (t1) */ + ".word 0x62830827\n\t" + "addi t1, %[key], 176\n\t" + /* vs2r.v v20, (t1) */ + ".word 0x22830a27\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + /* AES-256 key schedule. */ + "\n" + "L_AES_set_key_RISCV64_256:\n\t" + "bnez %[dir], L_AES_set_key_RISCV64_256_dec\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[userKey]\n\t" + /* vl2re32.v v0, (t0) */ + ".word 0x2282e007\n\t" + "mv t0, %[key]\n\t" + /* vmv.v.v v14, v0 */ + ".word 0x5e000757\n\t" + /* vmv.v.v v13, v1 */ + ".word 0x5e0086d7\n\t" + /* vaeskf2.vi v14, v13, 2 */ + ".word 0xaad12777\n\t" + /* vmv.v.v v2, v14 */ + ".word 0x5e070157\n\t" + /* vaeskf2.vi v13, v14, 3 */ + ".word 0xaae1a6f7\n\t" + /* vmv.v.v v3, v13 */ + ".word 0x5e0681d7\n\t" + /* vaeskf2.vi v14, v13, 4 */ + ".word 0xaad22777\n\t" + /* vmv.v.v v4, v14 */ + ".word 0x5e070257\n\t" + /* vaeskf2.vi v13, v14, 5 */ + ".word 0xaae2a6f7\n\t" + /* vmv.v.v v5, v13 */ + ".word 0x5e0682d7\n\t" + /* vaeskf2.vi v14, v13, 6 */ + ".word 0xaad32777\n\t" + /* vmv.v.v v6, v14 */ + ".word 0x5e070357\n\t" + /* vaeskf2.vi v13, v14, 7 */ + ".word 0xaae3a6f7\n\t" + /* vmv.v.v v7, v13 */ + ".word 0x5e0683d7\n\t" + /* vaeskf2.vi v14, v13, 8 */ + ".word 0xaad42777\n\t" + /* vmv.v.v v8, v14 */ + ".word 0x5e070457\n\t" + /* vaeskf2.vi v13, v14, 9 */ + ".word 0xaae4a6f7\n\t" + /* vmv.v.v v9, v13 */ + ".word 0x5e0684d7\n\t" + /* vaeskf2.vi v14, v13, 10 */ + ".word 0xaad52777\n\t" + /* vmv.v.v v10, v14 */ + ".word 0x5e070557\n\t" + /* vaeskf2.vi v13, v14, 11 */ + ".word 0xaae5a6f7\n\t" + /* vmv.v.v v11, v13 */ + ".word 0x5e0685d7\n\t" + /* vaeskf2.vi v14, v13, 12 */ + ".word 0xaad62777\n\t" + /* vmv.v.v v12, v14 */ + ".word 0x5e070657\n\t" + /* vaeskf2.vi v13, v14, 13 */ + ".word 0xaae6a6f7\n\t" + /* vaeskf2.vi v14, v13, 14 */ + ".word 0xaad72777\n\t" + /* vs8r.v v0, (t0) */ + ".word 0xe2828027\n\t" + "add t0, t0, 128\n\t" + /* vs4r.v v8, (t0) */ + ".word 0x62828427\n\t" + "add t0, t0, 64\n\t" + /* vs2r.v v12, (t0) */ + ".word 0x22828627\n\t" + "add t0, t0, 32\n\t" + /* vs1r.v v14, (t0) */ + ".word 0x02828727\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + "\n" + "L_AES_set_key_RISCV64_256_dec:\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[userKey]\n\t" + /* vl2re32.v v0, (t0) */ + ".word 0x2282e007\n\t" + /* vmv.v.v v13, v1 */ + ".word 0x5e0086d7\n\t" + /* vmv.v.v v14, v0 */ + ".word 0x5e000757\n\t" + "mv t0, %[key]\n\t" + /* vaeskf2.vi v0, v1, 2 */ + ".word 0xaa112077\n\t" + /* vmv.v.v v12, v0 */ + ".word 0x5e000657\n\t" + /* vaeskf2.vi v1, v0, 3 */ + ".word 0xaa01a0f7\n\t" + /* vmv.v.v v11, v1 */ + ".word 0x5e0085d7\n\t" + /* vaeskf2.vi v0, v1, 4 */ + ".word 0xaa122077\n\t" + /* vmv.v.v v10, v0 */ + ".word 0x5e000557\n\t" + /* vaeskf2.vi v1, v0, 5 */ + ".word 0xaa02a0f7\n\t" + /* vmv.v.v v9, v1 */ + ".word 0x5e0084d7\n\t" + /* vaeskf2.vi v0, v1, 6 */ + ".word 0xaa132077\n\t" + /* vmv.v.v v8, v0 */ + ".word 0x5e000457\n\t" + /* vaeskf2.vi v1, v0, 7 */ + ".word 0xaa03a0f7\n\t" + /* vmv.v.v v7, v1 */ + ".word 0x5e0083d7\n\t" + /* vaeskf2.vi v0, v1, 8 */ + ".word 0xaa142077\n\t" + /* vmv.v.v v6, v0 */ + ".word 0x5e000357\n\t" + /* vaeskf2.vi v1, v0, 9 */ + ".word 0xaa04a0f7\n\t" + /* vmv.v.v v5, v1 */ + ".word 0x5e0082d7\n\t" + /* vaeskf2.vi v0, v1, 10 */ + ".word 0xaa152077\n\t" + /* vmv.v.v v4, v0 */ + ".word 0x5e000257\n\t" + /* vaeskf2.vi v1, v0, 11 */ + ".word 0xaa05a0f7\n\t" + /* vmv.v.v v3, v1 */ + ".word 0x5e0081d7\n\t" + /* vaeskf2.vi v0, v1, 12 */ + ".word 0xaa162077\n\t" + /* vmv.v.v v2, v0 */ + ".word 0x5e000157\n\t" + /* vaeskf2.vi v1, v0, 13 */ + ".word 0xaa06a0f7\n\t" + /* vaeskf2.vi v0, v1, 14 */ + ".word 0xaa172077\n\t" + /* vs8r.v v0, (t0) */ + ".word 0xe2828027\n\t" + "add t0, t0, 128\n\t" + /* vs4r.v v8, (t0) */ + ".word 0x62828427\n\t" + "add t0, t0, 64\n\t" + /* vs2r.v v12, (t0) */ + ".word 0x22828627\n\t" + "add t0, t0, 32\n\t" + /* vs1r.v v14, (t0) */ + ".word 0x02828727\n\t" + "\n" + "L_AES_set_key_RISCV64_done:\n\t" + : [userKey] "+r" (userKey), [keylen] "+r" (keylen), [key] "+r" (key), + [dir] "+r" (dir) + : + : "memory", "t0", "t1", "t2" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#ifdef HAVE_AESGCM +void AES_GCM_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, const byte* aad, + word32 aadSz, byte* key, byte* gcm_h, byte* tmp, byte* reg, int nr) +{ + __asm__ __volatile__ ( + "mv s1, %[aadSz]\n\t" + "mv s2, %[key]\n\t" + "mv s3, %[gcm_h]\n\t" + "mv s4, %[tmp]\n\t" + "mv s5, %[reg]\n\t" + "mv s6, %[nr]\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* X = 0; load H */ + /* vxor.vv v18, v18, v18 */ + ".word 0x2f290957\n\t" + "mv t0, %[gcm_h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "li t0, 12\n\t" + "bne %[nonceSz], t0, L_AES_GCM_encrypt_RISCV64_j0_ghash\n\t" + "mv t0, %[tmp]\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "ld t1, 0(%[nonce])\n\t" + "sd t1, 0(t0)\n\t" + "lw t1, 8(%[nonce])\n\t" + "sw t1, 8(t0)\n\t" + "li t1, 1\n\t" + "sb t1, 15(t0)\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + "j L_AES_GCM_encrypt_RISCV64_j0_done\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0_ghash:\n\t" + /* vxor.vv v16, v16, v16 */ + ".word 0x2f080857\n\t" + "srli t6, %[nonceSz], 4\n\t" + "beqz t6, L_AES_GCM_encrypt_RISCV64_j0_nblk_done\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0_nloop:\n\t" + "mv t0, %[nonce]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "addi %[nonce], %[nonce], 16\n\t" + "addi t6, t6, -1\n\t" + "bnez t6, L_AES_GCM_encrypt_RISCV64_j0_nloop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0_nblk_done:\n\t" + "andi t1, %[nonceSz], 15\n\t" + "beqz t1, L_AES_GCM_encrypt_RISCV64_j0_npad_done\n\t" + /* vxor.vv v17, v17, v17 */ + ".word 0x2f1888d7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v17, (t0) */ + ".word 0x028288a7\n\t" + "mv t3, t1\n\t" + "mv t0, %[tmp]\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0_n_load_byte:\n\t" + "lb t4, 0(%[nonce])\n\t" + "sb t4, 0(t0)\n\t" + "addi %[nonce], %[nonce], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_RISCV64_j0_n_load_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0_npad_done:\n\t" + /* Length block: 0^64 || nonceSz*8 (big-endian) */ + "mv t0, %[tmp]\n\t" + "sd zero, 0(t0)\n\t" + "slli t1, %[nonceSz], 3\n\t" + "srli t2, t1, 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, t1, 24\n\t" + "srli t4, t1, 16\n\t" + "srli t5, t1, 8\n\t" + "sh zero, 8(t0)\n\t" + "sb zero, 10(t0)\n\t" + "sb t2, 11(t0)\n\t" + "sb t3, 12(t0)\n\t" + "sb t4, 13(t0)\n\t" + "sb t5, 14(t0)\n\t" + "sb t1, 15(t0)\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0_done:\n\t" + /* GHASH the AAD */ + "beqz %[aadSz], L_AES_GCM_encrypt_RISCV64_aad_done\n\t" + "srli t1, %[aadSz], 4\n\t" + "beqz t1, L_AES_GCM_encrypt_RISCV64_aad_blocks_done\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_encrypt_RISCV64_aad_loop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_blocks_done:\n\t" + "andi t1, %[aadSz], 15\n\t" + "beqz t1, L_AES_GCM_encrypt_RISCV64_aad_done\n\t" + /* vxor.vv v17, v17, v17 */ + ".word 0x2f1888d7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v17, (t0) */ + ".word 0x028288a7\n\t" + "mv t3, t1\n\t" + "mv t0, %[tmp]\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_load_byte:\n\t" + "lb t4, 0(%[aad])\n\t" + "sb t4, 0(t0)\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_RISCV64_aad_load_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_done:\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + /* Host counter (lane 0) from J0 */ + /* vslidedown.vi v20, v16, 3 */ + ".word 0x3f01ba57\n\t" + /* vrev8.v v20, v20 */ + ".word 0x4b44aa57\n\t" + /* 4-block fast path (64-byte groups), then <64-byte tail below */ + "srli t6, %[sz], 6\n\t" + "beqz t6, L_AES_GCM_encrypt_RISCV64_x4_done\n\t" + /* Precompute H^2, H^3, H^4 (v21/v22/v23) */ + /* vmv.v.v v21, v19 */ + ".word 0x5e098ad7\n\t" + /* vmv.v.v v22, v19 */ + ".word 0x5e098b57\n\t" + /* vgmul.vv v21, v19 */ + ".word 0xa338aaf7\n\t" + /* vmv.v.v v23, v21 */ + ".word 0x5e0a8bd7\n\t" + /* vgmul.vv v22, v21 */ + ".word 0xa358ab77\n\t" + /* vgmul.vv v23, v21 */ + ".word 0xa358abf7\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_x4_loop:\n\t" + /* Next 4 counters from host counter v20 (lane 0), big-endian into lane 3 */ + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vmv.v.v v25, v16 */ + ".word 0x5e080cd7\n\t" + /* vmv.v.v v26, v16 */ + ".word 0x5e080d57\n\t" + /* vmv.v.v v27, v16 */ + ".word 0x5e080dd7\n\t" + /* vadd.vi v28, v20, 1 */ + ".word 0x0340be57\n\t" + /* vadd.vi v29, v20, 2 */ + ".word 0x03413ed7\n\t" + /* vadd.vi v30, v20, 3 */ + ".word 0x0341bf57\n\t" + /* vadd.vi v20, v20, 4 */ + ".word 0x03423a57\n\t" + /* vrev8.v v28, v28 */ + ".word 0x4bc4ae57\n\t" + /* vrev8.v v29, v29 */ + ".word 0x4bd4aed7\n\t" + /* vrev8.v v30, v30 */ + ".word 0x4be4af57\n\t" + /* vrev8.v v31, v20 */ + ".word 0x4b44afd7\n\t" + /* vslideup.vi v24, v28, 3 */ + ".word 0x3bc1bc57\n\t" + /* vslideup.vi v25, v29, 3 */ + ".word 0x3bd1bcd7\n\t" + /* vslideup.vi v26, v30, 3 */ + ".word 0x3be1bd57\n\t" + /* vslideup.vi v27, v31, 3 */ + ".word 0x3bf1bdd7\n\t" + /* Encrypt the 4 counter blocks (v24-v27) as one LMUL=4 group */ + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vaesz.vs v24, v0 */ + ".word 0xa603ac77\n\t" + /* vaesem.vs v24, v1 */ + ".word 0xa6112c77\n\t" + /* vaesem.vs v24, v2 */ + ".word 0xa6212c77\n\t" + /* vaesem.vs v24, v3 */ + ".word 0xa6312c77\n\t" + /* vaesem.vs v24, v4 */ + ".word 0xa6412c77\n\t" + /* vaesem.vs v24, v5 */ + ".word 0xa6512c77\n\t" + /* vaesem.vs v24, v6 */ + ".word 0xa6612c77\n\t" + /* vaesem.vs v24, v7 */ + ".word 0xa6712c77\n\t" + /* vaesem.vs v24, v8 */ + ".word 0xa6812c77\n\t" + /* vaesem.vs v24, v9 */ + ".word 0xa6912c77\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_x4aes_last\n\t" + /* vaesem.vs v24, v10 */ + ".word 0xa6a12c77\n\t" + /* vaesem.vs v24, v11 */ + ".word 0xa6b12c77\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_x4aes_last\n\t" + /* vaesem.vs v24, v12 */ + ".word 0xa6c12c77\n\t" + /* vaesem.vs v24, v13 */ + ".word 0xa6d12c77\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_x4aes_last:\n\t" + /* vaesef.vs v24, v14 */ + ".word 0xa6e1ac77\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl4re32.v v28, (t0) */ + ".word 0x6282ee07\n\t" + /* vxor.vv v28, v24, v28 */ + ".word 0x2fcc0e57\n\t" + /* vxor.vv v29, v25, v29 */ + ".word 0x2fdc8ed7\n\t" + /* vxor.vv v30, v26, v30 */ + ".word 0x2fed0f57\n\t" + /* vxor.vv v31, v27, v31 */ + ".word 0x2ffd8fd7\n\t" + "mv t0, %[out]\n\t" + /* vs4r.v v28, (t0) */ + ".word 0x62828e27\n\t" + /* Aggregated GHASH: X = (X^ct0)*H^4 ^ ct1*H^3 ^ ct2*H^2 ^ ct3*H */ + /* vxor.vv v28, v28, v18 */ + ".word 0x2f2e0e57\n\t" + /* vgmul.vv v28, v23 */ + ".word 0xa378ae77\n\t" + /* vgmul.vv v29, v22 */ + ".word 0xa368aef7\n\t" + /* vgmul.vv v30, v21 */ + ".word 0xa358af77\n\t" + /* vgmul.vv v31, v19 */ + ".word 0xa338aff7\n\t" + /* vxor.vv v18, v28, v29 */ + ".word 0x2fde0957\n\t" + /* vxor.vv v18, v18, v30 */ + ".word 0x2fe90957\n\t" + /* vxor.vv v18, v18, v31 */ + ".word 0x2ff90957\n\t" + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + "addi t6, t6, -1\n\t" + "bnez t6, L_AES_GCM_encrypt_RISCV64_x4_loop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_x4_done:\n\t" + /* m2 rung then single-block loop for the <64-byte remainder */ + "andi t6, %[sz], 63\n\t" + "srli t6, t6, 4\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_GCM_encrypt_RISCV64_after_m2\n\t" + /* 2-block group: counters v24/v25, m2 AES, 2-way GHASH */ + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vmv.v.v v25, v16 */ + ".word 0x5e080cd7\n\t" + /* vadd.vi v26, v20, 1 */ + ".word 0x0340bd57\n\t" + /* vadd.vi v20, v20, 2 */ + ".word 0x03413a57\n\t" + /* vrev8.v v26, v26 */ + ".word 0x4ba4ad57\n\t" + /* vrev8.v v27, v20 */ + ".word 0x4b44add7\n\t" + /* vslideup.vi v24, v26, 3 */ + ".word 0x3ba1bc57\n\t" + /* vslideup.vi v25, v27, 3 */ + ".word 0x3bb1bcd7\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vaesz.vs v24, v0 */ + ".word 0xa603ac77\n\t" + /* vaesem.vs v24, v1 */ + ".word 0xa6112c77\n\t" + /* vaesem.vs v24, v2 */ + ".word 0xa6212c77\n\t" + /* vaesem.vs v24, v3 */ + ".word 0xa6312c77\n\t" + /* vaesem.vs v24, v4 */ + ".word 0xa6412c77\n\t" + /* vaesem.vs v24, v5 */ + ".word 0xa6512c77\n\t" + /* vaesem.vs v24, v6 */ + ".word 0xa6612c77\n\t" + /* vaesem.vs v24, v7 */ + ".word 0xa6712c77\n\t" + /* vaesem.vs v24, v8 */ + ".word 0xa6812c77\n\t" + /* vaesem.vs v24, v9 */ + ".word 0xa6912c77\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_m2aes_last\n\t" + /* vaesem.vs v24, v10 */ + ".word 0xa6a12c77\n\t" + /* vaesem.vs v24, v11 */ + ".word 0xa6b12c77\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_m2aes_last\n\t" + /* vaesem.vs v24, v12 */ + ".word 0xa6c12c77\n\t" + /* vaesem.vs v24, v13 */ + ".word 0xa6d12c77\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_m2aes_last:\n\t" + /* vaesef.vs v24, v14 */ + ".word 0xa6e1ac77\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl2re32.v v26, (t0) */ + ".word 0x2282ed07\n\t" + /* vxor.vv v26, v24, v26 */ + ".word 0x2fac0d57\n\t" + /* vxor.vv v27, v25, v27 */ + ".word 0x2fbc8dd7\n\t" + "mv t0, %[out]\n\t" + /* vs2r.v v26, (t0) */ + ".word 0x22828d27\n\t" + /* vmv.v.v v28, v19 */ + ".word 0x5e098e57\n\t" + /* vgmul.vv v28, v19 */ + ".word 0xa338ae77\n\t" + /* vghsh.vv v26, v18, v28 */ + ".word 0xb3c92d77\n\t" + /* vgmul.vv v27, v19 */ + ".word 0xa338adf7\n\t" + /* vxor.vv v18, v26, v27 */ + ".word 0x2fbd0957\n\t" + "addi %[in], %[in], 32\n\t" + "addi %[out], %[out], 32\n\t" + "addi t6, t6, -2\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_after_m2:\n\t" + "beqz t6, L_AES_GCM_encrypt_RISCV64_blocks_done\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_loop:\n\t" + /* vadd.vi v20, v20, 1 */ + ".word 0x0340ba57\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + /* vaesz.vs v21, v0 */ + ".word 0xa603aaf7\n\t" + /* vaesem.vs v21, v1 */ + ".word 0xa6112af7\n\t" + /* vaesem.vs v21, v2 */ + ".word 0xa6212af7\n\t" + /* vaesem.vs v21, v3 */ + ".word 0xa6312af7\n\t" + /* vaesem.vs v21, v4 */ + ".word 0xa6412af7\n\t" + /* vaesem.vs v21, v5 */ + ".word 0xa6512af7\n\t" + /* vaesem.vs v21, v6 */ + ".word 0xa6612af7\n\t" + /* vaesem.vs v21, v7 */ + ".word 0xa6712af7\n\t" + /* vaesem.vs v21, v8 */ + ".word 0xa6812af7\n\t" + /* vaesem.vs v21, v9 */ + ".word 0xa6912af7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v10 */ + ".word 0xa6a12af7\n\t" + /* vaesem.vs v21, v11 */ + ".word 0xa6b12af7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v12 */ + ".word 0xa6c12af7\n\t" + /* vaesem.vs v21, v13 */ + ".word 0xa6d12af7\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aes_last:\n\t" + /* vaesef.vs v21, v14 */ + ".word 0xa6e1aaf7\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vxor.vv v21, v21, v17 */ + ".word 0x2f1a8ad7\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + /* vghsh.vv v18, v21, v19 */ + ".word 0xb33aa977\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi t6, t6, -1\n\t" + "bnez t6, L_AES_GCM_encrypt_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_blocks_done:\n\t" + /* Partial final block */ + "andi t1, %[sz], 15\n\t" + "beqz t1, L_AES_GCM_encrypt_RISCV64_partial_done\n\t" + /* vadd.vi v20, v20, 1 */ + ".word 0x0340ba57\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + /* vaesz.vs v21, v0 */ + ".word 0xa603aaf7\n\t" + /* vaesem.vs v21, v1 */ + ".word 0xa6112af7\n\t" + /* vaesem.vs v21, v2 */ + ".word 0xa6212af7\n\t" + /* vaesem.vs v21, v3 */ + ".word 0xa6312af7\n\t" + /* vaesem.vs v21, v4 */ + ".word 0xa6412af7\n\t" + /* vaesem.vs v21, v5 */ + ".word 0xa6512af7\n\t" + /* vaesem.vs v21, v6 */ + ".word 0xa6612af7\n\t" + /* vaesem.vs v21, v7 */ + ".word 0xa6712af7\n\t" + /* vaesem.vs v21, v8 */ + ".word 0xa6812af7\n\t" + /* vaesem.vs v21, v9 */ + ".word 0xa6912af7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_p_aes_last\n\t" + /* vaesem.vs v21, v10 */ + ".word 0xa6a12af7\n\t" + /* vaesem.vs v21, v11 */ + ".word 0xa6b12af7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_p_aes_last\n\t" + /* vaesem.vs v21, v12 */ + ".word 0xa6c12af7\n\t" + /* vaesem.vs v21, v13 */ + ".word 0xa6d12af7\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_p_aes_last:\n\t" + /* vaesef.vs v21, v14 */ + ".word 0xa6e1aaf7\n\t" + /* vxor.vv v17, v17, v17 */ + ".word 0x2f1888d7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v17, (t0) */ + ".word 0x028288a7\n\t" + "mv t3, t1\n\t" + "mv t0, %[tmp]\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_p_load_byte:\n\t" + "lb t4, 0(%[in])\n\t" + "sb t4, 0(t0)\n\t" + "addi %[in], %[in], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_RISCV64_p_load_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vxor.vv v21, v21, v17 */ + ".word 0x2f1a8ad7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + "mv t3, t1\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_p_store_byte:\n\t" + "lb t4, 0(t0)\n\t" + "sb t4, 0(%[out])\n\t" + "addi t0, t0, 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_RISCV64_p_store_byte\n\t" + "li t3, 16\n\t" + "sub t3, t3, t1\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_p_zero_byte:\n\t" + "sb zero, 0(t0)\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_RISCV64_p_zero_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_partial_done:\n\t" + /* Hash in the lengths of AAD and ciphertext in bits (big-endian) */ + "mv t0, %[tmp]\n\t" + "slli %[aadSz], %[aadSz], 3\n\t" + "srli t2, %[aadSz], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[aadSz], 24\n\t" + "srli t4, %[aadSz], 16\n\t" + "srli t5, %[aadSz], 8\n\t" + "sh zero, 0(t0)\n\t" + "sb zero, 2(t0)\n\t" + "sb t2, 3(t0)\n\t" + "sb t3, 4(t0)\n\t" + "sb t4, 5(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb %[aadSz], 7(t0)\n\t" + "slli %[sz], %[sz], 3\n\t" + "srli t2, %[sz], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[sz], 24\n\t" + "srli t4, %[sz], 16\n\t" + "srli t5, %[sz], 8\n\t" + "sh zero, 8(t0)\n\t" + "sb zero, 10(t0)\n\t" + "sb t2, 11(t0)\n\t" + "sb t3, 12(t0)\n\t" + "sb t4, 13(t0)\n\t" + "sb t5, 14(t0)\n\t" + "sb %[sz], 15(t0)\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + /* tag = GHASH ^ E_K(J0) */ + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_tag_aes_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_RISCV64_tag_aes_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_tag_aes_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vxor.vv v18, v18, v16 */ + ".word 0x2f090957\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + /* Store tagSz bytes of the tag */ + "mv t0, %[tmp]\n\t" + "mv t3, %[tagSz]\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_store_tag:\n\t" + "lb t4, 0(t0)\n\t" + "sb t4, 0(%[tag])\n\t" + "addi t0, t0, 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_RISCV64_store_tag\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), + [nonce] "+r" (nonce), [nonceSz] "+r" (nonceSz), [tag] "+r" (tag), + [tagSz] "+r" (tagSz), [aad] "+r" (aad), [aadSz] "+r" (aadSz), + [key] "+r" (key), [gcm_h] "+r" (gcm_h), [tmp] "+r" (tmp), + [reg] "+r" (reg), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s2", "s3", + "s4", "s5", "s6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#ifdef HAVE_AES_DECRYPT +int AES_GCM_decrypt_RISCV64(byte* in, byte* out, word32 sz, const byte* nonce, + word32 nonceSz, const byte* tag, word32 tagSz, const byte* aad, + word32 aadSz, byte* key, byte* gcm_h, byte* tmp, byte* reg, int nr) +{ + __asm__ __volatile__ ( + "mv s1, %[aadSz]\n\t" + "mv s2, %[key]\n\t" + "mv s3, %[gcm_h]\n\t" + "mv s4, %[tmp]\n\t" + "mv s5, %[reg]\n\t" + "mv s6, %[nr]\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* X = 0; load H */ + /* vxor.vv v18, v18, v18 */ + ".word 0x2f290957\n\t" + "mv t0, %[gcm_h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "li t0, 12\n\t" + "bne %[nonceSz], t0, L_AES_GCM_decrypt_RISCV64_j0_ghash\n\t" + "mv t0, %[tmp]\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "ld t1, 0(%[nonce])\n\t" + "sd t1, 0(t0)\n\t" + "lw t1, 8(%[nonce])\n\t" + "sw t1, 8(t0)\n\t" + "li t1, 1\n\t" + "sb t1, 15(t0)\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + "j L_AES_GCM_decrypt_RISCV64_j0_done\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0_ghash:\n\t" + /* vxor.vv v16, v16, v16 */ + ".word 0x2f080857\n\t" + "srli t6, %[nonceSz], 4\n\t" + "beqz t6, L_AES_GCM_decrypt_RISCV64_j0_nblk_done\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0_nloop:\n\t" + "mv t0, %[nonce]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "addi %[nonce], %[nonce], 16\n\t" + "addi t6, t6, -1\n\t" + "bnez t6, L_AES_GCM_decrypt_RISCV64_j0_nloop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0_nblk_done:\n\t" + "andi t1, %[nonceSz], 15\n\t" + "beqz t1, L_AES_GCM_decrypt_RISCV64_j0_npad_done\n\t" + /* vxor.vv v17, v17, v17 */ + ".word 0x2f1888d7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v17, (t0) */ + ".word 0x028288a7\n\t" + "mv t3, t1\n\t" + "mv t0, %[tmp]\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0_n_load_byte:\n\t" + "lb t4, 0(%[nonce])\n\t" + "sb t4, 0(t0)\n\t" + "addi %[nonce], %[nonce], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_RISCV64_j0_n_load_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0_npad_done:\n\t" + /* Length block: 0^64 || nonceSz*8 (big-endian) */ + "mv t0, %[tmp]\n\t" + "sd zero, 0(t0)\n\t" + "slli t1, %[nonceSz], 3\n\t" + "srli t2, t1, 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, t1, 24\n\t" + "srli t4, t1, 16\n\t" + "srli t5, t1, 8\n\t" + "sh zero, 8(t0)\n\t" + "sb zero, 10(t0)\n\t" + "sb t2, 11(t0)\n\t" + "sb t3, 12(t0)\n\t" + "sb t4, 13(t0)\n\t" + "sb t5, 14(t0)\n\t" + "sb t1, 15(t0)\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0_done:\n\t" + /* GHASH the AAD */ + "beqz %[aadSz], L_AES_GCM_decrypt_RISCV64_aad_done\n\t" + "srli t1, %[aadSz], 4\n\t" + "beqz t1, L_AES_GCM_decrypt_RISCV64_aad_blocks_done\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_decrypt_RISCV64_aad_loop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_blocks_done:\n\t" + "andi t1, %[aadSz], 15\n\t" + "beqz t1, L_AES_GCM_decrypt_RISCV64_aad_done\n\t" + /* vxor.vv v17, v17, v17 */ + ".word 0x2f1888d7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v17, (t0) */ + ".word 0x028288a7\n\t" + "mv t3, t1\n\t" + "mv t0, %[tmp]\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_load_byte:\n\t" + "lb t4, 0(%[aad])\n\t" + "sb t4, 0(t0)\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_RISCV64_aad_load_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_done:\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + /* Host counter (lane 0) from J0 */ + /* vslidedown.vi v20, v16, 3 */ + ".word 0x3f01ba57\n\t" + /* vrev8.v v20, v20 */ + ".word 0x4b44aa57\n\t" + /* 4-block fast path (64-byte groups), then <64-byte tail below */ + "srli t6, %[sz], 6\n\t" + "beqz t6, L_AES_GCM_decrypt_RISCV64_x4_done\n\t" + /* Precompute H^2, H^3, H^4 (v21/v22/v23) */ + /* vmv.v.v v21, v19 */ + ".word 0x5e098ad7\n\t" + /* vmv.v.v v22, v19 */ + ".word 0x5e098b57\n\t" + /* vgmul.vv v21, v19 */ + ".word 0xa338aaf7\n\t" + /* vmv.v.v v23, v21 */ + ".word 0x5e0a8bd7\n\t" + /* vgmul.vv v22, v21 */ + ".word 0xa358ab77\n\t" + /* vgmul.vv v23, v21 */ + ".word 0xa358abf7\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_x4_loop:\n\t" + /* Next 4 counters from host counter v20 (lane 0), big-endian into lane 3 */ + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vmv.v.v v25, v16 */ + ".word 0x5e080cd7\n\t" + /* vmv.v.v v26, v16 */ + ".word 0x5e080d57\n\t" + /* vmv.v.v v27, v16 */ + ".word 0x5e080dd7\n\t" + /* vadd.vi v28, v20, 1 */ + ".word 0x0340be57\n\t" + /* vadd.vi v29, v20, 2 */ + ".word 0x03413ed7\n\t" + /* vadd.vi v30, v20, 3 */ + ".word 0x0341bf57\n\t" + /* vadd.vi v20, v20, 4 */ + ".word 0x03423a57\n\t" + /* vrev8.v v28, v28 */ + ".word 0x4bc4ae57\n\t" + /* vrev8.v v29, v29 */ + ".word 0x4bd4aed7\n\t" + /* vrev8.v v30, v30 */ + ".word 0x4be4af57\n\t" + /* vrev8.v v31, v20 */ + ".word 0x4b44afd7\n\t" + /* vslideup.vi v24, v28, 3 */ + ".word 0x3bc1bc57\n\t" + /* vslideup.vi v25, v29, 3 */ + ".word 0x3bd1bcd7\n\t" + /* vslideup.vi v26, v30, 3 */ + ".word 0x3be1bd57\n\t" + /* vslideup.vi v27, v31, 3 */ + ".word 0x3bf1bdd7\n\t" + /* Encrypt the 4 counter blocks (v24-v27) as one LMUL=4 group */ + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vaesz.vs v24, v0 */ + ".word 0xa603ac77\n\t" + /* vaesem.vs v24, v1 */ + ".word 0xa6112c77\n\t" + /* vaesem.vs v24, v2 */ + ".word 0xa6212c77\n\t" + /* vaesem.vs v24, v3 */ + ".word 0xa6312c77\n\t" + /* vaesem.vs v24, v4 */ + ".word 0xa6412c77\n\t" + /* vaesem.vs v24, v5 */ + ".word 0xa6512c77\n\t" + /* vaesem.vs v24, v6 */ + ".word 0xa6612c77\n\t" + /* vaesem.vs v24, v7 */ + ".word 0xa6712c77\n\t" + /* vaesem.vs v24, v8 */ + ".word 0xa6812c77\n\t" + /* vaesem.vs v24, v9 */ + ".word 0xa6912c77\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_x4aes_last\n\t" + /* vaesem.vs v24, v10 */ + ".word 0xa6a12c77\n\t" + /* vaesem.vs v24, v11 */ + ".word 0xa6b12c77\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_x4aes_last\n\t" + /* vaesem.vs v24, v12 */ + ".word 0xa6c12c77\n\t" + /* vaesem.vs v24, v13 */ + ".word 0xa6d12c77\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_x4aes_last:\n\t" + /* vaesef.vs v24, v14 */ + ".word 0xa6e1ac77\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl4re32.v v28, (t0) */ + ".word 0x6282ee07\n\t" + /* vxor.vv v24, v24, v28 */ + ".word 0x2fcc0c57\n\t" + /* vxor.vv v25, v25, v29 */ + ".word 0x2fdc8cd7\n\t" + /* vxor.vv v26, v26, v30 */ + ".word 0x2fed0d57\n\t" + /* vxor.vv v27, v27, v31 */ + ".word 0x2ffd8dd7\n\t" + "mv t0, %[out]\n\t" + /* vs4r.v v24, (t0) */ + ".word 0x62828c27\n\t" + /* Aggregated GHASH: X = (X^ct0)*H^4 ^ ct1*H^3 ^ ct2*H^2 ^ ct3*H */ + /* vxor.vv v28, v28, v18 */ + ".word 0x2f2e0e57\n\t" + /* vgmul.vv v28, v23 */ + ".word 0xa378ae77\n\t" + /* vgmul.vv v29, v22 */ + ".word 0xa368aef7\n\t" + /* vgmul.vv v30, v21 */ + ".word 0xa358af77\n\t" + /* vgmul.vv v31, v19 */ + ".word 0xa338aff7\n\t" + /* vxor.vv v18, v28, v29 */ + ".word 0x2fde0957\n\t" + /* vxor.vv v18, v18, v30 */ + ".word 0x2fe90957\n\t" + /* vxor.vv v18, v18, v31 */ + ".word 0x2ff90957\n\t" + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + "addi t6, t6, -1\n\t" + "bnez t6, L_AES_GCM_decrypt_RISCV64_x4_loop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_x4_done:\n\t" + /* m2 rung then single-block loop for the <64-byte remainder */ + "andi t6, %[sz], 63\n\t" + "srli t6, t6, 4\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_GCM_decrypt_RISCV64_after_m2\n\t" + /* 2-block group: counters v24/v25, m2 AES, 2-way GHASH */ + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vmv.v.v v25, v16 */ + ".word 0x5e080cd7\n\t" + /* vadd.vi v26, v20, 1 */ + ".word 0x0340bd57\n\t" + /* vadd.vi v20, v20, 2 */ + ".word 0x03413a57\n\t" + /* vrev8.v v26, v26 */ + ".word 0x4ba4ad57\n\t" + /* vrev8.v v27, v20 */ + ".word 0x4b44add7\n\t" + /* vslideup.vi v24, v26, 3 */ + ".word 0x3ba1bc57\n\t" + /* vslideup.vi v25, v27, 3 */ + ".word 0x3bb1bcd7\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vaesz.vs v24, v0 */ + ".word 0xa603ac77\n\t" + /* vaesem.vs v24, v1 */ + ".word 0xa6112c77\n\t" + /* vaesem.vs v24, v2 */ + ".word 0xa6212c77\n\t" + /* vaesem.vs v24, v3 */ + ".word 0xa6312c77\n\t" + /* vaesem.vs v24, v4 */ + ".word 0xa6412c77\n\t" + /* vaesem.vs v24, v5 */ + ".word 0xa6512c77\n\t" + /* vaesem.vs v24, v6 */ + ".word 0xa6612c77\n\t" + /* vaesem.vs v24, v7 */ + ".word 0xa6712c77\n\t" + /* vaesem.vs v24, v8 */ + ".word 0xa6812c77\n\t" + /* vaesem.vs v24, v9 */ + ".word 0xa6912c77\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_m2aes_last\n\t" + /* vaesem.vs v24, v10 */ + ".word 0xa6a12c77\n\t" + /* vaesem.vs v24, v11 */ + ".word 0xa6b12c77\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_m2aes_last\n\t" + /* vaesem.vs v24, v12 */ + ".word 0xa6c12c77\n\t" + /* vaesem.vs v24, v13 */ + ".word 0xa6d12c77\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_m2aes_last:\n\t" + /* vaesef.vs v24, v14 */ + ".word 0xa6e1ac77\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl2re32.v v26, (t0) */ + ".word 0x2282ed07\n\t" + /* vxor.vv v24, v24, v26 */ + ".word 0x2fac0c57\n\t" + /* vxor.vv v25, v25, v27 */ + ".word 0x2fbc8cd7\n\t" + "mv t0, %[out]\n\t" + /* vs2r.v v24, (t0) */ + ".word 0x22828c27\n\t" + /* vmv.v.v v28, v19 */ + ".word 0x5e098e57\n\t" + /* vgmul.vv v28, v19 */ + ".word 0xa338ae77\n\t" + /* vghsh.vv v26, v18, v28 */ + ".word 0xb3c92d77\n\t" + /* vgmul.vv v27, v19 */ + ".word 0xa338adf7\n\t" + /* vxor.vv v18, v26, v27 */ + ".word 0x2fbd0957\n\t" + "addi %[in], %[in], 32\n\t" + "addi %[out], %[out], 32\n\t" + "addi t6, t6, -2\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_after_m2:\n\t" + "beqz t6, L_AES_GCM_decrypt_RISCV64_blocks_done\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_loop:\n\t" + /* vadd.vi v20, v20, 1 */ + ".word 0x0340ba57\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + /* vaesz.vs v21, v0 */ + ".word 0xa603aaf7\n\t" + /* vaesem.vs v21, v1 */ + ".word 0xa6112af7\n\t" + /* vaesem.vs v21, v2 */ + ".word 0xa6212af7\n\t" + /* vaesem.vs v21, v3 */ + ".word 0xa6312af7\n\t" + /* vaesem.vs v21, v4 */ + ".word 0xa6412af7\n\t" + /* vaesem.vs v21, v5 */ + ".word 0xa6512af7\n\t" + /* vaesem.vs v21, v6 */ + ".word 0xa6612af7\n\t" + /* vaesem.vs v21, v7 */ + ".word 0xa6712af7\n\t" + /* vaesem.vs v21, v8 */ + ".word 0xa6812af7\n\t" + /* vaesem.vs v21, v9 */ + ".word 0xa6912af7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v10 */ + ".word 0xa6a12af7\n\t" + /* vaesem.vs v21, v11 */ + ".word 0xa6b12af7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v12 */ + ".word 0xa6c12af7\n\t" + /* vaesem.vs v21, v13 */ + ".word 0xa6d12af7\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aes_last:\n\t" + /* vaesef.vs v21, v14 */ + ".word 0xa6e1aaf7\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + /* vxor.vv v21, v21, v17 */ + ".word 0x2f1a8ad7\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi t6, t6, -1\n\t" + "bnez t6, L_AES_GCM_decrypt_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_blocks_done:\n\t" + /* Partial final block */ + "andi t1, %[sz], 15\n\t" + "beqz t1, L_AES_GCM_decrypt_RISCV64_partial_done\n\t" + /* vadd.vi v20, v20, 1 */ + ".word 0x0340ba57\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + /* vaesz.vs v21, v0 */ + ".word 0xa603aaf7\n\t" + /* vaesem.vs v21, v1 */ + ".word 0xa6112af7\n\t" + /* vaesem.vs v21, v2 */ + ".word 0xa6212af7\n\t" + /* vaesem.vs v21, v3 */ + ".word 0xa6312af7\n\t" + /* vaesem.vs v21, v4 */ + ".word 0xa6412af7\n\t" + /* vaesem.vs v21, v5 */ + ".word 0xa6512af7\n\t" + /* vaesem.vs v21, v6 */ + ".word 0xa6612af7\n\t" + /* vaesem.vs v21, v7 */ + ".word 0xa6712af7\n\t" + /* vaesem.vs v21, v8 */ + ".word 0xa6812af7\n\t" + /* vaesem.vs v21, v9 */ + ".word 0xa6912af7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_p_aes_last\n\t" + /* vaesem.vs v21, v10 */ + ".word 0xa6a12af7\n\t" + /* vaesem.vs v21, v11 */ + ".word 0xa6b12af7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_p_aes_last\n\t" + /* vaesem.vs v21, v12 */ + ".word 0xa6c12af7\n\t" + /* vaesem.vs v21, v13 */ + ".word 0xa6d12af7\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_p_aes_last:\n\t" + /* vaesef.vs v21, v14 */ + ".word 0xa6e1aaf7\n\t" + /* vxor.vv v17, v17, v17 */ + ".word 0x2f1888d7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v17, (t0) */ + ".word 0x028288a7\n\t" + "mv t3, t1\n\t" + "mv t0, %[tmp]\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_p_load_byte:\n\t" + "lb t4, 0(%[in])\n\t" + "sb t4, 0(t0)\n\t" + "addi %[in], %[in], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_RISCV64_p_load_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + /* vxor.vv v21, v21, v17 */ + ".word 0x2f1a8ad7\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + "mv t3, t1\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_p_store_byte:\n\t" + "lb t4, 0(t0)\n\t" + "sb t4, 0(%[out])\n\t" + "addi t0, t0, 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_RISCV64_p_store_byte\n\t" + "li t3, 16\n\t" + "sub t3, t3, t1\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_p_zero_byte:\n\t" + "sb zero, 0(t0)\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_RISCV64_p_zero_byte\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_partial_done:\n\t" + /* Hash in the lengths of AAD and ciphertext in bits (big-endian) */ + "mv t0, %[tmp]\n\t" + "slli %[aadSz], %[aadSz], 3\n\t" + "srli t2, %[aadSz], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[aadSz], 24\n\t" + "srli t4, %[aadSz], 16\n\t" + "srli t5, %[aadSz], 8\n\t" + "sh zero, 0(t0)\n\t" + "sb zero, 2(t0)\n\t" + "sb t2, 3(t0)\n\t" + "sb t3, 4(t0)\n\t" + "sb t4, 5(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb %[aadSz], 7(t0)\n\t" + "slli %[sz], %[sz], 3\n\t" + "srli t2, %[sz], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[sz], 24\n\t" + "srli t4, %[sz], 16\n\t" + "srli t5, %[sz], 8\n\t" + "sh zero, 8(t0)\n\t" + "sb zero, 10(t0)\n\t" + "sb t2, 11(t0)\n\t" + "sb t3, 12(t0)\n\t" + "sb t4, 13(t0)\n\t" + "sb t5, 14(t0)\n\t" + "sb %[sz], 15(t0)\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + /* tag = GHASH ^ E_K(J0) */ + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_tag_aes_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_RISCV64_tag_aes_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_tag_aes_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vxor.vv v18, v18, v16 */ + ".word 0x2f090957\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + /* Compare tagSz bytes; accumulate differences into t2 */ + "mv t0, %[tmp]\n\t" + "mv t3, %[tagSz]\n\t" + "xor t2, t2, t2\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_cmp_tag:\n\t" + "lbu t4, 0(t0)\n\t" + "lbu t5, 0(%[tag])\n\t" + "xor t5, t5, t4\n\t" + "or t2, t2, t5\n\t" + "addi t0, t0, 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_RISCV64_cmp_tag\n\t" + /* ret = (t2 != 0) ? -AES_GCM_AUTH_E (-180) : 0 */ + "negw t2, t2\n\t" + "sraiw t2, t2, 31\n\t" + "andi %[in], t2, -180\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), + [nonce] "+r" (nonce), [nonceSz] "+r" (nonceSz), [tag] "+r" (tag), + [tagSz] "+r" (tagSz), [aad] "+r" (aad), [aadSz] "+r" (aadSz), + [key] "+r" (key), [gcm_h] "+r" (gcm_h), [tmp] "+r" (tmp), + [reg] "+r" (reg), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s2", "s3", + "s4", "s5", "s6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); + return (word32)(size_t)in; +} + +#endif /* HAVE_AES_DECRYPT */ +#ifdef WOLFSSL_AESGCM_STREAM +void AES_GCM_init_RISCV64(const byte* key, int nr, const byte* nonce, + word32 nonceSz, byte* gcm_h, byte* counter, byte* initCtr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[gcm_h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_init_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_init_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_GCM_init_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "li t0, 12\n\t" + "bne %[nonceSz], t0, L_AES_GCM_init_RISCV64_j0_ghash\n\t" + "mv t0, %[counter]\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "ld t1, 0(%[nonce])\n\t" + "sd t1, 0(t0)\n\t" + "lw t1, 8(%[nonce])\n\t" + "sw t1, 8(t0)\n\t" + "li t1, 1\n\t" + "sb t1, 15(t0)\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + "j L_AES_GCM_init_RISCV64_j0_done\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0_ghash:\n\t" + /* vxor.vv v16, v16, v16 */ + ".word 0x2f080857\n\t" + "srli t6, %[nonceSz], 4\n\t" + "beqz t6, L_AES_GCM_init_RISCV64_j0_nblk_done\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0_nloop:\n\t" + "mv t0, %[nonce]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "addi %[nonce], %[nonce], 16\n\t" + "addi t6, t6, -1\n\t" + "bnez t6, L_AES_GCM_init_RISCV64_j0_nloop\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0_nblk_done:\n\t" + "andi t1, %[nonceSz], 15\n\t" + "beqz t1, L_AES_GCM_init_RISCV64_j0_npad_done\n\t" + /* vxor.vv v17, v17, v17 */ + ".word 0x2f1888d7\n\t" + "mv t0, %[counter]\n\t" + /* vs1r.v v17, (t0) */ + ".word 0x028288a7\n\t" + "mv t3, t1\n\t" + "mv t0, %[counter]\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0_n_load_byte:\n\t" + "lb t4, 0(%[nonce])\n\t" + "sb t4, 0(t0)\n\t" + "addi %[nonce], %[nonce], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_init_RISCV64_j0_n_load_byte\n\t" + "mv t0, %[counter]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0_npad_done:\n\t" + /* Length block: 0^64 || nonceSz*8 (big-endian) */ + "mv t0, %[counter]\n\t" + "sd zero, 0(t0)\n\t" + "slli t1, %[nonceSz], 3\n\t" + "srli t2, t1, 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, t1, 24\n\t" + "srli t4, t1, 16\n\t" + "srli t5, t1, 8\n\t" + "sh zero, 8(t0)\n\t" + "sb zero, 10(t0)\n\t" + "sb t2, 11(t0)\n\t" + "sb t3, 12(t0)\n\t" + "sb t4, 13(t0)\n\t" + "sb t5, 14(t0)\n\t" + "sb t1, 15(t0)\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v16, v17, v19 */ + ".word 0xb338a877\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0_done:\n\t" + "mv t0, %[counter]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_init_RISCV64_aes_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_init_RISCV64_aes_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_GCM_init_RISCV64_aes_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + "mv t0, %[initCtr]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [nonce] "+r" (nonce), + [nonceSz] "+r" (nonceSz), [gcm_h] "+r" (gcm_h), + [counter] "+r" (counter), [initCtr] "+r" (initCtr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +void AES_GCM_ghash_block_RISCV64(const byte* data, byte* tag, byte* gcm_h) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[tag]\n\t" + /* vl1re32.v v18, (t0) */ + ".word 0x0282e907\n\t" + "mv t0, %[gcm_h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "mv t0, %[data]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "mv t0, %[tag]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + : [data] "+r" (data), [tag] "+r" (tag), [gcm_h] "+r" (gcm_h) + : + : "memory", "t0" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +void AES_GCM_aad_update_RISCV64(const byte* addt, word32 abytes, byte* tag, + byte* h) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[tag]\n\t" + /* vl1re32.v v18, (t0) */ + ".word 0x0282e907\n\t" + "mv t0, %[h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "srli t1, %[abytes], 4\n\t" + "beqz t1, L_AES_GCM_aad_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_aad_update_RISCV64_loop:\n\t" + "mv t0, %[addt]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "addi %[addt], %[addt], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_aad_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_aad_update_RISCV64_done:\n\t" + "mv t0, %[tag]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + : [addt] "+r" (addt), [abytes] "+r" (abytes), [tag] "+r" (tag), + [h] "+r" (h) + : + : "memory", "t0", "t1" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +void AES_GCM_encrypt_block_RISCV64(const byte* key, int nr, byte* out, + const byte* in, byte* counter) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_block_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_block_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_GCM_encrypt_block_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "mv t0, %[counter]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vslidedown.vi v20, v16, 3 */ + ".word 0x3f01ba57\n\t" + /* vrev8.v v20, v20 */ + ".word 0x4b44aa57\n\t" + /* vadd.vi v20, v20, 1 */ + ".word 0x0340ba57\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + "mv t0, %[counter]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + /* vaesz.vs v21, v0 */ + ".word 0xa603aaf7\n\t" + /* vaesem.vs v21, v1 */ + ".word 0xa6112af7\n\t" + /* vaesem.vs v21, v2 */ + ".word 0xa6212af7\n\t" + /* vaesem.vs v21, v3 */ + ".word 0xa6312af7\n\t" + /* vaesem.vs v21, v4 */ + ".word 0xa6412af7\n\t" + /* vaesem.vs v21, v5 */ + ".word 0xa6512af7\n\t" + /* vaesem.vs v21, v6 */ + ".word 0xa6612af7\n\t" + /* vaesem.vs v21, v7 */ + ".word 0xa6712af7\n\t" + /* vaesem.vs v21, v8 */ + ".word 0xa6812af7\n\t" + /* vaesem.vs v21, v9 */ + ".word 0xa6912af7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_block_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v10 */ + ".word 0xa6a12af7\n\t" + /* vaesem.vs v21, v11 */ + ".word 0xa6b12af7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_block_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v12 */ + ".word 0xa6c12af7\n\t" + /* vaesem.vs v21, v13 */ + ".word 0xa6d12af7\n\t" + "\n" + "L_AES_GCM_encrypt_block_RISCV64_aes_last:\n\t" + /* vaesef.vs v21, v14 */ + ".word 0xa6e1aaf7\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vxor.vv v21, v21, v17 */ + ".word 0x2f1a8ad7\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [counter] "+r" (counter) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +void AES_GCM_encrypt_update_RISCV64(const byte* key, int nr, byte* out, + const byte* in, word32 nbytes, byte* tag, byte* h, byte* counter) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_update_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_update_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "mv t0, %[tag]\n\t" + /* vl1re32.v v18, (t0) */ + ".word 0x0282e907\n\t" + "mv t0, %[h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "mv t0, %[counter]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vslidedown.vi v20, v16, 3 */ + ".word 0x3f01ba57\n\t" + /* vrev8.v v20, v20 */ + ".word 0x4b44aa57\n\t" + "srli t1, %[nbytes], 4\n\t" + "beqz t1, L_AES_GCM_encrypt_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_loop:\n\t" + /* vadd.vi v20, v20, 1 */ + ".word 0x0340ba57\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + /* vaesz.vs v21, v0 */ + ".word 0xa603aaf7\n\t" + /* vaesem.vs v21, v1 */ + ".word 0xa6112af7\n\t" + /* vaesem.vs v21, v2 */ + ".word 0xa6212af7\n\t" + /* vaesem.vs v21, v3 */ + ".word 0xa6312af7\n\t" + /* vaesem.vs v21, v4 */ + ".word 0xa6412af7\n\t" + /* vaesem.vs v21, v5 */ + ".word 0xa6512af7\n\t" + /* vaesem.vs v21, v6 */ + ".word 0xa6612af7\n\t" + /* vaesem.vs v21, v7 */ + ".word 0xa6712af7\n\t" + /* vaesem.vs v21, v8 */ + ".word 0xa6812af7\n\t" + /* vaesem.vs v21, v9 */ + ".word 0xa6912af7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_update_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v10 */ + ".word 0xa6a12af7\n\t" + /* vaesem.vs v21, v11 */ + ".word 0xa6b12af7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_update_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v12 */ + ".word 0xa6c12af7\n\t" + /* vaesem.vs v21, v13 */ + ".word 0xa6d12af7\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_aes_last:\n\t" + /* vaesef.vs v21, v14 */ + ".word 0xa6e1aaf7\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vxor.vv v21, v21, v17 */ + ".word 0x2f1a8ad7\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + /* vghsh.vv v18, v21, v19 */ + ".word 0xb33aa977\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_encrypt_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_done:\n\t" + "mv t0, %[tag]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + "mv t0, %[counter]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [nbytes] "+r" (nbytes), [tag] "+r" (tag), [h] "+r" (h), + [counter] "+r" (counter) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +void AES_GCM_encrypt_final_RISCV64(byte* tag, byte* authTag, word32 tbytes, + word32 nbytes, word32 abytes, byte* h, byte* initCtr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[tag]\n\t" + /* vl1re32.v v18, (t0) */ + ".word 0x0282e907\n\t" + "mv t0, %[h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "mv t0, %[tag]\n\t" + "slli %[abytes], %[abytes], 3\n\t" + "srli t2, %[abytes], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[abytes], 24\n\t" + "srli t4, %[abytes], 16\n\t" + "srli t5, %[abytes], 8\n\t" + "sh zero, 0(t0)\n\t" + "sb zero, 2(t0)\n\t" + "sb t2, 3(t0)\n\t" + "sb t3, 4(t0)\n\t" + "sb t4, 5(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb %[abytes], 7(t0)\n\t" + "slli %[nbytes], %[nbytes], 3\n\t" + "srli t2, %[nbytes], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[nbytes], 24\n\t" + "srli t4, %[nbytes], 16\n\t" + "srli t5, %[nbytes], 8\n\t" + "sh zero, 8(t0)\n\t" + "sb zero, 10(t0)\n\t" + "sb t2, 11(t0)\n\t" + "sb t3, 12(t0)\n\t" + "sb t4, 13(t0)\n\t" + "sb t5, 14(t0)\n\t" + "sb %[nbytes], 15(t0)\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "mv t0, %[initCtr]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vxor.vv v18, v18, v16 */ + ".word 0x2f090957\n\t" + "mv t0, %[tag]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + "mv t0, %[tag]\n\t" + "mv t3, %[tbytes]\n\t" + "\n" + "L_AES_GCM_encrypt_final_RISCV64_store:\n\t" + "lb t4, 0(t0)\n\t" + "sb t4, 0(%[authTag])\n\t" + "addi t0, t0, 1\n\t" + "addi %[authTag], %[authTag], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_final_RISCV64_store\n\t" + : [tag] "+r" (tag), [authTag] "+r" (authTag), [tbytes] "+r" (tbytes), + [nbytes] "+r" (nbytes), [abytes] "+r" (abytes), [h] "+r" (h), + [initCtr] "+r" (initCtr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_GCM_decrypt_update_RISCV64(const byte* key, int nr, byte* out, + const byte* in, word32 nbytes, byte* tag, byte* h, byte* counter) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_update_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_update_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "mv t0, %[tag]\n\t" + /* vl1re32.v v18, (t0) */ + ".word 0x0282e907\n\t" + "mv t0, %[h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "mv t0, %[counter]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vslidedown.vi v20, v16, 3 */ + ".word 0x3f01ba57\n\t" + /* vrev8.v v20, v20 */ + ".word 0x4b44aa57\n\t" + "srli t1, %[nbytes], 4\n\t" + "beqz t1, L_AES_GCM_decrypt_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_loop:\n\t" + /* vadd.vi v20, v20, 1 */ + ".word 0x0340ba57\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + /* vaesz.vs v21, v0 */ + ".word 0xa603aaf7\n\t" + /* vaesem.vs v21, v1 */ + ".word 0xa6112af7\n\t" + /* vaesem.vs v21, v2 */ + ".word 0xa6212af7\n\t" + /* vaesem.vs v21, v3 */ + ".word 0xa6312af7\n\t" + /* vaesem.vs v21, v4 */ + ".word 0xa6412af7\n\t" + /* vaesem.vs v21, v5 */ + ".word 0xa6512af7\n\t" + /* vaesem.vs v21, v6 */ + ".word 0xa6612af7\n\t" + /* vaesem.vs v21, v7 */ + ".word 0xa6712af7\n\t" + /* vaesem.vs v21, v8 */ + ".word 0xa6812af7\n\t" + /* vaesem.vs v21, v9 */ + ".word 0xa6912af7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_update_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v10 */ + ".word 0xa6a12af7\n\t" + /* vaesem.vs v21, v11 */ + ".word 0xa6b12af7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_update_RISCV64_aes_last\n\t" + /* vaesem.vs v21, v12 */ + ".word 0xa6c12af7\n\t" + /* vaesem.vs v21, v13 */ + ".word 0xa6d12af7\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_aes_last:\n\t" + /* vaesef.vs v21, v14 */ + ".word 0xa6e1aaf7\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + /* vxor.vv v21, v21, v17 */ + ".word 0x2f1a8ad7\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_decrypt_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_done:\n\t" + "mv t0, %[tag]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + /* vrev8.v v17, v20 */ + ".word 0x4b44a8d7\n\t" + /* vmv.v.v v21, v16 */ + ".word 0x5e080ad7\n\t" + /* vslideup.vi v21, v17, 3 */ + ".word 0x3b11bad7\n\t" + "mv t0, %[counter]\n\t" + /* vs1r.v v21, (t0) */ + ".word 0x02828aa7\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [nbytes] "+r" (nbytes), [tag] "+r" (tag), [h] "+r" (h), + [counter] "+r" (counter) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +void AES_GCM_decrypt_final_RISCV64(byte* tag, const byte* authTag, + word32 tbytes, word32 nbytes, word32 abytes, byte* h, byte* initCtr, + int* res) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[tag]\n\t" + /* vl1re32.v v18, (t0) */ + ".word 0x0282e907\n\t" + "mv t0, %[h]\n\t" + /* vl1re32.v v19, (t0) */ + ".word 0x0282e987\n\t" + "mv t0, %[tag]\n\t" + "slli %[abytes], %[abytes], 3\n\t" + "srli t2, %[abytes], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[abytes], 24\n\t" + "srli t4, %[abytes], 16\n\t" + "srli t5, %[abytes], 8\n\t" + "sh zero, 0(t0)\n\t" + "sb zero, 2(t0)\n\t" + "sb t2, 3(t0)\n\t" + "sb t3, 4(t0)\n\t" + "sb t4, 5(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb %[abytes], 7(t0)\n\t" + "slli %[nbytes], %[nbytes], 3\n\t" + "srli t2, %[nbytes], 32\n\t" + "andi t2, t2, 7\n\t" + "srli t3, %[nbytes], 24\n\t" + "srli t4, %[nbytes], 16\n\t" + "srli t5, %[nbytes], 8\n\t" + "sh zero, 8(t0)\n\t" + "sb zero, 10(t0)\n\t" + "sb t2, 11(t0)\n\t" + "sb t3, 12(t0)\n\t" + "sb t4, 13(t0)\n\t" + "sb t5, 14(t0)\n\t" + "sb %[nbytes], 15(t0)\n\t" + /* vl1re32.v v17, (t0) */ + ".word 0x0282e887\n\t" + /* vghsh.vv v18, v17, v19 */ + ".word 0xb338a977\n\t" + "mv t0, %[initCtr]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vxor.vv v18, v18, v16 */ + ".word 0x2f090957\n\t" + "mv t0, %[tag]\n\t" + /* vs1r.v v18, (t0) */ + ".word 0x02828927\n\t" + /* Compare tagSz bytes; *res = (match) ? 1 : 0 */ + "mv t0, %[tag]\n\t" + "mv t3, %[tbytes]\n\t" + "xor t2, t2, t2\n\t" + "\n" + "L_AES_GCM_decrypt_final_RISCV64_cmp:\n\t" + "lbu t4, 0(t0)\n\t" + "lbu t5, 0(%[authTag])\n\t" + "xor t5, t5, t4\n\t" + "or t2, t2, t5\n\t" + "addi t0, t0, 1\n\t" + "addi %[authTag], %[authTag], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_final_RISCV64_cmp\n\t" + "sltiu t2, t2, 1\n\t" + "sw t2, 0(%[res])\n\t" + : [tag] "+r" (tag), [authTag] "+r" (authTag), [tbytes] "+r" (tbytes), + [nbytes] "+r" (nbytes), [abytes] "+r" (abytes), [h] "+r" (h), + [initCtr] "+r" (initCtr), [res] "+r" (res) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AESGCM_STREAM */ +#endif /* HAVE_AESGCM */ +#ifdef WOLFSSL_AES_XTS +void AES_XTS_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* tweak = AES_key2(i) */ + "mv t0, %[key2]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_k2_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_k2_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_k2_loaded:\n\t" + "addi t0, %[key2], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "mv t0, %[i]\n\t" + /* vl1re32.v v15, (t0) */ + ".word 0x0282e787\n\t" + /* vaesz.vs v15, v0 */ + ".word 0xa603a7f7\n\t" + /* vaesem.vs v15, v1 */ + ".word 0xa61127f7\n\t" + /* vaesem.vs v15, v2 */ + ".word 0xa62127f7\n\t" + /* vaesem.vs v15, v3 */ + ".word 0xa63127f7\n\t" + /* vaesem.vs v15, v4 */ + ".word 0xa64127f7\n\t" + /* vaesem.vs v15, v5 */ + ".word 0xa65127f7\n\t" + /* vaesem.vs v15, v6 */ + ".word 0xa66127f7\n\t" + /* vaesem.vs v15, v7 */ + ".word 0xa67127f7\n\t" + /* vaesem.vs v15, v8 */ + ".word 0xa68127f7\n\t" + /* vaesem.vs v15, v9 */ + ".word 0xa69127f7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_tw_aes_last\n\t" + /* vaesem.vs v15, v10 */ + ".word 0xa6a127f7\n\t" + /* vaesem.vs v15, v11 */ + ".word 0xa6b127f7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_tw_aes_last\n\t" + /* vaesem.vs v15, v12 */ + ".word 0xa6c127f7\n\t" + /* vaesem.vs v15, v13 */ + ".word 0xa6d127f7\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_tw_aes_last:\n\t" + /* vaesef.vs v15, v14 */ + ".word 0xa6e1a7f7\n\t" + /* Load data round keys */ + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "srli t3, %[sz], 4\n\t" + "andi %[sz], %[sz], 15\n\t" + /* Binary batch ladder m8->m4->m2->m1 (t5/t6 set before the loop as */ + /* xts_gf_mul clobbers t1-t4). */ + "srli t5, t3, 3\n\t" + "andi t6, t3, 7\n\t" + "beqz t5, L_AES_XTS_encrypt_RISCV64_after8\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_g8:\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v25, v24 */ + ".word 0x5e0c0cd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v25 */ + ".word 0x43902357\n\t" + /* vslidedown.vi v16, v25, 1 */ + ".word 0x3f90b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v25, t1 */ + ".word 0x42036cd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v25, v16, 1 */ + ".word 0x3b00bcd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v26, v25 */ + ".word 0x5e0c8d57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v26 */ + ".word 0x43a02357\n\t" + /* vslidedown.vi v16, v26, 1 */ + ".word 0x3fa0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v26, t1 */ + ".word 0x42036d57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v26, v16, 1 */ + ".word 0x3b00bd57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v27, v26 */ + ".word 0x5e0d0dd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v27 */ + ".word 0x43b02357\n\t" + /* vslidedown.vi v16, v27, 1 */ + ".word 0x3fb0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v27, t1 */ + ".word 0x42036dd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v27, v16, 1 */ + ".word 0x3b00bdd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v28, v27 */ + ".word 0x5e0d8e57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v28 */ + ".word 0x43c02357\n\t" + /* vslidedown.vi v16, v28, 1 */ + ".word 0x3fc0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v28, t1 */ + ".word 0x42036e57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v28, v16, 1 */ + ".word 0x3b00be57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v29, v28 */ + ".word 0x5e0e0ed7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v29 */ + ".word 0x43d02357\n\t" + /* vslidedown.vi v16, v29, 1 */ + ".word 0x3fd0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v29, t1 */ + ".word 0x42036ed7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v29, v16, 1 */ + ".word 0x3b00bed7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v30, v29 */ + ".word 0x5e0e8f57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v30 */ + ".word 0x43e02357\n\t" + /* vslidedown.vi v16, v30, 1 */ + ".word 0x3fe0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v30, t1 */ + ".word 0x42036f57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v30, v16, 1 */ + ".word 0x3b00bf57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v31, v30 */ + ".word 0x5e0f0fd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v31 */ + ".word 0x43f02357\n\t" + /* vslidedown.vi v16, v31, 1 */ + ".word 0x3ff0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v31, t1 */ + ".word 0x42036fd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v31, v16, 1 */ + ".word 0x3b00bfd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v15, v31 */ + ".word 0x5e0f87d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl8re32.v v16, (t0) */ + ".word 0xe282e807\n\t" + "li t4, 32\n\t" + /* vsetvli zero, t4, e32, m8, ta, ma */ + ".word 0x0d3ef057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g8_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g8_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_g8_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs8r.v v16, (t0) */ + ".word 0xe2828827\n\t" + "addi %[in], %[in], 128\n\t" + "addi %[out], %[out], 128\n\t" + "addi t5, t5, -1\n\t" + "bnez t5, L_AES_XTS_encrypt_RISCV64_g8\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_after8:\n\t" + "andi t5, t6, 4\n\t" + "beqz t5, L_AES_XTS_encrypt_RISCV64_after4\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v25, v24 */ + ".word 0x5e0c0cd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v25 */ + ".word 0x43902357\n\t" + /* vslidedown.vi v16, v25, 1 */ + ".word 0x3f90b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v25, t1 */ + ".word 0x42036cd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v25, v16, 1 */ + ".word 0x3b00bcd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v26, v25 */ + ".word 0x5e0c8d57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v26 */ + ".word 0x43a02357\n\t" + /* vslidedown.vi v16, v26, 1 */ + ".word 0x3fa0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v26, t1 */ + ".word 0x42036d57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v26, v16, 1 */ + ".word 0x3b00bd57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v27, v26 */ + ".word 0x5e0d0dd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v27 */ + ".word 0x43b02357\n\t" + /* vslidedown.vi v16, v27, 1 */ + ".word 0x3fb0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v27, t1 */ + ".word 0x42036dd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v27, v16, 1 */ + ".word 0x3b00bdd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v15, v27 */ + ".word 0x5e0d87d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl4re32.v v16, (t0) */ + ".word 0x6282e807\n\t" + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g4_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g4_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_g4_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs4r.v v16, (t0) */ + ".word 0x62828827\n\t" + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_after4:\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_XTS_encrypt_RISCV64_after2\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v25, v24 */ + ".word 0x5e0c0cd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v25 */ + ".word 0x43902357\n\t" + /* vslidedown.vi v16, v25, 1 */ + ".word 0x3f90b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v25, t1 */ + ".word 0x42036cd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v25, v16, 1 */ + ".word 0x3b00bcd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v15, v25 */ + ".word 0x5e0c87d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl2re32.v v16, (t0) */ + ".word 0x2282e807\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g2_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g2_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_g2_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs2r.v v16, (t0) */ + ".word 0x22828827\n\t" + "addi %[in], %[in], 32\n\t" + "addi %[out], %[out], 32\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_after2:\n\t" + "andi t5, t6, 1\n\t" + "beqz t5, L_AES_XTS_encrypt_RISCV64_blocks_done\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v15, v24 */ + ".word 0x5e0c07d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g1_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_g1_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_g1_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_blocks_done:\n\t" + /* Ciphertext stealing for the final partial block */ + "beqz %[sz], L_AES_XTS_encrypt_RISCV64_done\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "addi t0, %[out], -16\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "mv t1, %[sz]\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_byte:\n\t" + "lbu t2, 0(%[tmp])\n\t" + "lbu t3, 0(%[in])\n\t" + "sb t2, 0(%[out])\n\t" + "sb t3, 0(%[tmp])\n\t" + "addi %[tmp], %[tmp], 1\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_XTS_encrypt_RISCV64_byte\n\t" + "sub %[out], %[out], %[sz]\n\t" + "addi %[out], %[out], -16\n\t" + "sub %[tmp], %[tmp], %[sz]\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_cts_aes_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_encrypt_RISCV64_cts_aes_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_cts_aes_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [i] "+r" (i), + [key] "+r" (key), [key2] "+r" (key2), [tmp] "+r" (tmp), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_XTS_decrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* tweak = AES_key2(i) */ + "mv t0, %[key2]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_k2_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_k2_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_k2_loaded:\n\t" + "addi t0, %[key2], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "mv t0, %[i]\n\t" + /* vl1re32.v v15, (t0) */ + ".word 0x0282e787\n\t" + /* vaesz.vs v15, v0 */ + ".word 0xa603a7f7\n\t" + /* vaesem.vs v15, v1 */ + ".word 0xa61127f7\n\t" + /* vaesem.vs v15, v2 */ + ".word 0xa62127f7\n\t" + /* vaesem.vs v15, v3 */ + ".word 0xa63127f7\n\t" + /* vaesem.vs v15, v4 */ + ".word 0xa64127f7\n\t" + /* vaesem.vs v15, v5 */ + ".word 0xa65127f7\n\t" + /* vaesem.vs v15, v6 */ + ".word 0xa66127f7\n\t" + /* vaesem.vs v15, v7 */ + ".word 0xa67127f7\n\t" + /* vaesem.vs v15, v8 */ + ".word 0xa68127f7\n\t" + /* vaesem.vs v15, v9 */ + ".word 0xa69127f7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_tw_aes_last\n\t" + /* vaesem.vs v15, v10 */ + ".word 0xa6a127f7\n\t" + /* vaesem.vs v15, v11 */ + ".word 0xa6b127f7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_tw_aes_last\n\t" + /* vaesem.vs v15, v12 */ + ".word 0xa6c127f7\n\t" + /* vaesem.vs v15, v13 */ + ".word 0xa6d127f7\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_tw_aes_last:\n\t" + /* vaesef.vs v15, v14 */ + ".word 0xa6e1a7f7\n\t" + /* Load data (inverse) round keys */ + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "srli t3, %[sz], 4\n\t" + "andi %[sz], %[sz], 15\n\t" + /* With a partial block, leave the last full block for stealing */ + "beqz %[sz], L_AES_XTS_decrypt_RISCV64_no_steal\n\t" + "addi t3, t3, -1\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_no_steal:\n\t" + /* Binary batch ladder m8->m4->m2->m1 (t5/t6 before loop). */ + "srli t5, t3, 3\n\t" + "andi t6, t3, 7\n\t" + "beqz t5, L_AES_XTS_decrypt_RISCV64_after8\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_g8:\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v25, v24 */ + ".word 0x5e0c0cd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v25 */ + ".word 0x43902357\n\t" + /* vslidedown.vi v16, v25, 1 */ + ".word 0x3f90b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v25, t1 */ + ".word 0x42036cd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v25, v16, 1 */ + ".word 0x3b00bcd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v26, v25 */ + ".word 0x5e0c8d57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v26 */ + ".word 0x43a02357\n\t" + /* vslidedown.vi v16, v26, 1 */ + ".word 0x3fa0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v26, t1 */ + ".word 0x42036d57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v26, v16, 1 */ + ".word 0x3b00bd57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v27, v26 */ + ".word 0x5e0d0dd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v27 */ + ".word 0x43b02357\n\t" + /* vslidedown.vi v16, v27, 1 */ + ".word 0x3fb0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v27, t1 */ + ".word 0x42036dd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v27, v16, 1 */ + ".word 0x3b00bdd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v28, v27 */ + ".word 0x5e0d8e57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v28 */ + ".word 0x43c02357\n\t" + /* vslidedown.vi v16, v28, 1 */ + ".word 0x3fc0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v28, t1 */ + ".word 0x42036e57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v28, v16, 1 */ + ".word 0x3b00be57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v29, v28 */ + ".word 0x5e0e0ed7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v29 */ + ".word 0x43d02357\n\t" + /* vslidedown.vi v16, v29, 1 */ + ".word 0x3fd0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v29, t1 */ + ".word 0x42036ed7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v29, v16, 1 */ + ".word 0x3b00bed7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v30, v29 */ + ".word 0x5e0e8f57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v30 */ + ".word 0x43e02357\n\t" + /* vslidedown.vi v16, v30, 1 */ + ".word 0x3fe0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v30, t1 */ + ".word 0x42036f57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v30, v16, 1 */ + ".word 0x3b00bf57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v31, v30 */ + ".word 0x5e0f0fd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v31 */ + ".word 0x43f02357\n\t" + /* vslidedown.vi v16, v31, 1 */ + ".word 0x3ff0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v31, t1 */ + ".word 0x42036fd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v31, v16, 1 */ + ".word 0x3b00bfd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v15, v31 */ + ".word 0x5e0f87d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl8re32.v v16, (t0) */ + ".word 0xe282e807\n\t" + "li t4, 32\n\t" + /* vsetvli zero, t4, e32, m8, ta, ma */ + ".word 0x0d3ef057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g8_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g8_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_g8_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs8r.v v16, (t0) */ + ".word 0xe2828827\n\t" + "addi %[in], %[in], 128\n\t" + "addi %[out], %[out], 128\n\t" + "addi t5, t5, -1\n\t" + "bnez t5, L_AES_XTS_decrypt_RISCV64_g8\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_after8:\n\t" + "andi t5, t6, 4\n\t" + "beqz t5, L_AES_XTS_decrypt_RISCV64_after4\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v25, v24 */ + ".word 0x5e0c0cd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v25 */ + ".word 0x43902357\n\t" + /* vslidedown.vi v16, v25, 1 */ + ".word 0x3f90b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v25, t1 */ + ".word 0x42036cd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v25, v16, 1 */ + ".word 0x3b00bcd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v26, v25 */ + ".word 0x5e0c8d57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v26 */ + ".word 0x43a02357\n\t" + /* vslidedown.vi v16, v26, 1 */ + ".word 0x3fa0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v26, t1 */ + ".word 0x42036d57\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v26, v16, 1 */ + ".word 0x3b00bd57\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v27, v26 */ + ".word 0x5e0d0dd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v27 */ + ".word 0x43b02357\n\t" + /* vslidedown.vi v16, v27, 1 */ + ".word 0x3fb0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v27, t1 */ + ".word 0x42036dd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v27, v16, 1 */ + ".word 0x3b00bdd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v15, v27 */ + ".word 0x5e0d87d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl4re32.v v16, (t0) */ + ".word 0x6282e807\n\t" + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g4_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g4_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_g4_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs4r.v v16, (t0) */ + ".word 0x62828827\n\t" + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_after4:\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_XTS_decrypt_RISCV64_after2\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v25, v24 */ + ".word 0x5e0c0cd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v25 */ + ".word 0x43902357\n\t" + /* vslidedown.vi v16, v25, 1 */ + ".word 0x3f90b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v25, t1 */ + ".word 0x42036cd7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v25, v16, 1 */ + ".word 0x3b00bcd7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v15, v25 */ + ".word 0x5e0c87d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl2re32.v v16, (t0) */ + ".word 0x2282e807\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g2_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g2_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_g2_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs2r.v v16, (t0) */ + ".word 0x22828827\n\t" + "addi %[in], %[in], 32\n\t" + "addi %[out], %[out], 32\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_after2:\n\t" + "andi t5, t6, 1\n\t" + "beqz t5, L_AES_XTS_decrypt_RISCV64_blocks_done\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v15 */ + ".word 0x5e078c57\n\t" + /* vmv.v.v v15, v24 */ + ".word 0x5e0c07d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v16, v15, 1 */ + ".word 0x3ef0b857\n\t" + /* vmv.x.s t2, v16 */ + ".word 0x430023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v16, t2 */ + ".word 0x4203e857\n\t" + /* vslideup.vi v15, v16, 1 */ + ".word 0x3b00b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g1_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_g1_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_g1_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_blocks_done:\n\t" + "beqz %[sz], L_AES_XTS_decrypt_RISCV64_done\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* CTS: decrypt last full block with the NEXT tweak */ + /* vmv.v.v v18, v15 */ + ".word 0x5e078957\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vmv.x.s t1, v15 */ + ".word 0x42f02357\n\t" + /* vslidedown.vi v17, v15, 1 */ + ".word 0x3ef0b8d7\n\t" + /* vmv.x.s t2, v17 */ + ".word 0x431023d7\n\t" + "srli t3, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "srli t4, t1, 63\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t3, t3\n\t" + "and t4, t4, t3\n\t" + "xor t1, t1, t4\n\t" + /* vmv.s.x v15, t1 */ + ".word 0x420367d7\n\t" + /* vmv.s.x v17, t2 */ + ".word 0x4203e8d7\n\t" + /* vslideup.vi v15, v17, 1 */ + ".word 0x3b10b7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + "addi %[in], %[in], 16\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_cts1_aes_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_cts1_aes_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_cts1_aes_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "addi %[out], %[out], 16\n\t" + "mv t1, %[sz]\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_byte:\n\t" + "lbu t2, 0(%[tmp])\n\t" + "lbu t3, 0(%[in])\n\t" + "sb t2, 0(%[out])\n\t" + "sb t3, 0(%[tmp])\n\t" + "addi %[tmp], %[tmp], 1\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_XTS_decrypt_RISCV64_byte\n\t" + "sub %[out], %[out], %[sz]\n\t" + "addi %[out], %[out], -16\n\t" + "sub %[tmp], %[tmp], %[sz]\n\t" + "mv t0, %[tmp]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + /* vxor.vv v16, v16, v18 */ + ".word 0x2f280857\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_cts2_aes_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_XTS_decrypt_RISCV64_cts2_aes_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_cts2_aes_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vxor.vv v16, v16, v18 */ + ".word 0x2f280857\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [i] "+r" (i), + [key] "+r" (key), [key2] "+r" (key2), [tmp] "+r" (tmp), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_XTS */ +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || \ + defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || \ + defined(HAVE_AES_CBC) +void AES_encrypt_RISCV64(const byte* in, byte* out, byte* key, int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_encrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v15, (t0) */ + ".word 0x0282e787\n\t" + /* vaesz.vs v15, v0 */ + ".word 0xa603a7f7\n\t" + /* vaesem.vs v15, v1 */ + ".word 0xa61127f7\n\t" + /* vaesem.vs v15, v2 */ + ".word 0xa62127f7\n\t" + /* vaesem.vs v15, v3 */ + ".word 0xa63127f7\n\t" + /* vaesem.vs v15, v4 */ + ".word 0xa64127f7\n\t" + /* vaesem.vs v15, v5 */ + ".word 0xa65127f7\n\t" + /* vaesem.vs v15, v6 */ + ".word 0xa66127f7\n\t" + /* vaesem.vs v15, v7 */ + ".word 0xa67127f7\n\t" + /* vaesem.vs v15, v8 */ + ".word 0xa68127f7\n\t" + /* vaesem.vs v15, v9 */ + ".word 0xa69127f7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_encrypt_RISCV64_last\n\t" + /* vaesem.vs v15, v10 */ + ".word 0xa6a127f7\n\t" + /* vaesem.vs v15, v11 */ + ".word 0xa6b127f7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_encrypt_RISCV64_last\n\t" + /* vaesem.vs v15, v12 */ + ".word 0xa6c127f7\n\t" + /* vaesem.vs v15, v13 */ + ".word 0xa6d127f7\n\t" + "\n" + "L_AES_encrypt_RISCV64_last:\n\t" + /* vaesef.vs v15, v14 */ + ".word 0xa6e1a7f7\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v15, (t0) */ + ".word 0x028287a7\n\t" + : [in] "+r" (in), [out] "+r" (out), [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t4" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_decrypt_RISCV64(const byte* in, byte* out, byte* key, int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_decrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "mv t0, %[in]\n\t" + /* vl1re32.v v15, (t0) */ + ".word 0x0282e787\n\t" + /* vaesz.vs v15, v0 */ + ".word 0xa603a7f7\n\t" + /* vaesdm.vs v15, v1 */ + ".word 0xa61027f7\n\t" + /* vaesdm.vs v15, v2 */ + ".word 0xa62027f7\n\t" + /* vaesdm.vs v15, v3 */ + ".word 0xa63027f7\n\t" + /* vaesdm.vs v15, v4 */ + ".word 0xa64027f7\n\t" + /* vaesdm.vs v15, v5 */ + ".word 0xa65027f7\n\t" + /* vaesdm.vs v15, v6 */ + ".word 0xa66027f7\n\t" + /* vaesdm.vs v15, v7 */ + ".word 0xa67027f7\n\t" + /* vaesdm.vs v15, v8 */ + ".word 0xa68027f7\n\t" + /* vaesdm.vs v15, v9 */ + ".word 0xa69027f7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_decrypt_RISCV64_last\n\t" + /* vaesdm.vs v15, v10 */ + ".word 0xa6a027f7\n\t" + /* vaesdm.vs v15, v11 */ + ".word 0xa6b027f7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_decrypt_RISCV64_last\n\t" + /* vaesdm.vs v15, v12 */ + ".word 0xa6c027f7\n\t" + /* vaesdm.vs v15, v13 */ + ".word 0xa6d027f7\n\t" + "\n" + "L_AES_decrypt_RISCV64_last:\n\t" + /* vaesdf.vs v15, v14 */ + ".word 0xa6e0a7f7\n\t" + "mv t0, %[out]\n\t" + /* vs1r.v v15, (t0) */ + ".word 0x028287a7\n\t" + : [in] "+r" (in), [out] "+r" (out), [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t4" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || + * WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#ifdef HAVE_AES_ECB +void AES_encrypt_blocks_RISCV64(const byte* in, byte* out, word32 sz, byte* key, + int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "srli t3, %[sz], 4\n\t" + "mv t1, %[in]\n\t" + "mv t2, %[out]\n\t" + /* m8 main loop: 8 blocks per pass via an LMUL=8 register group. */ + "srli t5, t3, 3\n\t" + "beqz t5, L_AES_encrypt_blocks_RISCV64_after8\n\t" + "li t4, 32\n\t" + /* vsetvli zero, t4, e32, m8, ta, ma */ + ".word 0x0d3ef057\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_g8:\n\t" + /* vl8re32.v v16, (t1) */ + ".word 0xe2836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g8_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g8_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_g8_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vs8r.v v16, (t2) */ + ".word 0xe2838827\n\t" + "addi t1, t1, 128\n\t" + "addi t2, t2, 128\n\t" + "addi t5, t5, -1\n\t" + "bnez t5, L_AES_encrypt_blocks_RISCV64_g8\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_after8:\n\t" + "andi t6, t3, 7\n\t" + /* Binary remainder: one m4, then m2, then m1 as the bits require. */ + "andi t5, t6, 4\n\t" + "beqz t5, L_AES_encrypt_blocks_RISCV64_after4\n\t" + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vl4re32.v v16, (t1) */ + ".word 0x62836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g4_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g4_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_g4_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vs4r.v v16, (t2) */ + ".word 0x62838827\n\t" + "addi t1, t1, 64\n\t" + "addi t2, t2, 64\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_after4:\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_encrypt_blocks_RISCV64_after2\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vl2re32.v v16, (t1) */ + ".word 0x22836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g2_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g2_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_g2_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vs2r.v v16, (t2) */ + ".word 0x22838827\n\t" + "addi t1, t1, 32\n\t" + "addi t2, t2, 32\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_after2:\n\t" + "andi t5, t6, 1\n\t" + "beqz t5, L_AES_encrypt_blocks_RISCV64_done\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vl1re32.v v16, (t1) */ + ".word 0x02836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g1_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_encrypt_blocks_RISCV64_g1_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_g1_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vs1r.v v16, (t2) */ + ".word 0x02838827\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [key] "+r" (key), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_decrypt_blocks_RISCV64(const byte* in, byte* out, word32 sz, byte* key, + int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + "srli t3, %[sz], 4\n\t" + "mv t1, %[in]\n\t" + "mv t2, %[out]\n\t" + /* m8 main loop: 8 blocks per pass via an LMUL=8 register group. */ + "srli t5, t3, 3\n\t" + "beqz t5, L_AES_decrypt_blocks_RISCV64_after8\n\t" + "li t4, 32\n\t" + /* vsetvli zero, t4, e32, m8, ta, ma */ + ".word 0x0d3ef057\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_g8:\n\t" + /* vl8re32.v v16, (t1) */ + ".word 0xe2836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g8_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g8_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_g8_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vs8r.v v16, (t2) */ + ".word 0xe2838827\n\t" + "addi t1, t1, 128\n\t" + "addi t2, t2, 128\n\t" + "addi t5, t5, -1\n\t" + "bnez t5, L_AES_decrypt_blocks_RISCV64_g8\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_after8:\n\t" + "andi t6, t3, 7\n\t" + /* Binary remainder: one m4, then m2, then m1 as the bits require. */ + "andi t5, t6, 4\n\t" + "beqz t5, L_AES_decrypt_blocks_RISCV64_after4\n\t" + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vl4re32.v v16, (t1) */ + ".word 0x62836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g4_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g4_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_g4_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vs4r.v v16, (t2) */ + ".word 0x62838827\n\t" + "addi t1, t1, 64\n\t" + "addi t2, t2, 64\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_after4:\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_decrypt_blocks_RISCV64_after2\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vl2re32.v v16, (t1) */ + ".word 0x22836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g2_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g2_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_g2_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vs2r.v v16, (t2) */ + ".word 0x22838827\n\t" + "addi t1, t1, 32\n\t" + "addi t2, t2, 32\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_after2:\n\t" + "andi t5, t6, 1\n\t" + "beqz t5, L_AES_decrypt_blocks_RISCV64_done\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vl1re32.v v16, (t1) */ + ".word 0x02836807\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g1_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_decrypt_blocks_RISCV64_g1_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_g1_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vs1r.v v16, (t2) */ + ".word 0x02838827\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [key] "+r" (key), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_ECB */ +#ifdef HAVE_AES_CBC +void AES_CBC_encrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CBC_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CBC_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + /* Load the IV. */ + "mv t0, %[reg]\n\t" + /* vl1re32.v v16, (t0) */ + ".word 0x0282e807\n\t" + "srli t3, %[sz], 4\n\t" + "mv t1, %[in]\n\t" + "mv t2, %[out]\n\t" + "beqz t3, L_AES_CBC_encrypt_RISCV64_done\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_loop:\n\t" + /* Load input and chain with previous block. */ + /* vl1re32.v v15, (t1) */ + ".word 0x02836787\n\t" + /* vxor.vv v15, v15, v16 */ + ".word 0x2f0787d7\n\t" + /* vaesz.vs v15, v0 */ + ".word 0xa603a7f7\n\t" + /* vaesem.vs v15, v1 */ + ".word 0xa61127f7\n\t" + /* vaesem.vs v15, v2 */ + ".word 0xa62127f7\n\t" + /* vaesem.vs v15, v3 */ + ".word 0xa63127f7\n\t" + /* vaesem.vs v15, v4 */ + ".word 0xa64127f7\n\t" + /* vaesem.vs v15, v5 */ + ".word 0xa65127f7\n\t" + /* vaesem.vs v15, v6 */ + ".word 0xa66127f7\n\t" + /* vaesem.vs v15, v7 */ + ".word 0xa67127f7\n\t" + /* vaesem.vs v15, v8 */ + ".word 0xa68127f7\n\t" + /* vaesem.vs v15, v9 */ + ".word 0xa69127f7\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CBC_encrypt_RISCV64_last\n\t" + /* vaesem.vs v15, v10 */ + ".word 0xa6a127f7\n\t" + /* vaesem.vs v15, v11 */ + ".word 0xa6b127f7\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CBC_encrypt_RISCV64_last\n\t" + /* vaesem.vs v15, v12 */ + ".word 0xa6c127f7\n\t" + /* vaesem.vs v15, v13 */ + ".word 0xa6d127f7\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_last:\n\t" + /* vaesef.vs v15, v14 */ + ".word 0xa6e1a7f7\n\t" + /* vs1r.v v15, (t2) */ + ".word 0x028387a7\n\t" + /* vmv.v.v v16, v15 */ + ".word 0x5e078857\n\t" + "addi t1, t1, 16\n\t" + "addi t2, t2, 16\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_CBC_encrypt_RISCV64_loop\n\t" + /* Store the IV. */ + "mv t0, %[reg]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_CBC_decrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + /* Load the IV (running chaining value) into v15. */ + "mv t0, %[reg]\n\t" + /* vl1re32.v v15, (t0) */ + ".word 0x0282e787\n\t" + "srli t3, %[sz], 4\n\t" + "mv t1, %[in]\n\t" + "mv t2, %[out]\n\t" + /* Binary batch ladder m8->m4->m2->m1. */ + "srli t5, t3, 3\n\t" + "beqz t5, L_AES_CBC_decrypt_RISCV64_after8\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_g8:\n\t" + /* vl8re32.v v16, (t1) */ + ".word 0xe2836807\n\t" + "li t4, 32\n\t" + /* vsetvli zero, t4, e32, m8, ta, ma */ + ".word 0x0d3ef057\n\t" + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g8_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g8_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_g8_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + /* vxor.vv v17, v17, v24 */ + ".word 0x2f8888d7\n\t" + /* vxor.vv v18, v18, v25 */ + ".word 0x2f990957\n\t" + /* vxor.vv v19, v19, v26 */ + ".word 0x2fa989d7\n\t" + /* vxor.vv v20, v20, v27 */ + ".word 0x2fba0a57\n\t" + /* vxor.vv v21, v21, v28 */ + ".word 0x2fca8ad7\n\t" + /* vxor.vv v22, v22, v29 */ + ".word 0x2fdb0b57\n\t" + /* vxor.vv v23, v23, v30 */ + ".word 0x2feb8bd7\n\t" + /* vmv.v.v v15, v31 */ + ".word 0x5e0f87d7\n\t" + /* vs8r.v v16, (t2) */ + ".word 0xe2838827\n\t" + "addi t1, t1, 128\n\t" + "addi t2, t2, 128\n\t" + "addi t5, t5, -1\n\t" + "bnez t5, L_AES_CBC_decrypt_RISCV64_g8\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_after8:\n\t" + "andi t6, t3, 7\n\t" + "andi t5, t6, 4\n\t" + "beqz t5, L_AES_CBC_decrypt_RISCV64_after4\n\t" + /* vl4re32.v v16, (t1) */ + ".word 0x62836807\n\t" + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g4_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g4_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_g4_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + /* vxor.vv v17, v17, v24 */ + ".word 0x2f8888d7\n\t" + /* vxor.vv v18, v18, v25 */ + ".word 0x2f990957\n\t" + /* vxor.vv v19, v19, v26 */ + ".word 0x2fa989d7\n\t" + /* vmv.v.v v15, v27 */ + ".word 0x5e0d87d7\n\t" + /* vs4r.v v16, (t2) */ + ".word 0x62838827\n\t" + "addi t1, t1, 64\n\t" + "addi t2, t2, 64\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_after4:\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_CBC_decrypt_RISCV64_after2\n\t" + /* vl2re32.v v16, (t1) */ + ".word 0x22836807\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g2_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g2_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_g2_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + /* vxor.vv v17, v17, v24 */ + ".word 0x2f8888d7\n\t" + /* vmv.v.v v15, v25 */ + ".word 0x5e0c87d7\n\t" + /* vs2r.v v16, (t2) */ + ".word 0x22838827\n\t" + "addi t1, t1, 32\n\t" + "addi t2, t2, 32\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_after2:\n\t" + "andi t5, t6, 1\n\t" + "beqz t5, L_AES_CBC_decrypt_RISCV64_done\n\t" + /* vl1re32.v v16, (t1) */ + ".word 0x02836807\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v24, v16 */ + ".word 0x5e080c57\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesdm.vs v16, v1 */ + ".word 0xa6102877\n\t" + /* vaesdm.vs v16, v2 */ + ".word 0xa6202877\n\t" + /* vaesdm.vs v16, v3 */ + ".word 0xa6302877\n\t" + /* vaesdm.vs v16, v4 */ + ".word 0xa6402877\n\t" + /* vaesdm.vs v16, v5 */ + ".word 0xa6502877\n\t" + /* vaesdm.vs v16, v6 */ + ".word 0xa6602877\n\t" + /* vaesdm.vs v16, v7 */ + ".word 0xa6702877\n\t" + /* vaesdm.vs v16, v8 */ + ".word 0xa6802877\n\t" + /* vaesdm.vs v16, v9 */ + ".word 0xa6902877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g1_last\n\t" + /* vaesdm.vs v16, v10 */ + ".word 0xa6a02877\n\t" + /* vaesdm.vs v16, v11 */ + ".word 0xa6b02877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CBC_decrypt_RISCV64_g1_last\n\t" + /* vaesdm.vs v16, v12 */ + ".word 0xa6c02877\n\t" + /* vaesdm.vs v16, v13 */ + ".word 0xa6d02877\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_g1_last:\n\t" + /* vaesdf.vs v16, v14 */ + ".word 0xa6e0a877\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vxor.vv v16, v16, v15 */ + ".word 0x2ef80857\n\t" + /* vmv.v.v v15, v24 */ + ".word 0x5e0c07d7\n\t" + /* vs1r.v v16, (t2) */ + ".word 0x02838827\n\t" + "addi t1, t1, 16\n\t" + "addi t2, t2, 16\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_done:\n\t" + /* Store the IV (v15). */ + "mv t0, %[reg]\n\t" + /* vs1r.v v15, (t0) */ + ".word 0x028287a7\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER +void AES_CTR_encrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, byte* tmp, word32* left, int nr) +{ + __asm__ __volatile__ ( + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "mv t0, %[key]\n\t" + /* vl8re32.v v0, (t0) */ + ".word 0xe282e007\n\t" + "addi t0, t0, 128\n\t" + /* vl2re32.v v8, (t0) */ + ".word 0x2282e407\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v10, (t0) */ + ".word 0x2282e507\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_loaded\n\t" + "addi t0, t0, 32\n\t" + /* vl2re32.v v12, (t0) */ + ".word 0x2282e607\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_loaded:\n\t" + "addi t0, %[key], 224\n\t" + /* vl1re32.v v14, (t0) */ + ".word 0x0282e707\n\t" + /* Load the counter into v15 (master); v16-v23/v24-v31 stay free. */ + "mv t0, %[reg]\n\t" + /* vl1re32.v v15, (t0) */ + ".word 0x0282e787\n\t" + "mv t1, %[in]\n\t" + "mv t2, %[out]\n\t" + /* Use up any leftover keystream bytes from tmp. */ + "lw t5, 0(%[left])\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_left:\n\t" + "beqz t5, L_AES_CTR_encrypt_RISCV64_left_done\n\t" + "beqz %[sz], L_AES_CTR_encrypt_RISCV64_left_done\n\t" + "li t0, 16\n\t" + "sub t0, t0, t5\n\t" + "add t0, t0, %[tmp]\n\t" + "lb t3, 0(t0)\n\t" + "lb t4, 0(t1)\n\t" + "xor t3, t3, t4\n\t" + "sb t3, 0(t2)\n\t" + "addi t1, t1, 1\n\t" + "addi t2, t2, 1\n\t" + "addi t5, t5, -1\n\t" + "addi %[sz], %[sz], -1\n\t" + "j L_AES_CTR_encrypt_RISCV64_left\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_left_done:\n\t" + "sw t5, 0(%[left])\n\t" + /* Encrypt whole blocks; binary batch ladder m8->m4->m2->m1. */ + "srli t3, %[sz], 4\n\t" + "srli t5, t3, 3\n\t" + "beqz t5, L_AES_CTR_encrypt_RISCV64_after8\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_g8:\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v16, v15 */ + ".word 0x5e078857\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v17, v15 */ + ".word 0x5e0788d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v18, v15 */ + ".word 0x5e078957\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v19, v15 */ + ".word 0x5e0789d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v20, v15 */ + ".word 0x5e078a57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v21, v15 */ + ".word 0x5e078ad7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v22, v15 */ + ".word 0x5e078b57\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v23, v15 */ + ".word 0x5e078bd7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + "li t4, 32\n\t" + /* vsetvli zero, t4, e32, m8, ta, ma */ + ".word 0x0d3ef057\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g8_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g8_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_g8_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vl8re32.v v24, (t1) */ + ".word 0xe2836c07\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vs8r.v v16, (t2) */ + ".word 0xe2838827\n\t" + "addi t1, t1, 128\n\t" + "addi t2, t2, 128\n\t" + "addi t5, t5, -1\n\t" + "bnez t5, L_AES_CTR_encrypt_RISCV64_g8\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_after8:\n\t" + "andi t6, t3, 7\n\t" + "andi t5, t6, 4\n\t" + "beqz t5, L_AES_CTR_encrypt_RISCV64_after4\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v16, v15 */ + ".word 0x5e078857\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v17, v15 */ + ".word 0x5e0788d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v18, v15 */ + ".word 0x5e078957\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v19, v15 */ + ".word 0x5e0789d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 16, e32, m4, ta, ma */ + ".word 0xcd287057\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g4_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g4_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_g4_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vl4re32.v v24, (t1) */ + ".word 0x62836c07\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vs4r.v v16, (t2) */ + ".word 0x62838827\n\t" + "addi t1, t1, 64\n\t" + "addi t2, t2, 64\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_after4:\n\t" + "andi t5, t6, 2\n\t" + "beqz t5, L_AES_CTR_encrypt_RISCV64_after2\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v16, v15 */ + ".word 0x5e078857\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v17, v15 */ + ".word 0x5e0788d7\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 8, e32, m2, ta, ma */ + ".word 0xcd147057\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g2_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g2_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_g2_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vl2re32.v v24, (t1) */ + ".word 0x22836c07\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vs2r.v v16, (t2) */ + ".word 0x22838827\n\t" + "addi t1, t1, 32\n\t" + "addi t2, t2, 32\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_after2:\n\t" + "andi t5, t6, 1\n\t" + "beqz t5, L_AES_CTR_encrypt_RISCV64_tail\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v16, v15 */ + ".word 0x5e078857\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g1_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_g1_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_g1_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + /* vl1re32.v v24, (t1) */ + ".word 0x02836c07\n\t" + /* vxor.vv v16, v16, v24 */ + ".word 0x2f880857\n\t" + /* vs1r.v v16, (t2) */ + ".word 0x02838827\n\t" + "addi t1, t1, 16\n\t" + "addi t2, t2, 16\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_tail:\n\t" + "andi %[sz], %[sz], 15\n\t" + "beqz %[sz], L_AES_CTR_encrypt_RISCV64_store\n\t" + /* Encrypt counter into tmp for the final partial block. */ + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vmv.v.v v16, v15 */ + ".word 0x5e078857\n\t" + /* vsetivli zero, 2, e64, m1, ta, ma */ + ".word 0xcd817057\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vslidedown.vi v24, v15, 1 */ + ".word 0x3ef0bc57\n\t" + /* vxor.vv v25, v25, v25 */ + ".word 0x2f9c8cd7\n\t" + /* vadd.vi v24, v24, 1 */ + ".word 0x0380bc57\n\t" + /* vmseq.vv v25, v25, v24 */ + ".word 0x638c8cd7\n\t" + /* vslideup.vi v15, v24, 1 */ + ".word 0x3b80b7d7\n\t" + /* vadd.vv v15, v15, v25 */ + ".word 0x039787d7\n\t" + /* vrev8.v v15, v15 */ + ".word 0x4af4a7d7\n\t" + /* vsetivli zero, 4, e32, m1, ta, ma */ + ".word 0xcd027057\n\t" + /* vaesz.vs v16, v0 */ + ".word 0xa603a877\n\t" + /* vaesem.vs v16, v1 */ + ".word 0xa6112877\n\t" + /* vaesem.vs v16, v2 */ + ".word 0xa6212877\n\t" + /* vaesem.vs v16, v3 */ + ".word 0xa6312877\n\t" + /* vaesem.vs v16, v4 */ + ".word 0xa6412877\n\t" + /* vaesem.vs v16, v5 */ + ".word 0xa6512877\n\t" + /* vaesem.vs v16, v6 */ + ".word 0xa6612877\n\t" + /* vaesem.vs v16, v7 */ + ".word 0xa6712877\n\t" + /* vaesem.vs v16, v8 */ + ".word 0xa6812877\n\t" + /* vaesem.vs v16, v9 */ + ".word 0xa6912877\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_tblk_last\n\t" + /* vaesem.vs v16, v10 */ + ".word 0xa6a12877\n\t" + /* vaesem.vs v16, v11 */ + ".word 0xa6b12877\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_CTR_encrypt_RISCV64_tblk_last\n\t" + /* vaesem.vs v16, v12 */ + ".word 0xa6c12877\n\t" + /* vaesem.vs v16, v13 */ + ".word 0xa6d12877\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_tblk_last:\n\t" + /* vaesef.vs v16, v14 */ + ".word 0xa6e1a877\n\t" + "mv t0, %[tmp]\n\t" + /* vs1r.v v16, (t0) */ + ".word 0x02828827\n\t" + "li t6, 16\n\t" + "sub t6, t6, %[sz]\n\t" + "sw t6, 0(%[left])\n\t" + "mv t0, %[tmp]\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_tail_loop:\n\t" + "lb t3, 0(t1)\n\t" + "lb t4, 0(t0)\n\t" + "xor t3, t3, t4\n\t" + "sb t3, 0(t2)\n\t" + "addi t1, t1, 1\n\t" + "addi t2, t2, 1\n\t" + "addi t0, t0, 1\n\t" + "addi %[sz], %[sz], -1\n\t" + "bnez %[sz], L_AES_CTR_encrypt_RISCV64_tail_loop\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_store:\n\t" + /* Store the counter (master v15). */ + "mv t0, %[reg]\n\t" + /* vs1r.v v15, (t0) */ + ".word 0x028287a7\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [tmp] "+r" (tmp), [left] "+r" (left), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#endif /* WOLFSSL_AES_COUNTER */ +#else +#ifdef WOLFSSL_RISCV_SCALAR_CRYPTO_ASM +void AES_set_key_RISCV64(const byte* userKey, int keylen, byte* key, int dir) +{ + __asm__ __volatile__ ( + "li t0, 24\n\t" + "beq %[keylen], t0, L_AES_set_key_RISCV64_192\n\t" + "li t0, 32\n\t" + "beq %[keylen], t0, L_AES_set_key_RISCV64_256\n\t" + /* AES-128 key schedule. */ + "bnez %[dir], L_AES_set_key_RISCV64_128_dec\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld1_w_%=\n\t" + "ld t0, 0(%[userKey])\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld1_h_%=\n\t" + "lwu t0, 0(%[userKey])\n\t" + "lwu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld1_b_%=\n\t" + "lhu t0, 0(%[userKey])\n\t" + "lhu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_b_%=:\n\t" + "lbu t0, 0(%[userKey])\n\t" + "lbu t4, 1(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld1_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld2_w_%=\n\t" + "ld t1, 8(%[userKey])\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld2_h_%=\n\t" + "lwu t1, 8(%[userKey])\n\t" + "lwu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld2_b_%=\n\t" + "lhu t1, 8(%[userKey])\n\t" + "lhu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_b_%=:\n\t" + "lbu t1, 8(%[userKey])\n\t" + "lbu t4, 9(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld2_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t0, 0(%[key])\n\t" + "sd t1, 8(%[key])\n\t" + /* aes64ks1i x7, x6, 0 */ + ".word 0x31031393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 16(%[key])\n\t" + "sd t1, 24(%[key])\n\t" + /* aes64ks1i x7, x6, 1 */ + ".word 0x31131393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 32(%[key])\n\t" + "sd t1, 40(%[key])\n\t" + /* aes64ks1i x7, x6, 2 */ + ".word 0x31231393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 48(%[key])\n\t" + "sd t1, 56(%[key])\n\t" + /* aes64ks1i x7, x6, 3 */ + ".word 0x31331393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 64(%[key])\n\t" + "sd t1, 72(%[key])\n\t" + /* aes64ks1i x7, x6, 4 */ + ".word 0x31431393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 80(%[key])\n\t" + "sd t1, 88(%[key])\n\t" + /* aes64ks1i x7, x6, 5 */ + ".word 0x31531393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 96(%[key])\n\t" + "sd t1, 104(%[key])\n\t" + /* aes64ks1i x7, x6, 6 */ + ".word 0x31631393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 112(%[key])\n\t" + "sd t1, 120(%[key])\n\t" + /* aes64ks1i x7, x6, 7 */ + ".word 0x31731393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 128(%[key])\n\t" + "sd t1, 136(%[key])\n\t" + /* aes64ks1i x7, x6, 8 */ + ".word 0x31831393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 144(%[key])\n\t" + "sd t1, 152(%[key])\n\t" + /* aes64ks1i x7, x6, 9 */ + ".word 0x31931393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 160(%[key])\n\t" + "sd t1, 168(%[key])\n\t" + "sd t0, 224(%[key])\n\t" + "sd t1, 232(%[key])\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + "\n" + "L_AES_set_key_RISCV64_128_dec:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld3_w_%=\n\t" + "ld t0, 0(%[userKey])\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld3_h_%=\n\t" + "lwu t0, 0(%[userKey])\n\t" + "lwu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld3_b_%=\n\t" + "lhu t0, 0(%[userKey])\n\t" + "lhu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_b_%=:\n\t" + "lbu t0, 0(%[userKey])\n\t" + "lbu t4, 1(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld3_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld4_w_%=\n\t" + "ld t1, 8(%[userKey])\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld4_h_%=\n\t" + "lwu t1, 8(%[userKey])\n\t" + "lwu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld4_b_%=\n\t" + "lhu t1, 8(%[userKey])\n\t" + "lhu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_b_%=:\n\t" + "lbu t1, 8(%[userKey])\n\t" + "lbu t4, 9(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld4_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t0, 160(%[key])\n\t" + "sd t1, 168(%[key])\n\t" + /* aes64ks1i x7, x6, 0 */ + ".word 0x31031393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 144(%[key])\n\t" + "sd t3, 152(%[key])\n\t" + /* aes64ks1i x7, x6, 1 */ + ".word 0x31131393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 128(%[key])\n\t" + "sd t3, 136(%[key])\n\t" + /* aes64ks1i x7, x6, 2 */ + ".word 0x31231393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 112(%[key])\n\t" + "sd t3, 120(%[key])\n\t" + /* aes64ks1i x7, x6, 3 */ + ".word 0x31331393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 96(%[key])\n\t" + "sd t3, 104(%[key])\n\t" + /* aes64ks1i x7, x6, 4 */ + ".word 0x31431393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 80(%[key])\n\t" + "sd t3, 88(%[key])\n\t" + /* aes64ks1i x7, x6, 5 */ + ".word 0x31531393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 64(%[key])\n\t" + "sd t3, 72(%[key])\n\t" + /* aes64ks1i x7, x6, 6 */ + ".word 0x31631393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 48(%[key])\n\t" + "sd t3, 56(%[key])\n\t" + /* aes64ks1i x7, x6, 7 */ + ".word 0x31731393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 32(%[key])\n\t" + "sd t3, 40(%[key])\n\t" + /* aes64ks1i x7, x6, 8 */ + ".word 0x31831393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64im x7, x5 */ + ".word 0x30029393\n\t" + /* aes64im x28, x6 */ + ".word 0x30031e13\n\t" + "sd t2, 16(%[key])\n\t" + "sd t3, 24(%[key])\n\t" + /* aes64ks1i x7, x6, 9 */ + ".word 0x31931393\n\t" + /* aes64ks2 x5, x7, x5 */ + ".word 0x7e5382b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 0(%[key])\n\t" + "sd t1, 8(%[key])\n\t" + "sd t0, 224(%[key])\n\t" + "sd t1, 232(%[key])\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + /* AES-192 key schedule. */ + "\n" + "L_AES_set_key_RISCV64_192:\n\t" + "bnez %[dir], L_AES_set_key_RISCV64_192_dec\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld5_w_%=\n\t" + "ld t0, 0(%[userKey])\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld5_h_%=\n\t" + "lwu t0, 0(%[userKey])\n\t" + "lwu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld5_b_%=\n\t" + "lhu t0, 0(%[userKey])\n\t" + "lhu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_b_%=:\n\t" + "lbu t0, 0(%[userKey])\n\t" + "lbu t4, 1(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld5_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld6_w_%=\n\t" + "ld t1, 8(%[userKey])\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld6_h_%=\n\t" + "lwu t1, 8(%[userKey])\n\t" + "lwu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld6_b_%=\n\t" + "lhu t1, 8(%[userKey])\n\t" + "lhu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_b_%=:\n\t" + "lbu t1, 8(%[userKey])\n\t" + "lbu t4, 9(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld6_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 16(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld7_w_%=\n\t" + "ld t2, 16(%[userKey])\n\t" + "j L_ualn_ld7_e_%=\n\t" + "\n" + "L_ualn_ld7_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld7_h_%=\n\t" + "lwu t2, 16(%[userKey])\n\t" + "lwu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld7_e_%=\n\t" + "\n" + "L_ualn_ld7_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld7_b_%=\n\t" + "lhu t2, 16(%[userKey])\n\t" + "lhu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld7_e_%=\n\t" + "\n" + "L_ualn_ld7_b_%=:\n\t" + "lbu t2, 16(%[userKey])\n\t" + "lbu t4, 17(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 19(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 21(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 23(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld7_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t0, 0(%[key])\n\t" + "sd t1, 8(%[key])\n\t" + "sd t2, 16(%[key])\n\t" + /* aes64ks1i x28, x7, 0 */ + ".word 0x31039e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + "sd t0, 24(%[key])\n\t" + "sd t1, 32(%[key])\n\t" + "sd t2, 40(%[key])\n\t" + /* aes64ks1i x28, x7, 1 */ + ".word 0x31139e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + "sd t0, 48(%[key])\n\t" + "sd t1, 56(%[key])\n\t" + "sd t2, 64(%[key])\n\t" + /* aes64ks1i x28, x7, 2 */ + ".word 0x31239e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + "sd t0, 72(%[key])\n\t" + "sd t1, 80(%[key])\n\t" + "sd t2, 88(%[key])\n\t" + /* aes64ks1i x28, x7, 3 */ + ".word 0x31339e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + "sd t0, 96(%[key])\n\t" + "sd t1, 104(%[key])\n\t" + "sd t2, 112(%[key])\n\t" + /* aes64ks1i x28, x7, 4 */ + ".word 0x31439e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + "sd t0, 120(%[key])\n\t" + "sd t1, 128(%[key])\n\t" + "sd t2, 136(%[key])\n\t" + /* aes64ks1i x28, x7, 5 */ + ".word 0x31539e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + "sd t0, 144(%[key])\n\t" + "sd t1, 152(%[key])\n\t" + "sd t2, 160(%[key])\n\t" + /* aes64ks1i x28, x7, 6 */ + ".word 0x31639e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + "sd t0, 168(%[key])\n\t" + "sd t1, 176(%[key])\n\t" + "sd t2, 184(%[key])\n\t" + /* aes64ks1i x28, x7, 7 */ + ".word 0x31739e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 192(%[key])\n\t" + "sd t1, 200(%[key])\n\t" + "sd t0, 224(%[key])\n\t" + "sd t1, 232(%[key])\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + "\n" + "L_AES_set_key_RISCV64_192_dec:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld8_w_%=\n\t" + "ld t0, 0(%[userKey])\n\t" + "j L_ualn_ld8_e_%=\n\t" + "\n" + "L_ualn_ld8_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld8_h_%=\n\t" + "lwu t0, 0(%[userKey])\n\t" + "lwu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld8_e_%=\n\t" + "\n" + "L_ualn_ld8_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld8_b_%=\n\t" + "lhu t0, 0(%[userKey])\n\t" + "lhu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld8_e_%=\n\t" + "\n" + "L_ualn_ld8_b_%=:\n\t" + "lbu t0, 0(%[userKey])\n\t" + "lbu t4, 1(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld8_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld9_w_%=\n\t" + "ld t1, 8(%[userKey])\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld9_h_%=\n\t" + "lwu t1, 8(%[userKey])\n\t" + "lwu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld9_b_%=\n\t" + "lhu t1, 8(%[userKey])\n\t" + "lhu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_b_%=:\n\t" + "lbu t1, 8(%[userKey])\n\t" + "lbu t4, 9(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld9_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 16(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld10_w_%=\n\t" + "ld t2, 16(%[userKey])\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld10_h_%=\n\t" + "lwu t2, 16(%[userKey])\n\t" + "lwu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld10_b_%=\n\t" + "lhu t2, 16(%[userKey])\n\t" + "lhu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_b_%=:\n\t" + "lbu t2, 16(%[userKey])\n\t" + "lbu t4, 17(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 19(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 21(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 23(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld10_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + /* aes64im x28, x7 */ + ".word 0x30039e13\n\t" + "sd t0, 192(%[key])\n\t" + "sd t1, 200(%[key])\n\t" + "sd t3, 176(%[key])\n\t" + /* aes64ks1i x28, x7, 0 */ + ".word 0x31039e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + /* aes64im x28, x5 */ + ".word 0x30029e13\n\t" + /* aes64im x29, x6 */ + ".word 0x30031e93\n\t" + /* aes64im x30, x7 */ + ".word 0x30039f13\n\t" + "sd t3, 184(%[key])\n\t" + "sd t4, 160(%[key])\n\t" + "sd t5, 168(%[key])\n\t" + /* aes64ks1i x28, x7, 1 */ + ".word 0x31139e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + /* aes64im x28, x5 */ + ".word 0x30029e13\n\t" + /* aes64im x29, x6 */ + ".word 0x30031e93\n\t" + /* aes64im x30, x7 */ + ".word 0x30039f13\n\t" + "sd t3, 144(%[key])\n\t" + "sd t4, 152(%[key])\n\t" + "sd t5, 128(%[key])\n\t" + /* aes64ks1i x28, x7, 2 */ + ".word 0x31239e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + /* aes64im x28, x5 */ + ".word 0x30029e13\n\t" + /* aes64im x29, x6 */ + ".word 0x30031e93\n\t" + /* aes64im x30, x7 */ + ".word 0x30039f13\n\t" + "sd t3, 136(%[key])\n\t" + "sd t4, 112(%[key])\n\t" + "sd t5, 120(%[key])\n\t" + /* aes64ks1i x28, x7, 3 */ + ".word 0x31339e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + /* aes64im x28, x5 */ + ".word 0x30029e13\n\t" + /* aes64im x29, x6 */ + ".word 0x30031e93\n\t" + /* aes64im x30, x7 */ + ".word 0x30039f13\n\t" + "sd t3, 96(%[key])\n\t" + "sd t4, 104(%[key])\n\t" + "sd t5, 80(%[key])\n\t" + /* aes64ks1i x28, x7, 4 */ + ".word 0x31439e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + /* aes64im x28, x5 */ + ".word 0x30029e13\n\t" + /* aes64im x29, x6 */ + ".word 0x30031e93\n\t" + /* aes64im x30, x7 */ + ".word 0x30039f13\n\t" + "sd t3, 88(%[key])\n\t" + "sd t4, 64(%[key])\n\t" + "sd t5, 72(%[key])\n\t" + /* aes64ks1i x28, x7, 5 */ + ".word 0x31539e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + /* aes64im x28, x5 */ + ".word 0x30029e13\n\t" + /* aes64im x29, x6 */ + ".word 0x30031e93\n\t" + /* aes64im x30, x7 */ + ".word 0x30039f13\n\t" + "sd t3, 48(%[key])\n\t" + "sd t4, 56(%[key])\n\t" + "sd t5, 32(%[key])\n\t" + /* aes64ks1i x28, x7, 6 */ + ".word 0x31639e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks2 x7, x6, x7 */ + ".word 0x7e7303b3\n\t" + /* aes64im x28, x5 */ + ".word 0x30029e13\n\t" + /* aes64im x29, x6 */ + ".word 0x30031e93\n\t" + /* aes64im x30, x7 */ + ".word 0x30039f13\n\t" + "sd t3, 40(%[key])\n\t" + "sd t4, 16(%[key])\n\t" + "sd t5, 24(%[key])\n\t" + /* aes64ks1i x28, x7, 7 */ + ".word 0x31739e13\n\t" + /* aes64ks2 x5, x28, x5 */ + ".word 0x7e5e02b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 0(%[key])\n\t" + "sd t1, 8(%[key])\n\t" + "sd t4, 224(%[key])\n\t" + "sd t5, 232(%[key])\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + /* AES-256 key schedule. */ + "\n" + "L_AES_set_key_RISCV64_256:\n\t" + "bnez %[dir], L_AES_set_key_RISCV64_256_dec\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld11_w_%=\n\t" + "ld t0, 0(%[userKey])\n\t" + "j L_ualn_ld11_e_%=\n\t" + "\n" + "L_ualn_ld11_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld11_h_%=\n\t" + "lwu t0, 0(%[userKey])\n\t" + "lwu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld11_e_%=\n\t" + "\n" + "L_ualn_ld11_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld11_b_%=\n\t" + "lhu t0, 0(%[userKey])\n\t" + "lhu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld11_e_%=\n\t" + "\n" + "L_ualn_ld11_b_%=:\n\t" + "lbu t0, 0(%[userKey])\n\t" + "lbu t4, 1(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld11_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld12_w_%=\n\t" + "ld t1, 8(%[userKey])\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld12_h_%=\n\t" + "lwu t1, 8(%[userKey])\n\t" + "lwu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld12_b_%=\n\t" + "lhu t1, 8(%[userKey])\n\t" + "lhu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_b_%=:\n\t" + "lbu t1, 8(%[userKey])\n\t" + "lbu t4, 9(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld12_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 16(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld13_w_%=\n\t" + "ld t2, 16(%[userKey])\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld13_h_%=\n\t" + "lwu t2, 16(%[userKey])\n\t" + "lwu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld13_b_%=\n\t" + "lhu t2, 16(%[userKey])\n\t" + "lhu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_b_%=:\n\t" + "lbu t2, 16(%[userKey])\n\t" + "lbu t4, 17(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 19(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 21(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 23(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld13_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 24(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld14_w_%=\n\t" + "ld t3, 24(%[userKey])\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld14_h_%=\n\t" + "lwu t3, 24(%[userKey])\n\t" + "lwu t4, 28(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld14_b_%=\n\t" + "lhu t3, 24(%[userKey])\n\t" + "lhu t4, 26(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 28(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 30(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_b_%=:\n\t" + "lbu t3, 24(%[userKey])\n\t" + "lbu t4, 25(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 26(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 27(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 28(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 29(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 30(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 31(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld14_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t0, 0(%[key])\n\t" + "sd t1, 8(%[key])\n\t" + "sd t2, 16(%[key])\n\t" + "sd t3, 24(%[key])\n\t" + /* aes64ks1i x29, x28, 0 */ + ".word 0x310e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + "sd t0, 32(%[key])\n\t" + "sd t1, 40(%[key])\n\t" + "sd t2, 48(%[key])\n\t" + "sd t3, 56(%[key])\n\t" + /* aes64ks1i x29, x28, 1 */ + ".word 0x311e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + "sd t0, 64(%[key])\n\t" + "sd t1, 72(%[key])\n\t" + "sd t2, 80(%[key])\n\t" + "sd t3, 88(%[key])\n\t" + /* aes64ks1i x29, x28, 2 */ + ".word 0x312e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + "sd t0, 96(%[key])\n\t" + "sd t1, 104(%[key])\n\t" + "sd t2, 112(%[key])\n\t" + "sd t3, 120(%[key])\n\t" + /* aes64ks1i x29, x28, 3 */ + ".word 0x313e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + "sd t0, 128(%[key])\n\t" + "sd t1, 136(%[key])\n\t" + "sd t2, 144(%[key])\n\t" + "sd t3, 152(%[key])\n\t" + /* aes64ks1i x29, x28, 4 */ + ".word 0x314e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + "sd t0, 160(%[key])\n\t" + "sd t1, 168(%[key])\n\t" + "sd t2, 176(%[key])\n\t" + "sd t3, 184(%[key])\n\t" + /* aes64ks1i x29, x28, 5 */ + ".word 0x315e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + "sd t0, 192(%[key])\n\t" + "sd t1, 200(%[key])\n\t" + "sd t2, 208(%[key])\n\t" + "sd t3, 216(%[key])\n\t" + /* aes64ks1i x29, x28, 6 */ + ".word 0x316e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 224(%[key])\n\t" + "sd t1, 232(%[key])\n\t" + "j L_AES_set_key_RISCV64_done\n\t" + "\n" + "L_AES_set_key_RISCV64_256_dec:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld15_w_%=\n\t" + "ld t0, 0(%[userKey])\n\t" + "j L_ualn_ld15_e_%=\n\t" + "\n" + "L_ualn_ld15_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld15_h_%=\n\t" + "lwu t0, 0(%[userKey])\n\t" + "lwu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld15_e_%=\n\t" + "\n" + "L_ualn_ld15_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld15_b_%=\n\t" + "lhu t0, 0(%[userKey])\n\t" + "lhu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld15_e_%=\n\t" + "\n" + "L_ualn_ld15_b_%=:\n\t" + "lbu t0, 0(%[userKey])\n\t" + "lbu t4, 1(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld15_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld16_w_%=\n\t" + "ld t1, 8(%[userKey])\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld16_h_%=\n\t" + "lwu t1, 8(%[userKey])\n\t" + "lwu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld16_b_%=\n\t" + "lhu t1, 8(%[userKey])\n\t" + "lhu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_b_%=:\n\t" + "lbu t1, 8(%[userKey])\n\t" + "lbu t4, 9(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld16_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 16(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld17_w_%=\n\t" + "ld t2, 16(%[userKey])\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld17_h_%=\n\t" + "lwu t2, 16(%[userKey])\n\t" + "lwu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld17_b_%=\n\t" + "lhu t2, 16(%[userKey])\n\t" + "lhu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_b_%=:\n\t" + "lbu t2, 16(%[userKey])\n\t" + "lbu t4, 17(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 18(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 19(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 20(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 21(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 22(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 23(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld17_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 24(%[userKey])\n\t" +#else + "andi t4, %[userKey], 7\n\t" + "bnez t4, L_ualn_ld18_w_%=\n\t" + "ld t3, 24(%[userKey])\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld18_h_%=\n\t" + "lwu t3, 24(%[userKey])\n\t" + "lwu t4, 28(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld18_b_%=\n\t" + "lhu t3, 24(%[userKey])\n\t" + "lhu t4, 26(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 28(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 30(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_b_%=:\n\t" + "lbu t3, 24(%[userKey])\n\t" + "lbu t4, 25(%[userKey])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 26(%[userKey])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 27(%[userKey])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 28(%[userKey])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 29(%[userKey])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 30(%[userKey])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 31(%[userKey])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld18_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t0, 224(%[key])\n\t" + "sd t1, 232(%[key])\n\t" + /* aes64im x29, x7 */ + ".word 0x30039e93\n\t" + /* aes64im x30, x28 */ + ".word 0x300e1f13\n\t" + "sd t4, 208(%[key])\n\t" + "sd t5, 216(%[key])\n\t" + /* aes64ks1i x29, x28, 0 */ + ".word 0x310e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + /* aes64im x29, x5 */ + ".word 0x30029e93\n\t" + /* aes64im x30, x6 */ + ".word 0x30031f13\n\t" + "sd t4, 192(%[key])\n\t" + "sd t5, 200(%[key])\n\t" + /* aes64im x29, x7 */ + ".word 0x30039e93\n\t" + /* aes64im x30, x28 */ + ".word 0x300e1f13\n\t" + "sd t4, 176(%[key])\n\t" + "sd t5, 184(%[key])\n\t" + /* aes64ks1i x29, x28, 1 */ + ".word 0x311e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + /* aes64im x29, x5 */ + ".word 0x30029e93\n\t" + /* aes64im x30, x6 */ + ".word 0x30031f13\n\t" + "sd t4, 160(%[key])\n\t" + "sd t5, 168(%[key])\n\t" + /* aes64im x29, x7 */ + ".word 0x30039e93\n\t" + /* aes64im x30, x28 */ + ".word 0x300e1f13\n\t" + "sd t4, 144(%[key])\n\t" + "sd t5, 152(%[key])\n\t" + /* aes64ks1i x29, x28, 2 */ + ".word 0x312e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + /* aes64im x29, x5 */ + ".word 0x30029e93\n\t" + /* aes64im x30, x6 */ + ".word 0x30031f13\n\t" + "sd t4, 128(%[key])\n\t" + "sd t5, 136(%[key])\n\t" + /* aes64im x29, x7 */ + ".word 0x30039e93\n\t" + /* aes64im x30, x28 */ + ".word 0x300e1f13\n\t" + "sd t4, 112(%[key])\n\t" + "sd t5, 120(%[key])\n\t" + /* aes64ks1i x29, x28, 3 */ + ".word 0x313e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + /* aes64im x29, x5 */ + ".word 0x30029e93\n\t" + /* aes64im x30, x6 */ + ".word 0x30031f13\n\t" + "sd t4, 96(%[key])\n\t" + "sd t5, 104(%[key])\n\t" + /* aes64im x29, x7 */ + ".word 0x30039e93\n\t" + /* aes64im x30, x28 */ + ".word 0x300e1f13\n\t" + "sd t4, 80(%[key])\n\t" + "sd t5, 88(%[key])\n\t" + /* aes64ks1i x29, x28, 4 */ + ".word 0x314e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + /* aes64im x29, x5 */ + ".word 0x30029e93\n\t" + /* aes64im x30, x6 */ + ".word 0x30031f13\n\t" + "sd t4, 64(%[key])\n\t" + "sd t5, 72(%[key])\n\t" + /* aes64im x29, x7 */ + ".word 0x30039e93\n\t" + /* aes64im x30, x28 */ + ".word 0x300e1f13\n\t" + "sd t4, 48(%[key])\n\t" + "sd t5, 56(%[key])\n\t" + /* aes64ks1i x29, x28, 5 */ + ".word 0x315e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + /* aes64ks1i x29, x6, 10 */ + ".word 0x31a31e93\n\t" + /* aes64ks2 x7, x29, x7 */ + ".word 0x7e7e83b3\n\t" + /* aes64ks2 x28, x7, x28 */ + ".word 0x7fc38e33\n\t" + /* aes64im x29, x5 */ + ".word 0x30029e93\n\t" + /* aes64im x30, x6 */ + ".word 0x30031f13\n\t" + "sd t4, 32(%[key])\n\t" + "sd t5, 40(%[key])\n\t" + /* aes64im x29, x7 */ + ".word 0x30039e93\n\t" + /* aes64im x30, x28 */ + ".word 0x300e1f13\n\t" + "sd t4, 16(%[key])\n\t" + "sd t5, 24(%[key])\n\t" + /* aes64ks1i x29, x28, 6 */ + ".word 0x316e1e93\n\t" + /* aes64ks2 x5, x29, x5 */ + ".word 0x7e5e82b3\n\t" + /* aes64ks2 x6, x5, x6 */ + ".word 0x7e628333\n\t" + "sd t0, 0(%[key])\n\t" + "sd t1, 8(%[key])\n\t" + "\n" + "L_AES_set_key_RISCV64_done:\n\t" + : [userKey] "+r" (userKey), [keylen] "+r" (keylen), [key] "+r" (key), + [dir] "+r" (dir) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5" + ); +} + +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || \ + defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || \ + defined(HAVE_AES_CBC) +void AES_encrypt_RISCV64(const byte* in, byte* out, byte* key, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[nr]\n\t" + /* Load input block */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld19_w_%=\n\t" + "ld t2, 0(%[in])\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld19_h_%=\n\t" + "lwu t2, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld19_b_%=\n\t" + "lhu t2, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_b_%=:\n\t" + "lbu t2, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld19_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld20_w_%=\n\t" + "ld t3, 8(%[in])\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld20_h_%=\n\t" + "lwu t3, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld20_b_%=\n\t" + "lhu t3, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_b_%=:\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld20_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + "ld a5, 48(%[key])\n\t" + "ld a6, 56(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(%[key])\n\t" + "ld a4, 72(%[key])\n\t" + "ld a5, 80(%[key])\n\t" + "ld a6, 88(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(%[key])\n\t" + "ld a4, 104(%[key])\n\t" + "ld a5, 112(%[key])\n\t" + "ld a6, 120(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(%[key])\n\t" + "ld a4, 136(%[key])\n\t" + "ld a5, 144(%[key])\n\t" + "ld a6, 152(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(%[key])\n\t" + "ld a4, 168(%[key])\n\t" + "li t4, 11\n\t" + "ble t5, t4, L_AES_encrypt_RISCV64_done\n\t" + "ld a5, 176(%[key])\n\t" + "ld a6, 184(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(%[key])\n\t" + "ld a4, 200(%[key])\n\t" + "li t4, 13\n\t" + "ble t5, t4, L_AES_encrypt_RISCV64_done\n\t" + "ld a5, 208(%[key])\n\t" + "ld a6, 216(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(%[key])\n\t" + "ld a4, 232(%[key])\n\t" + "\n" + "L_AES_encrypt_RISCV64_done:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* Store output block */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd21_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd21_e_%=\n\t" + "\n" + "L_ualn_sd21_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd21_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd21_e_%=\n\t" + "\n" + "L_ualn_sd21_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd21_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd21_e_%=\n\t" + "\n" + "L_ualn_sd21_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd21_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd22_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd22_e_%=\n\t" + "\n" + "L_ualn_sd22_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd22_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd22_e_%=\n\t" + "\n" + "L_ualn_sd22_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd22_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd22_e_%=\n\t" + "\n" + "L_ualn_sd22_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd22_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + : [in] "+r" (in), [out] "+r" (out), [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "t5" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_decrypt_RISCV64(const byte* in, byte* out, byte* key, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[nr]\n\t" + /* Load input block */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld23_w_%=\n\t" + "ld t2, 0(%[in])\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld23_h_%=\n\t" + "lwu t2, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld23_b_%=\n\t" + "lhu t2, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_b_%=:\n\t" + "lbu t2, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld23_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld24_w_%=\n\t" + "ld t3, 8(%[in])\n\t" + "j L_ualn_ld24_e_%=\n\t" + "\n" + "L_ualn_ld24_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld24_h_%=\n\t" + "lwu t3, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld24_e_%=\n\t" + "\n" + "L_ualn_ld24_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld24_b_%=\n\t" + "lhu t3, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld24_e_%=\n\t" + "\n" + "L_ualn_ld24_b_%=:\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld24_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + "ld a5, 48(%[key])\n\t" + "ld a6, 56(%[key])\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(%[key])\n\t" + "ld a4, 72(%[key])\n\t" + "ld a5, 80(%[key])\n\t" + "ld a6, 88(%[key])\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(%[key])\n\t" + "ld a4, 104(%[key])\n\t" + "ld a5, 112(%[key])\n\t" + "ld a6, 120(%[key])\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(%[key])\n\t" + "ld a4, 136(%[key])\n\t" + "ld a5, 144(%[key])\n\t" + "ld a6, 152(%[key])\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(%[key])\n\t" + "ld a4, 168(%[key])\n\t" + "li t4, 11\n\t" + "ble t5, t4, L_AES_decrypt_RISCV64_done\n\t" + "ld a5, 176(%[key])\n\t" + "ld a6, 184(%[key])\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(%[key])\n\t" + "ld a4, 200(%[key])\n\t" + "li t4, 13\n\t" + "ble t5, t4, L_AES_decrypt_RISCV64_done\n\t" + "ld a5, 208(%[key])\n\t" + "ld a6, 216(%[key])\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(%[key])\n\t" + "ld a4, 232(%[key])\n\t" + "\n" + "L_AES_decrypt_RISCV64_done:\n\t" + /* aes64ds x7, x5, x6 */ + ".word 0x3a6283b3\n\t" + /* aes64ds x28, x6, x5 */ + ".word 0x3a530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* Store output block */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd25_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd25_e_%=\n\t" + "\n" + "L_ualn_sd25_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd25_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd25_e_%=\n\t" + "\n" + "L_ualn_sd25_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd25_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd25_e_%=\n\t" + "\n" + "L_ualn_sd25_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd25_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd26_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd26_e_%=\n\t" + "\n" + "L_ualn_sd26_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd26_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd26_e_%=\n\t" + "\n" + "L_ualn_sd26_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd26_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd26_e_%=\n\t" + "\n" + "L_ualn_sd26_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd26_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + : [in] "+r" (in), [out] "+r" (out), [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "t5" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || + * WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#ifdef HAVE_AES_ECB +void AES_encrypt_blocks_RISCV64(const byte* in, byte* out, word32 sz, byte* key, + int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[key]\n\t" + "mv t6, %[nr]\n\t" + "srliw %[sz], %[sz], 4\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_loop:\n\t" + "beqz %[sz], L_AES_encrypt_blocks_RISCV64_end\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld27_w_%=\n\t" + "ld t2, 0(%[in])\n\t" + "j L_ualn_ld27_e_%=\n\t" + "\n" + "L_ualn_ld27_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld27_h_%=\n\t" + "lwu t2, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld27_e_%=\n\t" + "\n" + "L_ualn_ld27_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld27_b_%=\n\t" + "lhu t2, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld27_e_%=\n\t" + "\n" + "L_ualn_ld27_b_%=:\n\t" + "lbu t2, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld27_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld28_w_%=\n\t" + "ld t3, 8(%[in])\n\t" + "j L_ualn_ld28_e_%=\n\t" + "\n" + "L_ualn_ld28_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld28_h_%=\n\t" + "lwu t3, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld28_e_%=\n\t" + "\n" + "L_ualn_ld28_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld28_b_%=\n\t" + "lhu t3, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld28_e_%=\n\t" + "\n" + "L_ualn_ld28_b_%=:\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld28_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a3, 0(t5)\n\t" + "ld a4, 8(t5)\n\t" + "ld a5, 16(t5)\n\t" + "ld a6, 24(t5)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t5)\n\t" + "ld a4, 40(t5)\n\t" + "ld a5, 48(t5)\n\t" + "ld a6, 56(t5)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t5)\n\t" + "ld a4, 72(t5)\n\t" + "ld a5, 80(t5)\n\t" + "ld a6, 88(t5)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t5)\n\t" + "ld a4, 104(t5)\n\t" + "ld a5, 112(t5)\n\t" + "ld a6, 120(t5)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t5)\n\t" + "ld a4, 136(t5)\n\t" + "ld a5, 144(t5)\n\t" + "ld a6, 152(t5)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t5)\n\t" + "ld a4, 168(t5)\n\t" + "li t4, 11\n\t" + "ble t6, t4, L_AES_encrypt_blocks_RISCV64_last\n\t" + "ld a5, 176(t5)\n\t" + "ld a6, 184(t5)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t5)\n\t" + "ld a4, 200(t5)\n\t" + "li t4, 13\n\t" + "ble t6, t4, L_AES_encrypt_blocks_RISCV64_last\n\t" + "ld a5, 208(t5)\n\t" + "ld a6, 216(t5)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t5)\n\t" + "ld a4, 232(t5)\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_last:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd29_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd29_e_%=\n\t" + "\n" + "L_ualn_sd29_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd29_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd29_e_%=\n\t" + "\n" + "L_ualn_sd29_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd29_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd29_e_%=\n\t" + "\n" + "L_ualn_sd29_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd29_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd30_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd30_e_%=\n\t" + "\n" + "L_ualn_sd30_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd30_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd30_e_%=\n\t" + "\n" + "L_ualn_sd30_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd30_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd30_e_%=\n\t" + "\n" + "L_ualn_sd30_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd30_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_encrypt_blocks_RISCV64_loop\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_end:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [key] "+r" (key), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "t5", + "t6" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_decrypt_blocks_RISCV64(const byte* in, byte* out, word32 sz, byte* key, + int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[key]\n\t" + "mv t6, %[nr]\n\t" + "srliw %[sz], %[sz], 4\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_loop:\n\t" + "beqz %[sz], L_AES_decrypt_blocks_RISCV64_end\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld31_w_%=\n\t" + "ld t2, 0(%[in])\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld31_h_%=\n\t" + "lwu t2, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld31_b_%=\n\t" + "lhu t2, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_b_%=:\n\t" + "lbu t2, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld31_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld32_w_%=\n\t" + "ld t3, 8(%[in])\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld32_h_%=\n\t" + "lwu t3, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld32_b_%=\n\t" + "lhu t3, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_b_%=:\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld32_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a3, 0(t5)\n\t" + "ld a4, 8(t5)\n\t" + "ld a5, 16(t5)\n\t" + "ld a6, 24(t5)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t5)\n\t" + "ld a4, 40(t5)\n\t" + "ld a5, 48(t5)\n\t" + "ld a6, 56(t5)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t5)\n\t" + "ld a4, 72(t5)\n\t" + "ld a5, 80(t5)\n\t" + "ld a6, 88(t5)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t5)\n\t" + "ld a4, 104(t5)\n\t" + "ld a5, 112(t5)\n\t" + "ld a6, 120(t5)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t5)\n\t" + "ld a4, 136(t5)\n\t" + "ld a5, 144(t5)\n\t" + "ld a6, 152(t5)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t5)\n\t" + "ld a4, 168(t5)\n\t" + "li t4, 11\n\t" + "ble t6, t4, L_AES_decrypt_blocks_RISCV64_last\n\t" + "ld a5, 176(t5)\n\t" + "ld a6, 184(t5)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t5)\n\t" + "ld a4, 200(t5)\n\t" + "li t4, 13\n\t" + "ble t6, t4, L_AES_decrypt_blocks_RISCV64_last\n\t" + "ld a5, 208(t5)\n\t" + "ld a6, 216(t5)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t5)\n\t" + "ld a4, 232(t5)\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_last:\n\t" + /* aes64ds x7, x5, x6 */ + ".word 0x3a6283b3\n\t" + /* aes64ds x28, x6, x5 */ + ".word 0x3a530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd33_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd33_e_%=\n\t" + "\n" + "L_ualn_sd33_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd33_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd33_e_%=\n\t" + "\n" + "L_ualn_sd33_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd33_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd33_e_%=\n\t" + "\n" + "L_ualn_sd33_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd33_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd34_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd34_e_%=\n\t" + "\n" + "L_ualn_sd34_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd34_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd34_e_%=\n\t" + "\n" + "L_ualn_sd34_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd34_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd34_e_%=\n\t" + "\n" + "L_ualn_sd34_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd34_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_decrypt_blocks_RISCV64_loop\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_end:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [key] "+r" (key), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "t5", + "t6" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_ECB */ +#ifdef HAVE_AES_CBC +void AES_CBC_encrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[reg]\n\t" + "mv t6, %[key]\n\t" + "mv a7, %[nr]\n\t" + "srliw %[sz], %[sz], 4\n\t" + "ld s1, 0(t5)\n\t" + "ld s2, 8(t5)\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_loop:\n\t" + "beqz %[sz], L_AES_CBC_encrypt_RISCV64_end\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a3, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld35_w_%=\n\t" + "ld a3, 0(%[in])\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld35_h_%=\n\t" + "lwu a3, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld35_b_%=\n\t" + "lhu a3, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_b_%=:\n\t" + "lbu a3, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a3, a3, t4\n\t" + "\n" + "L_ualn_ld35_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld36_w_%=\n\t" + "ld a4, 8(%[in])\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld36_h_%=\n\t" + "lwu a4, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld36_b_%=\n\t" + "lhu a4, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_b_%=:\n\t" + "lbu a4, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a4, a4, t4\n\t" + "\n" + "L_ualn_ld36_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, a3, s1\n\t" + "xor t3, a4, s2\n\t" + "ld a3, 0(t6)\n\t" + "ld a4, 8(t6)\n\t" + "ld a5, 16(t6)\n\t" + "ld a6, 24(t6)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t6)\n\t" + "ld a4, 40(t6)\n\t" + "ld a5, 48(t6)\n\t" + "ld a6, 56(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t6)\n\t" + "ld a4, 72(t6)\n\t" + "ld a5, 80(t6)\n\t" + "ld a6, 88(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t6)\n\t" + "ld a4, 104(t6)\n\t" + "ld a5, 112(t6)\n\t" + "ld a6, 120(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t6)\n\t" + "ld a4, 136(t6)\n\t" + "ld a5, 144(t6)\n\t" + "ld a6, 152(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t6)\n\t" + "ld a4, 168(t6)\n\t" + "li t4, 11\n\t" + "ble a7, t4, L_AES_CBC_encrypt_RISCV64_last\n\t" + "ld a5, 176(t6)\n\t" + "ld a6, 184(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t6)\n\t" + "ld a4, 200(t6)\n\t" + "li t4, 13\n\t" + "ble a7, t4, L_AES_CBC_encrypt_RISCV64_last\n\t" + "ld a5, 208(t6)\n\t" + "ld a6, 216(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t6)\n\t" + "ld a4, 232(t6)\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_last:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd37_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd37_e_%=\n\t" + "\n" + "L_ualn_sd37_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd37_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd37_e_%=\n\t" + "\n" + "L_ualn_sd37_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd37_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd37_e_%=\n\t" + "\n" + "L_ualn_sd37_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd37_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd38_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd38_e_%=\n\t" + "\n" + "L_ualn_sd38_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd38_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd38_e_%=\n\t" + "\n" + "L_ualn_sd38_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd38_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd38_e_%=\n\t" + "\n" + "L_ualn_sd38_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd38_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv s1, t2\n\t" + "mv s2, t3\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_CBC_encrypt_RISCV64_loop\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_end:\n\t" + "sd s1, 0(t5)\n\t" + "sd s2, 8(t5)\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "t5", + "t6", "a7", "s1", "s2" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_CBC_decrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[reg]\n\t" + "mv t6, %[key]\n\t" + "mv a7, %[nr]\n\t" + "srliw %[sz], %[sz], 4\n\t" + "ld s1, 0(t5)\n\t" + "ld s2, 8(t5)\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_loop:\n\t" + "beqz %[sz], L_AES_CBC_decrypt_RISCV64_end\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld39_w_%=\n\t" + "ld t2, 0(%[in])\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld39_h_%=\n\t" + "lwu t2, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld39_b_%=\n\t" + "lhu t2, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_b_%=:\n\t" + "lbu t2, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld39_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld40_w_%=\n\t" + "ld t3, 8(%[in])\n\t" + "j L_ualn_ld40_e_%=\n\t" + "\n" + "L_ualn_ld40_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld40_h_%=\n\t" + "lwu t3, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld40_e_%=\n\t" + "\n" + "L_ualn_ld40_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld40_b_%=\n\t" + "lhu t3, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld40_e_%=\n\t" + "\n" + "L_ualn_ld40_b_%=:\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld40_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv s3, t2\n\t" + "mv s4, t3\n\t" + "ld a3, 0(t6)\n\t" + "ld a4, 8(t6)\n\t" + "ld a5, 16(t6)\n\t" + "ld a6, 24(t6)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t6)\n\t" + "ld a4, 40(t6)\n\t" + "ld a5, 48(t6)\n\t" + "ld a6, 56(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t6)\n\t" + "ld a4, 72(t6)\n\t" + "ld a5, 80(t6)\n\t" + "ld a6, 88(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t6)\n\t" + "ld a4, 104(t6)\n\t" + "ld a5, 112(t6)\n\t" + "ld a6, 120(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t6)\n\t" + "ld a4, 136(t6)\n\t" + "ld a5, 144(t6)\n\t" + "ld a6, 152(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t6)\n\t" + "ld a4, 168(t6)\n\t" + "li t4, 11\n\t" + "ble a7, t4, L_AES_CBC_decrypt_RISCV64_last\n\t" + "ld a5, 176(t6)\n\t" + "ld a6, 184(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t6)\n\t" + "ld a4, 200(t6)\n\t" + "li t4, 13\n\t" + "ble a7, t4, L_AES_CBC_decrypt_RISCV64_last\n\t" + "ld a5, 208(t6)\n\t" + "ld a6, 216(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t6)\n\t" + "ld a4, 232(t6)\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_last:\n\t" + /* aes64ds x7, x5, x6 */ + ".word 0x3a6283b3\n\t" + /* aes64ds x28, x6, x5 */ + ".word 0x3a530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "xor t2, t2, s1\n\t" + "xor t3, t3, s2\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd41_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd41_e_%=\n\t" + "\n" + "L_ualn_sd41_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd41_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd41_e_%=\n\t" + "\n" + "L_ualn_sd41_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd41_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd41_e_%=\n\t" + "\n" + "L_ualn_sd41_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd41_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd42_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd42_e_%=\n\t" + "\n" + "L_ualn_sd42_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd42_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd42_e_%=\n\t" + "\n" + "L_ualn_sd42_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd42_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd42_e_%=\n\t" + "\n" + "L_ualn_sd42_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd42_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv s1, s3\n\t" + "mv s2, s4\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_CBC_decrypt_RISCV64_loop\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_end:\n\t" + "sd s1, 0(t5)\n\t" + "sd s2, 8(t5)\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "t5", + "t6", "a7", "s1", "s2", "s3", "s4" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER +void AES_CTR_encrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, byte* tmp, word32* left, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[reg]\n\t" + "mv s1, %[key]\n\t" + "mv s2, %[tmp]\n\t" + "mv s3, %[left]\n\t" + "mv s4, %[nr]\n\t" + /* Consume any leftover keystream bytes from tmp. */ + "lw t6, 0(s3)\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_left:\n\t" + "beqz t6, L_AES_CTR_encrypt_RISCV64_left_done\n\t" + "beqz %[sz], L_AES_CTR_encrypt_RISCV64_left_done\n\t" + "li a3, 16\n\t" + "sub a3, a3, t6\n\t" + "add a3, a3, s2\n\t" + "lb a4, 0(a3)\n\t" + "lb a5, 0(%[in])\n\t" + "xor a4, a4, a5\n\t" + "sb a4, 0(%[out])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addiw t6, t6, -1\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_CTR_encrypt_RISCV64_left\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_left_done:\n\t" + "sw t6, 0(s3)\n\t" + /* Whole blocks: keystream = E(counter); out = in ^ ks; counter++. */ + "\n" + "L_AES_CTR_encrypt_RISCV64_blk:\n\t" + "li a3, 16\n\t" + "bltu %[sz], a3, L_AES_CTR_encrypt_RISCV64_tail\n\t" + "ld t2, 0(t5)\n\t" + "ld t3, 8(t5)\n\t" + "ld a3, 0(s1)\n\t" + "ld a4, 8(s1)\n\t" + "ld a5, 16(s1)\n\t" + "ld a6, 24(s1)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s1)\n\t" + "ld a4, 40(s1)\n\t" + "ld a5, 48(s1)\n\t" + "ld a6, 56(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s1)\n\t" + "ld a4, 72(s1)\n\t" + "ld a5, 80(s1)\n\t" + "ld a6, 88(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s1)\n\t" + "ld a4, 104(s1)\n\t" + "ld a5, 112(s1)\n\t" + "ld a6, 120(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s1)\n\t" + "ld a4, 136(s1)\n\t" + "ld a5, 144(s1)\n\t" + "ld a6, 152(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s1)\n\t" + "ld a4, 168(s1)\n\t" + "li t4, 11\n\t" + "ble s4, t4, L_AES_CTR_encrypt_RISCV64_blk_last\n\t" + "ld a5, 176(s1)\n\t" + "ld a6, 184(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s1)\n\t" + "ld a4, 200(s1)\n\t" + "li t4, 13\n\t" + "ble s4, t4, L_AES_CTR_encrypt_RISCV64_blk_last\n\t" + "ld a5, 208(s1)\n\t" + "ld a6, 216(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s1)\n\t" + "ld a4, 232(s1)\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_blk_last:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a3, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld43_w_%=\n\t" + "ld a3, 0(%[in])\n\t" + "j L_ualn_ld43_e_%=\n\t" + "\n" + "L_ualn_ld43_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld43_h_%=\n\t" + "lwu a3, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld43_e_%=\n\t" + "\n" + "L_ualn_ld43_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld43_b_%=\n\t" + "lhu a3, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld43_e_%=\n\t" + "\n" + "L_ualn_ld43_b_%=:\n\t" + "lbu a3, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a3, a3, t4\n\t" + "\n" + "L_ualn_ld43_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld44_w_%=\n\t" + "ld a4, 8(%[in])\n\t" + "j L_ualn_ld44_e_%=\n\t" + "\n" + "L_ualn_ld44_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld44_h_%=\n\t" + "lwu a4, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld44_e_%=\n\t" + "\n" + "L_ualn_ld44_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld44_b_%=\n\t" + "lhu a4, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld44_e_%=\n\t" + "\n" + "L_ualn_ld44_b_%=:\n\t" + "lbu a4, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a4, a4, t4\n\t" + "\n" + "L_ualn_ld44_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd45_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd45_e_%=\n\t" + "\n" + "L_ualn_sd45_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd45_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd45_e_%=\n\t" + "\n" + "L_ualn_sd45_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd45_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd45_e_%=\n\t" + "\n" + "L_ualn_sd45_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd45_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd46_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd46_e_%=\n\t" + "\n" + "L_ualn_sd46_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd46_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd46_e_%=\n\t" + "\n" + "L_ualn_sd46_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd46_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd46_e_%=\n\t" + "\n" + "L_ualn_sd46_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd46_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t0, 8(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, t0, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "addi t0, t0, 1\n\t" + "seqz t4, t0\n\t" + "ld t1, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t1, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "add t1, t1, t4\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, t0, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t1, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 8(t5)\n\t" + "sd t1, 0(t5)\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -16\n\t" + "j L_AES_CTR_encrypt_RISCV64_blk\n\t" + /* Final partial block: keystream -> tmp, *left = 16 - sz. */ + "\n" + "L_AES_CTR_encrypt_RISCV64_tail:\n\t" + "beqz %[sz], L_AES_CTR_encrypt_RISCV64_done\n\t" + "ld t2, 0(t5)\n\t" + "ld t3, 8(t5)\n\t" + "ld a3, 0(s1)\n\t" + "ld a4, 8(s1)\n\t" + "ld a5, 16(s1)\n\t" + "ld a6, 24(s1)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s1)\n\t" + "ld a4, 40(s1)\n\t" + "ld a5, 48(s1)\n\t" + "ld a6, 56(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s1)\n\t" + "ld a4, 72(s1)\n\t" + "ld a5, 80(s1)\n\t" + "ld a6, 88(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s1)\n\t" + "ld a4, 104(s1)\n\t" + "ld a5, 112(s1)\n\t" + "ld a6, 120(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s1)\n\t" + "ld a4, 136(s1)\n\t" + "ld a5, 144(s1)\n\t" + "ld a6, 152(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s1)\n\t" + "ld a4, 168(s1)\n\t" + "li t4, 11\n\t" + "ble s4, t4, L_AES_CTR_encrypt_RISCV64_tail_last\n\t" + "ld a5, 176(s1)\n\t" + "ld a6, 184(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s1)\n\t" + "ld a4, 200(s1)\n\t" + "li t4, 13\n\t" + "ble s4, t4, L_AES_CTR_encrypt_RISCV64_tail_last\n\t" + "ld a5, 208(s1)\n\t" + "ld a6, 216(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s1)\n\t" + "ld a4, 232(s1)\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_tail_last:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" + "ld t0, 8(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, t0, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "addi t0, t0, 1\n\t" + "seqz t4, t0\n\t" + "ld t1, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t1, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "add t1, t1, t4\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, t0, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t1, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 8(t5)\n\t" + "sd t1, 0(t5)\n\t" + "li a3, 16\n\t" + "subw a3, a3, %[sz]\n\t" + "sw a3, 0(s3)\n\t" + "mv a4, s2\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_tail_loop:\n\t" + "lb a5, 0(%[in])\n\t" + "lb a6, 0(a4)\n\t" + "xor a5, a5, a6\n\t" + "sb a5, 0(%[out])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi a4, a4, 1\n\t" + "addiw %[sz], %[sz], -1\n\t" + "bnez %[sz], L_AES_CTR_encrypt_RISCV64_tail_loop\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [tmp] "+r" (tmp), [left] "+r" (left), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t6", "a3", "a4", "a5", "a6", + "a7", "t5", "s1", "s2", "s3", "s4" + ); +} + +#endif /* WOLFSSL_AES_COUNTER */ +#ifdef WOLFSSL_AES_XTS +void AES_XTS_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[i]\n\t" + "mv t6, %[key]\n\t" + "mv s1, %[key2]\n\t" + "mv s2, %[tmp]\n\t" + "mv s3, %[nr]\n\t" + /* tweak = AES_key2(i) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(t5)\n\t" +#else + "andi t4, t5, 7\n\t" + "bnez t4, L_ualn_ld47_w_%=\n\t" + "ld t2, 0(t5)\n\t" + "j L_ualn_ld47_e_%=\n\t" + "\n" + "L_ualn_ld47_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld47_h_%=\n\t" + "lwu t2, 0(t5)\n\t" + "lwu t4, 4(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld47_e_%=\n\t" + "\n" + "L_ualn_ld47_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld47_b_%=\n\t" + "lhu t2, 0(t5)\n\t" + "lhu t4, 2(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld47_e_%=\n\t" + "\n" + "L_ualn_ld47_b_%=:\n\t" + "lbu t2, 0(t5)\n\t" + "lbu t4, 1(t5)\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(t5)\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(t5)\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(t5)\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld47_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(t5)\n\t" +#else + "andi t4, t5, 7\n\t" + "bnez t4, L_ualn_ld48_w_%=\n\t" + "ld t3, 8(t5)\n\t" + "j L_ualn_ld48_e_%=\n\t" + "\n" + "L_ualn_ld48_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld48_h_%=\n\t" + "lwu t3, 8(t5)\n\t" + "lwu t4, 12(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld48_e_%=\n\t" + "\n" + "L_ualn_ld48_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld48_b_%=\n\t" + "lhu t3, 8(t5)\n\t" + "lhu t4, 10(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld48_e_%=\n\t" + "\n" + "L_ualn_ld48_b_%=:\n\t" + "lbu t3, 8(t5)\n\t" + "lbu t4, 9(t5)\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(t5)\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(t5)\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(t5)\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld48_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a3, 0(s1)\n\t" + "ld a4, 8(s1)\n\t" + "ld a5, 16(s1)\n\t" + "ld a6, 24(s1)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s1)\n\t" + "ld a4, 40(s1)\n\t" + "ld a5, 48(s1)\n\t" + "ld a6, 56(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s1)\n\t" + "ld a4, 72(s1)\n\t" + "ld a5, 80(s1)\n\t" + "ld a6, 88(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s1)\n\t" + "ld a4, 104(s1)\n\t" + "ld a5, 112(s1)\n\t" + "ld a6, 120(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s1)\n\t" + "ld a4, 136(s1)\n\t" + "ld a5, 144(s1)\n\t" + "ld a6, 152(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s1)\n\t" + "ld a4, 168(s1)\n\t" + "li t4, 11\n\t" + "ble s3, t4, L_AES_XTS_encrypt_RISCV64_tw\n\t" + "ld a5, 176(s1)\n\t" + "ld a6, 184(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s1)\n\t" + "ld a4, 200(s1)\n\t" + "li t4, 13\n\t" + "ble s3, t4, L_AES_XTS_encrypt_RISCV64_tw\n\t" + "ld a5, 208(s1)\n\t" + "ld a6, 216(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s1)\n\t" + "ld a4, 232(s1)\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_tw:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "mv s4, t2\n\t" + "mv s5, t3\n\t" + "srliw t5, %[sz], 4\n\t" + "andi %[sz], %[sz], 15\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_loop:\n\t" + "beqz t5, L_AES_XTS_encrypt_RISCV64_done\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a3, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld49_w_%=\n\t" + "ld a3, 0(%[in])\n\t" + "j L_ualn_ld49_e_%=\n\t" + "\n" + "L_ualn_ld49_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld49_h_%=\n\t" + "lwu a3, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld49_e_%=\n\t" + "\n" + "L_ualn_ld49_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld49_b_%=\n\t" + "lhu a3, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld49_e_%=\n\t" + "\n" + "L_ualn_ld49_b_%=:\n\t" + "lbu a3, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a3, a3, t4\n\t" + "\n" + "L_ualn_ld49_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld50_w_%=\n\t" + "ld a4, 8(%[in])\n\t" + "j L_ualn_ld50_e_%=\n\t" + "\n" + "L_ualn_ld50_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld50_h_%=\n\t" + "lwu a4, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld50_e_%=\n\t" + "\n" + "L_ualn_ld50_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld50_b_%=\n\t" + "lhu a4, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld50_e_%=\n\t" + "\n" + "L_ualn_ld50_b_%=:\n\t" + "lbu a4, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a4, a4, t4\n\t" + "\n" + "L_ualn_ld50_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, a3, s4\n\t" + "xor t3, a4, s5\n\t" + "ld a3, 0(t6)\n\t" + "ld a4, 8(t6)\n\t" + "ld a5, 16(t6)\n\t" + "ld a6, 24(t6)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t6)\n\t" + "ld a4, 40(t6)\n\t" + "ld a5, 48(t6)\n\t" + "ld a6, 56(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t6)\n\t" + "ld a4, 72(t6)\n\t" + "ld a5, 80(t6)\n\t" + "ld a6, 88(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t6)\n\t" + "ld a4, 104(t6)\n\t" + "ld a5, 112(t6)\n\t" + "ld a6, 120(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t6)\n\t" + "ld a4, 136(t6)\n\t" + "ld a5, 144(t6)\n\t" + "ld a6, 152(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t6)\n\t" + "ld a4, 168(t6)\n\t" + "li t4, 11\n\t" + "ble s3, t4, L_AES_XTS_encrypt_RISCV64_last\n\t" + "ld a5, 176(t6)\n\t" + "ld a6, 184(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t6)\n\t" + "ld a4, 200(t6)\n\t" + "li t4, 13\n\t" + "ble s3, t4, L_AES_XTS_encrypt_RISCV64_last\n\t" + "ld a5, 208(t6)\n\t" + "ld a6, 216(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t6)\n\t" + "ld a4, 232(t6)\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_last:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "xor t2, t2, s4\n\t" + "xor t3, t3, s5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd51_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd51_e_%=\n\t" + "\n" + "L_ualn_sd51_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd51_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd51_e_%=\n\t" + "\n" + "L_ualn_sd51_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd51_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd51_e_%=\n\t" + "\n" + "L_ualn_sd51_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd51_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd52_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd52_e_%=\n\t" + "\n" + "L_ualn_sd52_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd52_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd52_e_%=\n\t" + "\n" + "L_ualn_sd52_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd52_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd52_e_%=\n\t" + "\n" + "L_ualn_sd52_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd52_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "srli t4, s4, 63\n\t" + "srli a3, s5, 63\n\t" + "slli s5, s5, 1\n\t" + "or s5, s5, t4\n\t" + "slli s4, s4, 1\n\t" + "li t4, 135\n\t" + "neg a3, a3\n\t" + "and t4, t4, a3\n\t" + "xor s4, s4, t4\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw t5, t5, -1\n\t" + "j L_AES_XTS_encrypt_RISCV64_loop\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_done:\n\t" + "beqz %[sz], L_AES_XTS_encrypt_RISCV64_cts_done\n\t" + /* Ciphertext stealing: steal from the last full ciphertext (out[-16]). */ + "addi a3, %[out], -16\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(a3)\n\t" +#else + "andi t4, a3, 7\n\t" + "bnez t4, L_ualn_ld53_w_%=\n\t" + "ld t2, 0(a3)\n\t" + "j L_ualn_ld53_e_%=\n\t" + "\n" + "L_ualn_ld53_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld53_h_%=\n\t" + "lwu t2, 0(a3)\n\t" + "lwu t4, 4(a3)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld53_e_%=\n\t" + "\n" + "L_ualn_ld53_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld53_b_%=\n\t" + "lhu t2, 0(a3)\n\t" + "lhu t4, 2(a3)\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(a3)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(a3)\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld53_e_%=\n\t" + "\n" + "L_ualn_ld53_b_%=:\n\t" + "lbu t2, 0(a3)\n\t" + "lbu t4, 1(a3)\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(a3)\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(a3)\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(a3)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(a3)\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(a3)\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(a3)\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld53_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(a3)\n\t" +#else + "andi t4, a3, 7\n\t" + "bnez t4, L_ualn_ld54_w_%=\n\t" + "ld t3, 8(a3)\n\t" + "j L_ualn_ld54_e_%=\n\t" + "\n" + "L_ualn_ld54_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld54_h_%=\n\t" + "lwu t3, 8(a3)\n\t" + "lwu t4, 12(a3)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld54_e_%=\n\t" + "\n" + "L_ualn_ld54_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld54_b_%=\n\t" + "lhu t3, 8(a3)\n\t" + "lhu t4, 10(a3)\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(a3)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(a3)\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld54_e_%=\n\t" + "\n" + "L_ualn_ld54_b_%=:\n\t" + "lbu t3, 8(a3)\n\t" + "lbu t4, 9(a3)\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(a3)\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(a3)\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(a3)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(a3)\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(a3)\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(a3)\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld54_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" + "mv a3, s2\n\t" + "mv a4, %[sz]\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_byte:\n\t" + "lbu t2, 0(a3)\n\t" + "lbu t3, 0(%[in])\n\t" + "sb t2, 0(%[out])\n\t" + "sb t3, 0(a3)\n\t" + "addi a3, a3, 1\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addiw a4, a4, -1\n\t" + "bnez a4, L_AES_XTS_encrypt_RISCV64_byte\n\t" + "sub %[out], %[out], %[sz]\n\t" + "addi %[out], %[out], -16\n\t" + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, s4\n\t" + "xor t3, t3, s5\n\t" + "ld a3, 0(t6)\n\t" + "ld a4, 8(t6)\n\t" + "ld a5, 16(t6)\n\t" + "ld a6, 24(t6)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t6)\n\t" + "ld a4, 40(t6)\n\t" + "ld a5, 48(t6)\n\t" + "ld a6, 56(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t6)\n\t" + "ld a4, 72(t6)\n\t" + "ld a5, 80(t6)\n\t" + "ld a6, 88(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t6)\n\t" + "ld a4, 104(t6)\n\t" + "ld a5, 112(t6)\n\t" + "ld a6, 120(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t6)\n\t" + "ld a4, 136(t6)\n\t" + "ld a5, 144(t6)\n\t" + "ld a6, 152(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t6)\n\t" + "ld a4, 168(t6)\n\t" + "li t4, 11\n\t" + "ble s3, t4, L_AES_XTS_encrypt_RISCV64_cts_last\n\t" + "ld a5, 176(t6)\n\t" + "ld a6, 184(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t6)\n\t" + "ld a4, 200(t6)\n\t" + "li t4, 13\n\t" + "ble s3, t4, L_AES_XTS_encrypt_RISCV64_cts_last\n\t" + "ld a5, 208(t6)\n\t" + "ld a6, 216(t6)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t6)\n\t" + "ld a4, 232(t6)\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_cts_last:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "xor t2, t2, s4\n\t" + "xor t3, t3, s5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd55_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd55_e_%=\n\t" + "\n" + "L_ualn_sd55_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd55_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd55_e_%=\n\t" + "\n" + "L_ualn_sd55_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd55_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd55_e_%=\n\t" + "\n" + "L_ualn_sd55_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd55_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd56_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd56_e_%=\n\t" + "\n" + "L_ualn_sd56_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd56_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd56_e_%=\n\t" + "\n" + "L_ualn_sd56_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd56_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd56_e_%=\n\t" + "\n" + "L_ualn_sd56_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd56_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "\n" + "L_AES_XTS_encrypt_RISCV64_cts_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [i] "+r" (i), + [key] "+r" (key), [key2] "+r" (key2), [tmp] "+r" (tmp), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "a7", + "t5", "t6", "s1", "s2", "s3", "s4", "s5", "s6", "s7" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_XTS_decrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[i]\n\t" + "mv t6, %[key]\n\t" + "mv s1, %[key2]\n\t" + "mv s2, %[tmp]\n\t" + "mv s3, %[nr]\n\t" + /* tweak = AES_key2(i) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(t5)\n\t" +#else + "andi t4, t5, 7\n\t" + "bnez t4, L_ualn_ld57_w_%=\n\t" + "ld t2, 0(t5)\n\t" + "j L_ualn_ld57_e_%=\n\t" + "\n" + "L_ualn_ld57_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld57_h_%=\n\t" + "lwu t2, 0(t5)\n\t" + "lwu t4, 4(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld57_e_%=\n\t" + "\n" + "L_ualn_ld57_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld57_b_%=\n\t" + "lhu t2, 0(t5)\n\t" + "lhu t4, 2(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld57_e_%=\n\t" + "\n" + "L_ualn_ld57_b_%=:\n\t" + "lbu t2, 0(t5)\n\t" + "lbu t4, 1(t5)\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(t5)\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(t5)\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(t5)\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld57_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(t5)\n\t" +#else + "andi t4, t5, 7\n\t" + "bnez t4, L_ualn_ld58_w_%=\n\t" + "ld t3, 8(t5)\n\t" + "j L_ualn_ld58_e_%=\n\t" + "\n" + "L_ualn_ld58_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld58_h_%=\n\t" + "lwu t3, 8(t5)\n\t" + "lwu t4, 12(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld58_e_%=\n\t" + "\n" + "L_ualn_ld58_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld58_b_%=\n\t" + "lhu t3, 8(t5)\n\t" + "lhu t4, 10(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld58_e_%=\n\t" + "\n" + "L_ualn_ld58_b_%=:\n\t" + "lbu t3, 8(t5)\n\t" + "lbu t4, 9(t5)\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(t5)\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(t5)\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(t5)\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(t5)\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(t5)\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(t5)\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld58_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a3, 0(s1)\n\t" + "ld a4, 8(s1)\n\t" + "ld a5, 16(s1)\n\t" + "ld a6, 24(s1)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s1)\n\t" + "ld a4, 40(s1)\n\t" + "ld a5, 48(s1)\n\t" + "ld a6, 56(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s1)\n\t" + "ld a4, 72(s1)\n\t" + "ld a5, 80(s1)\n\t" + "ld a6, 88(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s1)\n\t" + "ld a4, 104(s1)\n\t" + "ld a5, 112(s1)\n\t" + "ld a6, 120(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s1)\n\t" + "ld a4, 136(s1)\n\t" + "ld a5, 144(s1)\n\t" + "ld a6, 152(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s1)\n\t" + "ld a4, 168(s1)\n\t" + "li t4, 11\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_tw\n\t" + "ld a5, 176(s1)\n\t" + "ld a6, 184(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s1)\n\t" + "ld a4, 200(s1)\n\t" + "li t4, 13\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_tw\n\t" + "ld a5, 208(s1)\n\t" + "ld a6, 216(s1)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s1)\n\t" + "ld a4, 232(s1)\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_tw:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "mv s4, t2\n\t" + "mv s5, t3\n\t" + "srliw t5, %[sz], 4\n\t" + "andi %[sz], %[sz], 15\n\t" + "beqz %[sz], L_AES_XTS_decrypt_RISCV64_full\n\t" + "addiw t5, t5, -1\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_full:\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_loop:\n\t" + "beqz t5, L_AES_XTS_decrypt_RISCV64_done\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a3, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld59_w_%=\n\t" + "ld a3, 0(%[in])\n\t" + "j L_ualn_ld59_e_%=\n\t" + "\n" + "L_ualn_ld59_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld59_h_%=\n\t" + "lwu a3, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld59_e_%=\n\t" + "\n" + "L_ualn_ld59_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld59_b_%=\n\t" + "lhu a3, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld59_e_%=\n\t" + "\n" + "L_ualn_ld59_b_%=:\n\t" + "lbu a3, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a3, a3, t4\n\t" + "\n" + "L_ualn_ld59_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld60_w_%=\n\t" + "ld a4, 8(%[in])\n\t" + "j L_ualn_ld60_e_%=\n\t" + "\n" + "L_ualn_ld60_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld60_h_%=\n\t" + "lwu a4, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld60_e_%=\n\t" + "\n" + "L_ualn_ld60_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld60_b_%=\n\t" + "lhu a4, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld60_e_%=\n\t" + "\n" + "L_ualn_ld60_b_%=:\n\t" + "lbu a4, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a4, a4, t4\n\t" + "\n" + "L_ualn_ld60_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, a3, s4\n\t" + "xor t3, a4, s5\n\t" + "ld a3, 0(t6)\n\t" + "ld a4, 8(t6)\n\t" + "ld a5, 16(t6)\n\t" + "ld a6, 24(t6)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t6)\n\t" + "ld a4, 40(t6)\n\t" + "ld a5, 48(t6)\n\t" + "ld a6, 56(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t6)\n\t" + "ld a4, 72(t6)\n\t" + "ld a5, 80(t6)\n\t" + "ld a6, 88(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t6)\n\t" + "ld a4, 104(t6)\n\t" + "ld a5, 112(t6)\n\t" + "ld a6, 120(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t6)\n\t" + "ld a4, 136(t6)\n\t" + "ld a5, 144(t6)\n\t" + "ld a6, 152(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t6)\n\t" + "ld a4, 168(t6)\n\t" + "li t4, 11\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_last\n\t" + "ld a5, 176(t6)\n\t" + "ld a6, 184(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t6)\n\t" + "ld a4, 200(t6)\n\t" + "li t4, 13\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_last\n\t" + "ld a5, 208(t6)\n\t" + "ld a6, 216(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t6)\n\t" + "ld a4, 232(t6)\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_last:\n\t" + /* aes64ds x7, x5, x6 */ + ".word 0x3a6283b3\n\t" + /* aes64ds x28, x6, x5 */ + ".word 0x3a530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "xor t2, t2, s4\n\t" + "xor t3, t3, s5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd61_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd61_e_%=\n\t" + "\n" + "L_ualn_sd61_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd61_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd61_e_%=\n\t" + "\n" + "L_ualn_sd61_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd61_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd61_e_%=\n\t" + "\n" + "L_ualn_sd61_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd61_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd62_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd62_e_%=\n\t" + "\n" + "L_ualn_sd62_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd62_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd62_e_%=\n\t" + "\n" + "L_ualn_sd62_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd62_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd62_e_%=\n\t" + "\n" + "L_ualn_sd62_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd62_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "srli t4, s4, 63\n\t" + "srli a3, s5, 63\n\t" + "slli s5, s5, 1\n\t" + "or s5, s5, t4\n\t" + "slli s4, s4, 1\n\t" + "li t4, 135\n\t" + "neg a3, a3\n\t" + "and t4, t4, a3\n\t" + "xor s4, s4, t4\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw t5, t5, -1\n\t" + "j L_AES_XTS_decrypt_RISCV64_loop\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_done:\n\t" + "beqz %[sz], L_AES_XTS_decrypt_RISCV64_cts_done\n\t" + /* CTS: decrypt last full block with the NEXT tweak, then steal. */ + "mv s6, s4\n\t" + "mv s7, s5\n\t" + "srli t4, s4, 63\n\t" + "srli a3, s5, 63\n\t" + "slli s5, s5, 1\n\t" + "or s5, s5, t4\n\t" + "slli s4, s4, 1\n\t" + "li t4, 135\n\t" + "neg a3, a3\n\t" + "and t4, t4, a3\n\t" + "xor s4, s4, t4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a3, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld63_w_%=\n\t" + "ld a3, 0(%[in])\n\t" + "j L_ualn_ld63_e_%=\n\t" + "\n" + "L_ualn_ld63_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld63_h_%=\n\t" + "lwu a3, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld63_e_%=\n\t" + "\n" + "L_ualn_ld63_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld63_b_%=\n\t" + "lhu a3, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "j L_ualn_ld63_e_%=\n\t" + "\n" + "L_ualn_ld63_b_%=:\n\t" + "lbu a3, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a3, a3, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a3, a3, t4\n\t" + "\n" + "L_ualn_ld63_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld64_w_%=\n\t" + "ld a4, 8(%[in])\n\t" + "j L_ualn_ld64_e_%=\n\t" + "\n" + "L_ualn_ld64_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld64_h_%=\n\t" + "lwu a4, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld64_e_%=\n\t" + "\n" + "L_ualn_ld64_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld64_b_%=\n\t" + "lhu a4, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "j L_ualn_ld64_e_%=\n\t" + "\n" + "L_ualn_ld64_b_%=:\n\t" + "lbu a4, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a4, a4, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a4, a4, t4\n\t" + "\n" + "L_ualn_ld64_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[in], %[in], 16\n\t" + "xor t2, a3, s4\n\t" + "xor t3, a4, s5\n\t" + "ld a3, 0(t6)\n\t" + "ld a4, 8(t6)\n\t" + "ld a5, 16(t6)\n\t" + "ld a6, 24(t6)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t6)\n\t" + "ld a4, 40(t6)\n\t" + "ld a5, 48(t6)\n\t" + "ld a6, 56(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t6)\n\t" + "ld a4, 72(t6)\n\t" + "ld a5, 80(t6)\n\t" + "ld a6, 88(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t6)\n\t" + "ld a4, 104(t6)\n\t" + "ld a5, 112(t6)\n\t" + "ld a6, 120(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t6)\n\t" + "ld a4, 136(t6)\n\t" + "ld a5, 144(t6)\n\t" + "ld a6, 152(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t6)\n\t" + "ld a4, 168(t6)\n\t" + "li t4, 11\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts1_last\n\t" + "ld a5, 176(t6)\n\t" + "ld a6, 184(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t6)\n\t" + "ld a4, 200(t6)\n\t" + "li t4, 13\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts1_last\n\t" + "ld a5, 208(t6)\n\t" + "ld a6, 216(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t6)\n\t" + "ld a4, 232(t6)\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_cts1_last:\n\t" + /* aes64ds x7, x5, x6 */ + ".word 0x3a6283b3\n\t" + /* aes64ds x28, x6, x5 */ + ".word 0x3a530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "xor t2, t2, s4\n\t" + "xor t3, t3, s5\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" + "addi %[out], %[out], 16\n\t" + "mv a3, s2\n\t" + "mv a4, %[sz]\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_byte:\n\t" + "lbu t2, 0(a3)\n\t" + "lbu t3, 0(%[in])\n\t" + "sb t2, 0(%[out])\n\t" + "sb t3, 0(a3)\n\t" + "addi a3, a3, 1\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addiw a4, a4, -1\n\t" + "bnez a4, L_AES_XTS_decrypt_RISCV64_byte\n\t" + "sub %[out], %[out], %[sz]\n\t" + "addi %[out], %[out], -16\n\t" + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, s6\n\t" + "xor t3, t3, s7\n\t" + "ld a3, 0(t6)\n\t" + "ld a4, 8(t6)\n\t" + "ld a5, 16(t6)\n\t" + "ld a6, 24(t6)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(t6)\n\t" + "ld a4, 40(t6)\n\t" + "ld a5, 48(t6)\n\t" + "ld a6, 56(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(t6)\n\t" + "ld a4, 72(t6)\n\t" + "ld a5, 80(t6)\n\t" + "ld a6, 88(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(t6)\n\t" + "ld a4, 104(t6)\n\t" + "ld a5, 112(t6)\n\t" + "ld a6, 120(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(t6)\n\t" + "ld a4, 136(t6)\n\t" + "ld a5, 144(t6)\n\t" + "ld a6, 152(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(t6)\n\t" + "ld a4, 168(t6)\n\t" + "li t4, 11\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts2_last\n\t" + "ld a5, 176(t6)\n\t" + "ld a6, 184(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(t6)\n\t" + "ld a4, 200(t6)\n\t" + "li t4, 13\n\t" + "ble s3, t4, L_AES_XTS_decrypt_RISCV64_cts2_last\n\t" + "ld a5, 208(t6)\n\t" + "ld a6, 216(t6)\n\t" + /* aes64dsm x7, x5, x6 */ + ".word 0x3e6283b3\n\t" + /* aes64dsm x28, x6, x5 */ + ".word 0x3e530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64dsm x5, x7, x28 */ + ".word 0x3fc382b3\n\t" + /* aes64dsm x6, x28, x7 */ + ".word 0x3e7e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(t6)\n\t" + "ld a4, 232(t6)\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_cts2_last:\n\t" + /* aes64ds x7, x5, x6 */ + ".word 0x3a6283b3\n\t" + /* aes64ds x28, x6, x5 */ + ".word 0x3a530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "xor t2, t2, s6\n\t" + "xor t3, t3, s7\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd65_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd65_e_%=\n\t" + "\n" + "L_ualn_sd65_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd65_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd65_e_%=\n\t" + "\n" + "L_ualn_sd65_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd65_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd65_e_%=\n\t" + "\n" + "L_ualn_sd65_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd65_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd66_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd66_e_%=\n\t" + "\n" + "L_ualn_sd66_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd66_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd66_e_%=\n\t" + "\n" + "L_ualn_sd66_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd66_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd66_e_%=\n\t" + "\n" + "L_ualn_sd66_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd66_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "\n" + "L_AES_XTS_decrypt_RISCV64_cts_done:\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [i] "+r" (i), + [key] "+r" (key), [key2] "+r" (key2), [tmp] "+r" (tmp), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "a7", + "t5", "t6", "s1", "s2", "s3", "s4", "s5", "s6", "s7" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_XTS */ +#ifdef HAVE_AESGCM +void AES_GCM_set_key_RISCV64(const byte* nonce, byte* key, byte* gcm_h, int nr) +{ + __asm__ __volatile__ ( + "mv t5, %[nr]\n\t" + /* H = E_K(nonce) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[nonce])\n\t" +#else + "andi t4, %[nonce], 7\n\t" + "bnez t4, L_ualn_ld67_w_%=\n\t" + "ld t2, 0(%[nonce])\n\t" + "j L_ualn_ld67_e_%=\n\t" + "\n" + "L_ualn_ld67_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld67_h_%=\n\t" + "lwu t2, 0(%[nonce])\n\t" + "lwu t4, 4(%[nonce])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld67_e_%=\n\t" + "\n" + "L_ualn_ld67_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld67_b_%=\n\t" + "lhu t2, 0(%[nonce])\n\t" + "lhu t4, 2(%[nonce])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 4(%[nonce])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lhu t4, 6(%[nonce])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "j L_ualn_ld67_e_%=\n\t" + "\n" + "L_ualn_ld67_b_%=:\n\t" + "lbu t2, 0(%[nonce])\n\t" + "lbu t4, 1(%[nonce])\n\t" + "slli t4, t4, 8\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 2(%[nonce])\n\t" + "slli t4, t4, 16\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 3(%[nonce])\n\t" + "slli t4, t4, 24\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 4(%[nonce])\n\t" + "slli t4, t4, 32\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 5(%[nonce])\n\t" + "slli t4, t4, 40\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 6(%[nonce])\n\t" + "slli t4, t4, 48\n\t" + "or t2, t2, t4\n\t" + "lbu t4, 7(%[nonce])\n\t" + "slli t4, t4, 56\n\t" + "or t2, t2, t4\n\t" + "\n" + "L_ualn_ld67_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[nonce])\n\t" +#else + "andi t4, %[nonce], 7\n\t" + "bnez t4, L_ualn_ld68_w_%=\n\t" + "ld t3, 8(%[nonce])\n\t" + "j L_ualn_ld68_e_%=\n\t" + "\n" + "L_ualn_ld68_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld68_h_%=\n\t" + "lwu t3, 8(%[nonce])\n\t" + "lwu t4, 12(%[nonce])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld68_e_%=\n\t" + "\n" + "L_ualn_ld68_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld68_b_%=\n\t" + "lhu t3, 8(%[nonce])\n\t" + "lhu t4, 10(%[nonce])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 12(%[nonce])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lhu t4, 14(%[nonce])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "j L_ualn_ld68_e_%=\n\t" + "\n" + "L_ualn_ld68_b_%=:\n\t" + "lbu t3, 8(%[nonce])\n\t" + "lbu t4, 9(%[nonce])\n\t" + "slli t4, t4, 8\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 10(%[nonce])\n\t" + "slli t4, t4, 16\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 11(%[nonce])\n\t" + "slli t4, t4, 24\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 12(%[nonce])\n\t" + "slli t4, t4, 32\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 13(%[nonce])\n\t" + "slli t4, t4, 40\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 14(%[nonce])\n\t" + "slli t4, t4, 48\n\t" + "or t3, t3, t4\n\t" + "lbu t4, 15(%[nonce])\n\t" + "slli t4, t4, 56\n\t" + "or t3, t3, t4\n\t" + "\n" + "L_ualn_ld68_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + "ld a5, 48(%[key])\n\t" + "ld a6, 56(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(%[key])\n\t" + "ld a4, 72(%[key])\n\t" + "ld a5, 80(%[key])\n\t" + "ld a6, 88(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(%[key])\n\t" + "ld a4, 104(%[key])\n\t" + "ld a5, 112(%[key])\n\t" + "ld a6, 120(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(%[key])\n\t" + "ld a4, 136(%[key])\n\t" + "ld a5, 144(%[key])\n\t" + "ld a6, 152(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(%[key])\n\t" + "ld a4, 168(%[key])\n\t" + "li t4, 11\n\t" + "ble t5, t4, L_AES_GCM_set_key_RISCV64_done\n\t" + "ld a5, 176(%[key])\n\t" + "ld a6, 184(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(%[key])\n\t" + "ld a4, 200(%[key])\n\t" + "li t4, 13\n\t" + "ble t5, t4, L_AES_GCM_set_key_RISCV64_done\n\t" + "ld a5, 208(%[key])\n\t" + "ld a6, 216(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(%[key])\n\t" + "ld a4, 232(%[key])\n\t" + "\n" + "L_AES_GCM_set_key_RISCV64_done:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* Reflect bits in each byte of H (for carryless-multiply GHASH) */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x7, x7 */ + ".word 0x6873d393\n\t" + /* brev8 x28, x28 */ + ".word 0x687e5e13\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a5, t2, 1\n\t" + "srli a6, t3, 1\n\t" + "and t2, t2, a4\n\t" + "and t3, t3, a4\n\t" + "and a5, a5, a4\n\t" + "and a6, a6, a4\n\t" + "slli t2, t2, 1\n\t" + "slli t3, t3, 1\n\t" + "or t2, t2, a5\n\t" + "or t3, t3, a6\n\t" + "li a4, 3689348814741910323\n\t" + "srli a5, t2, 2\n\t" + "srli a6, t3, 2\n\t" + "and t2, t2, a4\n\t" + "and t3, t3, a4\n\t" + "and a5, a5, a4\n\t" + "and a6, a6, a4\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "or t2, t2, a5\n\t" + "or t3, t3, a6\n\t" + "li a4, 1085102592571150095\n\t" + "srli a5, t2, 4\n\t" + "srli a6, t3, 4\n\t" + "and t2, t2, a4\n\t" + "and t3, t3, a4\n\t" + "and a5, a5, a4\n\t" + "and a6, a6, a4\n\t" + "slli t2, t2, 4\n\t" + "slli t3, t3, 4\n\t" + "or t2, t2, a5\n\t" + "or t3, t3, a6\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t2, 0(%[gcm_h])\n\t" + "sd t3, 8(%[gcm_h])\n\t" + : [nonce] "+r" (nonce), [key] "+r" (key), [gcm_h] "+r" (gcm_h), + [nr] "+r" (nr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6", "t5" + ); +} + +void GHASH_RISCV64(byte* x, byte* h, const byte* in, word32 blocks) +{ + __asm__ __volatile__ ( + "mv a6, %[in]\n\t" + "mv a7, %[blocks]\n\t" + "beqz a7, L_GHASH_RISCV64_ret\n\t" + "ld t0, 0(%[x])\n\t" + "ld t1, 8(%[x])\n\t" + "ld t2, 0(%[h])\n\t" + "ld t3, 8(%[h])\n\t" + "li t6, 135\n\t" + /* Reflect x (h was reflected at set_key) */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "\n" + "L_GHASH_RISCV64_loop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(a6)\n\t" +#else + "andi t4, a6, 7\n\t" + "bnez t4, L_ualn_ld69_w_%=\n\t" + "ld t5, 0(a6)\n\t" + "j L_ualn_ld69_e_%=\n\t" + "\n" + "L_ualn_ld69_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld69_h_%=\n\t" + "lwu t5, 0(a6)\n\t" + "lwu t4, 4(a6)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld69_e_%=\n\t" + "\n" + "L_ualn_ld69_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld69_b_%=\n\t" + "lhu t5, 0(a6)\n\t" + "lhu t4, 2(a6)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(a6)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(a6)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld69_e_%=\n\t" + "\n" + "L_ualn_ld69_b_%=:\n\t" + "lbu t5, 0(a6)\n\t" + "lbu t4, 1(a6)\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(a6)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(a6)\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(a6)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(a6)\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(a6)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(a6)\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld69_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(a6)\n\t" +#else + "andi t4, a6, 7\n\t" + "bnez t4, L_ualn_ld70_w_%=\n\t" + "ld a5, 8(a6)\n\t" + "j L_ualn_ld70_e_%=\n\t" + "\n" + "L_ualn_ld70_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld70_h_%=\n\t" + "lwu a5, 8(a6)\n\t" + "lwu t4, 12(a6)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld70_e_%=\n\t" + "\n" + "L_ualn_ld70_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld70_b_%=\n\t" + "lhu a5, 8(a6)\n\t" + "lhu t4, 10(a6)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(a6)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(a6)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld70_e_%=\n\t" + "\n" + "L_ualn_ld70_b_%=:\n\t" + "lbu a5, 8(a6)\n\t" + "lbu t4, 9(a6)\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(a6)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(a6)\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(a6)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(a6)\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(a6)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(a6)\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld70_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* Carryless multiply x * h in GF(2^128) - 3-way Karatsuba (6 clmul) */ + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* Reduce modulo the GCM polynomial (0x87) */ + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "addi a6, a6, 16\n\t" + "addi a7, a7, -1\n\t" + "bnez a7, L_GHASH_RISCV64_loop\n\t" + /* Reflect x back and store */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(%[x])\n\t" + "sd t1, 8(%[x])\n\t" + "\n" + "L_GHASH_RISCV64_ret:\n\t" + : [x] "+r" (x), [h] "+r" (h), [in] "+r" (in), [blocks] "+r" (blocks) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a2", "a3", "a4", + "a5", "a6", "a7" + ); +} + +void AES_GCM_encrypt_RISCV64(const byte* in_p, byte* out_p, word32 sz_p, + const byte* nonce_p, word32 nonceSz_p, byte* tag_p, word32 tagSz_p, + const byte* aad_p, word32 aadSz_p, byte* key_p, byte* gcm_h_p, byte* tmp_p, + byte* reg_p, int nr_p) +{ + register const byte* in __asm__ ("a0") = (const byte*)in_p; + register byte* out __asm__ ("a1") = (byte*)out_p; + register word32 sz __asm__ ("a2") = (word32)sz_p; + register const byte* nonce __asm__ ("a3") = (const byte*)nonce_p; + register word32 nonceSz __asm__ ("a4") = (word32)nonceSz_p; + register byte* tag __asm__ ("a5") = (byte*)tag_p; + register word32 tagSz __asm__ ("a6") = (word32)tagSz_p; + register const byte* aad __asm__ ("a7") = (const byte*)aad_p; + register word32 aadSz __asm__ ("t1") = (word32)aadSz_p; + register byte* key __asm__ ("t2") = (byte*)key_p; + register byte* gcm_h __asm__ ("t3") = (byte*)gcm_h_p; + register byte* tmp __asm__ ("t4") = (byte*)tmp_p; + register byte* reg __asm__ ("t5") = (byte*)reg_p; + register int nr __asm__ ("t6") = (int)nr_p; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "sd %[aadSz], 0(sp)\n\t" + "sd %[key], 8(sp)\n\t" + "sd %[gcm_h], 16(sp)\n\t" + "sd %[tmp], 24(sp)\n\t" + "sd %[reg], 32(sp)\n\t" + "sd %[nr], 40(sp)\n\t" + "addi sp, sp, -32\n\t" + "mv s9, %[sz]\n\t" + "mv s10, %[tag]\n\t" + "mv s11, %[tagSz]\n\t" + "ld s2, 32(sp)\n\t" + "ld s3, 40(sp)\n\t" + "ld s4, 48(sp)\n\t" + "ld s5, 56(sp)\n\t" + "ld s6, 64(sp)\n\t" + "ld s7, 72(sp)\n\t" + "li s1, 0\n\t" + "li s8, 0\n\t" + "li t0, 12\n\t" + "bne %[nonceSz], t0, L_AES_GCM_encrypt_RISCV64_j0ghash\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 0(%[nonce])\n\t" +#else + "andi t0, %[nonce], 7\n\t" + "bnez t0, L_ualn_ld71_w_%=\n\t" + "ld t1, 0(%[nonce])\n\t" + "j L_ualn_ld71_e_%=\n\t" + "\n" + "L_ualn_ld71_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld71_h_%=\n\t" + "lwu t1, 0(%[nonce])\n\t" + "lwu t0, 4(%[nonce])\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld71_e_%=\n\t" + "\n" + "L_ualn_ld71_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld71_b_%=\n\t" + "lhu t1, 0(%[nonce])\n\t" + "lhu t0, 2(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 4(%[nonce])\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 6(%[nonce])\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld71_e_%=\n\t" + "\n" + "L_ualn_ld71_b_%=:\n\t" + "lbu t1, 0(%[nonce])\n\t" + "lbu t0, 1(%[nonce])\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 2(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 3(%[nonce])\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 4(%[nonce])\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 5(%[nonce])\n\t" + "slli t0, t0, 40\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 6(%[nonce])\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 7(%[nonce])\n\t" + "slli t0, t0, 56\n\t" + "or t1, t1, t0\n\t" + "\n" + "L_ualn_ld71_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t1, 0(s6)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 8(%[nonce])\n\t" +#else + "andi t0, %[nonce], 3\n\t" + "bnez t0, L_ualn_lw72_h_%=\n\t" + "lw t1, 8(%[nonce])\n\t" + "j L_ualn_lw72_e_%=\n\t" + "\n" + "L_ualn_lw72_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_lw72_b_%=\n\t" + "lhu t1, 8(%[nonce])\n\t" + "lhu t0, 10(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw72_e_%=\n\t" + "\n" + "L_ualn_lw72_b_%=:\n\t" + "lbu t1, 8(%[nonce])\n\t" + "lbu t0, 9(%[nonce])\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 10(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 11(%[nonce])\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw72_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 8(s6)\n\t" + "sb zero, 12(s6)\n\t" + "sb zero, 13(s6)\n\t" + "sb zero, 14(s6)\n\t" + "li t1, 1\n\t" + "sb t1, 15(s6)\n\t" + "j L_AES_GCM_encrypt_RISCV64_j0done\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0ghash:\n\t" + /* Length block 0^64 || nonceSz*8 (BE) into reg (nonceSz still valid) */ + "mv t0, s6\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "slli t1, %[nonceSz], 3\n\t" + "srli t2, t1, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 11(t0)\n\t" + "srli t2, t1, 24\n\t" + "srli t3, t1, 16\n\t" + "srli t4, t1, 8\n\t" + "sb t2, 12(t0)\n\t" + "sb t3, 13(t0)\n\t" + "sb t4, 14(t0)\n\t" + "sb t1, 15(t0)\n\t" + "sd s10, 24(sp)\n\t" + "sd s11, 16(sp)\n\t" + "mv s10, %[nonce]\n\t" + "mv s11, %[nonceSz]\n\t" + "beqz s11, L_AES_GCM_encrypt_RISCV64_j0n_gdone\n\t" + "srli a6, s11, 4\n\t" + "beqz a6, L_AES_GCM_encrypt_RISCV64_j0n_gpart\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0n_gloop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(s10)\n\t" +#else + "andi t4, s10, 7\n\t" + "bnez t4, L_ualn_ld73_w_%=\n\t" + "ld t5, 0(s10)\n\t" + "j L_ualn_ld73_e_%=\n\t" + "\n" + "L_ualn_ld73_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld73_h_%=\n\t" + "lwu t5, 0(s10)\n\t" + "lwu t4, 4(s10)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld73_e_%=\n\t" + "\n" + "L_ualn_ld73_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld73_b_%=\n\t" + "lhu t5, 0(s10)\n\t" + "lhu t4, 2(s10)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(s10)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(s10)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld73_e_%=\n\t" + "\n" + "L_ualn_ld73_b_%=:\n\t" + "lbu t5, 0(s10)\n\t" + "lbu t4, 1(s10)\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(s10)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(s10)\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(s10)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(s10)\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(s10)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(s10)\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld73_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(s10)\n\t" +#else + "andi t4, s10, 7\n\t" + "bnez t4, L_ualn_ld74_w_%=\n\t" + "ld a5, 8(s10)\n\t" + "j L_ualn_ld74_e_%=\n\t" + "\n" + "L_ualn_ld74_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld74_h_%=\n\t" + "lwu a5, 8(s10)\n\t" + "lwu t4, 12(s10)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld74_e_%=\n\t" + "\n" + "L_ualn_ld74_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld74_b_%=\n\t" + "lhu a5, 8(s10)\n\t" + "lhu t4, 10(s10)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(s10)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(s10)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld74_e_%=\n\t" + "\n" + "L_ualn_ld74_b_%=:\n\t" + "lbu a5, 8(s10)\n\t" + "lbu t4, 9(s10)\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(s10)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(s10)\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(s10)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(s10)\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(s10)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(s10)\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld74_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi s10, s10, 16\n\t" + "addi a6, a6, -1\n\t" + "bnez a6, L_AES_GCM_encrypt_RISCV64_j0n_gloop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0n_gpart:\n\t" + "andi a6, s11, 15\n\t" + "beqz a6, L_AES_GCM_encrypt_RISCV64_j0n_gdone\n\t" + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "mv t1, a6\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0n_gpb:\n\t" + "lb t2, 0(s10)\n\t" + "sb t2, 0(t0)\n\t" + "addi s10, s10, 1\n\t" + "addi t0, t0, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_encrypt_RISCV64_j0n_gpb\n\t" + "mv t0, s5\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0n_gdone:\n\t" + /* GHASH the length block (from reg) */ + "mv t0, s6\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "ld s10, 24(sp)\n\t" + "ld s11, 16(sp)\n\t" + /* J0 = reflect(X); store to reg; reset X=0 */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(s6)\n\t" + "sd t1, 8(s6)\n\t" + "li s1, 0\n\t" + "li s8, 0\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_j0done:\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "ld a3, 0(s3)\n\t" + "ld a4, 8(s3)\n\t" + "ld a5, 16(s3)\n\t" + "ld a6, 24(s3)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s3)\n\t" + "ld a4, 40(s3)\n\t" + "ld a5, 48(s3)\n\t" + "ld a6, 56(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s3)\n\t" + "ld a4, 72(s3)\n\t" + "ld a5, 80(s3)\n\t" + "ld a6, 88(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s3)\n\t" + "ld a4, 104(s3)\n\t" + "ld a5, 112(s3)\n\t" + "ld a6, 120(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s3)\n\t" + "ld a4, 136(s3)\n\t" + "ld a5, 144(s3)\n\t" + "ld a6, 152(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s3)\n\t" + "ld a4, 168(s3)\n\t" + "li t4, 11\n\t" + "ble s7, t4, L_AES_GCM_encrypt_RISCV64_ekj0_done\n\t" + "ld a5, 176(s3)\n\t" + "ld a6, 184(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s3)\n\t" + "ld a4, 200(s3)\n\t" + "li t4, 13\n\t" + "ble s7, t4, L_AES_GCM_encrypt_RISCV64_ekj0_done\n\t" + "ld a5, 208(s3)\n\t" + "ld a6, 216(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s3)\n\t" + "ld a4, 232(s3)\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_ekj0_done:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "sd t2, 0(sp)\n\t" + "sd t3, 8(sp)\n\t" + /* GHASH the AAD */ + "beqz s2, L_AES_GCM_encrypt_RISCV64_aad_gdone\n\t" + "srli a6, s2, 4\n\t" + "beqz a6, L_AES_GCM_encrypt_RISCV64_aad_gpart\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_gloop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(%[aad])\n\t" +#else + "andi t4, %[aad], 7\n\t" + "bnez t4, L_ualn_ld75_w_%=\n\t" + "ld t5, 0(%[aad])\n\t" + "j L_ualn_ld75_e_%=\n\t" + "\n" + "L_ualn_ld75_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld75_h_%=\n\t" + "lwu t5, 0(%[aad])\n\t" + "lwu t4, 4(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld75_e_%=\n\t" + "\n" + "L_ualn_ld75_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld75_b_%=\n\t" + "lhu t5, 0(%[aad])\n\t" + "lhu t4, 2(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld75_e_%=\n\t" + "\n" + "L_ualn_ld75_b_%=:\n\t" + "lbu t5, 0(%[aad])\n\t" + "lbu t4, 1(%[aad])\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(%[aad])\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(%[aad])\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(%[aad])\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld75_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[aad])\n\t" +#else + "andi t4, %[aad], 7\n\t" + "bnez t4, L_ualn_ld76_w_%=\n\t" + "ld a5, 8(%[aad])\n\t" + "j L_ualn_ld76_e_%=\n\t" + "\n" + "L_ualn_ld76_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld76_h_%=\n\t" + "lwu a5, 8(%[aad])\n\t" + "lwu t4, 12(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld76_e_%=\n\t" + "\n" + "L_ualn_ld76_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld76_b_%=\n\t" + "lhu a5, 8(%[aad])\n\t" + "lhu t4, 10(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld76_e_%=\n\t" + "\n" + "L_ualn_ld76_b_%=:\n\t" + "lbu a5, 8(%[aad])\n\t" + "lbu t4, 9(%[aad])\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(%[aad])\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(%[aad])\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(%[aad])\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld76_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi %[aad], %[aad], 16\n\t" + "addi a6, a6, -1\n\t" + "bnez a6, L_AES_GCM_encrypt_RISCV64_aad_gloop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_gpart:\n\t" + "andi a6, s2, 15\n\t" + "beqz a6, L_AES_GCM_encrypt_RISCV64_aad_gdone\n\t" + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "mv t1, a6\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_gpb:\n\t" + "lb t2, 0(%[aad])\n\t" + "sb t2, 0(t0)\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_encrypt_RISCV64_aad_gpb\n\t" + "mv t0, s5\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_gdone:\n\t" + "srli a7, s9, 4\n\t" + "beqz a7, L_AES_GCM_encrypt_RISCV64_dbdone\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_dloop:\n\t" + "lbu t0, 12(s6)\n\t" + "lbu t1, 13(s6)\n\t" + "lbu t2, 14(s6)\n\t" + "lbu t3, 15(s6)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s6)\n\t" + "sb t2, 13(s6)\n\t" + "sb t3, 14(s6)\n\t" + "sb t0, 15(s6)\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "ld a3, 0(s3)\n\t" + "ld a4, 8(s3)\n\t" + "ld a5, 16(s3)\n\t" + "ld a6, 24(s3)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s3)\n\t" + "ld a4, 40(s3)\n\t" + "ld a5, 48(s3)\n\t" + "ld a6, 56(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s3)\n\t" + "ld a4, 72(s3)\n\t" + "ld a5, 80(s3)\n\t" + "ld a6, 88(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s3)\n\t" + "ld a4, 104(s3)\n\t" + "ld a5, 112(s3)\n\t" + "ld a6, 120(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s3)\n\t" + "ld a4, 136(s3)\n\t" + "ld a5, 144(s3)\n\t" + "ld a6, 152(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s3)\n\t" + "ld a4, 168(s3)\n\t" + "li t4, 11\n\t" + "ble s7, t4, L_AES_GCM_encrypt_RISCV64_denc\n\t" + "ld a5, 176(s3)\n\t" + "ld a6, 184(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s3)\n\t" + "ld a4, 200(s3)\n\t" + "li t4, 13\n\t" + "ble s7, t4, L_AES_GCM_encrypt_RISCV64_denc\n\t" + "ld a5, 208(s3)\n\t" + "ld a6, 216(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s3)\n\t" + "ld a4, 232(s3)\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_denc:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld77_w_%=\n\t" + "ld t5, 0(%[in])\n\t" + "j L_ualn_ld77_e_%=\n\t" + "\n" + "L_ualn_ld77_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld77_h_%=\n\t" + "lwu t5, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld77_e_%=\n\t" + "\n" + "L_ualn_ld77_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld77_b_%=\n\t" + "lhu t5, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld77_e_%=\n\t" + "\n" + "L_ualn_ld77_b_%=:\n\t" + "lbu t5, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld77_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld78_w_%=\n\t" + "ld a5, 8(%[in])\n\t" + "j L_ualn_ld78_e_%=\n\t" + "\n" + "L_ualn_ld78_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld78_h_%=\n\t" + "lwu a5, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld78_e_%=\n\t" + "\n" + "L_ualn_ld78_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld78_b_%=\n\t" + "lhu a5, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld78_e_%=\n\t" + "\n" + "L_ualn_ld78_b_%=:\n\t" + "lbu a5, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld78_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, t2, t5\n\t" + "xor t3, t3, a5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd79_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd79_e_%=\n\t" + "\n" + "L_ualn_sd79_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd79_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd79_e_%=\n\t" + "\n" + "L_ualn_sd79_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd79_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd79_e_%=\n\t" + "\n" + "L_ualn_sd79_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd79_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd80_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd80_e_%=\n\t" + "\n" + "L_ualn_sd80_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd80_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd80_e_%=\n\t" + "\n" + "L_ualn_sd80_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd80_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd80_e_%=\n\t" + "\n" + "L_ualn_sd80_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd80_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t5, t2\n\t" + "mv a5, t3\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi a7, a7, -1\n\t" + "bnez a7, L_AES_GCM_encrypt_RISCV64_dloop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_dbdone:\n\t" + /* Partial final block (cnt = sz & 15) */ + "andi a7, s9, 15\n\t" + "beqz a7, L_AES_GCM_encrypt_RISCV64_pdone\n\t" + "lbu t0, 12(s6)\n\t" + "lbu t1, 13(s6)\n\t" + "lbu t2, 14(s6)\n\t" + "lbu t3, 15(s6)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s6)\n\t" + "sb t2, 13(s6)\n\t" + "sb t3, 14(s6)\n\t" + "sb t0, 15(s6)\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "ld a3, 0(s3)\n\t" + "ld a4, 8(s3)\n\t" + "ld a5, 16(s3)\n\t" + "ld a6, 24(s3)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s3)\n\t" + "ld a4, 40(s3)\n\t" + "ld a5, 48(s3)\n\t" + "ld a6, 56(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s3)\n\t" + "ld a4, 72(s3)\n\t" + "ld a5, 80(s3)\n\t" + "ld a6, 88(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s3)\n\t" + "ld a4, 104(s3)\n\t" + "ld a5, 112(s3)\n\t" + "ld a6, 120(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s3)\n\t" + "ld a4, 136(s3)\n\t" + "ld a5, 144(s3)\n\t" + "ld a6, 152(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s3)\n\t" + "ld a4, 168(s3)\n\t" + "li t4, 11\n\t" + "ble s7, t4, L_AES_GCM_encrypt_RISCV64_penc\n\t" + "ld a5, 176(s3)\n\t" + "ld a6, 184(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s3)\n\t" + "ld a4, 200(s3)\n\t" + "li t4, 13\n\t" + "ble s7, t4, L_AES_GCM_encrypt_RISCV64_penc\n\t" + "ld a5, 208(s3)\n\t" + "ld a6, 216(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s3)\n\t" + "ld a4, 232(s3)\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_penc:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "mv t0, s6\n\t" + "sd t2, 0(t0)\n\t" + "sd t3, 8(t0)\n\t" + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "li t4, 0\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_pbyte:\n\t" + "add t5, %[in], t4\n\t" + "lb t5, 0(t5)\n\t" + "add t6, s6, t4\n\t" + "lb t6, 0(t6)\n\t" + "xor t0, t5, t6\n\t" + "add t1, %[out], t4\n\t" + "sb t0, 0(t1)\n\t" + "add t1, s5, t4\n\t" + "sb t0, 0(t1)\n\t" + "addi t4, t4, 1\n\t" + "blt t4, a7, L_AES_GCM_encrypt_RISCV64_pbyte\n\t" + "mv t0, s5\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_pdone:\n\t" + /* Length block: aadSz*8 (BE64) || sz*8 (BE64) */ + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "slli s2, s2, 3\n\t" + "srli t2, s2, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 3(t0)\n\t" + "srli t2, s2, 24\n\t" + "srli t3, s2, 16\n\t" + "srli t4, s2, 8\n\t" + "sb t2, 4(t0)\n\t" + "sb t3, 5(t0)\n\t" + "sb t4, 6(t0)\n\t" + "sb s2, 7(t0)\n\t" + "slli s9, s9, 3\n\t" + "srli t2, s9, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 11(t0)\n\t" + "srli t2, s9, 24\n\t" + "srli t3, s9, 16\n\t" + "srli t4, s9, 8\n\t" + "sb t2, 12(t0)\n\t" + "sb t3, 13(t0)\n\t" + "sb t4, 14(t0)\n\t" + "sb s9, 15(t0)\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + /* tag = reflect(X) ^ E_K(J0) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "ld t2, 0(sp)\n\t" + "ld t3, 8(sp)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "mv t4, s5\n\t" + "sd t0, 0(t4)\n\t" + "sd t1, 8(t4)\n\t" + /* Store tagSz bytes */ + "mv t0, s5\n\t" + "mv t3, s11\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_stag:\n\t" + "lb t4, 0(t0)\n\t" + "sb t4, 0(s10)\n\t" + "addi t0, t0, 1\n\t" + "addi s10, s10, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_RISCV64_stag\n\t" + "addi sp, sp, 32\n\t" + "ld %[aadSz], 0(sp)\n\t" + "ld %[key], 8(sp)\n\t" + "ld %[gcm_h], 16(sp)\n\t" + "ld %[tmp], 24(sp)\n\t" + "ld %[reg], 32(sp)\n\t" + "ld %[nr], 40(sp)\n\t" + "addi sp, sp, 48\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), + [nonce] "+r" (nonce), [nonceSz] "+r" (nonceSz), [tag] "+r" (tag), + [tagSz] "+r" (tagSz), [aad] "+r" (aad), [aadSz] "+r" (aadSz), + [key] "+r" (key), [gcm_h] "+r" (gcm_h), [tmp] "+r" (tmp), + [reg] "+r" (reg), [nr] "+r" (nr) + : + : "memory", "s9", "s10", "s11", "s2", "s3", "s4", "s5", "s6", "s7", + "t0", "s1", "s8" + ); +} + +#ifdef HAVE_AES_DECRYPT +int AES_GCM_decrypt_RISCV64(byte* in_p, byte* out_p, word32 sz_p, + const byte* nonce_p, word32 nonceSz_p, const byte* tag_p, word32 tagSz_p, + const byte* aad_p, word32 aadSz_p, byte* key_p, byte* gcm_h_p, byte* tmp_p, + byte* reg_p, int nr_p) +{ + register byte* in __asm__ ("a0") = (byte*)in_p; + register byte* out __asm__ ("a1") = (byte*)out_p; + register word32 sz __asm__ ("a2") = (word32)sz_p; + register const byte* nonce __asm__ ("a3") = (const byte*)nonce_p; + register word32 nonceSz __asm__ ("a4") = (word32)nonceSz_p; + register const byte* tag __asm__ ("a5") = (const byte*)tag_p; + register word32 tagSz __asm__ ("a6") = (word32)tagSz_p; + register const byte* aad __asm__ ("a7") = (const byte*)aad_p; + register word32 aadSz __asm__ ("t1") = (word32)aadSz_p; + register byte* key __asm__ ("t2") = (byte*)key_p; + register byte* gcm_h __asm__ ("t3") = (byte*)gcm_h_p; + register byte* tmp __asm__ ("t4") = (byte*)tmp_p; + register byte* reg __asm__ ("t5") = (byte*)reg_p; + register int nr __asm__ ("t6") = (int)nr_p; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "sd %[aadSz], 0(sp)\n\t" + "sd %[key], 8(sp)\n\t" + "sd %[gcm_h], 16(sp)\n\t" + "sd %[tmp], 24(sp)\n\t" + "sd %[reg], 32(sp)\n\t" + "sd %[nr], 40(sp)\n\t" + "addi sp, sp, -32\n\t" + "mv s9, %[sz]\n\t" + "mv s10, %[tag]\n\t" + "mv s11, %[tagSz]\n\t" + "ld s2, 32(sp)\n\t" + "ld s3, 40(sp)\n\t" + "ld s4, 48(sp)\n\t" + "ld s5, 56(sp)\n\t" + "ld s6, 64(sp)\n\t" + "ld s7, 72(sp)\n\t" + "li s1, 0\n\t" + "li s8, 0\n\t" + "li t0, 12\n\t" + "bne %[nonceSz], t0, L_AES_GCM_decrypt_RISCV64_j0ghash\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 0(%[nonce])\n\t" +#else + "andi t0, %[nonce], 7\n\t" + "bnez t0, L_ualn_ld81_w_%=\n\t" + "ld t1, 0(%[nonce])\n\t" + "j L_ualn_ld81_e_%=\n\t" + "\n" + "L_ualn_ld81_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld81_h_%=\n\t" + "lwu t1, 0(%[nonce])\n\t" + "lwu t0, 4(%[nonce])\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld81_e_%=\n\t" + "\n" + "L_ualn_ld81_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld81_b_%=\n\t" + "lhu t1, 0(%[nonce])\n\t" + "lhu t0, 2(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 4(%[nonce])\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 6(%[nonce])\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld81_e_%=\n\t" + "\n" + "L_ualn_ld81_b_%=:\n\t" + "lbu t1, 0(%[nonce])\n\t" + "lbu t0, 1(%[nonce])\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 2(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 3(%[nonce])\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 4(%[nonce])\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 5(%[nonce])\n\t" + "slli t0, t0, 40\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 6(%[nonce])\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 7(%[nonce])\n\t" + "slli t0, t0, 56\n\t" + "or t1, t1, t0\n\t" + "\n" + "L_ualn_ld81_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t1, 0(s6)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 8(%[nonce])\n\t" +#else + "andi t0, %[nonce], 3\n\t" + "bnez t0, L_ualn_lw82_h_%=\n\t" + "lw t1, 8(%[nonce])\n\t" + "j L_ualn_lw82_e_%=\n\t" + "\n" + "L_ualn_lw82_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_lw82_b_%=\n\t" + "lhu t1, 8(%[nonce])\n\t" + "lhu t0, 10(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw82_e_%=\n\t" + "\n" + "L_ualn_lw82_b_%=:\n\t" + "lbu t1, 8(%[nonce])\n\t" + "lbu t0, 9(%[nonce])\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 10(%[nonce])\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 11(%[nonce])\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw82_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 8(s6)\n\t" + "sb zero, 12(s6)\n\t" + "sb zero, 13(s6)\n\t" + "sb zero, 14(s6)\n\t" + "li t1, 1\n\t" + "sb t1, 15(s6)\n\t" + "j L_AES_GCM_decrypt_RISCV64_j0done\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0ghash:\n\t" + /* Length block 0^64 || nonceSz*8 (BE) into reg (nonceSz still valid) */ + "mv t0, s6\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "slli t1, %[nonceSz], 3\n\t" + "srli t2, t1, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 11(t0)\n\t" + "srli t2, t1, 24\n\t" + "srli t3, t1, 16\n\t" + "srli t4, t1, 8\n\t" + "sb t2, 12(t0)\n\t" + "sb t3, 13(t0)\n\t" + "sb t4, 14(t0)\n\t" + "sb t1, 15(t0)\n\t" + "sd s10, 24(sp)\n\t" + "sd s11, 16(sp)\n\t" + "mv s10, %[nonce]\n\t" + "mv s11, %[nonceSz]\n\t" + "beqz s11, L_AES_GCM_decrypt_RISCV64_j0n_gdone\n\t" + "srli a6, s11, 4\n\t" + "beqz a6, L_AES_GCM_decrypt_RISCV64_j0n_gpart\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0n_gloop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(s10)\n\t" +#else + "andi t4, s10, 7\n\t" + "bnez t4, L_ualn_ld83_w_%=\n\t" + "ld t5, 0(s10)\n\t" + "j L_ualn_ld83_e_%=\n\t" + "\n" + "L_ualn_ld83_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld83_h_%=\n\t" + "lwu t5, 0(s10)\n\t" + "lwu t4, 4(s10)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld83_e_%=\n\t" + "\n" + "L_ualn_ld83_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld83_b_%=\n\t" + "lhu t5, 0(s10)\n\t" + "lhu t4, 2(s10)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(s10)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(s10)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld83_e_%=\n\t" + "\n" + "L_ualn_ld83_b_%=:\n\t" + "lbu t5, 0(s10)\n\t" + "lbu t4, 1(s10)\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(s10)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(s10)\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(s10)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(s10)\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(s10)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(s10)\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld83_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(s10)\n\t" +#else + "andi t4, s10, 7\n\t" + "bnez t4, L_ualn_ld84_w_%=\n\t" + "ld a5, 8(s10)\n\t" + "j L_ualn_ld84_e_%=\n\t" + "\n" + "L_ualn_ld84_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld84_h_%=\n\t" + "lwu a5, 8(s10)\n\t" + "lwu t4, 12(s10)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld84_e_%=\n\t" + "\n" + "L_ualn_ld84_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld84_b_%=\n\t" + "lhu a5, 8(s10)\n\t" + "lhu t4, 10(s10)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(s10)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(s10)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld84_e_%=\n\t" + "\n" + "L_ualn_ld84_b_%=:\n\t" + "lbu a5, 8(s10)\n\t" + "lbu t4, 9(s10)\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(s10)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(s10)\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(s10)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(s10)\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(s10)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(s10)\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld84_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi s10, s10, 16\n\t" + "addi a6, a6, -1\n\t" + "bnez a6, L_AES_GCM_decrypt_RISCV64_j0n_gloop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0n_gpart:\n\t" + "andi a6, s11, 15\n\t" + "beqz a6, L_AES_GCM_decrypt_RISCV64_j0n_gdone\n\t" + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "mv t1, a6\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0n_gpb:\n\t" + "lb t2, 0(s10)\n\t" + "sb t2, 0(t0)\n\t" + "addi s10, s10, 1\n\t" + "addi t0, t0, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_decrypt_RISCV64_j0n_gpb\n\t" + "mv t0, s5\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0n_gdone:\n\t" + /* GHASH the length block (from reg) */ + "mv t0, s6\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "ld s10, 24(sp)\n\t" + "ld s11, 16(sp)\n\t" + /* J0 = reflect(X); store to reg; reset X=0 */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(s6)\n\t" + "sd t1, 8(s6)\n\t" + "li s1, 0\n\t" + "li s8, 0\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_j0done:\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "ld a3, 0(s3)\n\t" + "ld a4, 8(s3)\n\t" + "ld a5, 16(s3)\n\t" + "ld a6, 24(s3)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s3)\n\t" + "ld a4, 40(s3)\n\t" + "ld a5, 48(s3)\n\t" + "ld a6, 56(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s3)\n\t" + "ld a4, 72(s3)\n\t" + "ld a5, 80(s3)\n\t" + "ld a6, 88(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s3)\n\t" + "ld a4, 104(s3)\n\t" + "ld a5, 112(s3)\n\t" + "ld a6, 120(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s3)\n\t" + "ld a4, 136(s3)\n\t" + "ld a5, 144(s3)\n\t" + "ld a6, 152(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s3)\n\t" + "ld a4, 168(s3)\n\t" + "li t4, 11\n\t" + "ble s7, t4, L_AES_GCM_decrypt_RISCV64_ekj0_done\n\t" + "ld a5, 176(s3)\n\t" + "ld a6, 184(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s3)\n\t" + "ld a4, 200(s3)\n\t" + "li t4, 13\n\t" + "ble s7, t4, L_AES_GCM_decrypt_RISCV64_ekj0_done\n\t" + "ld a5, 208(s3)\n\t" + "ld a6, 216(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s3)\n\t" + "ld a4, 232(s3)\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_ekj0_done:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "sd t2, 0(sp)\n\t" + "sd t3, 8(sp)\n\t" + /* GHASH the AAD */ + "beqz s2, L_AES_GCM_decrypt_RISCV64_aad_gdone\n\t" + "srli a6, s2, 4\n\t" + "beqz a6, L_AES_GCM_decrypt_RISCV64_aad_gpart\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_gloop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(%[aad])\n\t" +#else + "andi t4, %[aad], 7\n\t" + "bnez t4, L_ualn_ld85_w_%=\n\t" + "ld t5, 0(%[aad])\n\t" + "j L_ualn_ld85_e_%=\n\t" + "\n" + "L_ualn_ld85_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld85_h_%=\n\t" + "lwu t5, 0(%[aad])\n\t" + "lwu t4, 4(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld85_e_%=\n\t" + "\n" + "L_ualn_ld85_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld85_b_%=\n\t" + "lhu t5, 0(%[aad])\n\t" + "lhu t4, 2(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld85_e_%=\n\t" + "\n" + "L_ualn_ld85_b_%=:\n\t" + "lbu t5, 0(%[aad])\n\t" + "lbu t4, 1(%[aad])\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(%[aad])\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(%[aad])\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(%[aad])\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld85_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[aad])\n\t" +#else + "andi t4, %[aad], 7\n\t" + "bnez t4, L_ualn_ld86_w_%=\n\t" + "ld a5, 8(%[aad])\n\t" + "j L_ualn_ld86_e_%=\n\t" + "\n" + "L_ualn_ld86_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld86_h_%=\n\t" + "lwu a5, 8(%[aad])\n\t" + "lwu t4, 12(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld86_e_%=\n\t" + "\n" + "L_ualn_ld86_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld86_b_%=\n\t" + "lhu a5, 8(%[aad])\n\t" + "lhu t4, 10(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld86_e_%=\n\t" + "\n" + "L_ualn_ld86_b_%=:\n\t" + "lbu a5, 8(%[aad])\n\t" + "lbu t4, 9(%[aad])\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(%[aad])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(%[aad])\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(%[aad])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(%[aad])\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(%[aad])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(%[aad])\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld86_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi %[aad], %[aad], 16\n\t" + "addi a6, a6, -1\n\t" + "bnez a6, L_AES_GCM_decrypt_RISCV64_aad_gloop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_gpart:\n\t" + "andi a6, s2, 15\n\t" + "beqz a6, L_AES_GCM_decrypt_RISCV64_aad_gdone\n\t" + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "mv t1, a6\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_gpb:\n\t" + "lb t2, 0(%[aad])\n\t" + "sb t2, 0(t0)\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi t0, t0, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_decrypt_RISCV64_aad_gpb\n\t" + "mv t0, s5\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_gdone:\n\t" + "srli a7, s9, 4\n\t" + "beqz a7, L_AES_GCM_decrypt_RISCV64_dbdone\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_dloop:\n\t" + "lbu t0, 12(s6)\n\t" + "lbu t1, 13(s6)\n\t" + "lbu t2, 14(s6)\n\t" + "lbu t3, 15(s6)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s6)\n\t" + "sb t2, 13(s6)\n\t" + "sb t3, 14(s6)\n\t" + "sb t0, 15(s6)\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "ld a3, 0(s3)\n\t" + "ld a4, 8(s3)\n\t" + "ld a5, 16(s3)\n\t" + "ld a6, 24(s3)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s3)\n\t" + "ld a4, 40(s3)\n\t" + "ld a5, 48(s3)\n\t" + "ld a6, 56(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s3)\n\t" + "ld a4, 72(s3)\n\t" + "ld a5, 80(s3)\n\t" + "ld a6, 88(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s3)\n\t" + "ld a4, 104(s3)\n\t" + "ld a5, 112(s3)\n\t" + "ld a6, 120(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s3)\n\t" + "ld a4, 136(s3)\n\t" + "ld a5, 144(s3)\n\t" + "ld a6, 152(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s3)\n\t" + "ld a4, 168(s3)\n\t" + "li t4, 11\n\t" + "ble s7, t4, L_AES_GCM_decrypt_RISCV64_denc\n\t" + "ld a5, 176(s3)\n\t" + "ld a6, 184(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s3)\n\t" + "ld a4, 200(s3)\n\t" + "li t4, 13\n\t" + "ble s7, t4, L_AES_GCM_decrypt_RISCV64_denc\n\t" + "ld a5, 208(s3)\n\t" + "ld a6, 216(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s3)\n\t" + "ld a4, 232(s3)\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_denc:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld87_w_%=\n\t" + "ld t5, 0(%[in])\n\t" + "j L_ualn_ld87_e_%=\n\t" + "\n" + "L_ualn_ld87_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld87_h_%=\n\t" + "lwu t5, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld87_e_%=\n\t" + "\n" + "L_ualn_ld87_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld87_b_%=\n\t" + "lhu t5, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld87_e_%=\n\t" + "\n" + "L_ualn_ld87_b_%=:\n\t" + "lbu t5, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld87_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld88_w_%=\n\t" + "ld a5, 8(%[in])\n\t" + "j L_ualn_ld88_e_%=\n\t" + "\n" + "L_ualn_ld88_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld88_h_%=\n\t" + "lwu a5, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld88_e_%=\n\t" + "\n" + "L_ualn_ld88_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld88_b_%=\n\t" + "lhu a5, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld88_e_%=\n\t" + "\n" + "L_ualn_ld88_b_%=:\n\t" + "lbu a5, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld88_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, t2, t5\n\t" + "xor t3, t3, a5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd89_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd89_e_%=\n\t" + "\n" + "L_ualn_sd89_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd89_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(%[out])\n\t" + "j L_ualn_sd89_e_%=\n\t" + "\n" + "L_ualn_sd89_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd89_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(%[out])\n\t" + "j L_ualn_sd89_e_%=\n\t" + "\n" + "L_ualn_sd89_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(%[out])\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(%[out])\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(%[out])\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(%[out])\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(%[out])\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(%[out])\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(%[out])\n\t" + "\n" + "L_ualn_sd89_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t4, %[out], 7\n\t" + "bnez t4, L_ualn_sd90_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd90_e_%=\n\t" + "\n" + "L_ualn_sd90_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd90_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(%[out])\n\t" + "j L_ualn_sd90_e_%=\n\t" + "\n" + "L_ualn_sd90_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd90_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(%[out])\n\t" + "j L_ualn_sd90_e_%=\n\t" + "\n" + "L_ualn_sd90_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(%[out])\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(%[out])\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(%[out])\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(%[out])\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(%[out])\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(%[out])\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(%[out])\n\t" + "\n" + "L_ualn_sd90_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi a7, a7, -1\n\t" + "bnez a7, L_AES_GCM_decrypt_RISCV64_dloop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_dbdone:\n\t" + /* Partial final block (cnt = sz & 15) */ + "andi a7, s9, 15\n\t" + "beqz a7, L_AES_GCM_decrypt_RISCV64_pdone\n\t" + "lbu t0, 12(s6)\n\t" + "lbu t1, 13(s6)\n\t" + "lbu t2, 14(s6)\n\t" + "lbu t3, 15(s6)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s6)\n\t" + "sb t2, 13(s6)\n\t" + "sb t3, 14(s6)\n\t" + "sb t0, 15(s6)\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "ld a3, 0(s3)\n\t" + "ld a4, 8(s3)\n\t" + "ld a5, 16(s3)\n\t" + "ld a6, 24(s3)\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(s3)\n\t" + "ld a4, 40(s3)\n\t" + "ld a5, 48(s3)\n\t" + "ld a6, 56(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(s3)\n\t" + "ld a4, 72(s3)\n\t" + "ld a5, 80(s3)\n\t" + "ld a6, 88(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(s3)\n\t" + "ld a4, 104(s3)\n\t" + "ld a5, 112(s3)\n\t" + "ld a6, 120(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(s3)\n\t" + "ld a4, 136(s3)\n\t" + "ld a5, 144(s3)\n\t" + "ld a6, 152(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(s3)\n\t" + "ld a4, 168(s3)\n\t" + "li t4, 11\n\t" + "ble s7, t4, L_AES_GCM_decrypt_RISCV64_penc\n\t" + "ld a5, 176(s3)\n\t" + "ld a6, 184(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(s3)\n\t" + "ld a4, 200(s3)\n\t" + "li t4, 13\n\t" + "ble s7, t4, L_AES_GCM_decrypt_RISCV64_penc\n\t" + "ld a5, 208(s3)\n\t" + "ld a6, 216(s3)\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(s3)\n\t" + "ld a4, 232(s3)\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_penc:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "mv t0, s6\n\t" + "sd t2, 0(t0)\n\t" + "sd t3, 8(t0)\n\t" + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "li t4, 0\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_pbyte:\n\t" + "add t5, %[in], t4\n\t" + "lb t5, 0(t5)\n\t" + "add t6, s6, t4\n\t" + "lb t6, 0(t6)\n\t" + "xor t0, t5, t6\n\t" + "add t1, %[out], t4\n\t" + "sb t0, 0(t1)\n\t" + "add t1, s5, t4\n\t" + "sb t5, 0(t1)\n\t" + "addi t4, t4, 1\n\t" + "blt t4, a7, L_AES_GCM_decrypt_RISCV64_pbyte\n\t" + "mv t0, s5\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_pdone:\n\t" + /* Length block: aadSz*8 (BE64) || sz*8 (BE64) */ + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "slli s2, s2, 3\n\t" + "srli t2, s2, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 3(t0)\n\t" + "srli t2, s2, 24\n\t" + "srli t3, s2, 16\n\t" + "srli t4, s2, 8\n\t" + "sb t2, 4(t0)\n\t" + "sb t3, 5(t0)\n\t" + "sb t4, 6(t0)\n\t" + "sb s2, 7(t0)\n\t" + "slli s9, s9, 3\n\t" + "srli t2, s9, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 11(t0)\n\t" + "srli t2, s9, 24\n\t" + "srli t3, s9, 16\n\t" + "srli t4, s9, 8\n\t" + "sb t2, 12(t0)\n\t" + "sb t3, 13(t0)\n\t" + "sb t4, 14(t0)\n\t" + "sb s9, 15(t0)\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + /* tag = reflect(X) ^ E_K(J0) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "ld t2, 0(sp)\n\t" + "ld t3, 8(sp)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "mv t4, s5\n\t" + "sd t0, 0(t4)\n\t" + "sd t1, 8(t4)\n\t" + /* Compare tagSz bytes (unsigned); @ret = diff ? -180 : 0 */ + "mv t0, s5\n\t" + "mv t3, s11\n\t" + "xor t2, t2, t2\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_ctag:\n\t" + "lbu t4, 0(t0)\n\t" + "lbu t5, 0(s10)\n\t" + "xor t5, t5, t4\n\t" + "or t2, t2, t5\n\t" + "addi t0, t0, 1\n\t" + "addi s10, s10, 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_RISCV64_ctag\n\t" + "negw t2, t2\n\t" + "sraiw t2, t2, 31\n\t" + "andi %[in], t2, -180\n\t" + "addi sp, sp, 32\n\t" + "ld %[aadSz], 0(sp)\n\t" + "ld %[key], 8(sp)\n\t" + "ld %[gcm_h], 16(sp)\n\t" + "ld %[tmp], 24(sp)\n\t" + "ld %[reg], 32(sp)\n\t" + "ld %[nr], 40(sp)\n\t" + "addi sp, sp, 48\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), + [nonce] "+r" (nonce), [nonceSz] "+r" (nonceSz), [tag] "+r" (tag), + [tagSz] "+r" (tagSz), [aad] "+r" (aad), [aadSz] "+r" (aadSz), + [key] "+r" (key), [gcm_h] "+r" (gcm_h), [tmp] "+r" (tmp), + [reg] "+r" (reg), [nr] "+r" (nr) + : + : "memory", "s9", "s10", "s11", "s2", "s3", "s4", "s5", "s6", "s7", + "t0", "s1", "s8" + ); + return (word32)(size_t)in; +} + +#endif /* HAVE_AES_DECRYPT */ +#ifdef WOLFSSL_AESGCM_STREAM +void AES_GCM_init_RISCV64(const byte* key_p, int nr_p, const byte* nonce_p, + word32 nonceSz_p, byte* gcm_h_p, byte* counter_p, byte* initCtr_p) +{ + register const byte* key __asm__ ("a0") = (const byte*)key_p; + register int nr __asm__ ("a1") = (int)nr_p; + register const byte* nonce __asm__ ("a2") = (const byte*)nonce_p; + register word32 nonceSz __asm__ ("a3") = (word32)nonceSz_p; + register byte* gcm_h __asm__ ("a4") = (byte*)gcm_h_p; + register byte* counter __asm__ ("a5") = (byte*)counter_p; + register byte* initCtr __asm__ ("a6") = (byte*)initCtr_p; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" + "mv s2, %[nonce]\n\t" + "mv s3, %[nonceSz]\n\t" + "mv s4, %[gcm_h]\n\t" + "mv s5, %[counter]\n\t" + "mv s6, %[initCtr]\n\t" + "li s1, 0\n\t" + "li s8, 0\n\t" + "li t0, 12\n\t" + "bne s3, t0, L_AES_GCM_init_RISCV64_j0ghash\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 0(s2)\n\t" +#else + "andi t0, s2, 7\n\t" + "bnez t0, L_ualn_ld91_w_%=\n\t" + "ld t1, 0(s2)\n\t" + "j L_ualn_ld91_e_%=\n\t" + "\n" + "L_ualn_ld91_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld91_h_%=\n\t" + "lwu t1, 0(s2)\n\t" + "lwu t0, 4(s2)\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld91_e_%=\n\t" + "\n" + "L_ualn_ld91_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld91_b_%=\n\t" + "lhu t1, 0(s2)\n\t" + "lhu t0, 2(s2)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 4(s2)\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 6(s2)\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld91_e_%=\n\t" + "\n" + "L_ualn_ld91_b_%=:\n\t" + "lbu t1, 0(s2)\n\t" + "lbu t0, 1(s2)\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 2(s2)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 3(s2)\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 4(s2)\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 5(s2)\n\t" + "slli t0, t0, 40\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 6(s2)\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 7(s2)\n\t" + "slli t0, t0, 56\n\t" + "or t1, t1, t0\n\t" + "\n" + "L_ualn_ld91_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t1, 0(s5)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 8(s2)\n\t" +#else + "andi t0, s2, 3\n\t" + "bnez t0, L_ualn_lw92_h_%=\n\t" + "lw t1, 8(s2)\n\t" + "j L_ualn_lw92_e_%=\n\t" + "\n" + "L_ualn_lw92_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_lw92_b_%=\n\t" + "lhu t1, 8(s2)\n\t" + "lhu t0, 10(s2)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw92_e_%=\n\t" + "\n" + "L_ualn_lw92_b_%=:\n\t" + "lbu t1, 8(s2)\n\t" + "lbu t0, 9(s2)\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 10(s2)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 11(s2)\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw92_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 8(s5)\n\t" + "sb zero, 12(s5)\n\t" + "sb zero, 13(s5)\n\t" + "sb zero, 14(s5)\n\t" + "li t1, 1\n\t" + "sb t1, 15(s5)\n\t" + "j L_AES_GCM_init_RISCV64_j0done\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0ghash:\n\t" + /* Length block 0^64 || nonceSz*8 (BE) into reg (nonceSz still valid) */ + "mv t0, s5\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "slli t1, s3, 3\n\t" + "srli t2, t1, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 11(t0)\n\t" + "srli t2, t1, 24\n\t" + "srli t3, t1, 16\n\t" + "srli t4, t1, 8\n\t" + "sb t2, 12(t0)\n\t" + "sb t3, 13(t0)\n\t" + "sb t4, 14(t0)\n\t" + "sb t1, 15(t0)\n\t" + "sd s7, 24(sp)\n\t" + "sd s9, 16(sp)\n\t" + "mv s7, s2\n\t" + "mv s9, s3\n\t" + "beqz s9, L_AES_GCM_init_RISCV64_j0n_gdone\n\t" + "srli a6, s9, 4\n\t" + "beqz a6, L_AES_GCM_init_RISCV64_j0n_gpart\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0n_gloop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld93_w_%=\n\t" + "ld t5, 0(s7)\n\t" + "j L_ualn_ld93_e_%=\n\t" + "\n" + "L_ualn_ld93_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld93_h_%=\n\t" + "lwu t5, 0(s7)\n\t" + "lwu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld93_e_%=\n\t" + "\n" + "L_ualn_ld93_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld93_b_%=\n\t" + "lhu t5, 0(s7)\n\t" + "lhu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld93_e_%=\n\t" + "\n" + "L_ualn_ld93_b_%=:\n\t" + "lbu t5, 0(s7)\n\t" + "lbu t4, 1(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld93_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld94_w_%=\n\t" + "ld a5, 8(s7)\n\t" + "j L_ualn_ld94_e_%=\n\t" + "\n" + "L_ualn_ld94_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld94_h_%=\n\t" + "lwu a5, 8(s7)\n\t" + "lwu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld94_e_%=\n\t" + "\n" + "L_ualn_ld94_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld94_b_%=\n\t" + "lhu a5, 8(s7)\n\t" + "lhu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld94_e_%=\n\t" + "\n" + "L_ualn_ld94_b_%=:\n\t" + "lbu a5, 8(s7)\n\t" + "lbu t4, 9(s7)\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(s7)\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(s7)\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(s7)\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld94_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi s7, s7, 16\n\t" + "addi a6, a6, -1\n\t" + "bnez a6, L_AES_GCM_init_RISCV64_j0n_gloop\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0n_gpart:\n\t" + "andi a6, s9, 15\n\t" + "beqz a6, L_AES_GCM_init_RISCV64_j0n_gdone\n\t" + "mv t0, s6\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "mv t1, a6\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0n_gpb:\n\t" + "lb t2, 0(s7)\n\t" + "sb t2, 0(t0)\n\t" + "addi s7, s7, 1\n\t" + "addi t0, t0, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_init_RISCV64_j0n_gpb\n\t" + "mv t0, s6\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0n_gdone:\n\t" + /* GHASH the length block (from reg) */ + "mv t0, s5\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "ld s7, 24(sp)\n\t" + "ld s9, 16(sp)\n\t" + /* J0 = reflect(X); store to reg; reset X=0 */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(s5)\n\t" + "sd t1, 8(s5)\n\t" + "li s1, 0\n\t" + "li s8, 0\n\t" + "\n" + "L_AES_GCM_init_RISCV64_j0done:\n\t" + /* initCtr = E_K(J0) */ + "ld t2, 0(s5)\n\t" + "ld t3, 8(s5)\n\t" + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + "ld a5, 48(%[key])\n\t" + "ld a6, 56(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(%[key])\n\t" + "ld a4, 72(%[key])\n\t" + "ld a5, 80(%[key])\n\t" + "ld a6, 88(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(%[key])\n\t" + "ld a4, 104(%[key])\n\t" + "ld a5, 112(%[key])\n\t" + "ld a6, 120(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(%[key])\n\t" + "ld a4, 136(%[key])\n\t" + "ld a5, 144(%[key])\n\t" + "ld a6, 152(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(%[key])\n\t" + "ld a4, 168(%[key])\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_init_RISCV64_ekj0_done\n\t" + "ld a5, 176(%[key])\n\t" + "ld a6, 184(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(%[key])\n\t" + "ld a4, 200(%[key])\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_init_RISCV64_ekj0_done\n\t" + "ld a5, 208(%[key])\n\t" + "ld a6, 216(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(%[key])\n\t" + "ld a4, 232(%[key])\n\t" + "\n" + "L_AES_GCM_init_RISCV64_ekj0_done:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + "sd t2, 0(s6)\n\t" + "sd t3, 8(s6)\n\t" + "addi sp, sp, 32\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [nonce] "+r" (nonce), + [nonceSz] "+r" (nonceSz), [gcm_h] "+r" (gcm_h), + [counter] "+r" (counter), [initCtr] "+r" (initCtr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s8", "a7", + "s2", "s3", "s4", "s5", "s6", "s7", "s9" + ); +} + +void AES_GCM_ghash_block_RISCV64(const byte* data, byte* tag, byte* gcm_h) +{ + __asm__ __volatile__ ( + "mv a6, %[gcm_h]\n\t" + "ld t0, 0(%[tag])\n\t" + "ld t1, 8(%[tag])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "mv s1, t0\n\t" + "mv s8, t1\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(%[data])\n\t" +#else + "andi t4, %[data], 7\n\t" + "bnez t4, L_ualn_ld95_w_%=\n\t" + "ld t5, 0(%[data])\n\t" + "j L_ualn_ld95_e_%=\n\t" + "\n" + "L_ualn_ld95_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld95_h_%=\n\t" + "lwu t5, 0(%[data])\n\t" + "lwu t4, 4(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld95_e_%=\n\t" + "\n" + "L_ualn_ld95_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld95_b_%=\n\t" + "lhu t5, 0(%[data])\n\t" + "lhu t4, 2(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld95_e_%=\n\t" + "\n" + "L_ualn_ld95_b_%=:\n\t" + "lbu t5, 0(%[data])\n\t" + "lbu t4, 1(%[data])\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(%[data])\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(%[data])\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(%[data])\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld95_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[data])\n\t" +#else + "andi t4, %[data], 7\n\t" + "bnez t4, L_ualn_ld96_w_%=\n\t" + "ld a5, 8(%[data])\n\t" + "j L_ualn_ld96_e_%=\n\t" + "\n" + "L_ualn_ld96_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld96_h_%=\n\t" + "lwu a5, 8(%[data])\n\t" + "lwu t4, 12(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld96_e_%=\n\t" + "\n" + "L_ualn_ld96_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld96_b_%=\n\t" + "lhu a5, 8(%[data])\n\t" + "lhu t4, 10(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld96_e_%=\n\t" + "\n" + "L_ualn_ld96_b_%=:\n\t" + "lbu a5, 8(%[data])\n\t" + "lbu t4, 9(%[data])\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(%[data])\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(%[data])\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(%[data])\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld96_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(a6)\n\t" + "ld t3, 8(a6)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(%[tag])\n\t" + "sd t1, 8(%[tag])\n\t" + : [data] "+r" (data), [tag] "+r" (tag), [gcm_h] "+r" (gcm_h) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s8", "a2", + "a3", "a4", "a5", "a6" + ); +} + +void AES_GCM_aad_update_RISCV64(const byte* addt, word32 abytes, byte* tag, + byte* h) +{ + __asm__ __volatile__ ( + "mv s2, %[tag]\n\t" + "mv s3, %[h]\n\t" + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "srli a7, %[abytes], 4\n\t" + "beqz a7, L_AES_GCM_aad_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_aad_update_RISCV64_loop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(%[addt])\n\t" +#else + "andi t4, %[addt], 7\n\t" + "bnez t4, L_ualn_ld97_w_%=\n\t" + "ld t5, 0(%[addt])\n\t" + "j L_ualn_ld97_e_%=\n\t" + "\n" + "L_ualn_ld97_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld97_h_%=\n\t" + "lwu t5, 0(%[addt])\n\t" + "lwu t4, 4(%[addt])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld97_e_%=\n\t" + "\n" + "L_ualn_ld97_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld97_b_%=\n\t" + "lhu t5, 0(%[addt])\n\t" + "lhu t4, 2(%[addt])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(%[addt])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(%[addt])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld97_e_%=\n\t" + "\n" + "L_ualn_ld97_b_%=:\n\t" + "lbu t5, 0(%[addt])\n\t" + "lbu t4, 1(%[addt])\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(%[addt])\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(%[addt])\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(%[addt])\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(%[addt])\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(%[addt])\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(%[addt])\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld97_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[addt])\n\t" +#else + "andi t4, %[addt], 7\n\t" + "bnez t4, L_ualn_ld98_w_%=\n\t" + "ld a5, 8(%[addt])\n\t" + "j L_ualn_ld98_e_%=\n\t" + "\n" + "L_ualn_ld98_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld98_h_%=\n\t" + "lwu a5, 8(%[addt])\n\t" + "lwu t4, 12(%[addt])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld98_e_%=\n\t" + "\n" + "L_ualn_ld98_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld98_b_%=\n\t" + "lhu a5, 8(%[addt])\n\t" + "lhu t4, 10(%[addt])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(%[addt])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(%[addt])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld98_e_%=\n\t" + "\n" + "L_ualn_ld98_b_%=:\n\t" + "lbu a5, 8(%[addt])\n\t" + "lbu t4, 9(%[addt])\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(%[addt])\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(%[addt])\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(%[addt])\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(%[addt])\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(%[addt])\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(%[addt])\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld98_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi %[addt], %[addt], 16\n\t" + "addi a7, a7, -1\n\t" + "bnez a7, L_AES_GCM_aad_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_aad_update_RISCV64_done:\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + : [addt] "+r" (addt), [abytes] "+r" (abytes), [tag] "+r" (tag), + [h] "+r" (h) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s8", "a2", + "a3", "a4", "a5", "a6", "a7", "s2", "s3" + ); +} + +void AES_GCM_encrypt_block_RISCV64(const byte* key, int nr, byte* out, + const byte* in, byte* counter) +{ + __asm__ __volatile__ ( + "mv a7, %[out]\n\t" + "mv s1, %[in]\n\t" + "mv s2, %[counter]\n\t" + "lbu t0, 12(s2)\n\t" + "lbu t1, 13(s2)\n\t" + "lbu t2, 14(s2)\n\t" + "lbu t3, 15(s2)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s2)\n\t" + "sb t2, 13(s2)\n\t" + "sb t3, 14(s2)\n\t" + "sb t0, 15(s2)\n\t" + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + "ld a5, 48(%[key])\n\t" + "ld a6, 56(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(%[key])\n\t" + "ld a4, 72(%[key])\n\t" + "ld a5, 80(%[key])\n\t" + "ld a6, 88(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(%[key])\n\t" + "ld a4, 104(%[key])\n\t" + "ld a5, 112(%[key])\n\t" + "ld a6, 120(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(%[key])\n\t" + "ld a4, 136(%[key])\n\t" + "ld a5, 144(%[key])\n\t" + "ld a6, 152(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(%[key])\n\t" + "ld a4, 168(%[key])\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_block_RISCV64_done\n\t" + "ld a5, 176(%[key])\n\t" + "ld a6, 184(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(%[key])\n\t" + "ld a4, 200(%[key])\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_block_RISCV64_done\n\t" + "ld a5, 208(%[key])\n\t" + "ld a6, 216(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(%[key])\n\t" + "ld a4, 232(%[key])\n\t" + "\n" + "L_AES_GCM_encrypt_block_RISCV64_done:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(s1)\n\t" +#else + "andi t6, s1, 7\n\t" + "bnez t6, L_ualn_ld99_w_%=\n\t" + "ld t5, 0(s1)\n\t" + "j L_ualn_ld99_e_%=\n\t" + "\n" + "L_ualn_ld99_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld99_h_%=\n\t" + "lwu t5, 0(s1)\n\t" + "lwu t6, 4(s1)\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld99_e_%=\n\t" + "\n" + "L_ualn_ld99_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld99_b_%=\n\t" + "lhu t5, 0(s1)\n\t" + "lhu t6, 2(s1)\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 4(s1)\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 6(s1)\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld99_e_%=\n\t" + "\n" + "L_ualn_ld99_b_%=:\n\t" + "lbu t5, 0(s1)\n\t" + "lbu t6, 1(s1)\n\t" + "slli t6, t6, 8\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 2(s1)\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 3(s1)\n\t" + "slli t6, t6, 24\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 4(s1)\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 5(s1)\n\t" + "slli t6, t6, 40\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 6(s1)\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 7(s1)\n\t" + "slli t6, t6, 56\n\t" + "or t5, t5, t6\n\t" + "\n" + "L_ualn_ld99_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t4, 8(s1)\n\t" +#else + "andi t6, s1, 7\n\t" + "bnez t6, L_ualn_ld100_w_%=\n\t" + "ld t4, 8(s1)\n\t" + "j L_ualn_ld100_e_%=\n\t" + "\n" + "L_ualn_ld100_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld100_h_%=\n\t" + "lwu t4, 8(s1)\n\t" + "lwu t6, 12(s1)\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld100_e_%=\n\t" + "\n" + "L_ualn_ld100_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld100_b_%=\n\t" + "lhu t4, 8(s1)\n\t" + "lhu t6, 10(s1)\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 12(s1)\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 14(s1)\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld100_e_%=\n\t" + "\n" + "L_ualn_ld100_b_%=:\n\t" + "lbu t4, 8(s1)\n\t" + "lbu t6, 9(s1)\n\t" + "slli t6, t6, 8\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 10(s1)\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 11(s1)\n\t" + "slli t6, t6, 24\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 12(s1)\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 13(s1)\n\t" + "slli t6, t6, 40\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 14(s1)\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 15(s1)\n\t" + "slli t6, t6, 56\n\t" + "or t4, t4, t6\n\t" + "\n" + "L_ualn_ld100_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, t2, t5\n\t" + "xor t3, t3, t4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(a7)\n\t" +#else + "andi t6, a7, 7\n\t" + "bnez t6, L_ualn_sd101_w_%=\n\t" + "sd t2, 0(a7)\n\t" + "j L_ualn_sd101_e_%=\n\t" + "\n" + "L_ualn_sd101_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd101_h_%=\n\t" + "sw t2, 0(a7)\n\t" + "srli t6, t2, 32\n\t" + "sw t6, 4(a7)\n\t" + "j L_ualn_sd101_e_%=\n\t" + "\n" + "L_ualn_sd101_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd101_b_%=\n\t" + "sh t2, 0(a7)\n\t" + "srli t6, t2, 16\n\t" + "sh t6, 2(a7)\n\t" + "srli t6, t2, 32\n\t" + "sh t6, 4(a7)\n\t" + "srli t6, t2, 48\n\t" + "sh t6, 6(a7)\n\t" + "j L_ualn_sd101_e_%=\n\t" + "\n" + "L_ualn_sd101_b_%=:\n\t" + "sb t2, 0(a7)\n\t" + "srli t6, t2, 8\n\t" + "sb t6, 1(a7)\n\t" + "srli t6, t2, 16\n\t" + "sb t6, 2(a7)\n\t" + "srli t6, t2, 24\n\t" + "sb t6, 3(a7)\n\t" + "srli t6, t2, 32\n\t" + "sb t6, 4(a7)\n\t" + "srli t6, t2, 40\n\t" + "sb t6, 5(a7)\n\t" + "srli t6, t2, 48\n\t" + "sb t6, 6(a7)\n\t" + "srli t6, t2, 56\n\t" + "sb t6, 7(a7)\n\t" + "\n" + "L_ualn_sd101_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(a7)\n\t" +#else + "andi t6, a7, 7\n\t" + "bnez t6, L_ualn_sd102_w_%=\n\t" + "sd t3, 8(a7)\n\t" + "j L_ualn_sd102_e_%=\n\t" + "\n" + "L_ualn_sd102_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd102_h_%=\n\t" + "sw t3, 8(a7)\n\t" + "srli t6, t3, 32\n\t" + "sw t6, 12(a7)\n\t" + "j L_ualn_sd102_e_%=\n\t" + "\n" + "L_ualn_sd102_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd102_b_%=\n\t" + "sh t3, 8(a7)\n\t" + "srli t6, t3, 16\n\t" + "sh t6, 10(a7)\n\t" + "srli t6, t3, 32\n\t" + "sh t6, 12(a7)\n\t" + "srli t6, t3, 48\n\t" + "sh t6, 14(a7)\n\t" + "j L_ualn_sd102_e_%=\n\t" + "\n" + "L_ualn_sd102_b_%=:\n\t" + "sb t3, 8(a7)\n\t" + "srli t6, t3, 8\n\t" + "sb t6, 9(a7)\n\t" + "srli t6, t3, 16\n\t" + "sb t6, 10(a7)\n\t" + "srli t6, t3, 24\n\t" + "sb t6, 11(a7)\n\t" + "srli t6, t3, 32\n\t" + "sb t6, 12(a7)\n\t" + "srli t6, t3, 40\n\t" + "sb t6, 13(a7)\n\t" + "srli t6, t3, 48\n\t" + "sb t6, 14(a7)\n\t" + "srli t6, t3, 56\n\t" + "sb t6, 15(a7)\n\t" + "\n" + "L_ualn_sd102_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [counter] "+r" (counter) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a2", "a3", "a4", + "a5", "a6", "a7", "s1", "s2" + ); +} + +void AES_GCM_encrypt_update_RISCV64(const byte* key_p, int nr_p, byte* out_p, + const byte* in_p, word32 nbytes_p, byte* tag_p, byte* h_p, byte* counter_p) +{ + register const byte* key __asm__ ("a0") = (const byte*)key_p; + register int nr __asm__ ("a1") = (int)nr_p; + register byte* out __asm__ ("a2") = (byte*)out_p; + register const byte* in __asm__ ("a3") = (const byte*)in_p; + register word32 nbytes __asm__ ("a4") = (word32)nbytes_p; + register byte* tag __asm__ ("a5") = (byte*)tag_p; + register byte* h __asm__ ("a6") = (byte*)h_p; + register byte* counter __asm__ ("a7") = (byte*)counter_p; + + __asm__ __volatile__ ( + "mv s2, %[out]\n\t" + "mv s3, %[in]\n\t" + "mv s4, %[nbytes]\n\t" + "mv s5, %[tag]\n\t" + "mv s6, %[h]\n\t" + "mv s7, %[counter]\n\t" + "ld t0, 0(s5)\n\t" + "ld t1, 8(s5)\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "srli a7, s4, 4\n\t" + "beqz a7, L_AES_GCM_encrypt_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_loop:\n\t" + "lbu t0, 12(s7)\n\t" + "lbu t1, 13(s7)\n\t" + "lbu t2, 14(s7)\n\t" + "lbu t3, 15(s7)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s7)\n\t" + "sb t2, 13(s7)\n\t" + "sb t3, 14(s7)\n\t" + "sb t0, 15(s7)\n\t" + "ld t2, 0(s7)\n\t" + "ld t3, 8(s7)\n\t" + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + "ld a5, 48(%[key])\n\t" + "ld a6, 56(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(%[key])\n\t" + "ld a4, 72(%[key])\n\t" + "ld a5, 80(%[key])\n\t" + "ld a6, 88(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(%[key])\n\t" + "ld a4, 104(%[key])\n\t" + "ld a5, 112(%[key])\n\t" + "ld a6, 120(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(%[key])\n\t" + "ld a4, 136(%[key])\n\t" + "ld a5, 144(%[key])\n\t" + "ld a6, 152(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(%[key])\n\t" + "ld a4, 168(%[key])\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_update_RISCV64_enc\n\t" + "ld a5, 176(%[key])\n\t" + "ld a6, 184(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(%[key])\n\t" + "ld a4, 200(%[key])\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_encrypt_update_RISCV64_enc\n\t" + "ld a5, 208(%[key])\n\t" + "ld a6, 216(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(%[key])\n\t" + "ld a4, 232(%[key])\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_enc:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(s3)\n\t" +#else + "andi t4, s3, 7\n\t" + "bnez t4, L_ualn_ld103_w_%=\n\t" + "ld t5, 0(s3)\n\t" + "j L_ualn_ld103_e_%=\n\t" + "\n" + "L_ualn_ld103_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld103_h_%=\n\t" + "lwu t5, 0(s3)\n\t" + "lwu t4, 4(s3)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld103_e_%=\n\t" + "\n" + "L_ualn_ld103_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld103_b_%=\n\t" + "lhu t5, 0(s3)\n\t" + "lhu t4, 2(s3)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(s3)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(s3)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld103_e_%=\n\t" + "\n" + "L_ualn_ld103_b_%=:\n\t" + "lbu t5, 0(s3)\n\t" + "lbu t4, 1(s3)\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(s3)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(s3)\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(s3)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(s3)\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(s3)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(s3)\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld103_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(s3)\n\t" +#else + "andi t4, s3, 7\n\t" + "bnez t4, L_ualn_ld104_w_%=\n\t" + "ld a5, 8(s3)\n\t" + "j L_ualn_ld104_e_%=\n\t" + "\n" + "L_ualn_ld104_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld104_h_%=\n\t" + "lwu a5, 8(s3)\n\t" + "lwu t4, 12(s3)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld104_e_%=\n\t" + "\n" + "L_ualn_ld104_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld104_b_%=\n\t" + "lhu a5, 8(s3)\n\t" + "lhu t4, 10(s3)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(s3)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(s3)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld104_e_%=\n\t" + "\n" + "L_ualn_ld104_b_%=:\n\t" + "lbu a5, 8(s3)\n\t" + "lbu t4, 9(s3)\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(s3)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(s3)\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(s3)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(s3)\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(s3)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(s3)\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld104_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, t2, t5\n\t" + "xor t3, t3, a5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(s2)\n\t" +#else + "andi t4, s2, 7\n\t" + "bnez t4, L_ualn_sd105_w_%=\n\t" + "sd t2, 0(s2)\n\t" + "j L_ualn_sd105_e_%=\n\t" + "\n" + "L_ualn_sd105_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd105_h_%=\n\t" + "sw t2, 0(s2)\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(s2)\n\t" + "j L_ualn_sd105_e_%=\n\t" + "\n" + "L_ualn_sd105_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd105_b_%=\n\t" + "sh t2, 0(s2)\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(s2)\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(s2)\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(s2)\n\t" + "j L_ualn_sd105_e_%=\n\t" + "\n" + "L_ualn_sd105_b_%=:\n\t" + "sb t2, 0(s2)\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(s2)\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(s2)\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(s2)\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(s2)\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(s2)\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(s2)\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(s2)\n\t" + "\n" + "L_ualn_sd105_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(s2)\n\t" +#else + "andi t4, s2, 7\n\t" + "bnez t4, L_ualn_sd106_w_%=\n\t" + "sd t3, 8(s2)\n\t" + "j L_ualn_sd106_e_%=\n\t" + "\n" + "L_ualn_sd106_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd106_h_%=\n\t" + "sw t3, 8(s2)\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(s2)\n\t" + "j L_ualn_sd106_e_%=\n\t" + "\n" + "L_ualn_sd106_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd106_b_%=\n\t" + "sh t3, 8(s2)\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(s2)\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(s2)\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(s2)\n\t" + "j L_ualn_sd106_e_%=\n\t" + "\n" + "L_ualn_sd106_b_%=:\n\t" + "sb t3, 8(s2)\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(s2)\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(s2)\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(s2)\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(s2)\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(s2)\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(s2)\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(s2)\n\t" + "\n" + "L_ualn_sd106_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t5, t2\n\t" + "mv a5, t3\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi s3, s3, 16\n\t" + "addi s2, s2, 16\n\t" + "addi a7, a7, -1\n\t" + "bnez a7, L_AES_GCM_encrypt_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_done:\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(s5)\n\t" + "sd t1, 8(s5)\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [nbytes] "+r" (nbytes), [tag] "+r" (tag), [h] "+r" (h), + [counter] "+r" (counter) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s8", "s2", + "s3", "s4", "s5", "s6", "s7" + ); +} + +void AES_GCM_encrypt_final_RISCV64(byte* tag_p, byte* authTag_p, + word32 tbytes_p, word32 nbytes_p, word32 abytes_p, byte* h_p, + byte* initCtr_p) +{ + register byte* tag __asm__ ("a0") = (byte*)tag_p; + register byte* authTag __asm__ ("a1") = (byte*)authTag_p; + register word32 tbytes __asm__ ("a2") = (word32)tbytes_p; + register word32 nbytes __asm__ ("a3") = (word32)nbytes_p; + register word32 abytes __asm__ ("a4") = (word32)abytes_p; + register byte* h __asm__ ("a5") = (byte*)h_p; + register byte* initCtr __asm__ ("a6") = (byte*)initCtr_p; + + __asm__ __volatile__ ( + "mv a7, %[tbytes]\n\t" + "mv s2, %[nbytes]\n\t" + "mv s3, %[abytes]\n\t" + "mv s4, %[h]\n\t" + "mv s5, %[initCtr]\n\t" + "ld t0, 0(%[tag])\n\t" + "ld t1, 8(%[tag])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "mv t0, %[tag]\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "slli s3, s3, 3\n\t" + "srli t2, s3, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 3(t0)\n\t" + "srli t2, s3, 24\n\t" + "srli t3, s3, 16\n\t" + "srli t4, s3, 8\n\t" + "sb t2, 4(t0)\n\t" + "sb t3, 5(t0)\n\t" + "sb t4, 6(t0)\n\t" + "sb s3, 7(t0)\n\t" + "slli s2, s2, 3\n\t" + "srli t2, s2, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 11(t0)\n\t" + "srli t2, s2, 24\n\t" + "srli t3, s2, 16\n\t" + "srli t4, s2, 8\n\t" + "sb t2, 12(t0)\n\t" + "sb t3, 13(t0)\n\t" + "sb t4, 14(t0)\n\t" + "sb s2, 15(t0)\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s4)\n\t" + "ld t3, 8(s4)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + /* tag = reflect(X) ^ initCtr(=E_K(J0)) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "ld t2, 0(s5)\n\t" + "ld t3, 8(s5)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "mv t4, %[tag]\n\t" + "sd t0, 0(t4)\n\t" + "sd t1, 8(t4)\n\t" + "mv t0, %[tag]\n\t" + "mv t3, a7\n\t" + "\n" + "L_AES_GCM_encrypt_final_RISCV64_stag:\n\t" + "lb t4, 0(t0)\n\t" + "sb t4, 0(%[authTag])\n\t" + "addi t0, t0, 1\n\t" + "addi %[authTag], %[authTag], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_encrypt_final_RISCV64_stag\n\t" + : [tag] "+r" (tag), [authTag] "+r" (authTag), [tbytes] "+r" (tbytes), + [nbytes] "+r" (nbytes), [abytes] "+r" (abytes), [h] "+r" (h), + [initCtr] "+r" (initCtr) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s8", "a7", + "s2", "s3", "s4", "s5" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_GCM_decrypt_update_RISCV64(const byte* key_p, int nr_p, byte* out_p, + const byte* in_p, word32 nbytes_p, byte* tag_p, byte* h_p, byte* counter_p) +{ + register const byte* key __asm__ ("a0") = (const byte*)key_p; + register int nr __asm__ ("a1") = (int)nr_p; + register byte* out __asm__ ("a2") = (byte*)out_p; + register const byte* in __asm__ ("a3") = (const byte*)in_p; + register word32 nbytes __asm__ ("a4") = (word32)nbytes_p; + register byte* tag __asm__ ("a5") = (byte*)tag_p; + register byte* h __asm__ ("a6") = (byte*)h_p; + register byte* counter __asm__ ("a7") = (byte*)counter_p; + + __asm__ __volatile__ ( + "mv s2, %[out]\n\t" + "mv s3, %[in]\n\t" + "mv s4, %[nbytes]\n\t" + "mv s5, %[tag]\n\t" + "mv s6, %[h]\n\t" + "mv s7, %[counter]\n\t" + "ld t0, 0(s5)\n\t" + "ld t1, 8(s5)\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "srli a7, s4, 4\n\t" + "beqz a7, L_AES_GCM_decrypt_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_loop:\n\t" + "lbu t0, 12(s7)\n\t" + "lbu t1, 13(s7)\n\t" + "lbu t2, 14(s7)\n\t" + "lbu t3, 15(s7)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s7)\n\t" + "sb t2, 13(s7)\n\t" + "sb t3, 14(s7)\n\t" + "sb t0, 15(s7)\n\t" + "ld t2, 0(s7)\n\t" + "ld t3, 8(s7)\n\t" + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + "ld a5, 48(%[key])\n\t" + "ld a6, 56(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 64(%[key])\n\t" + "ld a4, 72(%[key])\n\t" + "ld a5, 80(%[key])\n\t" + "ld a6, 88(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 96(%[key])\n\t" + "ld a4, 104(%[key])\n\t" + "ld a5, 112(%[key])\n\t" + "ld a6, 120(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 128(%[key])\n\t" + "ld a4, 136(%[key])\n\t" + "ld a5, 144(%[key])\n\t" + "ld a6, 152(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 160(%[key])\n\t" + "ld a4, 168(%[key])\n\t" + "li t4, 11\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_update_RISCV64_enc\n\t" + "ld a5, 176(%[key])\n\t" + "ld a6, 184(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 192(%[key])\n\t" + "ld a4, 200(%[key])\n\t" + "li t4, 13\n\t" + "ble %[nr], t4, L_AES_GCM_decrypt_update_RISCV64_enc\n\t" + "ld a5, 208(%[key])\n\t" + "ld a6, 216(%[key])\n\t" + /* aes64esm x7, x5, x6 */ + ".word 0x366283b3\n\t" + /* aes64esm x28, x6, x5 */ + ".word 0x36530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + /* aes64esm x5, x7, x28 */ + ".word 0x37c382b3\n\t" + /* aes64esm x6, x28, x7 */ + ".word 0x367e0333\n\t" + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 224(%[key])\n\t" + "ld a4, 232(%[key])\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_enc:\n\t" + /* aes64es x7, x5, x6 */ + ".word 0x326283b3\n\t" + /* aes64es x28, x6, x5 */ + ".word 0x32530e33\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(s3)\n\t" +#else + "andi t4, s3, 7\n\t" + "bnez t4, L_ualn_ld107_w_%=\n\t" + "ld t5, 0(s3)\n\t" + "j L_ualn_ld107_e_%=\n\t" + "\n" + "L_ualn_ld107_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld107_h_%=\n\t" + "lwu t5, 0(s3)\n\t" + "lwu t4, 4(s3)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld107_e_%=\n\t" + "\n" + "L_ualn_ld107_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld107_b_%=\n\t" + "lhu t5, 0(s3)\n\t" + "lhu t4, 2(s3)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 4(s3)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lhu t4, 6(s3)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "j L_ualn_ld107_e_%=\n\t" + "\n" + "L_ualn_ld107_b_%=:\n\t" + "lbu t5, 0(s3)\n\t" + "lbu t4, 1(s3)\n\t" + "slli t4, t4, 8\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 2(s3)\n\t" + "slli t4, t4, 16\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 3(s3)\n\t" + "slli t4, t4, 24\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 4(s3)\n\t" + "slli t4, t4, 32\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 5(s3)\n\t" + "slli t4, t4, 40\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 6(s3)\n\t" + "slli t4, t4, 48\n\t" + "or t5, t5, t4\n\t" + "lbu t4, 7(s3)\n\t" + "slli t4, t4, 56\n\t" + "or t5, t5, t4\n\t" + "\n" + "L_ualn_ld107_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(s3)\n\t" +#else + "andi t4, s3, 7\n\t" + "bnez t4, L_ualn_ld108_w_%=\n\t" + "ld a5, 8(s3)\n\t" + "j L_ualn_ld108_e_%=\n\t" + "\n" + "L_ualn_ld108_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld108_h_%=\n\t" + "lwu a5, 8(s3)\n\t" + "lwu t4, 12(s3)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld108_e_%=\n\t" + "\n" + "L_ualn_ld108_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld108_b_%=\n\t" + "lhu a5, 8(s3)\n\t" + "lhu t4, 10(s3)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 12(s3)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lhu t4, 14(s3)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "j L_ualn_ld108_e_%=\n\t" + "\n" + "L_ualn_ld108_b_%=:\n\t" + "lbu a5, 8(s3)\n\t" + "lbu t4, 9(s3)\n\t" + "slli t4, t4, 8\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 10(s3)\n\t" + "slli t4, t4, 16\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 11(s3)\n\t" + "slli t4, t4, 24\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 12(s3)\n\t" + "slli t4, t4, 32\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 13(s3)\n\t" + "slli t4, t4, 40\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 14(s3)\n\t" + "slli t4, t4, 48\n\t" + "or a5, a5, t4\n\t" + "lbu t4, 15(s3)\n\t" + "slli t4, t4, 56\n\t" + "or a5, a5, t4\n\t" + "\n" + "L_ualn_ld108_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t2, t2, t5\n\t" + "xor t3, t3, a5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(s2)\n\t" +#else + "andi t4, s2, 7\n\t" + "bnez t4, L_ualn_sd109_w_%=\n\t" + "sd t2, 0(s2)\n\t" + "j L_ualn_sd109_e_%=\n\t" + "\n" + "L_ualn_sd109_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd109_h_%=\n\t" + "sw t2, 0(s2)\n\t" + "srli t4, t2, 32\n\t" + "sw t4, 4(s2)\n\t" + "j L_ualn_sd109_e_%=\n\t" + "\n" + "L_ualn_sd109_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd109_b_%=\n\t" + "sh t2, 0(s2)\n\t" + "srli t4, t2, 16\n\t" + "sh t4, 2(s2)\n\t" + "srli t4, t2, 32\n\t" + "sh t4, 4(s2)\n\t" + "srli t4, t2, 48\n\t" + "sh t4, 6(s2)\n\t" + "j L_ualn_sd109_e_%=\n\t" + "\n" + "L_ualn_sd109_b_%=:\n\t" + "sb t2, 0(s2)\n\t" + "srli t4, t2, 8\n\t" + "sb t4, 1(s2)\n\t" + "srli t4, t2, 16\n\t" + "sb t4, 2(s2)\n\t" + "srli t4, t2, 24\n\t" + "sb t4, 3(s2)\n\t" + "srli t4, t2, 32\n\t" + "sb t4, 4(s2)\n\t" + "srli t4, t2, 40\n\t" + "sb t4, 5(s2)\n\t" + "srli t4, t2, 48\n\t" + "sb t4, 6(s2)\n\t" + "srli t4, t2, 56\n\t" + "sb t4, 7(s2)\n\t" + "\n" + "L_ualn_sd109_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(s2)\n\t" +#else + "andi t4, s2, 7\n\t" + "bnez t4, L_ualn_sd110_w_%=\n\t" + "sd t3, 8(s2)\n\t" + "j L_ualn_sd110_e_%=\n\t" + "\n" + "L_ualn_sd110_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd110_h_%=\n\t" + "sw t3, 8(s2)\n\t" + "srli t4, t3, 32\n\t" + "sw t4, 12(s2)\n\t" + "j L_ualn_sd110_e_%=\n\t" + "\n" + "L_ualn_sd110_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd110_b_%=\n\t" + "sh t3, 8(s2)\n\t" + "srli t4, t3, 16\n\t" + "sh t4, 10(s2)\n\t" + "srli t4, t3, 32\n\t" + "sh t4, 12(s2)\n\t" + "srli t4, t3, 48\n\t" + "sh t4, 14(s2)\n\t" + "j L_ualn_sd110_e_%=\n\t" + "\n" + "L_ualn_sd110_b_%=:\n\t" + "sb t3, 8(s2)\n\t" + "srli t4, t3, 8\n\t" + "sb t4, 9(s2)\n\t" + "srli t4, t3, 16\n\t" + "sb t4, 10(s2)\n\t" + "srli t4, t3, 24\n\t" + "sb t4, 11(s2)\n\t" + "srli t4, t3, 32\n\t" + "sb t4, 12(s2)\n\t" + "srli t4, t3, 40\n\t" + "sb t4, 13(s2)\n\t" + "srli t4, t3, 48\n\t" + "sb t4, 14(s2)\n\t" + "srli t4, t3, 56\n\t" + "sb t4, 15(s2)\n\t" + "\n" + "L_ualn_sd110_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "addi s3, s3, 16\n\t" + "addi s2, s2, 16\n\t" + "addi a7, a7, -1\n\t" + "bnez a7, L_AES_GCM_decrypt_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_done:\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "sd t0, 0(s5)\n\t" + "sd t1, 8(s5)\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [nbytes] "+r" (nbytes), [tag] "+r" (tag), [h] "+r" (h), + [counter] "+r" (counter) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s8", "s2", + "s3", "s4", "s5", "s6", "s7" + ); +} + +void AES_GCM_decrypt_final_RISCV64(byte* tag_p, const byte* authTag_p, + word32 tbytes_p, word32 nbytes_p, word32 abytes_p, byte* h_p, + byte* initCtr_p, int* res_p) +{ + register byte* tag __asm__ ("a0") = (byte*)tag_p; + register const byte* authTag __asm__ ("a1") = (const byte*)authTag_p; + register word32 tbytes __asm__ ("a2") = (word32)tbytes_p; + register word32 nbytes __asm__ ("a3") = (word32)nbytes_p; + register word32 abytes __asm__ ("a4") = (word32)abytes_p; + register byte* h __asm__ ("a5") = (byte*)h_p; + register byte* initCtr __asm__ ("a6") = (byte*)initCtr_p; + register int* res __asm__ ("a7") = (int*)res_p; + + __asm__ __volatile__ ( + "mv s2, %[tbytes]\n\t" + "mv s3, %[nbytes]\n\t" + "mv s4, %[abytes]\n\t" + "mv s5, %[h]\n\t" + "mv s6, %[initCtr]\n\t" + "mv s7, %[res]\n\t" + "ld t0, 0(%[tag])\n\t" + "ld t1, 8(%[tag])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li t2, 6148914691236517205\n\t" + "srli t3, t0, 1\n\t" + "srli t4, t1, 1\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 3689348814741910323\n\t" + "srli t3, t0, 2\n\t" + "srli t4, t1, 2\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" + "li t2, 1085102592571150095\n\t" + "srli t3, t0, 4\n\t" + "srli t4, t1, 4\n\t" + "and t0, t0, t2\n\t" + "and t1, t1, t2\n\t" + "and t3, t3, t2\n\t" + "and t4, t4, t2\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t3\n\t" + "or t1, t1, t4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "mv s1, t0\n\t" + "mv s8, t1\n\t" + "mv t0, %[tag]\n\t" + "sd zero, 0(t0)\n\t" + "sd zero, 8(t0)\n\t" + "slli s4, s4, 3\n\t" + "srli t2, s4, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 3(t0)\n\t" + "srli t2, s4, 24\n\t" + "srli t3, s4, 16\n\t" + "srli t4, s4, 8\n\t" + "sb t2, 4(t0)\n\t" + "sb t3, 5(t0)\n\t" + "sb t4, 6(t0)\n\t" + "sb s4, 7(t0)\n\t" + "slli s3, s3, 3\n\t" + "srli t2, s3, 32\n\t" + "andi t2, t2, 7\n\t" + "sb t2, 11(t0)\n\t" + "srli t2, s3, 24\n\t" + "srli t3, s3, 16\n\t" + "srli t4, s3, 8\n\t" + "sb t2, 12(t0)\n\t" + "sb t3, 13(t0)\n\t" + "sb t4, 14(t0)\n\t" + "sb s3, 15(t0)\n\t" + "ld t5, 0(t0)\n\t" + "ld a5, 8(t0)\n\t" + "mv t0, s1\n\t" + "mv t1, s8\n\t" + "ld t2, 0(s5)\n\t" + "ld t3, 8(s5)\n\t" + "li t6, 135\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x30, x30 */ + ".word 0x687f5f13\n\t" + /* brev8 x15, x15 */ + ".word 0x6877d793\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + /* clmul x12, x5, x7 */ + ".word 0x0a729633\n\t" + /* clmulh x29, x5, x7 */ + ".word 0x0a72beb3\n\t" + /* clmul x30, x6, x28 */ + ".word 0x0bc31f33\n\t" + /* clmulh x15, x6, x28 */ + ".word 0x0bc337b3\n\t" + "xor a3, t0, t1\n\t" + "xor a4, t2, t3\n\t" + /* clmul x5, x13, x14 */ + ".word 0x0ae692b3\n\t" + /* clmulh x6, x13, x14 */ + ".word 0x0ae6b333\n\t" + "xor a3, t4, t0\n\t" + "xor a3, a3, a2\n\t" + "xor a3, a3, t5\n\t" + "xor a4, t5, t1\n\t" + "xor a4, a4, t4\n\t" + "xor a4, a4, a5\n\t" + /* clmul x29, x15, x31 */ + ".word 0x0bf79eb3\n\t" + /* clmulh x30, x15, x31 */ + ".word 0x0bf7bf33\n\t" + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* clmul x29, x14, x31 */ + ".word 0x0bf71eb3\n\t" + /* clmulh x30, x14, x31 */ + ".word 0x0bf73f33\n\t" + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + "mv s1, t0\n\t" + "mv s8, t1\n\t" + /* tag = reflect(X) ^ initCtr(=E_K(J0)) */ + "mv t0, s1\n\t" + "mv t1, s8\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* brev8 x5, x5 */ + ".word 0x6872d293\n\t" + /* brev8 x6, x6 */ + ".word 0x68735313\n\t" +#else + "li a4, 6148914691236517205\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 3689348814741910323\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + "li a4, 1085102592571150095\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "ld t2, 0(s6)\n\t" + "ld t3, 8(s6)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "mv t4, %[tag]\n\t" + "sd t0, 0(t4)\n\t" + "sd t1, 8(t4)\n\t" + /* *res = (match) ? 1 : 0 */ + "mv t0, %[tag]\n\t" + "mv t3, s2\n\t" + "xor t2, t2, t2\n\t" + "\n" + "L_AES_GCM_decrypt_final_RISCV64_ctag:\n\t" + "lbu t4, 0(t0)\n\t" + "lbu t5, 0(%[authTag])\n\t" + "xor t5, t5, t4\n\t" + "or t2, t2, t5\n\t" + "addi t0, t0, 1\n\t" + "addi %[authTag], %[authTag], 1\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_AES_GCM_decrypt_final_RISCV64_ctag\n\t" + "sltiu t2, t2, 1\n\t" + "sw t2, 0(s7)\n\t" + : [tag] "+r" (tag), [authTag] "+r" (authTag), [tbytes] "+r" (tbytes), + [nbytes] "+r" (nbytes), [abytes] "+r" (abytes), [h] "+r" (h), + [initCtr] "+r" (initCtr), [res] "+r" (res) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "s1", "s8", "s2", + "s3", "s4", "s5", "s6", "s7" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AESGCM_STREAM */ +#endif /* HAVE_AESGCM */ +#else +XALIGNED(8) static const word32 L_AES_base_te[] = { + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +XALIGNED(8) static const word32 L_AES_base_td[] = { + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +XALIGNED(4) static const word8 L_AES_base_td4[] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, + 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, + 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, + 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, + 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, + 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, + 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, + 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, + 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, + 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, + 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, + 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, + 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, + 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, + 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, + 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, +}; + +XALIGNED(8) static const word32 L_AES_base_rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000 +}; + +#ifdef GCM_TABLE +XALIGNED(4) static const word8 L_AES_base_gcm_r[] = { + 0x00, 0x00, 0x01, 0xc2, 0x03, 0x84, 0x02, 0x46, + 0x07, 0x08, 0x06, 0xca, 0x04, 0x8c, 0x05, 0x4e, + 0x0e, 0x10, 0x0f, 0xd2, 0x0d, 0x94, 0x0c, 0x56, + 0x09, 0x18, 0x08, 0xda, 0x0a, 0x9c, 0x0b, 0x5e, + 0x1c, 0x20, 0x1d, 0xe2, 0x1f, 0xa4, 0x1e, 0x66, + 0x1b, 0x28, 0x1a, 0xea, 0x18, 0xac, 0x19, 0x6e, + 0x12, 0x30, 0x13, 0xf2, 0x11, 0xb4, 0x10, 0x76, + 0x15, 0x38, 0x14, 0xfa, 0x16, 0xbc, 0x17, 0x7e, + 0x38, 0x40, 0x39, 0x82, 0x3b, 0xc4, 0x3a, 0x06, + 0x3f, 0x48, 0x3e, 0x8a, 0x3c, 0xcc, 0x3d, 0x0e, + 0x36, 0x50, 0x37, 0x92, 0x35, 0xd4, 0x34, 0x16, + 0x31, 0x58, 0x30, 0x9a, 0x32, 0xdc, 0x33, 0x1e, + 0x24, 0x60, 0x25, 0xa2, 0x27, 0xe4, 0x26, 0x26, + 0x23, 0x68, 0x22, 0xaa, 0x20, 0xec, 0x21, 0x2e, + 0x2a, 0x70, 0x2b, 0xb2, 0x29, 0xf4, 0x28, 0x36, + 0x2d, 0x78, 0x2c, 0xba, 0x2e, 0xfc, 0x2f, 0x3e, + 0x70, 0x80, 0x71, 0x42, 0x73, 0x04, 0x72, 0xc6, + 0x77, 0x88, 0x76, 0x4a, 0x74, 0x0c, 0x75, 0xce, + 0x7e, 0x90, 0x7f, 0x52, 0x7d, 0x14, 0x7c, 0xd6, + 0x79, 0x98, 0x78, 0x5a, 0x7a, 0x1c, 0x7b, 0xde, + 0x6c, 0xa0, 0x6d, 0x62, 0x6f, 0x24, 0x6e, 0xe6, + 0x6b, 0xa8, 0x6a, 0x6a, 0x68, 0x2c, 0x69, 0xee, + 0x62, 0xb0, 0x63, 0x72, 0x61, 0x34, 0x60, 0xf6, + 0x65, 0xb8, 0x64, 0x7a, 0x66, 0x3c, 0x67, 0xfe, + 0x48, 0xc0, 0x49, 0x02, 0x4b, 0x44, 0x4a, 0x86, + 0x4f, 0xc8, 0x4e, 0x0a, 0x4c, 0x4c, 0x4d, 0x8e, + 0x46, 0xd0, 0x47, 0x12, 0x45, 0x54, 0x44, 0x96, + 0x41, 0xd8, 0x40, 0x1a, 0x42, 0x5c, 0x43, 0x9e, + 0x54, 0xe0, 0x55, 0x22, 0x57, 0x64, 0x56, 0xa6, + 0x53, 0xe8, 0x52, 0x2a, 0x50, 0x6c, 0x51, 0xae, + 0x5a, 0xf0, 0x5b, 0x32, 0x59, 0x74, 0x58, 0xb6, + 0x5d, 0xf8, 0x5c, 0x3a, 0x5e, 0x7c, 0x5f, 0xbe, + 0xe1, 0x00, 0xe0, 0xc2, 0xe2, 0x84, 0xe3, 0x46, + 0xe6, 0x08, 0xe7, 0xca, 0xe5, 0x8c, 0xe4, 0x4e, + 0xef, 0x10, 0xee, 0xd2, 0xec, 0x94, 0xed, 0x56, + 0xe8, 0x18, 0xe9, 0xda, 0xeb, 0x9c, 0xea, 0x5e, + 0xfd, 0x20, 0xfc, 0xe2, 0xfe, 0xa4, 0xff, 0x66, + 0xfa, 0x28, 0xfb, 0xea, 0xf9, 0xac, 0xf8, 0x6e, + 0xf3, 0x30, 0xf2, 0xf2, 0xf0, 0xb4, 0xf1, 0x76, + 0xf4, 0x38, 0xf5, 0xfa, 0xf7, 0xbc, 0xf6, 0x7e, + 0xd9, 0x40, 0xd8, 0x82, 0xda, 0xc4, 0xdb, 0x06, + 0xde, 0x48, 0xdf, 0x8a, 0xdd, 0xcc, 0xdc, 0x0e, + 0xd7, 0x50, 0xd6, 0x92, 0xd4, 0xd4, 0xd5, 0x16, + 0xd0, 0x58, 0xd1, 0x9a, 0xd3, 0xdc, 0xd2, 0x1e, + 0xc5, 0x60, 0xc4, 0xa2, 0xc6, 0xe4, 0xc7, 0x26, + 0xc2, 0x68, 0xc3, 0xaa, 0xc1, 0xec, 0xc0, 0x2e, + 0xcb, 0x70, 0xca, 0xb2, 0xc8, 0xf4, 0xc9, 0x36, + 0xcc, 0x78, 0xcd, 0xba, 0xcf, 0xfc, 0xce, 0x3e, + 0x91, 0x80, 0x90, 0x42, 0x92, 0x04, 0x93, 0xc6, + 0x96, 0x88, 0x97, 0x4a, 0x95, 0x0c, 0x94, 0xce, + 0x9f, 0x90, 0x9e, 0x52, 0x9c, 0x14, 0x9d, 0xd6, + 0x98, 0x98, 0x99, 0x5a, 0x9b, 0x1c, 0x9a, 0xde, + 0x8d, 0xa0, 0x8c, 0x62, 0x8e, 0x24, 0x8f, 0xe6, + 0x8a, 0xa8, 0x8b, 0x6a, 0x89, 0x2c, 0x88, 0xee, + 0x83, 0xb0, 0x82, 0x72, 0x80, 0x34, 0x81, 0xf6, + 0x84, 0xb8, 0x85, 0x7a, 0x87, 0x3c, 0x86, 0xfe, + 0xa9, 0xc0, 0xa8, 0x02, 0xaa, 0x44, 0xab, 0x86, + 0xae, 0xc8, 0xaf, 0x0a, 0xad, 0x4c, 0xac, 0x8e, + 0xa7, 0xd0, 0xa6, 0x12, 0xa4, 0x54, 0xa5, 0x96, + 0xa0, 0xd8, 0xa1, 0x1a, 0xa3, 0x5c, 0xa2, 0x9e, + 0xb5, 0xe0, 0xb4, 0x22, 0xb6, 0x64, 0xb7, 0xa6, + 0xb2, 0xe8, 0xb3, 0x2a, 0xb1, 0x6c, 0xb0, 0xae, + 0xbb, 0xf0, 0xba, 0x32, 0xb8, 0x74, 0xb9, 0xb6, + 0xbc, 0xf8, 0xbd, 0x3a, 0xbf, 0x7c, 0xbe, 0xbe, +}; + +#else +XALIGNED(4) static const word8 L_AES_base_gcm_r[] = { + 0x00, 0x00, 0x1c, 0x20, 0x38, 0x40, 0x24, 0x60, + 0x70, 0x80, 0x6c, 0xa0, 0x48, 0xc0, 0x54, 0xe0, + 0xe1, 0x00, 0xfd, 0x20, 0xd9, 0x40, 0xc5, 0x60, + 0x91, 0x80, 0x8d, 0xa0, 0xa9, 0xc0, 0xb5, 0xe0, +}; + +#endif /* GCM_TABLE */ +void AES_set_key_RISCV64(const byte* userKey, int keylen, byte* key, int dir) +{ + const word32* te = L_AES_base_te; + const word32* td = L_AES_base_td; + const word32* rcon = L_AES_base_rcon; + + __asm__ __volatile__ ( +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + /* Build forward key schedule (dispatch on key length) */ + "li t0, 24\n\t" + "beq %[keylen], t0, L_AES_set_key_RISCV64_192\n\t" + "li t0, 32\n\t" + "beq %[keylen], t0, L_AES_set_key_RISCV64_256\n\t" + /* AES-128 key schedule */ + "mv s3, %[key]\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(%[userKey])\n\t" + "lbu t1, 4(%[userKey])\n\t" + "lbu t2, 8(%[userKey])\n\t" + "lbu t3, 12(%[userKey])\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(%[userKey])\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(%[userKey])\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(%[userKey])\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t0, 0(s3)\n\t" + "sw t1, 4(s3)\n\t" + "sw t2, 8(s3)\n\t" + "sw t3, 12(s3)\n\t" + "li a6, 10\n\t" + "li a7, 0\n\t" + "\n" + "L_AES_set_key_RISCV64_128_loop:\n\t" + "addi s3, s3, 16\n\t" + "andi t5, t3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "li t6, 65280\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "srli t5, t3, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "addi t5, t5, 1024\n\t" + "lbu t5, 0(t5)\n\t" + "xor t0, t0, t5\n\t" + "srli t5, t3, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 2048\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 4278190080\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "srli t5, t3, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 3072\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 16711680\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "add t5, %[rcon], a7\n\t" + "lw t5, 0(t5)\n\t" + "xor t0, t0, t5\n\t" + "xor t1, t1, t0\n\t" + "xor t2, t2, t1\n\t" + "xor t3, t3, t2\n\t" + "sw t0, 0(s3)\n\t" + "sw t1, 4(s3)\n\t" + "sw t2, 8(s3)\n\t" + "sw t3, 12(s3)\n\t" + "addi a6, a6, -1\n\t" + "addi a7, a7, 4\n\t" + "bnez a6, L_AES_set_key_RISCV64_128_loop\n\t" + "j L_AES_set_key_RISCV64_fwd_done\n\t" + /* AES-192 key schedule */ + "\n" + "L_AES_set_key_RISCV64_192:\n\t" + "mv s3, %[key]\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(%[userKey])\n\t" + "lbu t1, 4(%[userKey])\n\t" + "lbu t2, 8(%[userKey])\n\t" + "lbu t3, 12(%[userKey])\n\t" + "lbu s1, 16(%[userKey])\n\t" + "lbu s2, 20(%[userKey])\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "lbu t4, 1(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "lbu t5, 17(%[userKey])\n\t" + "or s1, s1, t5\n\t" + "lbu t6, 21(%[userKey])\n\t" + "or s2, s2, t6\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "lbu t4, 2(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "lbu t5, 18(%[userKey])\n\t" + "or s1, s1, t5\n\t" + "lbu t6, 22(%[userKey])\n\t" + "or s2, s2, t6\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "lbu t4, 3(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "lbu t5, 19(%[userKey])\n\t" + "or s1, s1, t5\n\t" + "lbu t6, 23(%[userKey])\n\t" + "or s2, s2, t6\n\t" +#else + "ld t1, 0(%[userKey])\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(%[userKey])\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" + "ld s2, 16(%[userKey])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + "srli s1, s2, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t0, 0(s3)\n\t" + "sw t1, 4(s3)\n\t" + "sw t2, 8(s3)\n\t" + "sw t3, 12(s3)\n\t" + "sw s1, 16(s3)\n\t" + "sw s2, 20(s3)\n\t" + "li a6, 8\n\t" + "li a7, 0\n\t" + "\n" + "L_AES_set_key_RISCV64_192_loop:\n\t" + "addi s3, s3, 24\n\t" + "andi t5, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "li t6, 65280\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "srli t5, s2, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "addi t5, t5, 1024\n\t" + "lbu t5, 0(t5)\n\t" + "xor t0, t0, t5\n\t" + "srli t5, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 2048\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 4278190080\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "srli t5, s2, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 3072\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 16711680\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "add t5, %[rcon], a7\n\t" + "lw t5, 0(t5)\n\t" + "xor t0, t0, t5\n\t" + "xor t1, t1, t0\n\t" + "xor t2, t2, t1\n\t" + "xor t3, t3, t2\n\t" + "xor s1, s1, t3\n\t" + "xor s2, s2, s1\n\t" + "sw t0, 0(s3)\n\t" + "sw t1, 4(s3)\n\t" + "sw t2, 8(s3)\n\t" + "sw t3, 12(s3)\n\t" + "sw s1, 16(s3)\n\t" + "sw s2, 20(s3)\n\t" + "addi a6, a6, -1\n\t" + "addi a7, a7, 4\n\t" + "bnez a6, L_AES_set_key_RISCV64_192_loop\n\t" + "j L_AES_set_key_RISCV64_fwd_done\n\t" + /* AES-256 key schedule */ + "\n" + "L_AES_set_key_RISCV64_256:\n\t" + "mv s3, %[key]\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(%[userKey])\n\t" + "lbu t1, 4(%[userKey])\n\t" + "lbu t2, 8(%[userKey])\n\t" + "lbu t3, 12(%[userKey])\n\t" + "lbu s1, 16(%[userKey])\n\t" + "lbu s2, 20(%[userKey])\n\t" + "lbu a4, 24(%[userKey])\n\t" + "lbu a5, 28(%[userKey])\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "slli a4, a4, 8\n\t" + "slli a5, a5, 8\n\t" + "lbu t4, 1(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "lbu t5, 17(%[userKey])\n\t" + "or s1, s1, t5\n\t" + "lbu t6, 21(%[userKey])\n\t" + "or s2, s2, t6\n\t" + "lbu t4, 25(%[userKey])\n\t" + "or a4, a4, t4\n\t" + "lbu t5, 29(%[userKey])\n\t" + "or a5, a5, t5\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "slli a4, a4, 8\n\t" + "slli a5, a5, 8\n\t" + "lbu t4, 2(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "lbu t5, 18(%[userKey])\n\t" + "or s1, s1, t5\n\t" + "lbu t6, 22(%[userKey])\n\t" + "or s2, s2, t6\n\t" + "lbu t4, 26(%[userKey])\n\t" + "or a4, a4, t4\n\t" + "lbu t5, 30(%[userKey])\n\t" + "or a5, a5, t5\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "slli a4, a4, 8\n\t" + "slli a5, a5, 8\n\t" + "lbu t4, 3(%[userKey])\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(%[userKey])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(%[userKey])\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(%[userKey])\n\t" + "or t3, t3, t4\n\t" + "lbu t5, 19(%[userKey])\n\t" + "or s1, s1, t5\n\t" + "lbu t6, 23(%[userKey])\n\t" + "or s2, s2, t6\n\t" + "lbu t4, 27(%[userKey])\n\t" + "or a4, a4, t4\n\t" + "lbu t5, 31(%[userKey])\n\t" + "or a5, a5, t5\n\t" +#else + "ld t1, 0(%[userKey])\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(%[userKey])\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" + "ld s2, 16(%[userKey])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + "srli s1, s2, 32\n\t" + "ld a5, 24(%[userKey])\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + "srli a4, a5, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t0, 0(s3)\n\t" + "sw t1, 4(s3)\n\t" + "sw t2, 8(s3)\n\t" + "sw t3, 12(s3)\n\t" + "sw s1, 16(s3)\n\t" + "sw s2, 20(s3)\n\t" + "sw a4, 24(s3)\n\t" + "sw a5, 28(s3)\n\t" + "li a6, 7\n\t" + "li a7, 0\n\t" + "\n" + "L_AES_set_key_RISCV64_256_loop:\n\t" + "addi s3, s3, 32\n\t" + "andi t5, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "li t6, 65280\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "srli t5, a5, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "addi t5, t5, 1024\n\t" + "lbu t5, 0(t5)\n\t" + "xor t0, t0, t5\n\t" + "srli t5, a5, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 2048\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 4278190080\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "srli t5, a5, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 3072\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 16711680\n\t" + "and t5, t5, t6\n\t" + "xor t0, t0, t5\n\t" + "add t5, %[rcon], a7\n\t" + "lw t5, 0(t5)\n\t" + "xor t0, t0, t5\n\t" + "xor t1, t1, t0\n\t" + "xor t2, t2, t1\n\t" + "xor t3, t3, t2\n\t" + "sw t0, 0(s3)\n\t" + "sw t1, 4(s3)\n\t" + "sw t2, 8(s3)\n\t" + "sw t3, 12(s3)\n\t" + "addi a7, a7, 4\n\t" + "addi a6, a6, -1\n\t" + "beqz a6, L_AES_set_key_RISCV64_256_done\n\t" + "srli t5, t3, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 65280\n\t" + "and t5, t5, t6\n\t" + "xor s1, s1, t5\n\t" + "andi t5, t3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lbu t5, 0(t5)\n\t" + "xor s1, s1, t5\n\t" + "srli t5, t3, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 2048\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 4278190080\n\t" + "and t5, t5, t6\n\t" + "xor s1, s1, t5\n\t" + "srli t5, t3, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, %[te]\n\t" + "li t6, 3072\n\t" + "add t5, t5, t6\n\t" + "lw t5, 0(t5)\n\t" + "li t6, 16711680\n\t" + "and t5, t5, t6\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, s1\n\t" + "xor a4, a4, s2\n\t" + "xor a5, a5, a4\n\t" + "sw s1, 16(s3)\n\t" + "sw s2, 20(s3)\n\t" + "sw a4, 24(s3)\n\t" + "sw a5, 28(s3)\n\t" + "j L_AES_set_key_RISCV64_256_loop\n\t" + "\n" + "L_AES_set_key_RISCV64_256_done:\n\t" + "\n" + "L_AES_set_key_RISCV64_fwd_done:\n\t" + /* If decrypting, apply inverse MixColumns to the schedule */ + "beqz %[dir], L_AES_set_key_RISCV64_done\n\t" + "addi s5, %[te], 1024\n\t" + "srli s4, %[keylen], 2\n\t" + "addi s4, s4, 6\n\t" + "mv s3, %[key]\n\t" + "slli a4, s4, 4\n\t" + "add a4, a4, s3\n\t" + "srli s4, s4, 1\n\t" + "addi s4, s4, -1\n\t" + /* Swap first and last round keys */ + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" + "ld t2, 0(a4)\n\t" + "ld t3, 8(a4)\n\t" + "sd t0, 0(a4)\n\t" + "sd t1, 8(a4)\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" + "\n" + "L_AES_set_key_RISCV64_inv_mixcol_loop:\n\t" + "addi s3, s3, 16\n\t" + "addi a4, a4, -16\n\t" + "lw t0, 0(s3)\n\t" + "lw t1, 4(s3)\n\t" + "lw t2, 8(s3)\n\t" + "lw t3, 12(s3)\n\t" + "lw a6, 0(a4)\n\t" + "lw a7, 4(a4)\n\t" + "lw s1, 8(a4)\n\t" + "lw s2, 12(a4)\n\t" + "srli t5, t0, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t0, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t0, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t0, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t0, t6, t5\n\t" + "srli t5, t1, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t1, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t1, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t1, t6, t5\n\t" + "srli t5, t2, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t2, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t2, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t2, t6, t5\n\t" + "srli t5, t3, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t3, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t3, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t3, t6, t5\n\t" + "srli t5, a6, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, a6, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, a6, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor a6, t6, t5\n\t" + "srli t5, a7, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, a7, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, a7, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, a7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor a7, t6, t5\n\t" + "srli t5, s1, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, s1, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, s1, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, t6, t5\n\t" + "srli t5, s2, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, s2, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor s2, t6, t5\n\t" + "sw t0, 0(a4)\n\t" + "sw t1, 4(a4)\n\t" + "sw t2, 8(a4)\n\t" + "sw t3, 12(a4)\n\t" + "sw a6, 0(s3)\n\t" + "sw a7, 4(s3)\n\t" + "sw s1, 8(s3)\n\t" + "sw s2, 12(s3)\n\t" + "addi s4, s4, -1\n\t" + "bnez s4, L_AES_set_key_RISCV64_inv_mixcol_loop\n\t" + /* Middle round key */ + "lw t0, 16(s3)\n\t" + "lw t1, 20(s3)\n\t" + "lw t2, 24(s3)\n\t" + "lw t3, 28(s3)\n\t" + "srli t5, t0, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t0, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t0, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t0, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t0, t6, t5\n\t" + "srli t5, t1, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t1, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t1, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t1, t6, t5\n\t" + "srli t5, t2, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t2, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t2, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t2, t6, t5\n\t" + "srli t5, t3, 22\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t5)\n\t" + "srli t5, t3, 14\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "addi t5, t5, 1024\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "srli t5, t3, 6\n\t" + "andi t5, t5, 1020\n\t" + "add t5, t5, s5\n\t" + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 2048\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t6, t6, t5\n\t" + "andi t5, t3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s5\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, s5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[td]\n\t" +#else + "slli t5, t5, 2\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "li t4, 3072\n\t" + "add t5, t5, t4\n\t" + "lw t5, 0(t5)\n\t" + "xor t3, t6, t5\n\t" + "sw t0, 16(s3)\n\t" + "sw t1, 20(s3)\n\t" + "sw t2, 24(s3)\n\t" + "sw t3, 28(s3)\n\t" + "\n" + "L_AES_set_key_RISCV64_done:\n\t" + : [userKey] "+r" (userKey), [keylen] "+r" (keylen), [key] "+r" (key), + [dir] "+r" (dir) + : [te] "r" (te), [td] "r" (td), [rcon] "r" (rcon) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", "a6", + "a7", "s1", "s2", "s3", "s4", "s5" + ); +} + +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || \ + defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || \ + defined(HAVE_AES_CBC) +void AES_encrypt_RISCV64(const byte* in, byte* out, byte* key, int nr) +{ + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t1, 0(%[in])\n\t" + "lbu t2, 4(%[in])\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "lbu t5, 1(%[in])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 5(%[in])\n\t" + "or t2, t2, t6\n\t" + "lbu a4, 9(%[in])\n\t" + "or t3, t3, a4\n\t" + "lbu t5, 13(%[in])\n\t" + "or t4, t4, t5\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "lbu t5, 2(%[in])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 6(%[in])\n\t" + "or t2, t2, t6\n\t" + "lbu a4, 10(%[in])\n\t" + "or t3, t3, a4\n\t" + "lbu t5, 14(%[in])\n\t" + "or t4, t4, t5\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "lbu t5, 3(%[in])\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 7(%[in])\n\t" + "or t2, t2, t6\n\t" + "lbu a4, 11(%[in])\n\t" + "or t3, t3, a4\n\t" + "lbu t5, 15(%[in])\n\t" + "or t4, t4, t5\n\t" +#else + "ld t2, 0(%[in])\n\t" + /* rev8 t2, t2 */ + ".word 0x6b83d393\n\t" + "srli t1, t2, 32\n\t" + "ld t4, 8(%[in])\n\t" + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" + "srli t3, t4, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw a7, 0(%[key])\n\t" + "lw s1, 4(%[key])\n\t" + "lw s2, 8(%[key])\n\t" + "lw s3, 12(%[key])\n\t" + "xor a7, t1, a7\n\t" + "xor s1, t2, s1\n\t" + "xor s2, t3, s2\n\t" + "xor s3, t4, s3\n\t" + "srliw t1, a7, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t1)\n\t" + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, s3, 14\n\t" + "srliw t4, a7, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, s1, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, s3, 255\n\t" + "andi t2, a7, 255\n\t" + "andi t3, s1, 255\n\t" + "andi t4, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "lw t1, 16(%[key])\n\t" + "lw t2, 20(%[key])\n\t" + "lw t3, 24(%[key])\n\t" + "lw t4, 28(%[key])\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, a4, 14\n\t" + "srliw t2, a5, 14\n\t" + "srliw t3, a6, 14\n\t" + "srliw t4, t6, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, a5, 6\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, t6, 6\n\t" + "srliw t4, a4, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, a6, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, a4, 255\n\t" + "andi t4, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "lw t1, 32(%[key])\n\t" + "lw t2, 36(%[key])\n\t" + "lw t3, 40(%[key])\n\t" + "lw t4, 44(%[key])\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "srliw t1, a7, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t1)\n\t" + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, s3, 14\n\t" + "srliw t4, a7, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, s1, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, s3, 255\n\t" + "andi t2, a7, 255\n\t" + "andi t3, s1, 255\n\t" + "andi t4, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "lw t1, 48(%[key])\n\t" + "lw t2, 52(%[key])\n\t" + "lw t3, 56(%[key])\n\t" + "lw t4, 60(%[key])\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, a4, 14\n\t" + "srliw t2, a5, 14\n\t" + "srliw t3, a6, 14\n\t" + "srliw t4, t6, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, a5, 6\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, t6, 6\n\t" + "srliw t4, a4, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, a6, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, a4, 255\n\t" + "andi t4, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "lw t1, 64(%[key])\n\t" + "lw t2, 68(%[key])\n\t" + "lw t3, 72(%[key])\n\t" + "lw t4, 76(%[key])\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "srliw t1, a7, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t1)\n\t" + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, s3, 14\n\t" + "srliw t4, a7, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, s1, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, s3, 255\n\t" + "andi t2, a7, 255\n\t" + "andi t3, s1, 255\n\t" + "andi t4, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "lw t1, 80(%[key])\n\t" + "lw t2, 84(%[key])\n\t" + "lw t3, 88(%[key])\n\t" + "lw t4, 92(%[key])\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, a4, 14\n\t" + "srliw t2, a5, 14\n\t" + "srliw t3, a6, 14\n\t" + "srliw t4, t6, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, a5, 6\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, t6, 6\n\t" + "srliw t4, a4, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, a6, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, a4, 255\n\t" + "andi t4, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "lw t1, 96(%[key])\n\t" + "lw t2, 100(%[key])\n\t" + "lw t3, 104(%[key])\n\t" + "lw t4, 108(%[key])\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "srliw t1, a7, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t1)\n\t" + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, s3, 14\n\t" + "srliw t4, a7, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, s1, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, s3, 255\n\t" + "andi t2, a7, 255\n\t" + "andi t3, s1, 255\n\t" + "andi t4, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "lw t1, 112(%[key])\n\t" + "lw t2, 116(%[key])\n\t" + "lw t3, 120(%[key])\n\t" + "lw t4, 124(%[key])\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, a4, 14\n\t" + "srliw t2, a5, 14\n\t" + "srliw t3, a6, 14\n\t" + "srliw t4, t6, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, a5, 6\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, t6, 6\n\t" + "srliw t4, a4, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, a6, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, a4, 255\n\t" + "andi t4, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "lw t1, 128(%[key])\n\t" + "lw t2, 132(%[key])\n\t" + "lw t3, 136(%[key])\n\t" + "lw t4, 140(%[key])\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "srliw t1, a7, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t1)\n\t" + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, s3, 14\n\t" + "srliw t4, a7, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, s1, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, s3, 255\n\t" + "andi t2, a7, 255\n\t" + "andi t3, s1, 255\n\t" + "andi t4, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "lw t1, 144(%[key])\n\t" + "lw t2, 148(%[key])\n\t" + "lw t3, 152(%[key])\n\t" + "lw t4, 156(%[key])\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "li t5, 10\n\t" + "ble %[nr], t5, L_AES_encrypt_RISCV64_done\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, a4, 14\n\t" + "srliw t2, a5, 14\n\t" + "srliw t3, a6, 14\n\t" + "srliw t4, t6, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, a5, 6\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, t6, 6\n\t" + "srliw t4, a4, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, a6, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, a4, 255\n\t" + "andi t4, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "lw t1, 160(%[key])\n\t" + "lw t2, 164(%[key])\n\t" + "lw t3, 168(%[key])\n\t" + "lw t4, 172(%[key])\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "srliw t1, a7, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t1)\n\t" + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, s3, 14\n\t" + "srliw t4, a7, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, s1, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, s3, 255\n\t" + "andi t2, a7, 255\n\t" + "andi t3, s1, 255\n\t" + "andi t4, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "lw t1, 176(%[key])\n\t" + "lw t2, 180(%[key])\n\t" + "lw t3, 184(%[key])\n\t" + "lw t4, 188(%[key])\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "li t5, 12\n\t" + "ble %[nr], t5, L_AES_encrypt_RISCV64_done\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, a4, 14\n\t" + "srliw t2, a5, 14\n\t" + "srliw t3, a6, 14\n\t" + "srliw t4, t6, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, a5, 6\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, t6, 6\n\t" + "srliw t4, a4, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, a6, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, a4, 255\n\t" + "andi t4, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "lw t1, 192(%[key])\n\t" + "lw t2, 196(%[key])\n\t" + "lw t3, 200(%[key])\n\t" + "lw t4, 204(%[key])\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "srliw t1, a7, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t6, 0(t1)\n\t" + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "addi t5, %[te], 1024\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, s3, 14\n\t" + "srliw t4, a7, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, s1, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "addi t5, t5, 1024\n\t" + "andi t1, s3, 255\n\t" + "andi t2, a7, 255\n\t" + "andi t3, s1, 255\n\t" + "andi t4, s2, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "lw t1, 208(%[key])\n\t" + "lw t2, 212(%[key])\n\t" + "lw t3, 216(%[key])\n\t" + "lw t4, 220(%[key])\n\t" + "xor t6, t6, t1\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "\n" + "L_AES_encrypt_RISCV64_done:\n\t" + "srliw t1, a5, 6\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, t6, 6\n\t" + "srliw t4, a4, 6\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "lw a7, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "li t5, 65280\n\t" + "and a7, a7, t5\n\t" + "and s1, s1, t5\n\t" + "and s2, s2, t5\n\t" + "and s3, s3, t5\n\t" + "addi t5, %[te], 1024\n\t" + "andi t1, a6, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, a4, 255\n\t" + "andi t4, a5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "slli t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "lbu t4, 0(t4)\n\t" + "or a7, a7, t1\n\t" + "or s1, s1, t2\n\t" + "or s2, s2, t3\n\t" + "or s3, s3, t4\n\t" + "addi t5, t5, 1024\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t1, t1, t5\n\t" + "sh2add t2, t2, t5\n\t" + "sh2add t3, t3, t5\n\t" + "sh2add t4, t4, t5\n\t" +#else + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "slli t4, t4, 2\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "li t5, 4278190080\n\t" + "and t1, t1, t5\n\t" + "and t2, t2, t5\n\t" + "and t3, t3, t5\n\t" + "and t4, t4, t5\n\t" + "or a7, a7, t1\n\t" + "or s1, s1, t2\n\t" + "or s2, s2, t3\n\t" + "or s3, s3, t4\n\t" + "li t5, 3072\n\t" + "add t5, %[te], t5\n\t" + "srliw t1, a4, 14\n\t" + "srliw t2, a5, 14\n\t" + "srliw t3, a6, 14\n\t" + "srliw t4, t6, 14\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t5\n\t" + "add t3, t3, t5\n\t" + "add t4, t4, t5\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "li t5, 16711680\n\t" + "and t1, t1, t5\n\t" + "and t2, t2, t5\n\t" + "and t3, t3, t5\n\t" + "and t4, t4, t5\n\t" + "or a7, a7, t1\n\t" + "or s1, s1, t2\n\t" + "or s2, s2, t3\n\t" + "or s3, s3, t4\n\t" + "slli t5, %[nr], 4\n\t" + "add t5, %[key], t5\n\t" + "lw t1, 0(t5)\n\t" + "lw t2, 4(t5)\n\t" + "lw t3, 8(t5)\n\t" + "lw t4, 12(t5)\n\t" + "xor a7, a7, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t1, a7, 24\n\t" + "srli t2, s1, 24\n\t" + "srli t3, s2, 24\n\t" + "srli t4, s3, 24\n\t" + "sb t1, 0(%[out])\n\t" + "sb t2, 4(%[out])\n\t" + "sb t3, 8(%[out])\n\t" + "sb t4, 12(%[out])\n\t" + "srli t1, a7, 16\n\t" + "srli t2, s1, 16\n\t" + "srli t3, s2, 16\n\t" + "srli t4, s3, 16\n\t" + "sb t1, 1(%[out])\n\t" + "sb t2, 5(%[out])\n\t" + "sb t3, 9(%[out])\n\t" + "sb t4, 13(%[out])\n\t" + "srli t1, a7, 8\n\t" + "srli t2, s1, 8\n\t" + "srli t3, s2, 8\n\t" + "srli t4, s3, 8\n\t" + "sb t1, 2(%[out])\n\t" + "sb t2, 6(%[out])\n\t" + "sb t3, 10(%[out])\n\t" + "sb t4, 14(%[out])\n\t" + "sb a7, 3(%[out])\n\t" + "sb s1, 7(%[out])\n\t" + "sb s2, 11(%[out])\n\t" + "sb s3, 15(%[out])\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t1, a7, 32\n\t" + "slli t2, s1, 32\n\t" + "slli t3, s2, 32\n\t" + "slli t4, s3, 32\n\t" + "srli t2, t2, 32\n\t" + "srli t4, t4, 32\n\t" + "or t2, t2, t1\n\t" + "or t4, t4, t3\n\t" +#else + /* pack t2, s1, a7 */ + ".word 0x0914c3b3\n\t" + /* pack t4, s3, s2 */ + ".word 0x0929ceb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t2, t2 */ + ".word 0x6b83d393\n\t" + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" + "sd t2, 0(%[out])\n\t" + "sd t4, 8(%[out])\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + : [in] "+r" (in), [out] "+r" (out), [key] "+r" (key), [nr] "+r" (nr) + : [te] "r" (te) + : "memory", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", "a6", "a7", + "s1", "s2", "s3" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_decrypt_RISCV64(const byte* in, byte* out, byte* key, int nr) +{ + const word32* td = L_AES_base_td; + const word8* td4 = L_AES_base_td4; + + __asm__ __volatile__ ( +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t2, 0(%[in])\n\t" + "lbu t3, 4(%[in])\n\t" + "lbu t4, 8(%[in])\n\t" + "lbu t5, 12(%[in])\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "lbu t6, 1(%[in])\n\t" + "or t2, t2, t6\n\t" + "lbu a4, 5(%[in])\n\t" + "or t3, t3, a4\n\t" + "lbu a5, 9(%[in])\n\t" + "or t4, t4, a5\n\t" + "lbu t6, 13(%[in])\n\t" + "or t5, t5, t6\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "lbu t6, 2(%[in])\n\t" + "or t2, t2, t6\n\t" + "lbu a4, 6(%[in])\n\t" + "or t3, t3, a4\n\t" + "lbu a5, 10(%[in])\n\t" + "or t4, t4, a5\n\t" + "lbu t6, 14(%[in])\n\t" + "or t5, t5, t6\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "lbu t6, 3(%[in])\n\t" + "or t2, t2, t6\n\t" + "lbu a4, 7(%[in])\n\t" + "or t3, t3, a4\n\t" + "lbu a5, 11(%[in])\n\t" + "or t4, t4, a5\n\t" + "lbu t6, 15(%[in])\n\t" + "or t5, t5, t6\n\t" +#else + "ld t3, 0(%[in])\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" + "ld t5, 8(%[in])\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s1, 0(%[key])\n\t" + "lw s2, 4(%[key])\n\t" + "lw s3, 8(%[key])\n\t" + "lw s4, 12(%[key])\n\t" + "xor s1, t2, s1\n\t" + "xor s2, t3, s2\n\t" + "xor s3, t4, s3\n\t" + "xor s4, t5, s4\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "lw a7, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, s4, 14\n\t" + "srliw t3, s1, 14\n\t" + "srliw t4, s2, 14\n\t" + "srliw t5, s3, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, s4, 6\n\t" + "srliw t4, s1, 6\n\t" + "srliw t5, s2, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, s2, 255\n\t" + "andi t3, s3, 255\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "lw t2, 16(%[key])\n\t" + "lw t3, 20(%[key])\n\t" + "lw t4, 24(%[key])\n\t" + "lw t5, 28(%[key])\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" + "srliw t5, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "srliw t4, a5, 14\n\t" + "srliw t5, a6, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, a4, 6\n\t" + "srliw t5, a5, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" + "andi t4, a7, 255\n\t" + "andi t5, a4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "lw t2, 32(%[key])\n\t" + "lw t3, 36(%[key])\n\t" + "lw t4, 40(%[key])\n\t" + "lw t5, 44(%[key])\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "lw a7, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, s4, 14\n\t" + "srliw t3, s1, 14\n\t" + "srliw t4, s2, 14\n\t" + "srliw t5, s3, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, s4, 6\n\t" + "srliw t4, s1, 6\n\t" + "srliw t5, s2, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, s2, 255\n\t" + "andi t3, s3, 255\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "lw t2, 48(%[key])\n\t" + "lw t3, 52(%[key])\n\t" + "lw t4, 56(%[key])\n\t" + "lw t5, 60(%[key])\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" + "srliw t5, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "srliw t4, a5, 14\n\t" + "srliw t5, a6, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, a4, 6\n\t" + "srliw t5, a5, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" + "andi t4, a7, 255\n\t" + "andi t5, a4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "lw t2, 64(%[key])\n\t" + "lw t3, 68(%[key])\n\t" + "lw t4, 72(%[key])\n\t" + "lw t5, 76(%[key])\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "lw a7, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, s4, 14\n\t" + "srliw t3, s1, 14\n\t" + "srliw t4, s2, 14\n\t" + "srliw t5, s3, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, s4, 6\n\t" + "srliw t4, s1, 6\n\t" + "srliw t5, s2, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, s2, 255\n\t" + "andi t3, s3, 255\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "lw t2, 80(%[key])\n\t" + "lw t3, 84(%[key])\n\t" + "lw t4, 88(%[key])\n\t" + "lw t5, 92(%[key])\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" + "srliw t5, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "srliw t4, a5, 14\n\t" + "srliw t5, a6, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, a4, 6\n\t" + "srliw t5, a5, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" + "andi t4, a7, 255\n\t" + "andi t5, a4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "lw t2, 96(%[key])\n\t" + "lw t3, 100(%[key])\n\t" + "lw t4, 104(%[key])\n\t" + "lw t5, 108(%[key])\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "lw a7, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, s4, 14\n\t" + "srliw t3, s1, 14\n\t" + "srliw t4, s2, 14\n\t" + "srliw t5, s3, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, s4, 6\n\t" + "srliw t4, s1, 6\n\t" + "srliw t5, s2, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, s2, 255\n\t" + "andi t3, s3, 255\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "lw t2, 112(%[key])\n\t" + "lw t3, 116(%[key])\n\t" + "lw t4, 120(%[key])\n\t" + "lw t5, 124(%[key])\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" + "srliw t5, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "srliw t4, a5, 14\n\t" + "srliw t5, a6, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, a4, 6\n\t" + "srliw t5, a5, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" + "andi t4, a7, 255\n\t" + "andi t5, a4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "lw t2, 128(%[key])\n\t" + "lw t3, 132(%[key])\n\t" + "lw t4, 136(%[key])\n\t" + "lw t5, 140(%[key])\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "lw a7, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, s4, 14\n\t" + "srliw t3, s1, 14\n\t" + "srliw t4, s2, 14\n\t" + "srliw t5, s3, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, s4, 6\n\t" + "srliw t4, s1, 6\n\t" + "srliw t5, s2, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, s2, 255\n\t" + "andi t3, s3, 255\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "lw t2, 144(%[key])\n\t" + "lw t3, 148(%[key])\n\t" + "lw t4, 152(%[key])\n\t" + "lw t5, 156(%[key])\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "li t6, 10\n\t" + "ble %[nr], t6, L_AES_decrypt_RISCV64_done\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" + "srliw t5, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "srliw t4, a5, 14\n\t" + "srliw t5, a6, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, a4, 6\n\t" + "srliw t5, a5, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" + "andi t4, a7, 255\n\t" + "andi t5, a4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "lw t2, 160(%[key])\n\t" + "lw t3, 164(%[key])\n\t" + "lw t4, 168(%[key])\n\t" + "lw t5, 172(%[key])\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "lw a7, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, s4, 14\n\t" + "srliw t3, s1, 14\n\t" + "srliw t4, s2, 14\n\t" + "srliw t5, s3, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, s4, 6\n\t" + "srliw t4, s1, 6\n\t" + "srliw t5, s2, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, s2, 255\n\t" + "andi t3, s3, 255\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "lw t2, 176(%[key])\n\t" + "lw t3, 180(%[key])\n\t" + "lw t4, 184(%[key])\n\t" + "lw t5, 188(%[key])\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "li t6, 12\n\t" + "ble %[nr], t6, L_AES_decrypt_RISCV64_done\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" + "srliw t5, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "srliw t4, a5, 14\n\t" + "srliw t5, a6, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, a6, 6\n\t" + "srliw t3, a7, 6\n\t" + "srliw t4, a4, 6\n\t" + "srliw t5, a5, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" + "andi t4, a7, 255\n\t" + "andi t5, a4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "lw t2, 192(%[key])\n\t" + "lw t3, 196(%[key])\n\t" + "lw t4, 200(%[key])\n\t" + "lw t5, 204(%[key])\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, %[td]\n\t" + "sh2add t3, t3, %[td]\n\t" + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, %[td]\n\t" + "add t3, t3, %[td]\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t2)\n\t" + "lw a5, 0(t3)\n\t" + "lw a6, 0(t4)\n\t" + "lw a7, 0(t5)\n\t" + "addi t6, %[td], 1024\n\t" + "srliw t2, s4, 14\n\t" + "srliw t3, s1, 14\n\t" + "srliw t4, s2, 14\n\t" + "srliw t5, s3, 14\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "srliw t2, s3, 6\n\t" + "srliw t3, s4, 6\n\t" + "srliw t4, s1, 6\n\t" + "srliw t5, s2, 6\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "addi t6, t6, 1024\n\t" + "andi t2, s2, 255\n\t" + "andi t3, s3, 255\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t2, t2, t6\n\t" + "sh2add t3, t3, t6\n\t" + "sh2add t4, t4, t6\n\t" + "sh2add t5, t5, t6\n\t" +#else + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, t6\n\t" + "add t4, t4, t6\n\t" + "add t5, t5, t6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "lw t2, 208(%[key])\n\t" + "lw t3, 212(%[key])\n\t" + "lw t4, 216(%[key])\n\t" + "lw t5, 220(%[key])\n\t" + "xor a4, a4, t2\n\t" + "xor a5, a5, t3\n\t" + "xor a6, a6, t4\n\t" + "xor a7, a7, t5\n\t" + "\n" + "L_AES_decrypt_RISCV64_done:\n\t" + "srliw t2, a4, 24\n\t" + "srliw t3, a5, 24\n\t" + "srliw t4, a6, 24\n\t" + "srliw t5, a7, 24\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "lbu s1, 0(t2)\n\t" + "lbu s2, 0(t3)\n\t" + "lbu s3, 0(t4)\n\t" + "lbu s4, 0(t5)\n\t" + "slli s1, s1, 24\n\t" + "slli s2, s2, 24\n\t" + "slli s3, s3, 24\n\t" + "slli s4, s4, 24\n\t" + "srliw t2, a7, 16\n\t" + "srliw t3, a4, 16\n\t" + "srliw t4, a5, 16\n\t" + "srliw t5, a6, 16\n\t" + "andi t2, t2, 255\n\t" + "andi t3, t3, 255\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "slli t2, t2, 16\n\t" + "slli t3, t3, 16\n\t" + "slli t4, t4, 16\n\t" + "slli t5, t5, 16\n\t" + "or s1, s1, t2\n\t" + "or s2, s2, t3\n\t" + "or s3, s3, t4\n\t" + "or s4, s4, t5\n\t" + "srliw t2, a6, 8\n\t" + "srliw t3, a7, 8\n\t" + "srliw t4, a4, 8\n\t" + "srliw t5, a5, 8\n\t" + "andi t2, t2, 255\n\t" + "andi t3, t3, 255\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "or s1, s1, t2\n\t" + "or s2, s2, t3\n\t" + "or s3, s3, t4\n\t" + "or s4, s4, t5\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" + "andi t4, a7, 255\n\t" + "andi t5, a4, 255\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "or s1, s1, t2\n\t" + "or s2, s2, t3\n\t" + "or s3, s3, t4\n\t" + "or s4, s4, t5\n\t" + "slli t6, %[nr], 4\n\t" + "add t6, %[key], t6\n\t" + "lw t2, 0(t6)\n\t" + "lw t3, 4(t6)\n\t" + "lw t4, 8(t6)\n\t" + "lw t5, 12(t6)\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t2, s1, 24\n\t" + "srli t3, s2, 24\n\t" + "srli t4, s3, 24\n\t" + "srli t5, s4, 24\n\t" + "sb t2, 0(%[out])\n\t" + "sb t3, 4(%[out])\n\t" + "sb t4, 8(%[out])\n\t" + "sb t5, 12(%[out])\n\t" + "srli t2, s1, 16\n\t" + "srli t3, s2, 16\n\t" + "srli t4, s3, 16\n\t" + "srli t5, s4, 16\n\t" + "sb t2, 1(%[out])\n\t" + "sb t3, 5(%[out])\n\t" + "sb t4, 9(%[out])\n\t" + "sb t5, 13(%[out])\n\t" + "srli t2, s1, 8\n\t" + "srli t3, s2, 8\n\t" + "srli t4, s3, 8\n\t" + "srli t5, s4, 8\n\t" + "sb t2, 2(%[out])\n\t" + "sb t3, 6(%[out])\n\t" + "sb t4, 10(%[out])\n\t" + "sb t5, 14(%[out])\n\t" + "sb s1, 3(%[out])\n\t" + "sb s2, 7(%[out])\n\t" + "sb s3, 11(%[out])\n\t" + "sb s4, 15(%[out])\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t2, s1, 32\n\t" + "slli t3, s2, 32\n\t" + "slli t4, s3, 32\n\t" + "slli t5, s4, 32\n\t" + "srli t3, t3, 32\n\t" + "srli t5, t5, 32\n\t" + "or t3, t3, t2\n\t" + "or t5, t5, t4\n\t" +#else + /* pack t3, s2, s1 */ + ".word 0x08994e33\n\t" + /* pack t5, s4, s3 */ + ".word 0x093a4f33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "sd t3, 0(%[out])\n\t" + "sd t5, 8(%[out])\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + : [in] "+r" (in), [out] "+r" (out), [key] "+r" (key), [nr] "+r" (nr) + : [td] "r" (td), [td4] "r" (td4) + : "memory", "t2", "t3", "t4", "t5", "t6", "a4", "a5", "a6", "a7", "s1", + "s2", "s3", "s4" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || + * WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#ifdef HAVE_AES_ECB +void AES_encrypt_blocks_RISCV64(const byte* in, byte* out, word32 sz, byte* key, + int nr) +{ + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 16(sp)\n\t" + "srliw %[sz], %[sz], 4\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_block:\n\t" + "beqz %[sz], L_AES_encrypt_blocks_RISCV64_end\n\t" + "mv t0, %[in]\n\t" + "mv t1, %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t3, 0(t0)\n\t" + "lbu t4, 4(t0)\n\t" + "lbu t5, 8(t0)\n\t" + "lbu t6, 12(t0)\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "lbu a5, 1(t0)\n\t" + "or t3, t3, a5\n\t" + "lbu a6, 5(t0)\n\t" + "or t4, t4, a6\n\t" + "lbu a7, 9(t0)\n\t" + "or t5, t5, a7\n\t" + "lbu a5, 13(t0)\n\t" + "or t6, t6, a5\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "lbu a5, 2(t0)\n\t" + "or t3, t3, a5\n\t" + "lbu a6, 6(t0)\n\t" + "or t4, t4, a6\n\t" + "lbu a7, 10(t0)\n\t" + "or t5, t5, a7\n\t" + "lbu a5, 14(t0)\n\t" + "or t6, t6, a5\n\t" + "slli t3, t3, 8\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "lbu a5, 3(t0)\n\t" + "or t3, t3, a5\n\t" + "lbu a6, 7(t0)\n\t" + "or t4, t4, a6\n\t" + "lbu a7, 11(t0)\n\t" + "or t5, t5, a7\n\t" + "lbu a5, 15(t0)\n\t" + "or t6, t6, a5\n\t" +#else + "ld t4, 0(t0)\n\t" + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" + "srli t3, t4, 32\n\t" + "ld t6, 8(t0)\n\t" + /* rev8 t6, t6 */ + ".word 0x6b8fdf93\n\t" + "srli t5, t6, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s3, 0(%[key])\n\t" + "lw s4, 4(%[key])\n\t" + "lw s5, 8(%[key])\n\t" + "lw s6, 12(%[key])\n\t" + "xor s3, t3, s3\n\t" + "xor s4, t4, s4\n\t" + "xor s5, t5, s5\n\t" + "xor s6, t6, s6\n\t" + "srliw t3, s3, 24\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a6, 0(t3)\n\t" + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, s4, 14\n\t" + "srliw t4, s5, 14\n\t" + "srliw t5, s6, 14\n\t" + "srliw t6, s3, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s5, 6\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, s4, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s6, 255\n\t" + "andi t4, s3, 255\n\t" + "andi t5, s4, 255\n\t" + "andi t6, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "lw t3, 16(%[key])\n\t" + "lw t4, 20(%[key])\n\t" + "lw t5, 24(%[key])\n\t" + "lw t6, 28(%[key])\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "srliw t3, a6, 24\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t3)\n\t" + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, a7, 14\n\t" + "srliw t4, s1, 14\n\t" + "srliw t5, s2, 14\n\t" + "srliw t6, a6, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s1, 6\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, a6, 6\n\t" + "srliw t6, a7, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s2, 255\n\t" + "andi t4, a6, 255\n\t" + "andi t5, a7, 255\n\t" + "andi t6, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "lw t3, 32(%[key])\n\t" + "lw t4, 36(%[key])\n\t" + "lw t5, 40(%[key])\n\t" + "lw t6, 44(%[key])\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "srliw t3, s3, 24\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a6, 0(t3)\n\t" + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, s4, 14\n\t" + "srliw t4, s5, 14\n\t" + "srliw t5, s6, 14\n\t" + "srliw t6, s3, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s5, 6\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, s4, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s6, 255\n\t" + "andi t4, s3, 255\n\t" + "andi t5, s4, 255\n\t" + "andi t6, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "lw t3, 48(%[key])\n\t" + "lw t4, 52(%[key])\n\t" + "lw t5, 56(%[key])\n\t" + "lw t6, 60(%[key])\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "srliw t3, a6, 24\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t3)\n\t" + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, a7, 14\n\t" + "srliw t4, s1, 14\n\t" + "srliw t5, s2, 14\n\t" + "srliw t6, a6, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s1, 6\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, a6, 6\n\t" + "srliw t6, a7, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s2, 255\n\t" + "andi t4, a6, 255\n\t" + "andi t5, a7, 255\n\t" + "andi t6, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "lw t3, 64(%[key])\n\t" + "lw t4, 68(%[key])\n\t" + "lw t5, 72(%[key])\n\t" + "lw t6, 76(%[key])\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "srliw t3, s3, 24\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a6, 0(t3)\n\t" + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, s4, 14\n\t" + "srliw t4, s5, 14\n\t" + "srliw t5, s6, 14\n\t" + "srliw t6, s3, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s5, 6\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, s4, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s6, 255\n\t" + "andi t4, s3, 255\n\t" + "andi t5, s4, 255\n\t" + "andi t6, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "lw t3, 80(%[key])\n\t" + "lw t4, 84(%[key])\n\t" + "lw t5, 88(%[key])\n\t" + "lw t6, 92(%[key])\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "srliw t3, a6, 24\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t3)\n\t" + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, a7, 14\n\t" + "srliw t4, s1, 14\n\t" + "srliw t5, s2, 14\n\t" + "srliw t6, a6, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s1, 6\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, a6, 6\n\t" + "srliw t6, a7, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s2, 255\n\t" + "andi t4, a6, 255\n\t" + "andi t5, a7, 255\n\t" + "andi t6, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "lw t3, 96(%[key])\n\t" + "lw t4, 100(%[key])\n\t" + "lw t5, 104(%[key])\n\t" + "lw t6, 108(%[key])\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "srliw t3, s3, 24\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a6, 0(t3)\n\t" + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, s4, 14\n\t" + "srliw t4, s5, 14\n\t" + "srliw t5, s6, 14\n\t" + "srliw t6, s3, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s5, 6\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, s4, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s6, 255\n\t" + "andi t4, s3, 255\n\t" + "andi t5, s4, 255\n\t" + "andi t6, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "lw t3, 112(%[key])\n\t" + "lw t4, 116(%[key])\n\t" + "lw t5, 120(%[key])\n\t" + "lw t6, 124(%[key])\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "srliw t3, a6, 24\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t3)\n\t" + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, a7, 14\n\t" + "srliw t4, s1, 14\n\t" + "srliw t5, s2, 14\n\t" + "srliw t6, a6, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s1, 6\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, a6, 6\n\t" + "srliw t6, a7, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s2, 255\n\t" + "andi t4, a6, 255\n\t" + "andi t5, a7, 255\n\t" + "andi t6, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "lw t3, 128(%[key])\n\t" + "lw t4, 132(%[key])\n\t" + "lw t5, 136(%[key])\n\t" + "lw t6, 140(%[key])\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "srliw t3, s3, 24\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a6, 0(t3)\n\t" + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, s4, 14\n\t" + "srliw t4, s5, 14\n\t" + "srliw t5, s6, 14\n\t" + "srliw t6, s3, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s5, 6\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, s4, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s6, 255\n\t" + "andi t4, s3, 255\n\t" + "andi t5, s4, 255\n\t" + "andi t6, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "lw t3, 144(%[key])\n\t" + "lw t4, 148(%[key])\n\t" + "lw t5, 152(%[key])\n\t" + "lw t6, 156(%[key])\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "li a5, 10\n\t" + "ble %[nr], a5, L_AES_enc_block_1_done\n\t" + "srliw t3, a6, 24\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t3)\n\t" + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, a7, 14\n\t" + "srliw t4, s1, 14\n\t" + "srliw t5, s2, 14\n\t" + "srliw t6, a6, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s1, 6\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, a6, 6\n\t" + "srliw t6, a7, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s2, 255\n\t" + "andi t4, a6, 255\n\t" + "andi t5, a7, 255\n\t" + "andi t6, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "lw t3, 160(%[key])\n\t" + "lw t4, 164(%[key])\n\t" + "lw t5, 168(%[key])\n\t" + "lw t6, 172(%[key])\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "srliw t3, s3, 24\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a6, 0(t3)\n\t" + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, s4, 14\n\t" + "srliw t4, s5, 14\n\t" + "srliw t5, s6, 14\n\t" + "srliw t6, s3, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s5, 6\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, s4, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s6, 255\n\t" + "andi t4, s3, 255\n\t" + "andi t5, s4, 255\n\t" + "andi t6, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "lw t3, 176(%[key])\n\t" + "lw t4, 180(%[key])\n\t" + "lw t5, 184(%[key])\n\t" + "lw t6, 188(%[key])\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "li a5, 12\n\t" + "ble %[nr], a5, L_AES_enc_block_1_done\n\t" + "srliw t3, a6, 24\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t3)\n\t" + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, a7, 14\n\t" + "srliw t4, s1, 14\n\t" + "srliw t5, s2, 14\n\t" + "srliw t6, a6, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s1, 6\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, a6, 6\n\t" + "srliw t6, a7, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s2, 255\n\t" + "andi t4, a6, 255\n\t" + "andi t5, a7, 255\n\t" + "andi t6, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "lw t3, 192(%[key])\n\t" + "lw t4, 196(%[key])\n\t" + "lw t5, 200(%[key])\n\t" + "lw t6, 204(%[key])\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "srliw t3, s3, 24\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, %[te]\n\t" + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a6, 0(t3)\n\t" + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "addi a5, %[te], 1024\n\t" + "srliw t3, s4, 14\n\t" + "srliw t4, s5, 14\n\t" + "srliw t5, s6, 14\n\t" + "srliw t6, s3, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, s5, 6\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, s4, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "addi a5, a5, 1024\n\t" + "andi t3, s6, 255\n\t" + "andi t4, s3, 255\n\t" + "andi t5, s4, 255\n\t" + "andi t6, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slliw t3, t3, 2\n\t" + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "lw t3, 208(%[key])\n\t" + "lw t4, 212(%[key])\n\t" + "lw t5, 216(%[key])\n\t" + "lw t6, 220(%[key])\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "\n" + "L_AES_enc_block_1_done:\n\t" + "srliw t3, s1, 6\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, a6, 6\n\t" + "srliw t6, a7, 6\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, %[te]\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "lw s3, 0(t3)\n\t" + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "li a5, 65280\n\t" + "and s3, s3, a5\n\t" + "and s4, s4, a5\n\t" + "and s5, s5, a5\n\t" + "and s6, s6, a5\n\t" + "addi a5, %[te], 1024\n\t" + "andi t3, s2, 255\n\t" + "andi t4, a6, 255\n\t" + "andi t5, a7, 255\n\t" + "andi t6, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slli t3, t3, 2\n\t" + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t3, 0(t3)\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "or s3, s3, t3\n\t" + "or s4, s4, t4\n\t" + "or s5, s5, t5\n\t" + "or s6, s6, t6\n\t" + "addi a5, a5, 1024\n\t" + "srliw t3, a6, 24\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t3, t3, a5\n\t" + "sh2add t4, t4, a5\n\t" + "sh2add t5, t5, a5\n\t" + "sh2add t6, t6, a5\n\t" +#else + "slli t3, t3, 2\n\t" + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "li a5, 4278190080\n\t" + "and t3, t3, a5\n\t" + "and t4, t4, a5\n\t" + "and t5, t5, a5\n\t" + "and t6, t6, a5\n\t" + "or s3, s3, t3\n\t" + "or s4, s4, t4\n\t" + "or s5, s5, t5\n\t" + "or s6, s6, t6\n\t" + "li a5, 3072\n\t" + "add a5, %[te], a5\n\t" + "srliw t3, a7, 14\n\t" + "srliw t4, s1, 14\n\t" + "srliw t5, s2, 14\n\t" + "srliw t6, a6, 14\n\t" + "andi t3, t3, 1020\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "add t3, t3, a5\n\t" + "add t4, t4, a5\n\t" + "add t5, t5, a5\n\t" + "add t6, t6, a5\n\t" + "lw t3, 0(t3)\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "li a5, 16711680\n\t" + "and t3, t3, a5\n\t" + "and t4, t4, a5\n\t" + "and t5, t5, a5\n\t" + "and t6, t6, a5\n\t" + "or s3, s3, t3\n\t" + "or s4, s4, t4\n\t" + "or s5, s5, t5\n\t" + "or s6, s6, t6\n\t" + "slli a5, %[nr], 4\n\t" + "add a5, %[key], a5\n\t" + "lw t3, 0(a5)\n\t" + "lw t4, 4(a5)\n\t" + "lw t5, 8(a5)\n\t" + "lw t6, 12(a5)\n\t" + "xor s3, s3, t3\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t3, s3, 24\n\t" + "srli t4, s4, 24\n\t" + "srli t5, s5, 24\n\t" + "srli t6, s6, 24\n\t" + "sb t3, 0(t1)\n\t" + "sb t4, 4(t1)\n\t" + "sb t5, 8(t1)\n\t" + "sb t6, 12(t1)\n\t" + "srli t3, s3, 16\n\t" + "srli t4, s4, 16\n\t" + "srli t5, s5, 16\n\t" + "srli t6, s6, 16\n\t" + "sb t3, 1(t1)\n\t" + "sb t4, 5(t1)\n\t" + "sb t5, 9(t1)\n\t" + "sb t6, 13(t1)\n\t" + "srli t3, s3, 8\n\t" + "srli t4, s4, 8\n\t" + "srli t5, s5, 8\n\t" + "srli t6, s6, 8\n\t" + "sb t3, 2(t1)\n\t" + "sb t4, 6(t1)\n\t" + "sb t5, 10(t1)\n\t" + "sb t6, 14(t1)\n\t" + "sb s3, 3(t1)\n\t" + "sb s4, 7(t1)\n\t" + "sb s5, 11(t1)\n\t" + "sb s6, 15(t1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t3, s3, 32\n\t" + "slli t4, s4, 32\n\t" + "slli t5, s5, 32\n\t" + "slli t6, s6, 32\n\t" + "srli t4, t4, 32\n\t" + "srli t6, t6, 32\n\t" + "or t4, t4, t3\n\t" + "or t6, t6, t5\n\t" +#else + /* pack t4, s4, s3 */ + ".word 0x093a4eb3\n\t" + /* pack t6, s6, s5 */ + ".word 0x095b4fb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" + /* rev8 t6, t6 */ + ".word 0x6b8fdf93\n\t" + "sd t4, 0(t1)\n\t" + "sd t6, 8(t1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_encrypt_blocks_RISCV64_block\n\t" + "\n" + "L_AES_encrypt_blocks_RISCV64_end:\n\t" + "ld ra, 16(sp)\n\t" + "addi sp, sp, 32\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [key] "+r" (key), + [nr] "+r" (nr) + : [te] "r" (te) + : "memory", "t0", "t1", "t3", "t4", "t5", "t6", "a5", "a6", "a7", "s1", + "s2", "s3", "s4", "s5", "s6" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_decrypt_blocks_RISCV64(const byte* in, byte* out, word32 sz, byte* key, + int nr) +{ + const word32* td = L_AES_base_td; + const word8* td4 = L_AES_base_td4; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 16(sp)\n\t" + "srliw %[sz], %[sz], 4\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_block:\n\t" + "beqz %[sz], L_AES_decrypt_blocks_RISCV64_end\n\t" + "mv t0, %[in]\n\t" + "mv t1, %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu a5, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli a5, a5, 8\n\t" + "lbu a6, 1(t0)\n\t" + "or t4, t4, a6\n\t" + "lbu a7, 5(t0)\n\t" + "or t5, t5, a7\n\t" + "lbu s1, 9(t0)\n\t" + "or t6, t6, s1\n\t" + "lbu a6, 13(t0)\n\t" + "or a5, a5, a6\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli a5, a5, 8\n\t" + "lbu a6, 2(t0)\n\t" + "or t4, t4, a6\n\t" + "lbu a7, 6(t0)\n\t" + "or t5, t5, a7\n\t" + "lbu s1, 10(t0)\n\t" + "or t6, t6, s1\n\t" + "lbu a6, 14(t0)\n\t" + "or a5, a5, a6\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli a5, a5, 8\n\t" + "lbu a6, 3(t0)\n\t" + "or t4, t4, a6\n\t" + "lbu a7, 7(t0)\n\t" + "or t5, t5, a7\n\t" + "lbu s1, 11(t0)\n\t" + "or t6, t6, s1\n\t" + "lbu a6, 15(t0)\n\t" + "or a5, a5, a6\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld a5, 8(t0)\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + "srli t6, a5, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s4, 0(%[key])\n\t" + "lw s5, 4(%[key])\n\t" + "lw s6, 8(%[key])\n\t" + "lw s7, 12(%[key])\n\t" + "xor s4, t4, s4\n\t" + "xor s5, t5, s5\n\t" + "xor s6, t6, s6\n\t" + "xor s7, a5, s7\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" + "srliw a5, s7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "lw s3, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s7, 14\n\t" + "srliw t5, s4, 14\n\t" + "srliw t6, s5, 14\n\t" + "srliw a5, s6, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s7, 6\n\t" + "srliw t6, s4, 6\n\t" + "srliw a5, s5, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s5, 255\n\t" + "andi t5, s6, 255\n\t" + "andi t6, s7, 255\n\t" + "andi a5, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw a5, 28(%[key])\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" + "srliw a5, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "lw s7, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s3, 14\n\t" + "srliw t5, a7, 14\n\t" + "srliw t6, s1, 14\n\t" + "srliw a5, s2, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, a7, 6\n\t" + "srliw a5, s1, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s1, 255\n\t" + "andi t5, s2, 255\n\t" + "andi t6, s3, 255\n\t" + "andi a5, a7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw a5, 44(%[key])\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" + "srliw a5, s7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "lw s3, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s7, 14\n\t" + "srliw t5, s4, 14\n\t" + "srliw t6, s5, 14\n\t" + "srliw a5, s6, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s7, 6\n\t" + "srliw t6, s4, 6\n\t" + "srliw a5, s5, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s5, 255\n\t" + "andi t5, s6, 255\n\t" + "andi t6, s7, 255\n\t" + "andi a5, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw a5, 60(%[key])\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" + "srliw a5, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "lw s7, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s3, 14\n\t" + "srliw t5, a7, 14\n\t" + "srliw t6, s1, 14\n\t" + "srliw a5, s2, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, a7, 6\n\t" + "srliw a5, s1, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s1, 255\n\t" + "andi t5, s2, 255\n\t" + "andi t6, s3, 255\n\t" + "andi a5, a7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw a5, 76(%[key])\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" + "srliw a5, s7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "lw s3, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s7, 14\n\t" + "srliw t5, s4, 14\n\t" + "srliw t6, s5, 14\n\t" + "srliw a5, s6, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s7, 6\n\t" + "srliw t6, s4, 6\n\t" + "srliw a5, s5, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s5, 255\n\t" + "andi t5, s6, 255\n\t" + "andi t6, s7, 255\n\t" + "andi a5, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw a5, 92(%[key])\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" + "srliw a5, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "lw s7, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s3, 14\n\t" + "srliw t5, a7, 14\n\t" + "srliw t6, s1, 14\n\t" + "srliw a5, s2, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, a7, 6\n\t" + "srliw a5, s1, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s1, 255\n\t" + "andi t5, s2, 255\n\t" + "andi t6, s3, 255\n\t" + "andi a5, a7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw a5, 108(%[key])\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" + "srliw a5, s7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "lw s3, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s7, 14\n\t" + "srliw t5, s4, 14\n\t" + "srliw t6, s5, 14\n\t" + "srliw a5, s6, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s7, 6\n\t" + "srliw t6, s4, 6\n\t" + "srliw a5, s5, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s5, 255\n\t" + "andi t5, s6, 255\n\t" + "andi t6, s7, 255\n\t" + "andi a5, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw a5, 124(%[key])\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" + "srliw a5, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "lw s7, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s3, 14\n\t" + "srliw t5, a7, 14\n\t" + "srliw t6, s1, 14\n\t" + "srliw a5, s2, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, a7, 6\n\t" + "srliw a5, s1, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s1, 255\n\t" + "andi t5, s2, 255\n\t" + "andi t6, s3, 255\n\t" + "andi a5, a7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw a5, 140(%[key])\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" + "srliw a5, s7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "lw s3, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s7, 14\n\t" + "srliw t5, s4, 14\n\t" + "srliw t6, s5, 14\n\t" + "srliw a5, s6, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s7, 6\n\t" + "srliw t6, s4, 6\n\t" + "srliw a5, s5, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s5, 255\n\t" + "andi t5, s6, 255\n\t" + "andi t6, s7, 255\n\t" + "andi a5, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw a5, 156(%[key])\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "li a6, 10\n\t" + "ble %[nr], a6, L_AES_dec_block_2_done\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" + "srliw a5, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "lw s7, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s3, 14\n\t" + "srliw t5, a7, 14\n\t" + "srliw t6, s1, 14\n\t" + "srliw a5, s2, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, a7, 6\n\t" + "srliw a5, s1, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s1, 255\n\t" + "andi t5, s2, 255\n\t" + "andi t6, s3, 255\n\t" + "andi a5, a7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw a5, 172(%[key])\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" + "srliw a5, s7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "lw s3, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s7, 14\n\t" + "srliw t5, s4, 14\n\t" + "srliw t6, s5, 14\n\t" + "srliw a5, s6, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s7, 6\n\t" + "srliw t6, s4, 6\n\t" + "srliw a5, s5, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s5, 255\n\t" + "andi t5, s6, 255\n\t" + "andi t6, s7, 255\n\t" + "andi a5, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw a5, 188(%[key])\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "li a6, 12\n\t" + "ble %[nr], a6, L_AES_dec_block_2_done\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" + "srliw a5, s3, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s4, 0(t4)\n\t" + "lw s5, 0(t5)\n\t" + "lw s6, 0(t6)\n\t" + "lw s7, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s3, 14\n\t" + "srliw t5, a7, 14\n\t" + "srliw t6, s1, 14\n\t" + "srliw a5, s2, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s2, 6\n\t" + "srliw t5, s3, 6\n\t" + "srliw t6, a7, 6\n\t" + "srliw a5, s1, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s1, 255\n\t" + "andi t5, s2, 255\n\t" + "andi t6, s3, 255\n\t" + "andi a5, a7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw a5, 204(%[key])\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + "srliw t4, s4, 24\n\t" + "srliw t5, s5, 24\n\t" + "srliw t6, s6, 24\n\t" + "srliw a5, s7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add a5, a5, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add a5, a5, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(t4)\n\t" + "lw s1, 0(t5)\n\t" + "lw s2, 0(t6)\n\t" + "lw s3, 0(a5)\n\t" + "addi a6, %[td], 1024\n\t" + "srliw t4, s7, 14\n\t" + "srliw t5, s4, 14\n\t" + "srliw t6, s5, 14\n\t" + "srliw a5, s6, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "srliw t4, s6, 6\n\t" + "srliw t5, s7, 6\n\t" + "srliw t6, s4, 6\n\t" + "srliw a5, s5, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a5, a5, 1020\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "addi a6, a6, 1024\n\t" + "andi t4, s5, 255\n\t" + "andi t5, s6, 255\n\t" + "andi t6, s7, 255\n\t" + "andi a5, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, a6\n\t" + "sh2add t5, t5, a6\n\t" + "sh2add t6, t6, a6\n\t" + "sh2add a5, a5, a6\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a5, a5, 2\n\t" + "add t4, t4, a6\n\t" + "add t5, t5, a6\n\t" + "add t6, t6, a6\n\t" + "add a5, a5, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a5, 0(a5)\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw a5, 220(%[key])\n\t" + "xor a7, a7, t4\n\t" + "xor s1, s1, t5\n\t" + "xor s2, s2, t6\n\t" + "xor s3, s3, a5\n\t" + "\n" + "L_AES_dec_block_2_done:\n\t" + "srliw t4, a7, 24\n\t" + "srliw t5, s1, 24\n\t" + "srliw t6, s2, 24\n\t" + "srliw a5, s3, 24\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add a5, a5, %[td4]\n\t" + "lbu s4, 0(t4)\n\t" + "lbu s5, 0(t5)\n\t" + "lbu s6, 0(t6)\n\t" + "lbu s7, 0(a5)\n\t" + "slli s4, s4, 24\n\t" + "slli s5, s5, 24\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 24\n\t" + "srliw t4, s3, 16\n\t" + "srliw t5, a7, 16\n\t" + "srliw t6, s1, 16\n\t" + "srliw a5, s2, 16\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi a5, a5, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add a5, a5, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu a5, 0(a5)\n\t" + "slli t4, t4, 16\n\t" + "slli t5, t5, 16\n\t" + "slli t6, t6, 16\n\t" + "slli a5, a5, 16\n\t" + "or s4, s4, t4\n\t" + "or s5, s5, t5\n\t" + "or s6, s6, t6\n\t" + "or s7, s7, a5\n\t" + "srliw t4, s2, 8\n\t" + "srliw t5, s3, 8\n\t" + "srliw t6, a7, 8\n\t" + "srliw a5, s1, 8\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi a5, a5, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add a5, a5, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu a5, 0(a5)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli a5, a5, 8\n\t" + "or s4, s4, t4\n\t" + "or s5, s5, t5\n\t" + "or s6, s6, t6\n\t" + "or s7, s7, a5\n\t" + "andi t4, s1, 255\n\t" + "andi t5, s2, 255\n\t" + "andi t6, s3, 255\n\t" + "andi a5, a7, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add a5, a5, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu a5, 0(a5)\n\t" + "or s4, s4, t4\n\t" + "or s5, s5, t5\n\t" + "or s6, s6, t6\n\t" + "or s7, s7, a5\n\t" + "slli a6, %[nr], 4\n\t" + "add a6, %[key], a6\n\t" + "lw t4, 0(a6)\n\t" + "lw t5, 4(a6)\n\t" + "lw t6, 8(a6)\n\t" + "lw a5, 12(a6)\n\t" + "xor s4, s4, t4\n\t" + "xor s5, s5, t5\n\t" + "xor s6, s6, t6\n\t" + "xor s7, s7, a5\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s4, 24\n\t" + "srli t5, s5, 24\n\t" + "srli t6, s6, 24\n\t" + "srli a5, s7, 24\n\t" + "sb t4, 0(t1)\n\t" + "sb t5, 4(t1)\n\t" + "sb t6, 8(t1)\n\t" + "sb a5, 12(t1)\n\t" + "srli t4, s4, 16\n\t" + "srli t5, s5, 16\n\t" + "srli t6, s6, 16\n\t" + "srli a5, s7, 16\n\t" + "sb t4, 1(t1)\n\t" + "sb t5, 5(t1)\n\t" + "sb t6, 9(t1)\n\t" + "sb a5, 13(t1)\n\t" + "srli t4, s4, 8\n\t" + "srli t5, s5, 8\n\t" + "srli t6, s6, 8\n\t" + "srli a5, s7, 8\n\t" + "sb t4, 2(t1)\n\t" + "sb t5, 6(t1)\n\t" + "sb t6, 10(t1)\n\t" + "sb a5, 14(t1)\n\t" + "sb s4, 3(t1)\n\t" + "sb s5, 7(t1)\n\t" + "sb s6, 11(t1)\n\t" + "sb s7, 15(t1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s4, 32\n\t" + "slli t5, s5, 32\n\t" + "slli t6, s6, 32\n\t" + "slli a5, s7, 32\n\t" + "srli t5, t5, 32\n\t" + "srli a5, a5, 32\n\t" + "or t5, t5, t4\n\t" + "or a5, a5, t6\n\t" +#else + /* pack t5, s5, s4 */ + ".word 0x094acf33\n\t" + /* pack a5, s7, s6 */ + ".word 0x096bc7b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + "sd t5, 0(t1)\n\t" + "sd a5, 8(t1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_decrypt_blocks_RISCV64_block\n\t" + "\n" + "L_AES_decrypt_blocks_RISCV64_end:\n\t" + "ld ra, 16(sp)\n\t" + "addi sp, sp, 32\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [key] "+r" (key), + [nr] "+r" (nr) + : [td] "r" (td), [td4] "r" (td4) + : "memory", "t0", "t1", "t4", "t5", "t6", "a5", "a6", "a7", "s1", "s2", + "s3", "s4", "s5", "s6", "s7" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_ECB */ +#ifdef HAVE_AES_CBC +void AES_CBC_encrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, int nr) +{ + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 16(sp)\n\t" + "srliw %[sz], %[sz], 4\n\t" + "ld t2, 0(%[reg])\n\t" + "ld t3, 8(%[reg])\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_block:\n\t" + "beqz %[sz], L_AES_CBC_encrypt_RISCV64_end\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 0(%[in])\n\t" +#else + "andi a6, %[in], 7\n\t" + "bnez a6, L_ualn_ld1_w_%=\n\t" + "ld t5, 0(%[in])\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_w_%=:\n\t" + "andi a6, a6, 3\n\t" + "bnez a6, L_ualn_ld1_h_%=\n\t" + "lwu t5, 0(%[in])\n\t" + "lwu a6, 4(%[in])\n\t" + "slli a6, a6, 32\n\t" + "or t5, t5, a6\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_h_%=:\n\t" + "andi a6, a6, 1\n\t" + "bnez a6, L_ualn_ld1_b_%=\n\t" + "lhu t5, 0(%[in])\n\t" + "lhu a6, 2(%[in])\n\t" + "slli a6, a6, 16\n\t" + "or t5, t5, a6\n\t" + "lhu a6, 4(%[in])\n\t" + "slli a6, a6, 32\n\t" + "or t5, t5, a6\n\t" + "lhu a6, 6(%[in])\n\t" + "slli a6, a6, 48\n\t" + "or t5, t5, a6\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_b_%=:\n\t" + "lbu t5, 0(%[in])\n\t" + "lbu a6, 1(%[in])\n\t" + "slli a6, a6, 8\n\t" + "or t5, t5, a6\n\t" + "lbu a6, 2(%[in])\n\t" + "slli a6, a6, 16\n\t" + "or t5, t5, a6\n\t" + "lbu a6, 3(%[in])\n\t" + "slli a6, a6, 24\n\t" + "or t5, t5, a6\n\t" + "lbu a6, 4(%[in])\n\t" + "slli a6, a6, 32\n\t" + "or t5, t5, a6\n\t" + "lbu a6, 5(%[in])\n\t" + "slli a6, a6, 40\n\t" + "or t5, t5, a6\n\t" + "lbu a6, 6(%[in])\n\t" + "slli a6, a6, 48\n\t" + "or t5, t5, a6\n\t" + "lbu a6, 7(%[in])\n\t" + "slli a6, a6, 56\n\t" + "or t5, t5, a6\n\t" + "\n" + "L_ualn_ld1_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t6, 8(%[in])\n\t" +#else + "andi a6, %[in], 7\n\t" + "bnez a6, L_ualn_ld2_w_%=\n\t" + "ld t6, 8(%[in])\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_w_%=:\n\t" + "andi a6, a6, 3\n\t" + "bnez a6, L_ualn_ld2_h_%=\n\t" + "lwu t6, 8(%[in])\n\t" + "lwu a6, 12(%[in])\n\t" + "slli a6, a6, 32\n\t" + "or t6, t6, a6\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_h_%=:\n\t" + "andi a6, a6, 1\n\t" + "bnez a6, L_ualn_ld2_b_%=\n\t" + "lhu t6, 8(%[in])\n\t" + "lhu a6, 10(%[in])\n\t" + "slli a6, a6, 16\n\t" + "or t6, t6, a6\n\t" + "lhu a6, 12(%[in])\n\t" + "slli a6, a6, 32\n\t" + "or t6, t6, a6\n\t" + "lhu a6, 14(%[in])\n\t" + "slli a6, a6, 48\n\t" + "or t6, t6, a6\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_b_%=:\n\t" + "lbu t6, 8(%[in])\n\t" + "lbu a6, 9(%[in])\n\t" + "slli a6, a6, 8\n\t" + "or t6, t6, a6\n\t" + "lbu a6, 10(%[in])\n\t" + "slli a6, a6, 16\n\t" + "or t6, t6, a6\n\t" + "lbu a6, 11(%[in])\n\t" + "slli a6, a6, 24\n\t" + "or t6, t6, a6\n\t" + "lbu a6, 12(%[in])\n\t" + "slli a6, a6, 32\n\t" + "or t6, t6, a6\n\t" + "lbu a6, 13(%[in])\n\t" + "slli a6, a6, 40\n\t" + "or t6, t6, a6\n\t" + "lbu a6, 14(%[in])\n\t" + "slli a6, a6, 48\n\t" + "or t6, t6, a6\n\t" + "lbu a6, 15(%[in])\n\t" + "slli a6, a6, 56\n\t" + "or t6, t6, a6\n\t" + "\n" + "L_ualn_ld2_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t5, t5, t2\n\t" + "xor t6, t6, t3\n\t" + "sd t5, 0(sp)\n\t" + "sd t6, 8(sp)\n\t" + "addi t0, sp, 0\n\t" + "mv t1, %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t5, 0(t0)\n\t" + "lbu t6, 4(t0)\n\t" + "lbu a6, 8(t0)\n\t" + "lbu a7, 12(t0)\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli a6, a6, 8\n\t" + "slli a7, a7, 8\n\t" + "lbu s1, 1(t0)\n\t" + "or t5, t5, s1\n\t" + "lbu s2, 5(t0)\n\t" + "or t6, t6, s2\n\t" + "lbu s3, 9(t0)\n\t" + "or a6, a6, s3\n\t" + "lbu s1, 13(t0)\n\t" + "or a7, a7, s1\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli a6, a6, 8\n\t" + "slli a7, a7, 8\n\t" + "lbu s1, 2(t0)\n\t" + "or t5, t5, s1\n\t" + "lbu s2, 6(t0)\n\t" + "or t6, t6, s2\n\t" + "lbu s3, 10(t0)\n\t" + "or a6, a6, s3\n\t" + "lbu s1, 14(t0)\n\t" + "or a7, a7, s1\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli a6, a6, 8\n\t" + "slli a7, a7, 8\n\t" + "lbu s1, 3(t0)\n\t" + "or t5, t5, s1\n\t" + "lbu s2, 7(t0)\n\t" + "or t6, t6, s2\n\t" + "lbu s3, 11(t0)\n\t" + "or a6, a6, s3\n\t" + "lbu s1, 15(t0)\n\t" + "or a7, a7, s1\n\t" +#else + "ld t6, 0(t0)\n\t" + /* rev8 t6, t6 */ + ".word 0x6b8fdf93\n\t" + "srli t5, t6, 32\n\t" + "ld a7, 8(t0)\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + "srli a6, a7, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s6, 0(%[key])\n\t" + "lw s7, 4(%[key])\n\t" + "lw s8, 8(%[key])\n\t" + "lw s9, 12(%[key])\n\t" + "xor s6, t5, s6\n\t" + "xor s7, t6, s7\n\t" + "xor s8, a6, s8\n\t" + "xor s9, a7, s9\n\t" + "srliw t5, s6, 24\n\t" + "srliw t6, s7, 24\n\t" + "srliw a6, s8, 24\n\t" + "srliw a7, s9, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s2, 0(t5)\n\t" + "lw s3, 0(t6)\n\t" + "lw s4, 0(a6)\n\t" + "lw s5, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw a6, s9, 14\n\t" + "srliw a7, s6, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s8, 6\n\t" + "srliw t6, s9, 6\n\t" + "srliw a6, s6, 6\n\t" + "srliw a7, s7, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s6, 255\n\t" + "andi a6, s7, 255\n\t" + "andi a7, s8, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "lw t5, 16(%[key])\n\t" + "lw t6, 20(%[key])\n\t" + "lw a6, 24(%[key])\n\t" + "lw a7, 28(%[key])\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "srliw t5, s2, 24\n\t" + "srliw t6, s3, 24\n\t" + "srliw a6, s4, 24\n\t" + "srliw a7, s5, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s6, 0(t5)\n\t" + "lw s7, 0(t6)\n\t" + "lw s8, 0(a6)\n\t" + "lw s9, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw a6, s5, 14\n\t" + "srliw a7, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s4, 6\n\t" + "srliw t6, s5, 6\n\t" + "srliw a6, s2, 6\n\t" + "srliw a7, s3, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s2, 255\n\t" + "andi a6, s3, 255\n\t" + "andi a7, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "lw t5, 32(%[key])\n\t" + "lw t6, 36(%[key])\n\t" + "lw a6, 40(%[key])\n\t" + "lw a7, 44(%[key])\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "srliw t5, s6, 24\n\t" + "srliw t6, s7, 24\n\t" + "srliw a6, s8, 24\n\t" + "srliw a7, s9, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s2, 0(t5)\n\t" + "lw s3, 0(t6)\n\t" + "lw s4, 0(a6)\n\t" + "lw s5, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw a6, s9, 14\n\t" + "srliw a7, s6, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s8, 6\n\t" + "srliw t6, s9, 6\n\t" + "srliw a6, s6, 6\n\t" + "srliw a7, s7, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s6, 255\n\t" + "andi a6, s7, 255\n\t" + "andi a7, s8, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "lw t5, 48(%[key])\n\t" + "lw t6, 52(%[key])\n\t" + "lw a6, 56(%[key])\n\t" + "lw a7, 60(%[key])\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "srliw t5, s2, 24\n\t" + "srliw t6, s3, 24\n\t" + "srliw a6, s4, 24\n\t" + "srliw a7, s5, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s6, 0(t5)\n\t" + "lw s7, 0(t6)\n\t" + "lw s8, 0(a6)\n\t" + "lw s9, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw a6, s5, 14\n\t" + "srliw a7, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s4, 6\n\t" + "srliw t6, s5, 6\n\t" + "srliw a6, s2, 6\n\t" + "srliw a7, s3, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s2, 255\n\t" + "andi a6, s3, 255\n\t" + "andi a7, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "lw t5, 64(%[key])\n\t" + "lw t6, 68(%[key])\n\t" + "lw a6, 72(%[key])\n\t" + "lw a7, 76(%[key])\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "srliw t5, s6, 24\n\t" + "srliw t6, s7, 24\n\t" + "srliw a6, s8, 24\n\t" + "srliw a7, s9, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s2, 0(t5)\n\t" + "lw s3, 0(t6)\n\t" + "lw s4, 0(a6)\n\t" + "lw s5, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw a6, s9, 14\n\t" + "srliw a7, s6, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s8, 6\n\t" + "srliw t6, s9, 6\n\t" + "srliw a6, s6, 6\n\t" + "srliw a7, s7, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s6, 255\n\t" + "andi a6, s7, 255\n\t" + "andi a7, s8, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "lw t5, 80(%[key])\n\t" + "lw t6, 84(%[key])\n\t" + "lw a6, 88(%[key])\n\t" + "lw a7, 92(%[key])\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "srliw t5, s2, 24\n\t" + "srliw t6, s3, 24\n\t" + "srliw a6, s4, 24\n\t" + "srliw a7, s5, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s6, 0(t5)\n\t" + "lw s7, 0(t6)\n\t" + "lw s8, 0(a6)\n\t" + "lw s9, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw a6, s5, 14\n\t" + "srliw a7, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s4, 6\n\t" + "srliw t6, s5, 6\n\t" + "srliw a6, s2, 6\n\t" + "srliw a7, s3, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s2, 255\n\t" + "andi a6, s3, 255\n\t" + "andi a7, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "lw t5, 96(%[key])\n\t" + "lw t6, 100(%[key])\n\t" + "lw a6, 104(%[key])\n\t" + "lw a7, 108(%[key])\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "srliw t5, s6, 24\n\t" + "srliw t6, s7, 24\n\t" + "srliw a6, s8, 24\n\t" + "srliw a7, s9, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s2, 0(t5)\n\t" + "lw s3, 0(t6)\n\t" + "lw s4, 0(a6)\n\t" + "lw s5, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw a6, s9, 14\n\t" + "srliw a7, s6, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s8, 6\n\t" + "srliw t6, s9, 6\n\t" + "srliw a6, s6, 6\n\t" + "srliw a7, s7, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s6, 255\n\t" + "andi a6, s7, 255\n\t" + "andi a7, s8, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "lw t5, 112(%[key])\n\t" + "lw t6, 116(%[key])\n\t" + "lw a6, 120(%[key])\n\t" + "lw a7, 124(%[key])\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "srliw t5, s2, 24\n\t" + "srliw t6, s3, 24\n\t" + "srliw a6, s4, 24\n\t" + "srliw a7, s5, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s6, 0(t5)\n\t" + "lw s7, 0(t6)\n\t" + "lw s8, 0(a6)\n\t" + "lw s9, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw a6, s5, 14\n\t" + "srliw a7, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s4, 6\n\t" + "srliw t6, s5, 6\n\t" + "srliw a6, s2, 6\n\t" + "srliw a7, s3, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s2, 255\n\t" + "andi a6, s3, 255\n\t" + "andi a7, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "lw t5, 128(%[key])\n\t" + "lw t6, 132(%[key])\n\t" + "lw a6, 136(%[key])\n\t" + "lw a7, 140(%[key])\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "srliw t5, s6, 24\n\t" + "srliw t6, s7, 24\n\t" + "srliw a6, s8, 24\n\t" + "srliw a7, s9, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s2, 0(t5)\n\t" + "lw s3, 0(t6)\n\t" + "lw s4, 0(a6)\n\t" + "lw s5, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw a6, s9, 14\n\t" + "srliw a7, s6, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s8, 6\n\t" + "srliw t6, s9, 6\n\t" + "srliw a6, s6, 6\n\t" + "srliw a7, s7, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s6, 255\n\t" + "andi a6, s7, 255\n\t" + "andi a7, s8, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "lw t5, 144(%[key])\n\t" + "lw t6, 148(%[key])\n\t" + "lw a6, 152(%[key])\n\t" + "lw a7, 156(%[key])\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "li s1, 10\n\t" + "ble %[nr], s1, L_AES_enc_block_3_done\n\t" + "srliw t5, s2, 24\n\t" + "srliw t6, s3, 24\n\t" + "srliw a6, s4, 24\n\t" + "srliw a7, s5, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s6, 0(t5)\n\t" + "lw s7, 0(t6)\n\t" + "lw s8, 0(a6)\n\t" + "lw s9, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw a6, s5, 14\n\t" + "srliw a7, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s4, 6\n\t" + "srliw t6, s5, 6\n\t" + "srliw a6, s2, 6\n\t" + "srliw a7, s3, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s2, 255\n\t" + "andi a6, s3, 255\n\t" + "andi a7, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "lw t5, 160(%[key])\n\t" + "lw t6, 164(%[key])\n\t" + "lw a6, 168(%[key])\n\t" + "lw a7, 172(%[key])\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "srliw t5, s6, 24\n\t" + "srliw t6, s7, 24\n\t" + "srliw a6, s8, 24\n\t" + "srliw a7, s9, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s2, 0(t5)\n\t" + "lw s3, 0(t6)\n\t" + "lw s4, 0(a6)\n\t" + "lw s5, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw a6, s9, 14\n\t" + "srliw a7, s6, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s8, 6\n\t" + "srliw t6, s9, 6\n\t" + "srliw a6, s6, 6\n\t" + "srliw a7, s7, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s6, 255\n\t" + "andi a6, s7, 255\n\t" + "andi a7, s8, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "lw t5, 176(%[key])\n\t" + "lw t6, 180(%[key])\n\t" + "lw a6, 184(%[key])\n\t" + "lw a7, 188(%[key])\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "li s1, 12\n\t" + "ble %[nr], s1, L_AES_enc_block_3_done\n\t" + "srliw t5, s2, 24\n\t" + "srliw t6, s3, 24\n\t" + "srliw a6, s4, 24\n\t" + "srliw a7, s5, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s6, 0(t5)\n\t" + "lw s7, 0(t6)\n\t" + "lw s8, 0(a6)\n\t" + "lw s9, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw a6, s5, 14\n\t" + "srliw a7, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s4, 6\n\t" + "srliw t6, s5, 6\n\t" + "srliw a6, s2, 6\n\t" + "srliw a7, s3, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s2, 255\n\t" + "andi a6, s3, 255\n\t" + "andi a7, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "lw t5, 192(%[key])\n\t" + "lw t6, 196(%[key])\n\t" + "lw a6, 200(%[key])\n\t" + "lw a7, 204(%[key])\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + "srliw t5, s6, 24\n\t" + "srliw t6, s7, 24\n\t" + "srliw a6, s8, 24\n\t" + "srliw a7, s9, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add a6, a6, %[te]\n\t" + "sh2add a7, a7, %[te]\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s2, 0(t5)\n\t" + "lw s3, 0(t6)\n\t" + "lw s4, 0(a6)\n\t" + "lw s5, 0(a7)\n\t" + "addi s1, %[te], 1024\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw a6, s9, 14\n\t" + "srliw a7, s6, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s8, 6\n\t" + "srliw t6, s9, 6\n\t" + "srliw a6, s6, 6\n\t" + "srliw a7, s7, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "addi s1, s1, 1024\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s6, 255\n\t" + "andi a6, s7, 255\n\t" + "andi a7, s8, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw a6, a6, 2\n\t" + "slliw a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "lw t5, 208(%[key])\n\t" + "lw t6, 212(%[key])\n\t" + "lw a6, 216(%[key])\n\t" + "lw a7, 220(%[key])\n\t" + "xor s2, s2, t5\n\t" + "xor s3, s3, t6\n\t" + "xor s4, s4, a6\n\t" + "xor s5, s5, a7\n\t" + "\n" + "L_AES_enc_block_3_done:\n\t" + "srliw t5, s4, 6\n\t" + "srliw t6, s5, 6\n\t" + "srliw a6, s2, 6\n\t" + "srliw a7, s3, 6\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add a6, a6, %[te]\n\t" + "add a7, a7, %[te]\n\t" + "lw s6, 0(t5)\n\t" + "lw s7, 0(t6)\n\t" + "lw s8, 0(a6)\n\t" + "lw s9, 0(a7)\n\t" + "li s1, 65280\n\t" + "and s6, s6, s1\n\t" + "and s7, s7, s1\n\t" + "and s8, s8, s1\n\t" + "and s9, s9, s1\n\t" + "addi s1, %[te], 1024\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s2, 255\n\t" + "andi a6, s3, 255\n\t" + "andi a7, s4, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli a6, a6, 2\n\t" + "slli a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu a6, 0(a6)\n\t" + "lbu a7, 0(a7)\n\t" + "or s6, s6, t5\n\t" + "or s7, s7, t6\n\t" + "or s8, s8, a6\n\t" + "or s9, s9, a7\n\t" + "addi s1, s1, 1024\n\t" + "srliw t5, s2, 24\n\t" + "srliw t6, s3, 24\n\t" + "srliw a6, s4, 24\n\t" + "srliw a7, s5, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t5, t5, s1\n\t" + "sh2add t6, t6, s1\n\t" + "sh2add a6, a6, s1\n\t" + "sh2add a7, a7, s1\n\t" +#else + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli a6, a6, 2\n\t" + "slli a7, a7, 2\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "li s1, 4278190080\n\t" + "and t5, t5, s1\n\t" + "and t6, t6, s1\n\t" + "and a6, a6, s1\n\t" + "and a7, a7, s1\n\t" + "or s6, s6, t5\n\t" + "or s7, s7, t6\n\t" + "or s8, s8, a6\n\t" + "or s9, s9, a7\n\t" + "li s1, 3072\n\t" + "add s1, %[te], s1\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw a6, s5, 14\n\t" + "srliw a7, s2, 14\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi a6, a6, 1020\n\t" + "andi a7, a7, 1020\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s1\n\t" + "add a6, a6, s1\n\t" + "add a7, a7, s1\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw a6, 0(a6)\n\t" + "lw a7, 0(a7)\n\t" + "li s1, 16711680\n\t" + "and t5, t5, s1\n\t" + "and t6, t6, s1\n\t" + "and a6, a6, s1\n\t" + "and a7, a7, s1\n\t" + "or s6, s6, t5\n\t" + "or s7, s7, t6\n\t" + "or s8, s8, a6\n\t" + "or s9, s9, a7\n\t" + "slli s1, %[nr], 4\n\t" + "add s1, %[key], s1\n\t" + "lw t5, 0(s1)\n\t" + "lw t6, 4(s1)\n\t" + "lw a6, 8(s1)\n\t" + "lw a7, 12(s1)\n\t" + "xor s6, s6, t5\n\t" + "xor s7, s7, t6\n\t" + "xor s8, s8, a6\n\t" + "xor s9, s9, a7\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t5, s6, 24\n\t" + "srli t6, s7, 24\n\t" + "srli a6, s8, 24\n\t" + "srli a7, s9, 24\n\t" + "sb t5, 0(t1)\n\t" + "sb t6, 4(t1)\n\t" + "sb a6, 8(t1)\n\t" + "sb a7, 12(t1)\n\t" + "srli t5, s6, 16\n\t" + "srli t6, s7, 16\n\t" + "srli a6, s8, 16\n\t" + "srli a7, s9, 16\n\t" + "sb t5, 1(t1)\n\t" + "sb t6, 5(t1)\n\t" + "sb a6, 9(t1)\n\t" + "sb a7, 13(t1)\n\t" + "srli t5, s6, 8\n\t" + "srli t6, s7, 8\n\t" + "srli a6, s8, 8\n\t" + "srli a7, s9, 8\n\t" + "sb t5, 2(t1)\n\t" + "sb t6, 6(t1)\n\t" + "sb a6, 10(t1)\n\t" + "sb a7, 14(t1)\n\t" + "sb s6, 3(t1)\n\t" + "sb s7, 7(t1)\n\t" + "sb s8, 11(t1)\n\t" + "sb s9, 15(t1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t5, s6, 32\n\t" + "slli t6, s7, 32\n\t" + "slli a6, s8, 32\n\t" + "slli a7, s9, 32\n\t" + "srli t6, t6, 32\n\t" + "srli a7, a7, 32\n\t" + "or t6, t6, t5\n\t" + "or a7, a7, a6\n\t" +#else + /* pack t6, s7, s6 */ + ".word 0x096bcfb3\n\t" + /* pack a7, s9, s8 */ + ".word 0x098cc8b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t6, t6 */ + ".word 0x6b8fdf93\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + "sd t6, 0(t1)\n\t" + "sd a7, 8(t1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[out])\n\t" +#else + "andi t5, %[out], 7\n\t" + "bnez t5, L_ualn_ld3_w_%=\n\t" + "ld t2, 0(%[out])\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_w_%=:\n\t" + "andi t5, t5, 3\n\t" + "bnez t5, L_ualn_ld3_h_%=\n\t" + "lwu t2, 0(%[out])\n\t" + "lwu t5, 4(%[out])\n\t" + "slli t5, t5, 32\n\t" + "or t2, t2, t5\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_h_%=:\n\t" + "andi t5, t5, 1\n\t" + "bnez t5, L_ualn_ld3_b_%=\n\t" + "lhu t2, 0(%[out])\n\t" + "lhu t5, 2(%[out])\n\t" + "slli t5, t5, 16\n\t" + "or t2, t2, t5\n\t" + "lhu t5, 4(%[out])\n\t" + "slli t5, t5, 32\n\t" + "or t2, t2, t5\n\t" + "lhu t5, 6(%[out])\n\t" + "slli t5, t5, 48\n\t" + "or t2, t2, t5\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_b_%=:\n\t" + "lbu t2, 0(%[out])\n\t" + "lbu t5, 1(%[out])\n\t" + "slli t5, t5, 8\n\t" + "or t2, t2, t5\n\t" + "lbu t5, 2(%[out])\n\t" + "slli t5, t5, 16\n\t" + "or t2, t2, t5\n\t" + "lbu t5, 3(%[out])\n\t" + "slli t5, t5, 24\n\t" + "or t2, t2, t5\n\t" + "lbu t5, 4(%[out])\n\t" + "slli t5, t5, 32\n\t" + "or t2, t2, t5\n\t" + "lbu t5, 5(%[out])\n\t" + "slli t5, t5, 40\n\t" + "or t2, t2, t5\n\t" + "lbu t5, 6(%[out])\n\t" + "slli t5, t5, 48\n\t" + "or t2, t2, t5\n\t" + "lbu t5, 7(%[out])\n\t" + "slli t5, t5, 56\n\t" + "or t2, t2, t5\n\t" + "\n" + "L_ualn_ld3_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[out])\n\t" +#else + "andi t5, %[out], 7\n\t" + "bnez t5, L_ualn_ld4_w_%=\n\t" + "ld t3, 8(%[out])\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_w_%=:\n\t" + "andi t5, t5, 3\n\t" + "bnez t5, L_ualn_ld4_h_%=\n\t" + "lwu t3, 8(%[out])\n\t" + "lwu t5, 12(%[out])\n\t" + "slli t5, t5, 32\n\t" + "or t3, t3, t5\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_h_%=:\n\t" + "andi t5, t5, 1\n\t" + "bnez t5, L_ualn_ld4_b_%=\n\t" + "lhu t3, 8(%[out])\n\t" + "lhu t5, 10(%[out])\n\t" + "slli t5, t5, 16\n\t" + "or t3, t3, t5\n\t" + "lhu t5, 12(%[out])\n\t" + "slli t5, t5, 32\n\t" + "or t3, t3, t5\n\t" + "lhu t5, 14(%[out])\n\t" + "slli t5, t5, 48\n\t" + "or t3, t3, t5\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_b_%=:\n\t" + "lbu t3, 8(%[out])\n\t" + "lbu t5, 9(%[out])\n\t" + "slli t5, t5, 8\n\t" + "or t3, t3, t5\n\t" + "lbu t5, 10(%[out])\n\t" + "slli t5, t5, 16\n\t" + "or t3, t3, t5\n\t" + "lbu t5, 11(%[out])\n\t" + "slli t5, t5, 24\n\t" + "or t3, t3, t5\n\t" + "lbu t5, 12(%[out])\n\t" + "slli t5, t5, 32\n\t" + "or t3, t3, t5\n\t" + "lbu t5, 13(%[out])\n\t" + "slli t5, t5, 40\n\t" + "or t3, t3, t5\n\t" + "lbu t5, 14(%[out])\n\t" + "slli t5, t5, 48\n\t" + "or t3, t3, t5\n\t" + "lbu t5, 15(%[out])\n\t" + "slli t5, t5, 56\n\t" + "or t3, t3, t5\n\t" + "\n" + "L_ualn_ld4_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_CBC_encrypt_RISCV64_block\n\t" + "\n" + "L_AES_CBC_encrypt_RISCV64_end:\n\t" + "sd t2, 0(%[reg])\n\t" + "sd t3, 8(%[reg])\n\t" + "ld ra, 16(sp)\n\t" + "addi sp, sp, 32\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [nr] "+r" (nr) + : [te] "r" (te) + : "memory", "t0", "t1", "t2", "t3", "t5", "t6", "a6", "a7", "s1", "s2", + "s3", "s4", "s5", "s6", "s7", "s8", "s9" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_CBC_decrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, int nr) +{ + const word32* td = L_AES_base_td; + const word8* td4 = L_AES_base_td4; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 16(sp)\n\t" + "srliw %[sz], %[sz], 4\n\t" + "ld t2, 0(%[reg])\n\t" + "ld t3, 8(%[reg])\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_block:\n\t" + "beqz %[sz], L_AES_CBC_decrypt_RISCV64_end\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t4, 0(%[in])\n\t" +#else + "andi a7, %[in], 7\n\t" + "bnez a7, L_ualn_ld5_w_%=\n\t" + "ld t4, 0(%[in])\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_w_%=:\n\t" + "andi a7, a7, 3\n\t" + "bnez a7, L_ualn_ld5_h_%=\n\t" + "lwu t4, 0(%[in])\n\t" + "lwu a7, 4(%[in])\n\t" + "slli a7, a7, 32\n\t" + "or t4, t4, a7\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_h_%=:\n\t" + "andi a7, a7, 1\n\t" + "bnez a7, L_ualn_ld5_b_%=\n\t" + "lhu t4, 0(%[in])\n\t" + "lhu a7, 2(%[in])\n\t" + "slli a7, a7, 16\n\t" + "or t4, t4, a7\n\t" + "lhu a7, 4(%[in])\n\t" + "slli a7, a7, 32\n\t" + "or t4, t4, a7\n\t" + "lhu a7, 6(%[in])\n\t" + "slli a7, a7, 48\n\t" + "or t4, t4, a7\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_b_%=:\n\t" + "lbu t4, 0(%[in])\n\t" + "lbu a7, 1(%[in])\n\t" + "slli a7, a7, 8\n\t" + "or t4, t4, a7\n\t" + "lbu a7, 2(%[in])\n\t" + "slli a7, a7, 16\n\t" + "or t4, t4, a7\n\t" + "lbu a7, 3(%[in])\n\t" + "slli a7, a7, 24\n\t" + "or t4, t4, a7\n\t" + "lbu a7, 4(%[in])\n\t" + "slli a7, a7, 32\n\t" + "or t4, t4, a7\n\t" + "lbu a7, 5(%[in])\n\t" + "slli a7, a7, 40\n\t" + "or t4, t4, a7\n\t" + "lbu a7, 6(%[in])\n\t" + "slli a7, a7, 48\n\t" + "or t4, t4, a7\n\t" + "lbu a7, 7(%[in])\n\t" + "slli a7, a7, 56\n\t" + "or t4, t4, a7\n\t" + "\n" + "L_ualn_ld5_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 8(%[in])\n\t" +#else + "andi a7, %[in], 7\n\t" + "bnez a7, L_ualn_ld6_w_%=\n\t" + "ld t5, 8(%[in])\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_w_%=:\n\t" + "andi a7, a7, 3\n\t" + "bnez a7, L_ualn_ld6_h_%=\n\t" + "lwu t5, 8(%[in])\n\t" + "lwu a7, 12(%[in])\n\t" + "slli a7, a7, 32\n\t" + "or t5, t5, a7\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_h_%=:\n\t" + "andi a7, a7, 1\n\t" + "bnez a7, L_ualn_ld6_b_%=\n\t" + "lhu t5, 8(%[in])\n\t" + "lhu a7, 10(%[in])\n\t" + "slli a7, a7, 16\n\t" + "or t5, t5, a7\n\t" + "lhu a7, 12(%[in])\n\t" + "slli a7, a7, 32\n\t" + "or t5, t5, a7\n\t" + "lhu a7, 14(%[in])\n\t" + "slli a7, a7, 48\n\t" + "or t5, t5, a7\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_b_%=:\n\t" + "lbu t5, 8(%[in])\n\t" + "lbu a7, 9(%[in])\n\t" + "slli a7, a7, 8\n\t" + "or t5, t5, a7\n\t" + "lbu a7, 10(%[in])\n\t" + "slli a7, a7, 16\n\t" + "or t5, t5, a7\n\t" + "lbu a7, 11(%[in])\n\t" + "slli a7, a7, 24\n\t" + "or t5, t5, a7\n\t" + "lbu a7, 12(%[in])\n\t" + "slli a7, a7, 32\n\t" + "or t5, t5, a7\n\t" + "lbu a7, 13(%[in])\n\t" + "slli a7, a7, 40\n\t" + "or t5, t5, a7\n\t" + "lbu a7, 14(%[in])\n\t" + "slli a7, a7, 48\n\t" + "or t5, t5, a7\n\t" + "lbu a7, 15(%[in])\n\t" + "slli a7, a7, 56\n\t" + "or t5, t5, a7\n\t" + "\n" + "L_ualn_ld6_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t0, %[in]\n\t" + "addi t1, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu a7, 0(t0)\n\t" + "lbu s1, 4(t0)\n\t" + "lbu s2, 8(t0)\n\t" + "lbu s3, 12(t0)\n\t" + "slli a7, a7, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "slli s3, s3, 8\n\t" + "lbu s4, 1(t0)\n\t" + "or a7, a7, s4\n\t" + "lbu s5, 5(t0)\n\t" + "or s1, s1, s5\n\t" + "lbu s6, 9(t0)\n\t" + "or s2, s2, s6\n\t" + "lbu s4, 13(t0)\n\t" + "or s3, s3, s4\n\t" + "slli a7, a7, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "slli s3, s3, 8\n\t" + "lbu s4, 2(t0)\n\t" + "or a7, a7, s4\n\t" + "lbu s5, 6(t0)\n\t" + "or s1, s1, s5\n\t" + "lbu s6, 10(t0)\n\t" + "or s2, s2, s6\n\t" + "lbu s4, 14(t0)\n\t" + "or s3, s3, s4\n\t" + "slli a7, a7, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "slli s3, s3, 8\n\t" + "lbu s4, 3(t0)\n\t" + "or a7, a7, s4\n\t" + "lbu s5, 7(t0)\n\t" + "or s1, s1, s5\n\t" + "lbu s6, 11(t0)\n\t" + "or s2, s2, s6\n\t" + "lbu s4, 15(t0)\n\t" + "or s3, s3, s4\n\t" +#else + "ld s1, 0(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli a7, s1, 32\n\t" + "ld s3, 8(t0)\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + "srli s2, s3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s9, 0(%[key])\n\t" + "lw s10, 4(%[key])\n\t" + "lw s11, 8(%[key])\n\t" + "lw s0, 12(%[key])\n\t" + "xor s9, a7, s9\n\t" + "xor s10, s1, s10\n\t" + "xor s11, s2, s11\n\t" + "xor s0, s3, s0\n\t" + "srliw a7, s9, 24\n\t" + "srliw s1, s10, 24\n\t" + "srliw s2, s11, 24\n\t" + "srliw s3, s0, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s5, 0(a7)\n\t" + "lw s6, 0(s1)\n\t" + "lw s7, 0(s2)\n\t" + "lw s8, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s0, 14\n\t" + "srliw s1, s9, 14\n\t" + "srliw s2, s10, 14\n\t" + "srliw s3, s11, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s11, 6\n\t" + "srliw s1, s0, 6\n\t" + "srliw s2, s9, 6\n\t" + "srliw s3, s10, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s10, 255\n\t" + "andi s1, s11, 255\n\t" + "andi s2, s0, 255\n\t" + "andi s3, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "lw a7, 16(%[key])\n\t" + "lw s1, 20(%[key])\n\t" + "lw s2, 24(%[key])\n\t" + "lw s3, 28(%[key])\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "srliw a7, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "srliw s2, s7, 24\n\t" + "srliw s3, s8, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s9, 0(a7)\n\t" + "lw s10, 0(s1)\n\t" + "lw s11, 0(s2)\n\t" + "lw s0, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s8, 14\n\t" + "srliw s1, s5, 14\n\t" + "srliw s2, s6, 14\n\t" + "srliw s3, s7, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "srliw s2, s5, 6\n\t" + "srliw s3, s6, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s6, 255\n\t" + "andi s1, s7, 255\n\t" + "andi s2, s8, 255\n\t" + "andi s3, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "lw a7, 32(%[key])\n\t" + "lw s1, 36(%[key])\n\t" + "lw s2, 40(%[key])\n\t" + "lw s3, 44(%[key])\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "srliw a7, s9, 24\n\t" + "srliw s1, s10, 24\n\t" + "srliw s2, s11, 24\n\t" + "srliw s3, s0, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s5, 0(a7)\n\t" + "lw s6, 0(s1)\n\t" + "lw s7, 0(s2)\n\t" + "lw s8, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s0, 14\n\t" + "srliw s1, s9, 14\n\t" + "srliw s2, s10, 14\n\t" + "srliw s3, s11, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s11, 6\n\t" + "srliw s1, s0, 6\n\t" + "srliw s2, s9, 6\n\t" + "srliw s3, s10, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s10, 255\n\t" + "andi s1, s11, 255\n\t" + "andi s2, s0, 255\n\t" + "andi s3, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "lw a7, 48(%[key])\n\t" + "lw s1, 52(%[key])\n\t" + "lw s2, 56(%[key])\n\t" + "lw s3, 60(%[key])\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "srliw a7, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "srliw s2, s7, 24\n\t" + "srliw s3, s8, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s9, 0(a7)\n\t" + "lw s10, 0(s1)\n\t" + "lw s11, 0(s2)\n\t" + "lw s0, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s8, 14\n\t" + "srliw s1, s5, 14\n\t" + "srliw s2, s6, 14\n\t" + "srliw s3, s7, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "srliw s2, s5, 6\n\t" + "srliw s3, s6, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s6, 255\n\t" + "andi s1, s7, 255\n\t" + "andi s2, s8, 255\n\t" + "andi s3, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "lw a7, 64(%[key])\n\t" + "lw s1, 68(%[key])\n\t" + "lw s2, 72(%[key])\n\t" + "lw s3, 76(%[key])\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "srliw a7, s9, 24\n\t" + "srliw s1, s10, 24\n\t" + "srliw s2, s11, 24\n\t" + "srliw s3, s0, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s5, 0(a7)\n\t" + "lw s6, 0(s1)\n\t" + "lw s7, 0(s2)\n\t" + "lw s8, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s0, 14\n\t" + "srliw s1, s9, 14\n\t" + "srliw s2, s10, 14\n\t" + "srliw s3, s11, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s11, 6\n\t" + "srliw s1, s0, 6\n\t" + "srliw s2, s9, 6\n\t" + "srliw s3, s10, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s10, 255\n\t" + "andi s1, s11, 255\n\t" + "andi s2, s0, 255\n\t" + "andi s3, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "lw a7, 80(%[key])\n\t" + "lw s1, 84(%[key])\n\t" + "lw s2, 88(%[key])\n\t" + "lw s3, 92(%[key])\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "srliw a7, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "srliw s2, s7, 24\n\t" + "srliw s3, s8, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s9, 0(a7)\n\t" + "lw s10, 0(s1)\n\t" + "lw s11, 0(s2)\n\t" + "lw s0, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s8, 14\n\t" + "srliw s1, s5, 14\n\t" + "srliw s2, s6, 14\n\t" + "srliw s3, s7, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "srliw s2, s5, 6\n\t" + "srliw s3, s6, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s6, 255\n\t" + "andi s1, s7, 255\n\t" + "andi s2, s8, 255\n\t" + "andi s3, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "lw a7, 96(%[key])\n\t" + "lw s1, 100(%[key])\n\t" + "lw s2, 104(%[key])\n\t" + "lw s3, 108(%[key])\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "srliw a7, s9, 24\n\t" + "srliw s1, s10, 24\n\t" + "srliw s2, s11, 24\n\t" + "srliw s3, s0, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s5, 0(a7)\n\t" + "lw s6, 0(s1)\n\t" + "lw s7, 0(s2)\n\t" + "lw s8, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s0, 14\n\t" + "srliw s1, s9, 14\n\t" + "srliw s2, s10, 14\n\t" + "srliw s3, s11, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s11, 6\n\t" + "srliw s1, s0, 6\n\t" + "srliw s2, s9, 6\n\t" + "srliw s3, s10, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s10, 255\n\t" + "andi s1, s11, 255\n\t" + "andi s2, s0, 255\n\t" + "andi s3, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "lw a7, 112(%[key])\n\t" + "lw s1, 116(%[key])\n\t" + "lw s2, 120(%[key])\n\t" + "lw s3, 124(%[key])\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "srliw a7, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "srliw s2, s7, 24\n\t" + "srliw s3, s8, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s9, 0(a7)\n\t" + "lw s10, 0(s1)\n\t" + "lw s11, 0(s2)\n\t" + "lw s0, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s8, 14\n\t" + "srliw s1, s5, 14\n\t" + "srliw s2, s6, 14\n\t" + "srliw s3, s7, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "srliw s2, s5, 6\n\t" + "srliw s3, s6, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s6, 255\n\t" + "andi s1, s7, 255\n\t" + "andi s2, s8, 255\n\t" + "andi s3, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "lw a7, 128(%[key])\n\t" + "lw s1, 132(%[key])\n\t" + "lw s2, 136(%[key])\n\t" + "lw s3, 140(%[key])\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "srliw a7, s9, 24\n\t" + "srliw s1, s10, 24\n\t" + "srliw s2, s11, 24\n\t" + "srliw s3, s0, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s5, 0(a7)\n\t" + "lw s6, 0(s1)\n\t" + "lw s7, 0(s2)\n\t" + "lw s8, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s0, 14\n\t" + "srliw s1, s9, 14\n\t" + "srliw s2, s10, 14\n\t" + "srliw s3, s11, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s11, 6\n\t" + "srliw s1, s0, 6\n\t" + "srliw s2, s9, 6\n\t" + "srliw s3, s10, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s10, 255\n\t" + "andi s1, s11, 255\n\t" + "andi s2, s0, 255\n\t" + "andi s3, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "lw a7, 144(%[key])\n\t" + "lw s1, 148(%[key])\n\t" + "lw s2, 152(%[key])\n\t" + "lw s3, 156(%[key])\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "li s4, 10\n\t" + "ble %[nr], s4, L_AES_dec_block_4_done\n\t" + "srliw a7, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "srliw s2, s7, 24\n\t" + "srliw s3, s8, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s9, 0(a7)\n\t" + "lw s10, 0(s1)\n\t" + "lw s11, 0(s2)\n\t" + "lw s0, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s8, 14\n\t" + "srliw s1, s5, 14\n\t" + "srliw s2, s6, 14\n\t" + "srliw s3, s7, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "srliw s2, s5, 6\n\t" + "srliw s3, s6, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s6, 255\n\t" + "andi s1, s7, 255\n\t" + "andi s2, s8, 255\n\t" + "andi s3, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "lw a7, 160(%[key])\n\t" + "lw s1, 164(%[key])\n\t" + "lw s2, 168(%[key])\n\t" + "lw s3, 172(%[key])\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "srliw a7, s9, 24\n\t" + "srliw s1, s10, 24\n\t" + "srliw s2, s11, 24\n\t" + "srliw s3, s0, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s5, 0(a7)\n\t" + "lw s6, 0(s1)\n\t" + "lw s7, 0(s2)\n\t" + "lw s8, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s0, 14\n\t" + "srliw s1, s9, 14\n\t" + "srliw s2, s10, 14\n\t" + "srliw s3, s11, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s11, 6\n\t" + "srliw s1, s0, 6\n\t" + "srliw s2, s9, 6\n\t" + "srliw s3, s10, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s10, 255\n\t" + "andi s1, s11, 255\n\t" + "andi s2, s0, 255\n\t" + "andi s3, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "lw a7, 176(%[key])\n\t" + "lw s1, 180(%[key])\n\t" + "lw s2, 184(%[key])\n\t" + "lw s3, 188(%[key])\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "li s4, 12\n\t" + "ble %[nr], s4, L_AES_dec_block_4_done\n\t" + "srliw a7, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "srliw s2, s7, 24\n\t" + "srliw s3, s8, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s9, 0(a7)\n\t" + "lw s10, 0(s1)\n\t" + "lw s11, 0(s2)\n\t" + "lw s0, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s8, 14\n\t" + "srliw s1, s5, 14\n\t" + "srliw s2, s6, 14\n\t" + "srliw s3, s7, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "srliw s2, s5, 6\n\t" + "srliw s3, s6, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s6, 255\n\t" + "andi s1, s7, 255\n\t" + "andi s2, s8, 255\n\t" + "andi s3, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "lw a7, 192(%[key])\n\t" + "lw s1, 196(%[key])\n\t" + "lw s2, 200(%[key])\n\t" + "lw s3, 204(%[key])\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + "srliw a7, s9, 24\n\t" + "srliw s1, s10, 24\n\t" + "srliw s2, s11, 24\n\t" + "srliw s3, s0, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" + "sh2add s2, s2, %[td]\n\t" + "sh2add s3, s3, %[td]\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, %[td]\n\t" + "add s1, s1, %[td]\n\t" + "add s2, s2, %[td]\n\t" + "add s3, s3, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s5, 0(a7)\n\t" + "lw s6, 0(s1)\n\t" + "lw s7, 0(s2)\n\t" + "lw s8, 0(s3)\n\t" + "addi s4, %[td], 1024\n\t" + "srliw a7, s0, 14\n\t" + "srliw s1, s9, 14\n\t" + "srliw s2, s10, 14\n\t" + "srliw s3, s11, 14\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "srliw a7, s11, 6\n\t" + "srliw s1, s0, 6\n\t" + "srliw s2, s9, 6\n\t" + "srliw s3, s10, 6\n\t" + "andi a7, a7, 1020\n\t" + "andi s1, s1, 1020\n\t" + "andi s2, s2, 1020\n\t" + "andi s3, s3, 1020\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "addi s4, s4, 1024\n\t" + "andi a7, s10, 255\n\t" + "andi s1, s11, 255\n\t" + "andi s2, s0, 255\n\t" + "andi s3, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add a7, a7, s4\n\t" + "sh2add s1, s1, s4\n\t" + "sh2add s2, s2, s4\n\t" + "sh2add s3, s3, s4\n\t" +#else + "slliw a7, a7, 2\n\t" + "slliw s1, s1, 2\n\t" + "slliw s2, s2, 2\n\t" + "slliw s3, s3, 2\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s4\n\t" + "add s2, s2, s4\n\t" + "add s3, s3, s4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a7, 0(a7)\n\t" + "lw s1, 0(s1)\n\t" + "lw s2, 0(s2)\n\t" + "lw s3, 0(s3)\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "lw a7, 208(%[key])\n\t" + "lw s1, 212(%[key])\n\t" + "lw s2, 216(%[key])\n\t" + "lw s3, 220(%[key])\n\t" + "xor s5, s5, a7\n\t" + "xor s6, s6, s1\n\t" + "xor s7, s7, s2\n\t" + "xor s8, s8, s3\n\t" + "\n" + "L_AES_dec_block_4_done:\n\t" + "srliw a7, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "srliw s2, s7, 24\n\t" + "srliw s3, s8, 24\n\t" + "add a7, a7, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "add s2, s2, %[td4]\n\t" + "add s3, s3, %[td4]\n\t" + "lbu s9, 0(a7)\n\t" + "lbu s10, 0(s1)\n\t" + "lbu s11, 0(s2)\n\t" + "lbu s0, 0(s3)\n\t" + "slli s9, s9, 24\n\t" + "slli s10, s10, 24\n\t" + "slli s11, s11, 24\n\t" + "slli s0, s0, 24\n\t" + "srliw a7, s8, 16\n\t" + "srliw s1, s5, 16\n\t" + "srliw s2, s6, 16\n\t" + "srliw s3, s7, 16\n\t" + "andi a7, a7, 255\n\t" + "andi s1, s1, 255\n\t" + "andi s2, s2, 255\n\t" + "andi s3, s3, 255\n\t" + "add a7, a7, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "add s2, s2, %[td4]\n\t" + "add s3, s3, %[td4]\n\t" + "lbu a7, 0(a7)\n\t" + "lbu s1, 0(s1)\n\t" + "lbu s2, 0(s2)\n\t" + "lbu s3, 0(s3)\n\t" + "slli a7, a7, 16\n\t" + "slli s1, s1, 16\n\t" + "slli s2, s2, 16\n\t" + "slli s3, s3, 16\n\t" + "or s9, s9, a7\n\t" + "or s10, s10, s1\n\t" + "or s11, s11, s2\n\t" + "or s0, s0, s3\n\t" + "srliw a7, s7, 8\n\t" + "srliw s1, s8, 8\n\t" + "srliw s2, s5, 8\n\t" + "srliw s3, s6, 8\n\t" + "andi a7, a7, 255\n\t" + "andi s1, s1, 255\n\t" + "andi s2, s2, 255\n\t" + "andi s3, s3, 255\n\t" + "add a7, a7, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "add s2, s2, %[td4]\n\t" + "add s3, s3, %[td4]\n\t" + "lbu a7, 0(a7)\n\t" + "lbu s1, 0(s1)\n\t" + "lbu s2, 0(s2)\n\t" + "lbu s3, 0(s3)\n\t" + "slli a7, a7, 8\n\t" + "slli s1, s1, 8\n\t" + "slli s2, s2, 8\n\t" + "slli s3, s3, 8\n\t" + "or s9, s9, a7\n\t" + "or s10, s10, s1\n\t" + "or s11, s11, s2\n\t" + "or s0, s0, s3\n\t" + "andi a7, s6, 255\n\t" + "andi s1, s7, 255\n\t" + "andi s2, s8, 255\n\t" + "andi s3, s5, 255\n\t" + "add a7, a7, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "add s2, s2, %[td4]\n\t" + "add s3, s3, %[td4]\n\t" + "lbu a7, 0(a7)\n\t" + "lbu s1, 0(s1)\n\t" + "lbu s2, 0(s2)\n\t" + "lbu s3, 0(s3)\n\t" + "or s9, s9, a7\n\t" + "or s10, s10, s1\n\t" + "or s11, s11, s2\n\t" + "or s0, s0, s3\n\t" + "slli s4, %[nr], 4\n\t" + "add s4, %[key], s4\n\t" + "lw a7, 0(s4)\n\t" + "lw s1, 4(s4)\n\t" + "lw s2, 8(s4)\n\t" + "lw s3, 12(s4)\n\t" + "xor s9, s9, a7\n\t" + "xor s10, s10, s1\n\t" + "xor s11, s11, s2\n\t" + "xor s0, s0, s3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli a7, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "srli s2, s11, 24\n\t" + "srli s3, s0, 24\n\t" + "sb a7, 0(t1)\n\t" + "sb s1, 4(t1)\n\t" + "sb s2, 8(t1)\n\t" + "sb s3, 12(t1)\n\t" + "srli a7, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "srli s2, s11, 16\n\t" + "srli s3, s0, 16\n\t" + "sb a7, 1(t1)\n\t" + "sb s1, 5(t1)\n\t" + "sb s2, 9(t1)\n\t" + "sb s3, 13(t1)\n\t" + "srli a7, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "srli s2, s11, 8\n\t" + "srli s3, s0, 8\n\t" + "sb a7, 2(t1)\n\t" + "sb s1, 6(t1)\n\t" + "sb s2, 10(t1)\n\t" + "sb s3, 14(t1)\n\t" + "sb s9, 3(t1)\n\t" + "sb s10, 7(t1)\n\t" + "sb s11, 11(t1)\n\t" + "sb s0, 15(t1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli a7, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "slli s2, s11, 32\n\t" + "slli s3, s0, 32\n\t" + "srli s1, s1, 32\n\t" + "srli s3, s3, 32\n\t" + "or s1, s1, a7\n\t" + "or s3, s3, s2\n\t" +#else + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" + /* pack s3, s0, s11 */ + ".word 0x09b449b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + "sd s1, 0(t1)\n\t" + "sd s3, 8(t1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld a7, 0(sp)\n\t" + "ld s1, 8(sp)\n\t" + "xor a7, a7, t2\n\t" + "xor s1, s1, t3\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd a7, 0(%[out])\n\t" +#else + "andi s2, %[out], 7\n\t" + "bnez s2, L_ualn_sd7_w_%=\n\t" + "sd a7, 0(%[out])\n\t" + "j L_ualn_sd7_e_%=\n\t" + "\n" + "L_ualn_sd7_w_%=:\n\t" + "andi s2, s2, 3\n\t" + "bnez s2, L_ualn_sd7_h_%=\n\t" + "sw a7, 0(%[out])\n\t" + "srli s2, a7, 32\n\t" + "sw s2, 4(%[out])\n\t" + "j L_ualn_sd7_e_%=\n\t" + "\n" + "L_ualn_sd7_h_%=:\n\t" + "andi s2, s2, 1\n\t" + "bnez s2, L_ualn_sd7_b_%=\n\t" + "sh a7, 0(%[out])\n\t" + "srli s2, a7, 16\n\t" + "sh s2, 2(%[out])\n\t" + "srli s2, a7, 32\n\t" + "sh s2, 4(%[out])\n\t" + "srli s2, a7, 48\n\t" + "sh s2, 6(%[out])\n\t" + "j L_ualn_sd7_e_%=\n\t" + "\n" + "L_ualn_sd7_b_%=:\n\t" + "sb a7, 0(%[out])\n\t" + "srli s2, a7, 8\n\t" + "sb s2, 1(%[out])\n\t" + "srli s2, a7, 16\n\t" + "sb s2, 2(%[out])\n\t" + "srli s2, a7, 24\n\t" + "sb s2, 3(%[out])\n\t" + "srli s2, a7, 32\n\t" + "sb s2, 4(%[out])\n\t" + "srli s2, a7, 40\n\t" + "sb s2, 5(%[out])\n\t" + "srli s2, a7, 48\n\t" + "sb s2, 6(%[out])\n\t" + "srli s2, a7, 56\n\t" + "sb s2, 7(%[out])\n\t" + "\n" + "L_ualn_sd7_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd s1, 8(%[out])\n\t" +#else + "andi s2, %[out], 7\n\t" + "bnez s2, L_ualn_sd8_w_%=\n\t" + "sd s1, 8(%[out])\n\t" + "j L_ualn_sd8_e_%=\n\t" + "\n" + "L_ualn_sd8_w_%=:\n\t" + "andi s2, s2, 3\n\t" + "bnez s2, L_ualn_sd8_h_%=\n\t" + "sw s1, 8(%[out])\n\t" + "srli s2, s1, 32\n\t" + "sw s2, 12(%[out])\n\t" + "j L_ualn_sd8_e_%=\n\t" + "\n" + "L_ualn_sd8_h_%=:\n\t" + "andi s2, s2, 1\n\t" + "bnez s2, L_ualn_sd8_b_%=\n\t" + "sh s1, 8(%[out])\n\t" + "srli s2, s1, 16\n\t" + "sh s2, 10(%[out])\n\t" + "srli s2, s1, 32\n\t" + "sh s2, 12(%[out])\n\t" + "srli s2, s1, 48\n\t" + "sh s2, 14(%[out])\n\t" + "j L_ualn_sd8_e_%=\n\t" + "\n" + "L_ualn_sd8_b_%=:\n\t" + "sb s1, 8(%[out])\n\t" + "srli s2, s1, 8\n\t" + "sb s2, 9(%[out])\n\t" + "srli s2, s1, 16\n\t" + "sb s2, 10(%[out])\n\t" + "srli s2, s1, 24\n\t" + "sb s2, 11(%[out])\n\t" + "srli s2, s1, 32\n\t" + "sb s2, 12(%[out])\n\t" + "srli s2, s1, 40\n\t" + "sb s2, 13(%[out])\n\t" + "srli s2, s1, 48\n\t" + "sb s2, 14(%[out])\n\t" + "srli s2, s1, 56\n\t" + "sb s2, 15(%[out])\n\t" + "\n" + "L_ualn_sd8_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv t2, t4\n\t" + "mv t3, t5\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_CBC_decrypt_RISCV64_block\n\t" + "\n" + "L_AES_CBC_decrypt_RISCV64_end:\n\t" + "sd t2, 0(%[reg])\n\t" + "sd t3, 8(%[reg])\n\t" + "ld ra, 16(sp)\n\t" + "addi sp, sp, 32\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [nr] "+r" (nr) + : [td] "r" (td), [td4] "r" (td4) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "a7", "s1", "s2", "s3", + "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s0" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER +void AES_CTR_encrypt_RISCV64(const byte* in, byte* out, word32 sz, byte* reg, + byte* key, byte* tmp, word32* left, int nr) +{ + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 16(sp)\n\t" + "lw t2, 0(%[left])\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_leftover:\n\t" + "beqz t2, L_AES_CTR_encrypt_RISCV64_leftover_done\n\t" + "beqz %[sz], L_AES_CTR_encrypt_RISCV64_leftover_done\n\t" + "li t4, 16\n\t" + "sub t4, t4, t2\n\t" + "add t4, t4, %[tmp]\n\t" + "lb t5, 0(t4)\n\t" + "lb t6, 0(%[in])\n\t" + "xor t5, t5, t6\n\t" + "sb t5, 0(%[out])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addiw t2, t2, -1\n\t" + "addiw %[sz], %[sz], -1\n\t" + "j L_AES_CTR_encrypt_RISCV64_leftover\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_leftover_done:\n\t" + "sw t2, 0(%[left])\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_block_loop:\n\t" + "li t4, 16\n\t" + "bltu %[sz], t4, L_AES_CTR_encrypt_RISCV64_tail\n\t" + "mv t0, %[reg]\n\t" + "addi t1, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu s1, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(t0)\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key])\n\t" + "lw s8, 4(%[key])\n\t" + "lw s9, 8(%[key])\n\t" + "lw s10, 12(%[key])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw s1, 28(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw s1, 44(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw s1, 60(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw s1, 76(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw s1, 92(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw s1, 108(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw s1, 124(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw s1, 140(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw s1, 156(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_enc_block_5_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw s1, 172(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw s1, 188(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_enc_block_5_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw s1, 204(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw s1, 220(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_enc_block_5_done:\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "li s2, 65280\n\t" + "and s7, s7, s2\n\t" + "and s8, s8, s2\n\t" + "and s9, s9, s2\n\t" + "and s10, s10, s2\n\t" + "addi s2, %[te], 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 4278190080\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "li s2, 3072\n\t" + "add s2, %[te], s2\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 16711680\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t1)\n\t" + "sb t5, 4(t1)\n\t" + "sb t6, 8(t1)\n\t" + "sb s1, 12(t1)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t1)\n\t" + "sb t5, 5(t1)\n\t" + "sb t6, 9(t1)\n\t" + "sb s1, 13(t1)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t1)\n\t" + "sb t5, 6(t1)\n\t" + "sb t6, 10(t1)\n\t" + "sb s1, 14(t1)\n\t" + "sb s7, 3(t1)\n\t" + "sb s8, 7(t1)\n\t" + "sb s9, 11(t1)\n\t" + "sb s10, 15(t1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t1)\n\t" + "sd s1, 8(t1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t6, 0(%[in])\n\t" +#else + "andi s2, %[in], 7\n\t" + "bnez s2, L_ualn_ld9_w_%=\n\t" + "ld t6, 0(%[in])\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_w_%=:\n\t" + "andi s2, s2, 3\n\t" + "bnez s2, L_ualn_ld9_h_%=\n\t" + "lwu t6, 0(%[in])\n\t" + "lwu s2, 4(%[in])\n\t" + "slli s2, s2, 32\n\t" + "or t6, t6, s2\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_h_%=:\n\t" + "andi s2, s2, 1\n\t" + "bnez s2, L_ualn_ld9_b_%=\n\t" + "lhu t6, 0(%[in])\n\t" + "lhu s2, 2(%[in])\n\t" + "slli s2, s2, 16\n\t" + "or t6, t6, s2\n\t" + "lhu s2, 4(%[in])\n\t" + "slli s2, s2, 32\n\t" + "or t6, t6, s2\n\t" + "lhu s2, 6(%[in])\n\t" + "slli s2, s2, 48\n\t" + "or t6, t6, s2\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_b_%=:\n\t" + "lbu t6, 0(%[in])\n\t" + "lbu s2, 1(%[in])\n\t" + "slli s2, s2, 8\n\t" + "or t6, t6, s2\n\t" + "lbu s2, 2(%[in])\n\t" + "slli s2, s2, 16\n\t" + "or t6, t6, s2\n\t" + "lbu s2, 3(%[in])\n\t" + "slli s2, s2, 24\n\t" + "or t6, t6, s2\n\t" + "lbu s2, 4(%[in])\n\t" + "slli s2, s2, 32\n\t" + "or t6, t6, s2\n\t" + "lbu s2, 5(%[in])\n\t" + "slli s2, s2, 40\n\t" + "or t6, t6, s2\n\t" + "lbu s2, 6(%[in])\n\t" + "slli s2, s2, 48\n\t" + "or t6, t6, s2\n\t" + "lbu s2, 7(%[in])\n\t" + "slli s2, s2, 56\n\t" + "or t6, t6, s2\n\t" + "\n" + "L_ualn_ld9_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s1, 8(%[in])\n\t" +#else + "andi s2, %[in], 7\n\t" + "bnez s2, L_ualn_ld10_w_%=\n\t" + "ld s1, 8(%[in])\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_w_%=:\n\t" + "andi s2, s2, 3\n\t" + "bnez s2, L_ualn_ld10_h_%=\n\t" + "lwu s1, 8(%[in])\n\t" + "lwu s2, 12(%[in])\n\t" + "slli s2, s2, 32\n\t" + "or s1, s1, s2\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_h_%=:\n\t" + "andi s2, s2, 1\n\t" + "bnez s2, L_ualn_ld10_b_%=\n\t" + "lhu s1, 8(%[in])\n\t" + "lhu s2, 10(%[in])\n\t" + "slli s2, s2, 16\n\t" + "or s1, s1, s2\n\t" + "lhu s2, 12(%[in])\n\t" + "slli s2, s2, 32\n\t" + "or s1, s1, s2\n\t" + "lhu s2, 14(%[in])\n\t" + "slli s2, s2, 48\n\t" + "or s1, s1, s2\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_b_%=:\n\t" + "lbu s1, 8(%[in])\n\t" + "lbu s2, 9(%[in])\n\t" + "slli s2, s2, 8\n\t" + "or s1, s1, s2\n\t" + "lbu s2, 10(%[in])\n\t" + "slli s2, s2, 16\n\t" + "or s1, s1, s2\n\t" + "lbu s2, 11(%[in])\n\t" + "slli s2, s2, 24\n\t" + "or s1, s1, s2\n\t" + "lbu s2, 12(%[in])\n\t" + "slli s2, s2, 32\n\t" + "or s1, s1, s2\n\t" + "lbu s2, 13(%[in])\n\t" + "slli s2, s2, 40\n\t" + "or s1, s1, s2\n\t" + "lbu s2, 14(%[in])\n\t" + "slli s2, s2, 48\n\t" + "or s1, s1, s2\n\t" + "lbu s2, 15(%[in])\n\t" + "slli s2, s2, 56\n\t" + "or s1, s1, s2\n\t" + "\n" + "L_ualn_ld10_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t4, t4, t6\n\t" + "xor t5, t5, s1\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t4, 0(%[out])\n\t" +#else + "andi s2, %[out], 7\n\t" + "bnez s2, L_ualn_sd11_w_%=\n\t" + "sd t4, 0(%[out])\n\t" + "j L_ualn_sd11_e_%=\n\t" + "\n" + "L_ualn_sd11_w_%=:\n\t" + "andi s2, s2, 3\n\t" + "bnez s2, L_ualn_sd11_h_%=\n\t" + "sw t4, 0(%[out])\n\t" + "srli s2, t4, 32\n\t" + "sw s2, 4(%[out])\n\t" + "j L_ualn_sd11_e_%=\n\t" + "\n" + "L_ualn_sd11_h_%=:\n\t" + "andi s2, s2, 1\n\t" + "bnez s2, L_ualn_sd11_b_%=\n\t" + "sh t4, 0(%[out])\n\t" + "srli s2, t4, 16\n\t" + "sh s2, 2(%[out])\n\t" + "srli s2, t4, 32\n\t" + "sh s2, 4(%[out])\n\t" + "srli s2, t4, 48\n\t" + "sh s2, 6(%[out])\n\t" + "j L_ualn_sd11_e_%=\n\t" + "\n" + "L_ualn_sd11_b_%=:\n\t" + "sb t4, 0(%[out])\n\t" + "srli s2, t4, 8\n\t" + "sb s2, 1(%[out])\n\t" + "srli s2, t4, 16\n\t" + "sb s2, 2(%[out])\n\t" + "srli s2, t4, 24\n\t" + "sb s2, 3(%[out])\n\t" + "srli s2, t4, 32\n\t" + "sb s2, 4(%[out])\n\t" + "srli s2, t4, 40\n\t" + "sb s2, 5(%[out])\n\t" + "srli s2, t4, 48\n\t" + "sb s2, 6(%[out])\n\t" + "srli s2, t4, 56\n\t" + "sb s2, 7(%[out])\n\t" + "\n" + "L_ualn_sd11_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t5, 8(%[out])\n\t" +#else + "andi s2, %[out], 7\n\t" + "bnez s2, L_ualn_sd12_w_%=\n\t" + "sd t5, 8(%[out])\n\t" + "j L_ualn_sd12_e_%=\n\t" + "\n" + "L_ualn_sd12_w_%=:\n\t" + "andi s2, s2, 3\n\t" + "bnez s2, L_ualn_sd12_h_%=\n\t" + "sw t5, 8(%[out])\n\t" + "srli s2, t5, 32\n\t" + "sw s2, 12(%[out])\n\t" + "j L_ualn_sd12_e_%=\n\t" + "\n" + "L_ualn_sd12_h_%=:\n\t" + "andi s2, s2, 1\n\t" + "bnez s2, L_ualn_sd12_b_%=\n\t" + "sh t5, 8(%[out])\n\t" + "srli s2, t5, 16\n\t" + "sh s2, 10(%[out])\n\t" + "srli s2, t5, 32\n\t" + "sh s2, 12(%[out])\n\t" + "srli s2, t5, 48\n\t" + "sh s2, 14(%[out])\n\t" + "j L_ualn_sd12_e_%=\n\t" + "\n" + "L_ualn_sd12_b_%=:\n\t" + "sb t5, 8(%[out])\n\t" + "srli s2, t5, 8\n\t" + "sb s2, 9(%[out])\n\t" + "srli s2, t5, 16\n\t" + "sb s2, 10(%[out])\n\t" + "srli s2, t5, 24\n\t" + "sb s2, 11(%[out])\n\t" + "srli s2, t5, 32\n\t" + "sb s2, 12(%[out])\n\t" + "srli s2, t5, 40\n\t" + "sb s2, 13(%[out])\n\t" + "srli s2, t5, 48\n\t" + "sb s2, 14(%[out])\n\t" + "srli s2, t5, 56\n\t" + "sb s2, 15(%[out])\n\t" + "\n" + "L_ualn_sd12_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "li t5, 15\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_carry0:\n\t" + "add s1, %[reg], t5\n\t" + "lbu t4, 0(s1)\n\t" + "addi t4, t4, 1\n\t" + "sb t4, 0(s1)\n\t" + "andi t6, t4, 256\n\t" + "beqz t6, L_AES_CTR_encrypt_RISCV64_carry_done0\n\t" + "addi t5, t5, -1\n\t" + "bgez t5, L_AES_CTR_encrypt_RISCV64_carry0\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_carry_done0:\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[sz], %[sz], -16\n\t" + "j L_AES_CTR_encrypt_RISCV64_block_loop\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_tail:\n\t" + "beqz %[sz], L_AES_CTR_encrypt_RISCV64_done\n\t" + "mv t0, %[reg]\n\t" + "addi t1, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu s1, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(t0)\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key])\n\t" + "lw s8, 4(%[key])\n\t" + "lw s9, 8(%[key])\n\t" + "lw s10, 12(%[key])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw s1, 28(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw s1, 44(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw s1, 60(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw s1, 76(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw s1, 92(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw s1, 108(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw s1, 124(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw s1, 140(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw s1, 156(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_enc_block_6_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw s1, 172(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw s1, 188(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_enc_block_6_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw s1, 204(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw s1, 220(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_enc_block_6_done:\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "li s2, 65280\n\t" + "and s7, s7, s2\n\t" + "and s8, s8, s2\n\t" + "and s9, s9, s2\n\t" + "and s10, s10, s2\n\t" + "addi s2, %[te], 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 4278190080\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "li s2, 3072\n\t" + "add s2, %[te], s2\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 16711680\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t1)\n\t" + "sb t5, 4(t1)\n\t" + "sb t6, 8(t1)\n\t" + "sb s1, 12(t1)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t1)\n\t" + "sb t5, 5(t1)\n\t" + "sb t6, 9(t1)\n\t" + "sb s1, 13(t1)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t1)\n\t" + "sb t5, 6(t1)\n\t" + "sb t6, 10(t1)\n\t" + "sb s1, 14(t1)\n\t" + "sb s7, 3(t1)\n\t" + "sb s8, 7(t1)\n\t" + "sb s9, 11(t1)\n\t" + "sb s10, 15(t1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t1)\n\t" + "sd s1, 8(t1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "sd t4, 0(%[tmp])\n\t" + "sd t5, 8(%[tmp])\n\t" + "li t5, 15\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_carry1:\n\t" + "add s1, %[reg], t5\n\t" + "lbu t4, 0(s1)\n\t" + "addi t4, t4, 1\n\t" + "sb t4, 0(s1)\n\t" + "andi t6, t4, 256\n\t" + "beqz t6, L_AES_CTR_encrypt_RISCV64_carry_done1\n\t" + "addi t5, t5, -1\n\t" + "bgez t5, L_AES_CTR_encrypt_RISCV64_carry1\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_carry_done1:\n\t" + "li t4, 16\n\t" + "subw t4, t4, %[sz]\n\t" + "sw t4, 0(%[left])\n\t" + "mv s2, %[tmp]\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_tail_byte:\n\t" + "lb t4, 0(%[in])\n\t" + "lb t5, 0(s2)\n\t" + "xor t4, t4, t5\n\t" + "sb t4, 0(%[out])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi s2, s2, 1\n\t" + "addiw %[sz], %[sz], -1\n\t" + "bnez %[sz], L_AES_CTR_encrypt_RISCV64_tail_byte\n\t" + "\n" + "L_AES_CTR_encrypt_RISCV64_done:\n\t" + "ld ra, 16(sp)\n\t" + "addi sp, sp, 32\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [reg] "+r" (reg), + [key] "+r" (key), [tmp] "+r" (tmp), [left] "+r" (left), + [nr] "+r" (nr) + : [te] "r" (te) + : "memory", "t0", "t1", "t2", "t4", "t5", "t6", "s1", "s2", "s3", "s4", + "s5", "s6", "s7", "s8", "s9", "s10" + ); +} + +#endif /* WOLFSSL_AES_COUNTER */ +#ifdef WOLFSSL_AES_XTS +void AES_XTS_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr) +{ + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 16(sp)\n\t" + "addi t0, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(%[i])\n\t" + "lbu t5, 4(%[i])\n\t" + "lbu t6, 8(%[i])\n\t" + "lbu s1, 12(%[i])\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(%[i])\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(%[i])\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(%[i])\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(%[i])\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(%[i])\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(%[i])\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(%[i])\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(%[i])\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(%[i])\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(%[i])\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(%[i])\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(%[i])\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(%[i])\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(%[i])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key2])\n\t" + "lw s8, 4(%[key2])\n\t" + "lw s9, 8(%[key2])\n\t" + "lw s10, 12(%[key2])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key2])\n\t" + "lw t5, 20(%[key2])\n\t" + "lw t6, 24(%[key2])\n\t" + "lw s1, 28(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key2])\n\t" + "lw t5, 36(%[key2])\n\t" + "lw t6, 40(%[key2])\n\t" + "lw s1, 44(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key2])\n\t" + "lw t5, 52(%[key2])\n\t" + "lw t6, 56(%[key2])\n\t" + "lw s1, 60(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key2])\n\t" + "lw t5, 68(%[key2])\n\t" + "lw t6, 72(%[key2])\n\t" + "lw s1, 76(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key2])\n\t" + "lw t5, 84(%[key2])\n\t" + "lw t6, 88(%[key2])\n\t" + "lw s1, 92(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key2])\n\t" + "lw t5, 100(%[key2])\n\t" + "lw t6, 104(%[key2])\n\t" + "lw s1, 108(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key2])\n\t" + "lw t5, 116(%[key2])\n\t" + "lw t6, 120(%[key2])\n\t" + "lw s1, 124(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key2])\n\t" + "lw t5, 132(%[key2])\n\t" + "lw t6, 136(%[key2])\n\t" + "lw s1, 140(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key2])\n\t" + "lw t5, 148(%[key2])\n\t" + "lw t6, 152(%[key2])\n\t" + "lw s1, 156(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_enc_block_7_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key2])\n\t" + "lw t5, 164(%[key2])\n\t" + "lw t6, 168(%[key2])\n\t" + "lw s1, 172(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key2])\n\t" + "lw t5, 180(%[key2])\n\t" + "lw t6, 184(%[key2])\n\t" + "lw s1, 188(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_enc_block_7_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key2])\n\t" + "lw t5, 196(%[key2])\n\t" + "lw t6, 200(%[key2])\n\t" + "lw s1, 204(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key2])\n\t" + "lw t5, 212(%[key2])\n\t" + "lw t6, 216(%[key2])\n\t" + "lw s1, 220(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_enc_block_7_done:\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "li s2, 65280\n\t" + "and s7, s7, s2\n\t" + "and s8, s8, s2\n\t" + "and s9, s9, s2\n\t" + "and s10, s10, s2\n\t" + "addi s2, %[te], 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 4278190080\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "li s2, 3072\n\t" + "add s2, %[te], s2\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 16711680\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key2], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t0)\n\t" + "sb t5, 4(t0)\n\t" + "sb t6, 8(t0)\n\t" + "sb s1, 12(t0)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t0)\n\t" + "sb t5, 5(t0)\n\t" + "sb t6, 9(t0)\n\t" + "sb s1, 13(t0)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb t6, 10(t0)\n\t" + "sb s1, 14(t0)\n\t" + "sb s7, 3(t0)\n\t" + "sb s8, 7(t0)\n\t" + "sb s9, 11(t0)\n\t" + "sb s10, 15(t0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t0)\n\t" + "sd s1, 8(t0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t1, 0(sp)\n\t" + "ld t2, 8(sp)\n\t" + "srliw %[i], %[sz], 4\n\t" + "andi %[sz], %[sz], 15\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_block:\n\t" + "beqz %[i], L_AES_XTS_encrypt_RISCV64_last\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t4, 0(%[in])\n\t" +#else + "andi t6, %[in], 7\n\t" + "bnez t6, L_ualn_ld13_w_%=\n\t" + "ld t4, 0(%[in])\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld13_h_%=\n\t" + "lwu t4, 0(%[in])\n\t" + "lwu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld13_b_%=\n\t" + "lhu t4, 0(%[in])\n\t" + "lhu t6, 2(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 6(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_b_%=:\n\t" + "lbu t4, 0(%[in])\n\t" + "lbu t6, 1(%[in])\n\t" + "slli t6, t6, 8\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 2(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 3(%[in])\n\t" + "slli t6, t6, 24\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 5(%[in])\n\t" + "slli t6, t6, 40\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 6(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 7(%[in])\n\t" + "slli t6, t6, 56\n\t" + "or t4, t4, t6\n\t" + "\n" + "L_ualn_ld13_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 8(%[in])\n\t" +#else + "andi t6, %[in], 7\n\t" + "bnez t6, L_ualn_ld14_w_%=\n\t" + "ld t5, 8(%[in])\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld14_h_%=\n\t" + "lwu t5, 8(%[in])\n\t" + "lwu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld14_b_%=\n\t" + "lhu t5, 8(%[in])\n\t" + "lhu t6, 10(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 14(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_b_%=:\n\t" + "lbu t5, 8(%[in])\n\t" + "lbu t6, 9(%[in])\n\t" + "slli t6, t6, 8\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 10(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 11(%[in])\n\t" + "slli t6, t6, 24\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 13(%[in])\n\t" + "slli t6, t6, 40\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 14(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 15(%[in])\n\t" + "slli t6, t6, 56\n\t" + "or t5, t5, t6\n\t" + "\n" + "L_ualn_ld14_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" + "sd t4, 0(sp)\n\t" + "sd t5, 8(sp)\n\t" + "addi t0, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu s1, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(t0)\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key])\n\t" + "lw s8, 4(%[key])\n\t" + "lw s9, 8(%[key])\n\t" + "lw s10, 12(%[key])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw s1, 28(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw s1, 44(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw s1, 60(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw s1, 76(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw s1, 92(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw s1, 108(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw s1, 124(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw s1, 140(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw s1, 156(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_enc_block_8_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw s1, 172(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw s1, 188(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_enc_block_8_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw s1, 204(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw s1, 220(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_enc_block_8_done:\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "li s2, 65280\n\t" + "and s7, s7, s2\n\t" + "and s8, s8, s2\n\t" + "and s9, s9, s2\n\t" + "and s10, s10, s2\n\t" + "addi s2, %[te], 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 4278190080\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "li s2, 3072\n\t" + "add s2, %[te], s2\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 16711680\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t0)\n\t" + "sb t5, 4(t0)\n\t" + "sb t6, 8(t0)\n\t" + "sb s1, 12(t0)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t0)\n\t" + "sb t5, 5(t0)\n\t" + "sb t6, 9(t0)\n\t" + "sb s1, 13(t0)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb t6, 10(t0)\n\t" + "sb s1, 14(t0)\n\t" + "sb s7, 3(t0)\n\t" + "sb s8, 7(t0)\n\t" + "sb s9, 11(t0)\n\t" + "sb s10, 15(t0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t0)\n\t" + "sd s1, 8(t0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t4, 0(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd15_w_%=\n\t" + "sd t4, 0(%[out])\n\t" + "j L_ualn_sd15_e_%=\n\t" + "\n" + "L_ualn_sd15_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd15_h_%=\n\t" + "sw t4, 0(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sw t6, 4(%[out])\n\t" + "j L_ualn_sd15_e_%=\n\t" + "\n" + "L_ualn_sd15_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd15_b_%=\n\t" + "sh t4, 0(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sh t6, 2(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sh t6, 4(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sh t6, 6(%[out])\n\t" + "j L_ualn_sd15_e_%=\n\t" + "\n" + "L_ualn_sd15_b_%=:\n\t" + "sb t4, 0(%[out])\n\t" + "srli t6, t4, 8\n\t" + "sb t6, 1(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sb t6, 2(%[out])\n\t" + "srli t6, t4, 24\n\t" + "sb t6, 3(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sb t6, 4(%[out])\n\t" + "srli t6, t4, 40\n\t" + "sb t6, 5(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sb t6, 6(%[out])\n\t" + "srli t6, t4, 56\n\t" + "sb t6, 7(%[out])\n\t" + "\n" + "L_ualn_sd15_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t5, 8(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd16_w_%=\n\t" + "sd t5, 8(%[out])\n\t" + "j L_ualn_sd16_e_%=\n\t" + "\n" + "L_ualn_sd16_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd16_h_%=\n\t" + "sw t5, 8(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sw t6, 12(%[out])\n\t" + "j L_ualn_sd16_e_%=\n\t" + "\n" + "L_ualn_sd16_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd16_b_%=\n\t" + "sh t5, 8(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sh t6, 10(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sh t6, 12(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sh t6, 14(%[out])\n\t" + "j L_ualn_sd16_e_%=\n\t" + "\n" + "L_ualn_sd16_b_%=:\n\t" + "sb t5, 8(%[out])\n\t" + "srli t6, t5, 8\n\t" + "sb t6, 9(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sb t6, 10(%[out])\n\t" + "srli t6, t5, 24\n\t" + "sb t6, 11(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sb t6, 12(%[out])\n\t" + "srli t6, t5, 40\n\t" + "sb t6, 13(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sb t6, 14(%[out])\n\t" + "srli t6, t5, 56\n\t" + "sb t6, 15(%[out])\n\t" + "\n" + "L_ualn_sd16_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "srli t4, t1, 63\n\t" + "srli t5, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t5, t5\n\t" + "and t4, t4, t5\n\t" + "xor t1, t1, t4\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[i], %[i], -1\n\t" + "j L_AES_XTS_encrypt_RISCV64_block\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_last:\n\t" + "beqz %[sz], L_AES_XTS_encrypt_RISCV64_done\n\t" + "addi s2, %[out], -16\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t4, 0(s2)\n\t" +#else + "andi t6, s2, 7\n\t" + "bnez t6, L_ualn_ld17_w_%=\n\t" + "ld t4, 0(s2)\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld17_h_%=\n\t" + "lwu t4, 0(s2)\n\t" + "lwu t6, 4(s2)\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld17_b_%=\n\t" + "lhu t4, 0(s2)\n\t" + "lhu t6, 2(s2)\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 4(s2)\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 6(s2)\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_b_%=:\n\t" + "lbu t4, 0(s2)\n\t" + "lbu t6, 1(s2)\n\t" + "slli t6, t6, 8\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 2(s2)\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 3(s2)\n\t" + "slli t6, t6, 24\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 4(s2)\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 5(s2)\n\t" + "slli t6, t6, 40\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 6(s2)\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 7(s2)\n\t" + "slli t6, t6, 56\n\t" + "or t4, t4, t6\n\t" + "\n" + "L_ualn_ld17_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 8(s2)\n\t" +#else + "andi t6, s2, 7\n\t" + "bnez t6, L_ualn_ld18_w_%=\n\t" + "ld t5, 8(s2)\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld18_h_%=\n\t" + "lwu t5, 8(s2)\n\t" + "lwu t6, 12(s2)\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld18_b_%=\n\t" + "lhu t5, 8(s2)\n\t" + "lhu t6, 10(s2)\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 12(s2)\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 14(s2)\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_b_%=:\n\t" + "lbu t5, 8(s2)\n\t" + "lbu t6, 9(s2)\n\t" + "slli t6, t6, 8\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 10(s2)\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 11(s2)\n\t" + "slli t6, t6, 24\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 12(s2)\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 13(s2)\n\t" + "slli t6, t6, 40\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 14(s2)\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 15(s2)\n\t" + "slli t6, t6, 56\n\t" + "or t5, t5, t6\n\t" + "\n" + "L_ualn_ld18_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t4, 0(%[tmp])\n\t" + "sd t5, 8(%[tmp])\n\t" + "mv s2, %[tmp]\n\t" + "mv s1, %[sz]\n\t" + "\n" + "L_AES_XTS_encrypt_RISCV64_steal:\n\t" + "lbu t4, 0(s2)\n\t" + "lbu t5, 0(%[in])\n\t" + "sb t4, 0(%[out])\n\t" + "sb t5, 0(s2)\n\t" + "addi s2, s2, 1\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addiw s1, s1, -1\n\t" + "bnez s1, L_AES_XTS_encrypt_RISCV64_steal\n\t" + "sub %[out], %[out], %[sz]\n\t" + "addi %[out], %[out], -16\n\t" + "ld t4, 0(%[tmp])\n\t" + "ld t5, 8(%[tmp])\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" + "sd t4, 0(sp)\n\t" + "sd t5, 8(sp)\n\t" + "addi t0, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu s1, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(t0)\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key])\n\t" + "lw s8, 4(%[key])\n\t" + "lw s9, 8(%[key])\n\t" + "lw s10, 12(%[key])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw s1, 28(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw s1, 44(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw s1, 60(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw s1, 76(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw s1, 92(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw s1, 108(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw s1, 124(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw s1, 140(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw s1, 156(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_enc_block_9_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw s1, 172(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw s1, 188(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_enc_block_9_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw s1, 204(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw s1, 220(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_enc_block_9_done:\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "li s2, 65280\n\t" + "and s7, s7, s2\n\t" + "and s8, s8, s2\n\t" + "and s9, s9, s2\n\t" + "and s10, s10, s2\n\t" + "addi s2, %[te], 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 4278190080\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "li s2, 3072\n\t" + "add s2, %[te], s2\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 16711680\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t0)\n\t" + "sb t5, 4(t0)\n\t" + "sb t6, 8(t0)\n\t" + "sb s1, 12(t0)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t0)\n\t" + "sb t5, 5(t0)\n\t" + "sb t6, 9(t0)\n\t" + "sb s1, 13(t0)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb t6, 10(t0)\n\t" + "sb s1, 14(t0)\n\t" + "sb s7, 3(t0)\n\t" + "sb s8, 7(t0)\n\t" + "sb s9, 11(t0)\n\t" + "sb s10, 15(t0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t0)\n\t" + "sd s1, 8(t0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t4, 0(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd19_w_%=\n\t" + "sd t4, 0(%[out])\n\t" + "j L_ualn_sd19_e_%=\n\t" + "\n" + "L_ualn_sd19_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd19_h_%=\n\t" + "sw t4, 0(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sw t6, 4(%[out])\n\t" + "j L_ualn_sd19_e_%=\n\t" + "\n" + "L_ualn_sd19_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd19_b_%=\n\t" + "sh t4, 0(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sh t6, 2(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sh t6, 4(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sh t6, 6(%[out])\n\t" + "j L_ualn_sd19_e_%=\n\t" + "\n" + "L_ualn_sd19_b_%=:\n\t" + "sb t4, 0(%[out])\n\t" + "srli t6, t4, 8\n\t" + "sb t6, 1(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sb t6, 2(%[out])\n\t" + "srli t6, t4, 24\n\t" + "sb t6, 3(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sb t6, 4(%[out])\n\t" + "srli t6, t4, 40\n\t" + "sb t6, 5(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sb t6, 6(%[out])\n\t" + "srli t6, t4, 56\n\t" + "sb t6, 7(%[out])\n\t" + "\n" + "L_ualn_sd19_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t5, 8(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd20_w_%=\n\t" + "sd t5, 8(%[out])\n\t" + "j L_ualn_sd20_e_%=\n\t" + "\n" + "L_ualn_sd20_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd20_h_%=\n\t" + "sw t5, 8(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sw t6, 12(%[out])\n\t" + "j L_ualn_sd20_e_%=\n\t" + "\n" + "L_ualn_sd20_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd20_b_%=\n\t" + "sh t5, 8(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sh t6, 10(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sh t6, 12(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sh t6, 14(%[out])\n\t" + "j L_ualn_sd20_e_%=\n\t" + "\n" + "L_ualn_sd20_b_%=:\n\t" + "sb t5, 8(%[out])\n\t" + "srli t6, t5, 8\n\t" + "sb t6, 9(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sb t6, 10(%[out])\n\t" + "srli t6, t5, 24\n\t" + "sb t6, 11(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sb t6, 12(%[out])\n\t" + "srli t6, t5, 40\n\t" + "sb t6, 13(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sb t6, 14(%[out])\n\t" + "srli t6, t5, 56\n\t" + "sb t6, 15(%[out])\n\t" + "\n" + "L_ualn_sd20_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "\n" + "L_AES_XTS_encrypt_RISCV64_done:\n\t" + "ld ra, 16(sp)\n\t" + "addi sp, sp, 48\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [i] "+r" (i), + [key] "+r" (key), [key2] "+r" (key2), [tmp] "+r" (tmp), + [nr] "+r" (nr) + : [te] "r" (te) + : "memory", "t0", "t1", "t2", "t4", "t5", "t6", "s1", "s2", "s3", "s4", + "s5", "s6", "s7", "s8", "s9", "s10" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_XTS_decrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr) +{ + const word32* te = L_AES_base_te; + const word32* td = L_AES_base_td; + const word8* td4 = L_AES_base_td4; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 16(sp)\n\t" + "addi t0, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(%[i])\n\t" + "lbu t5, 4(%[i])\n\t" + "lbu t6, 8(%[i])\n\t" + "lbu s1, 12(%[i])\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(%[i])\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(%[i])\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(%[i])\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(%[i])\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(%[i])\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(%[i])\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(%[i])\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(%[i])\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(%[i])\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(%[i])\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(%[i])\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(%[i])\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(%[i])\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(%[i])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key2])\n\t" + "lw s8, 4(%[key2])\n\t" + "lw s9, 8(%[key2])\n\t" + "lw s10, 12(%[key2])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key2])\n\t" + "lw t5, 20(%[key2])\n\t" + "lw t6, 24(%[key2])\n\t" + "lw s1, 28(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key2])\n\t" + "lw t5, 36(%[key2])\n\t" + "lw t6, 40(%[key2])\n\t" + "lw s1, 44(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key2])\n\t" + "lw t5, 52(%[key2])\n\t" + "lw t6, 56(%[key2])\n\t" + "lw s1, 60(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key2])\n\t" + "lw t5, 68(%[key2])\n\t" + "lw t6, 72(%[key2])\n\t" + "lw s1, 76(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key2])\n\t" + "lw t5, 84(%[key2])\n\t" + "lw t6, 88(%[key2])\n\t" + "lw s1, 92(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key2])\n\t" + "lw t5, 100(%[key2])\n\t" + "lw t6, 104(%[key2])\n\t" + "lw s1, 108(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key2])\n\t" + "lw t5, 116(%[key2])\n\t" + "lw t6, 120(%[key2])\n\t" + "lw s1, 124(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key2])\n\t" + "lw t5, 132(%[key2])\n\t" + "lw t6, 136(%[key2])\n\t" + "lw s1, 140(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key2])\n\t" + "lw t5, 148(%[key2])\n\t" + "lw t6, 152(%[key2])\n\t" + "lw s1, 156(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_enc_block_10_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key2])\n\t" + "lw t5, 164(%[key2])\n\t" + "lw t6, 168(%[key2])\n\t" + "lw s1, 172(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key2])\n\t" + "lw t5, 180(%[key2])\n\t" + "lw t6, 184(%[key2])\n\t" + "lw s1, 188(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_enc_block_10_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key2])\n\t" + "lw t5, 196(%[key2])\n\t" + "lw t6, 200(%[key2])\n\t" + "lw s1, 204(%[key2])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[te]\n\t" + "sh2add t5, t5, %[te]\n\t" + "sh2add t6, t6, %[te]\n\t" + "sh2add s1, s1, %[te]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[te], 1024\n\t" + "srliw t4, s8, 14\n\t" + "srliw t5, s9, 14\n\t" + "srliw t6, s10, 14\n\t" + "srliw s1, s7, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s10, 255\n\t" + "andi t5, s7, 255\n\t" + "andi t6, s8, 255\n\t" + "andi s1, s9, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key2])\n\t" + "lw t5, 212(%[key2])\n\t" + "lw t6, 216(%[key2])\n\t" + "lw s1, 220(%[key2])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_enc_block_10_done:\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, %[te]\n\t" + "add t5, t5, %[te]\n\t" + "add t6, t6, %[te]\n\t" + "add s1, s1, %[te]\n\t" + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "li s2, 65280\n\t" + "and s7, s7, s2\n\t" + "and s8, s8, s2\n\t" + "and s9, s9, s2\n\t" + "and s10, s10, s2\n\t" + "addi s2, %[te], 1024\n\t" + "andi t4, s6, 255\n\t" + "andi t5, s3, 255\n\t" + "andi t6, s4, 255\n\t" + "andi s1, s5, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slli t4, t4, 2\n\t" + "slli t5, t5, 2\n\t" + "slli t6, t6, 2\n\t" + "slli s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 4278190080\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "li s2, 3072\n\t" + "add s2, %[te], s2\n\t" + "srliw t4, s4, 14\n\t" + "srliw t5, s5, 14\n\t" + "srliw t6, s6, 14\n\t" + "srliw s1, s3, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "li s2, 16711680\n\t" + "and t4, t4, s2\n\t" + "and t5, t5, s2\n\t" + "and t6, t6, s2\n\t" + "and s1, s1, s2\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key2], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t0)\n\t" + "sb t5, 4(t0)\n\t" + "sb t6, 8(t0)\n\t" + "sb s1, 12(t0)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t0)\n\t" + "sb t5, 5(t0)\n\t" + "sb t6, 9(t0)\n\t" + "sb s1, 13(t0)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb t6, 10(t0)\n\t" + "sb s1, 14(t0)\n\t" + "sb s7, 3(t0)\n\t" + "sb s8, 7(t0)\n\t" + "sb s9, 11(t0)\n\t" + "sb s10, 15(t0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t0)\n\t" + "sd s1, 8(t0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t1, 0(sp)\n\t" + "ld t2, 8(sp)\n\t" + "srliw %[i], %[sz], 4\n\t" + "andi %[sz], %[sz], 15\n\t" + "beqz %[sz], L_AES_XTS_decrypt_RISCV64_full\n\t" + "addiw %[i], %[i], -1\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_full:\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_block:\n\t" + "beqz %[i], L_AES_XTS_decrypt_RISCV64_last\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t4, 0(%[in])\n\t" +#else + "andi t6, %[in], 7\n\t" + "bnez t6, L_ualn_ld21_w_%=\n\t" + "ld t4, 0(%[in])\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld21_h_%=\n\t" + "lwu t4, 0(%[in])\n\t" + "lwu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld21_b_%=\n\t" + "lhu t4, 0(%[in])\n\t" + "lhu t6, 2(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 6(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_b_%=:\n\t" + "lbu t4, 0(%[in])\n\t" + "lbu t6, 1(%[in])\n\t" + "slli t6, t6, 8\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 2(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 3(%[in])\n\t" + "slli t6, t6, 24\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 5(%[in])\n\t" + "slli t6, t6, 40\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 6(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 7(%[in])\n\t" + "slli t6, t6, 56\n\t" + "or t4, t4, t6\n\t" + "\n" + "L_ualn_ld21_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 8(%[in])\n\t" +#else + "andi t6, %[in], 7\n\t" + "bnez t6, L_ualn_ld22_w_%=\n\t" + "ld t5, 8(%[in])\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld22_h_%=\n\t" + "lwu t5, 8(%[in])\n\t" + "lwu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld22_b_%=\n\t" + "lhu t5, 8(%[in])\n\t" + "lhu t6, 10(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 14(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_b_%=:\n\t" + "lbu t5, 8(%[in])\n\t" + "lbu t6, 9(%[in])\n\t" + "slli t6, t6, 8\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 10(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 11(%[in])\n\t" + "slli t6, t6, 24\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 13(%[in])\n\t" + "slli t6, t6, 40\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 14(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 15(%[in])\n\t" + "slli t6, t6, 56\n\t" + "or t5, t5, t6\n\t" + "\n" + "L_ualn_ld22_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" + "sd t4, 0(sp)\n\t" + "sd t5, 8(sp)\n\t" + "addi t0, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu s1, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(t0)\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key])\n\t" + "lw s8, 4(%[key])\n\t" + "lw s9, 8(%[key])\n\t" + "lw s10, 12(%[key])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw s1, 28(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw s1, 44(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw s1, 60(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw s1, 76(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw s1, 92(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw s1, 108(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw s1, 124(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw s1, 140(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw s1, 156(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_dec_block_11_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw s1, 172(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw s1, 188(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_dec_block_11_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw s1, 204(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw s1, 220(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_dec_block_11_done:\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu s7, 0(t4)\n\t" + "lbu s8, 0(t5)\n\t" + "lbu s9, 0(t6)\n\t" + "lbu s10, 0(s1)\n\t" + "slli s7, s7, 24\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 24\n\t" + "slli s10, s10, 24\n\t" + "srliw t4, s6, 16\n\t" + "srliw t5, s3, 16\n\t" + "srliw t6, s4, 16\n\t" + "srliw s1, s5, 16\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi s1, s1, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "slli t4, t4, 16\n\t" + "slli t5, t5, 16\n\t" + "slli t6, t6, 16\n\t" + "slli s1, s1, 16\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "srliw t4, s5, 8\n\t" + "srliw t5, s6, 8\n\t" + "srliw t6, s3, 8\n\t" + "srliw s1, s4, 8\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi s1, s1, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t0)\n\t" + "sb t5, 4(t0)\n\t" + "sb t6, 8(t0)\n\t" + "sb s1, 12(t0)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t0)\n\t" + "sb t5, 5(t0)\n\t" + "sb t6, 9(t0)\n\t" + "sb s1, 13(t0)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb t6, 10(t0)\n\t" + "sb s1, 14(t0)\n\t" + "sb s7, 3(t0)\n\t" + "sb s8, 7(t0)\n\t" + "sb s9, 11(t0)\n\t" + "sb s10, 15(t0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t0)\n\t" + "sd s1, 8(t0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t4, 0(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd23_w_%=\n\t" + "sd t4, 0(%[out])\n\t" + "j L_ualn_sd23_e_%=\n\t" + "\n" + "L_ualn_sd23_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd23_h_%=\n\t" + "sw t4, 0(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sw t6, 4(%[out])\n\t" + "j L_ualn_sd23_e_%=\n\t" + "\n" + "L_ualn_sd23_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd23_b_%=\n\t" + "sh t4, 0(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sh t6, 2(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sh t6, 4(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sh t6, 6(%[out])\n\t" + "j L_ualn_sd23_e_%=\n\t" + "\n" + "L_ualn_sd23_b_%=:\n\t" + "sb t4, 0(%[out])\n\t" + "srli t6, t4, 8\n\t" + "sb t6, 1(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sb t6, 2(%[out])\n\t" + "srli t6, t4, 24\n\t" + "sb t6, 3(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sb t6, 4(%[out])\n\t" + "srli t6, t4, 40\n\t" + "sb t6, 5(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sb t6, 6(%[out])\n\t" + "srli t6, t4, 56\n\t" + "sb t6, 7(%[out])\n\t" + "\n" + "L_ualn_sd23_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t5, 8(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd24_w_%=\n\t" + "sd t5, 8(%[out])\n\t" + "j L_ualn_sd24_e_%=\n\t" + "\n" + "L_ualn_sd24_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd24_h_%=\n\t" + "sw t5, 8(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sw t6, 12(%[out])\n\t" + "j L_ualn_sd24_e_%=\n\t" + "\n" + "L_ualn_sd24_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd24_b_%=\n\t" + "sh t5, 8(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sh t6, 10(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sh t6, 12(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sh t6, 14(%[out])\n\t" + "j L_ualn_sd24_e_%=\n\t" + "\n" + "L_ualn_sd24_b_%=:\n\t" + "sb t5, 8(%[out])\n\t" + "srli t6, t5, 8\n\t" + "sb t6, 9(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sb t6, 10(%[out])\n\t" + "srli t6, t5, 24\n\t" + "sb t6, 11(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sb t6, 12(%[out])\n\t" + "srli t6, t5, 40\n\t" + "sb t6, 13(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sb t6, 14(%[out])\n\t" + "srli t6, t5, 56\n\t" + "sb t6, 15(%[out])\n\t" + "\n" + "L_ualn_sd24_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "srli t4, t1, 63\n\t" + "srli t5, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t5, t5\n\t" + "and t4, t4, t5\n\t" + "xor t1, t1, t4\n\t" + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addiw %[i], %[i], -1\n\t" + "j L_AES_XTS_decrypt_RISCV64_block\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_last:\n\t" + "beqz %[sz], L_AES_XTS_decrypt_RISCV64_done\n\t" + "sd t1, 24(sp)\n\t" + "sd t2, 32(sp)\n\t" + "srli t4, t1, 63\n\t" + "srli t5, t2, 63\n\t" + "slli t2, t2, 1\n\t" + "or t2, t2, t4\n\t" + "slli t1, t1, 1\n\t" + "li t4, 135\n\t" + "neg t5, t5\n\t" + "and t4, t4, t5\n\t" + "xor t1, t1, t4\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t4, 0(%[in])\n\t" +#else + "andi t6, %[in], 7\n\t" + "bnez t6, L_ualn_ld25_w_%=\n\t" + "ld t4, 0(%[in])\n\t" + "j L_ualn_ld25_e_%=\n\t" + "\n" + "L_ualn_ld25_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld25_h_%=\n\t" + "lwu t4, 0(%[in])\n\t" + "lwu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld25_e_%=\n\t" + "\n" + "L_ualn_ld25_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld25_b_%=\n\t" + "lhu t4, 0(%[in])\n\t" + "lhu t6, 2(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lhu t6, 6(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "j L_ualn_ld25_e_%=\n\t" + "\n" + "L_ualn_ld25_b_%=:\n\t" + "lbu t4, 0(%[in])\n\t" + "lbu t6, 1(%[in])\n\t" + "slli t6, t6, 8\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 2(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 3(%[in])\n\t" + "slli t6, t6, 24\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 4(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 5(%[in])\n\t" + "slli t6, t6, 40\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 6(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t4, t4, t6\n\t" + "lbu t6, 7(%[in])\n\t" + "slli t6, t6, 56\n\t" + "or t4, t4, t6\n\t" + "\n" + "L_ualn_ld25_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 8(%[in])\n\t" +#else + "andi t6, %[in], 7\n\t" + "bnez t6, L_ualn_ld26_w_%=\n\t" + "ld t5, 8(%[in])\n\t" + "j L_ualn_ld26_e_%=\n\t" + "\n" + "L_ualn_ld26_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_ld26_h_%=\n\t" + "lwu t5, 8(%[in])\n\t" + "lwu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld26_e_%=\n\t" + "\n" + "L_ualn_ld26_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_ld26_b_%=\n\t" + "lhu t5, 8(%[in])\n\t" + "lhu t6, 10(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lhu t6, 14(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "j L_ualn_ld26_e_%=\n\t" + "\n" + "L_ualn_ld26_b_%=:\n\t" + "lbu t5, 8(%[in])\n\t" + "lbu t6, 9(%[in])\n\t" + "slli t6, t6, 8\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 10(%[in])\n\t" + "slli t6, t6, 16\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 11(%[in])\n\t" + "slli t6, t6, 24\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 12(%[in])\n\t" + "slli t6, t6, 32\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 13(%[in])\n\t" + "slli t6, t6, 40\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 14(%[in])\n\t" + "slli t6, t6, 48\n\t" + "or t5, t5, t6\n\t" + "lbu t6, 15(%[in])\n\t" + "slli t6, t6, 56\n\t" + "or t5, t5, t6\n\t" + "\n" + "L_ualn_ld26_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[in], %[in], 16\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" + "sd t4, 0(sp)\n\t" + "sd t5, 8(sp)\n\t" + "addi t0, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu s1, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(t0)\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key])\n\t" + "lw s8, 4(%[key])\n\t" + "lw s9, 8(%[key])\n\t" + "lw s10, 12(%[key])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw s1, 28(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw s1, 44(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw s1, 60(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw s1, 76(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw s1, 92(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw s1, 108(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw s1, 124(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw s1, 140(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw s1, 156(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_dec_block_12_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw s1, 172(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw s1, 188(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_dec_block_12_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw s1, 204(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw s1, 220(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_dec_block_12_done:\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu s7, 0(t4)\n\t" + "lbu s8, 0(t5)\n\t" + "lbu s9, 0(t6)\n\t" + "lbu s10, 0(s1)\n\t" + "slli s7, s7, 24\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 24\n\t" + "slli s10, s10, 24\n\t" + "srliw t4, s6, 16\n\t" + "srliw t5, s3, 16\n\t" + "srliw t6, s4, 16\n\t" + "srliw s1, s5, 16\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi s1, s1, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "slli t4, t4, 16\n\t" + "slli t5, t5, 16\n\t" + "slli t6, t6, 16\n\t" + "slli s1, s1, 16\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "srliw t4, s5, 8\n\t" + "srliw t5, s6, 8\n\t" + "srliw t6, s3, 8\n\t" + "srliw s1, s4, 8\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi s1, s1, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t0)\n\t" + "sb t5, 4(t0)\n\t" + "sb t6, 8(t0)\n\t" + "sb s1, 12(t0)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t0)\n\t" + "sb t5, 5(t0)\n\t" + "sb t6, 9(t0)\n\t" + "sb s1, 13(t0)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb t6, 10(t0)\n\t" + "sb s1, 14(t0)\n\t" + "sb s7, 3(t0)\n\t" + "sb s8, 7(t0)\n\t" + "sb s9, 11(t0)\n\t" + "sb s10, 15(t0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t0)\n\t" + "sd s1, 8(t0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" + "sd t4, 0(%[tmp])\n\t" + "sd t5, 8(%[tmp])\n\t" + "addi %[out], %[out], 16\n\t" + "mv s2, %[tmp]\n\t" + "mv s1, %[sz]\n\t" + "\n" + "L_AES_XTS_decrypt_RISCV64_steal:\n\t" + "lbu t4, 0(s2)\n\t" + "lbu t5, 0(%[in])\n\t" + "sb t4, 0(%[out])\n\t" + "sb t5, 0(s2)\n\t" + "addi s2, s2, 1\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addiw s1, s1, -1\n\t" + "bnez s1, L_AES_XTS_decrypt_RISCV64_steal\n\t" + "sub %[out], %[out], %[sz]\n\t" + "addi %[out], %[out], -16\n\t" + "ld t1, 24(sp)\n\t" + "ld t2, 32(sp)\n\t" + "ld t4, 0(%[tmp])\n\t" + "ld t5, 8(%[tmp])\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" + "sd t4, 0(sp)\n\t" + "sd t5, 8(sp)\n\t" + "addi t0, sp, 0\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t4, 0(t0)\n\t" + "lbu t5, 4(t0)\n\t" + "lbu t6, 8(t0)\n\t" + "lbu s1, 12(t0)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 1(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 5(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 9(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 13(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 2(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 6(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 10(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 14(t0)\n\t" + "or s1, s1, s2\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "lbu s2, 3(t0)\n\t" + "or t4, t4, s2\n\t" + "lbu s3, 7(t0)\n\t" + "or t5, t5, s3\n\t" + "lbu s4, 11(t0)\n\t" + "or t6, t6, s4\n\t" + "lbu s2, 15(t0)\n\t" + "or s1, s1, s2\n\t" +#else + "ld t5, 0(t0)\n\t" + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + "srli t4, t5, 32\n\t" + "ld s1, 8(t0)\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "srli t6, s1, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(%[key])\n\t" + "lw s8, 4(%[key])\n\t" + "lw s9, 8(%[key])\n\t" + "lw s10, 12(%[key])\n\t" + "xor s7, t4, s7\n\t" + "xor s8, t5, s8\n\t" + "xor s9, t6, s9\n\t" + "xor s10, s1, s10\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 16(%[key])\n\t" + "lw t5, 20(%[key])\n\t" + "lw t6, 24(%[key])\n\t" + "lw s1, 28(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 32(%[key])\n\t" + "lw t5, 36(%[key])\n\t" + "lw t6, 40(%[key])\n\t" + "lw s1, 44(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 48(%[key])\n\t" + "lw t5, 52(%[key])\n\t" + "lw t6, 56(%[key])\n\t" + "lw s1, 60(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 64(%[key])\n\t" + "lw t5, 68(%[key])\n\t" + "lw t6, 72(%[key])\n\t" + "lw s1, 76(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 80(%[key])\n\t" + "lw t5, 84(%[key])\n\t" + "lw t6, 88(%[key])\n\t" + "lw s1, 92(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 96(%[key])\n\t" + "lw t5, 100(%[key])\n\t" + "lw t6, 104(%[key])\n\t" + "lw s1, 108(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 112(%[key])\n\t" + "lw t5, 116(%[key])\n\t" + "lw t6, 120(%[key])\n\t" + "lw s1, 124(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 128(%[key])\n\t" + "lw t5, 132(%[key])\n\t" + "lw t6, 136(%[key])\n\t" + "lw s1, 140(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 144(%[key])\n\t" + "lw t5, 148(%[key])\n\t" + "lw t6, 152(%[key])\n\t" + "lw s1, 156(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 10\n\t" + "ble %[nr], s2, L_AES_dec_block_13_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 160(%[key])\n\t" + "lw t5, 164(%[key])\n\t" + "lw t6, 168(%[key])\n\t" + "lw s1, 172(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 176(%[key])\n\t" + "lw t5, 180(%[key])\n\t" + "lw t6, 184(%[key])\n\t" + "lw s1, 188(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "li s2, 12\n\t" + "ble %[nr], s2, L_AES_dec_block_13_done\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s7, 0(t4)\n\t" + "lw s8, 0(t5)\n\t" + "lw s9, 0(t6)\n\t" + "lw s10, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s6, 14\n\t" + "srliw t5, s3, 14\n\t" + "srliw t6, s4, 14\n\t" + "srliw s1, s5, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s5, 6\n\t" + "srliw t5, s6, 6\n\t" + "srliw t6, s3, 6\n\t" + "srliw s1, s4, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "lw t4, 192(%[key])\n\t" + "lw t5, 196(%[key])\n\t" + "lw t6, 200(%[key])\n\t" + "lw s1, 204(%[key])\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + "srliw t4, s7, 24\n\t" + "srliw t5, s8, 24\n\t" + "srliw t6, s9, 24\n\t" + "srliw s1, s10, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, %[td]\n\t" + "sh2add t5, t5, %[td]\n\t" + "sh2add t6, t6, %[td]\n\t" + "sh2add s1, s1, %[td]\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, %[td]\n\t" + "add t5, t5, %[td]\n\t" + "add t6, t6, %[td]\n\t" + "add s1, s1, %[td]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw s3, 0(t4)\n\t" + "lw s4, 0(t5)\n\t" + "lw s5, 0(t6)\n\t" + "lw s6, 0(s1)\n\t" + "addi s2, %[td], 1024\n\t" + "srliw t4, s10, 14\n\t" + "srliw t5, s7, 14\n\t" + "srliw t6, s8, 14\n\t" + "srliw s1, s9, 14\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "srliw t4, s9, 6\n\t" + "srliw t5, s10, 6\n\t" + "srliw t6, s7, 6\n\t" + "srliw s1, s8, 6\n\t" + "andi t4, t4, 1020\n\t" + "andi t5, t5, 1020\n\t" + "andi t6, t6, 1020\n\t" + "andi s1, s1, 1020\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "addi s2, s2, 1024\n\t" + "andi t4, s8, 255\n\t" + "andi t5, s9, 255\n\t" + "andi t6, s10, 255\n\t" + "andi s1, s7, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t4, t4, s2\n\t" + "sh2add t5, t5, s2\n\t" + "sh2add t6, t6, s2\n\t" + "sh2add s1, s1, s2\n\t" +#else + "slliw t4, t4, 2\n\t" + "slliw t5, t5, 2\n\t" + "slliw t6, t6, 2\n\t" + "slliw s1, s1, 2\n\t" + "add t4, t4, s2\n\t" + "add t5, t5, s2\n\t" + "add t6, t6, s2\n\t" + "add s1, s1, s2\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t4, 0(t4)\n\t" + "lw t5, 0(t5)\n\t" + "lw t6, 0(t6)\n\t" + "lw s1, 0(s1)\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "lw t4, 208(%[key])\n\t" + "lw t5, 212(%[key])\n\t" + "lw t6, 216(%[key])\n\t" + "lw s1, 220(%[key])\n\t" + "xor s3, s3, t4\n\t" + "xor s4, s4, t5\n\t" + "xor s5, s5, t6\n\t" + "xor s6, s6, s1\n\t" + "\n" + "L_AES_dec_block_13_done:\n\t" + "srliw t4, s3, 24\n\t" + "srliw t5, s4, 24\n\t" + "srliw t6, s5, 24\n\t" + "srliw s1, s6, 24\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu s7, 0(t4)\n\t" + "lbu s8, 0(t5)\n\t" + "lbu s9, 0(t6)\n\t" + "lbu s10, 0(s1)\n\t" + "slli s7, s7, 24\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 24\n\t" + "slli s10, s10, 24\n\t" + "srliw t4, s6, 16\n\t" + "srliw t5, s3, 16\n\t" + "srliw t6, s4, 16\n\t" + "srliw s1, s5, 16\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi s1, s1, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "slli t4, t4, 16\n\t" + "slli t5, t5, 16\n\t" + "slli t6, t6, 16\n\t" + "slli s1, s1, 16\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "srliw t4, s5, 8\n\t" + "srliw t5, s6, 8\n\t" + "srliw t6, s3, 8\n\t" + "srliw s1, s4, 8\n\t" + "andi t4, t4, 255\n\t" + "andi t5, t5, 255\n\t" + "andi t6, t6, 255\n\t" + "andi s1, s1, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "slli t4, t4, 8\n\t" + "slli t5, t5, 8\n\t" + "slli t6, t6, 8\n\t" + "slli s1, s1, 8\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "andi t4, s4, 255\n\t" + "andi t5, s5, 255\n\t" + "andi t6, s6, 255\n\t" + "andi s1, s3, 255\n\t" + "add t4, t4, %[td4]\n\t" + "add t5, t5, %[td4]\n\t" + "add t6, t6, %[td4]\n\t" + "add s1, s1, %[td4]\n\t" + "lbu t4, 0(t4)\n\t" + "lbu t5, 0(t5)\n\t" + "lbu t6, 0(t6)\n\t" + "lbu s1, 0(s1)\n\t" + "or s7, s7, t4\n\t" + "or s8, s8, t5\n\t" + "or s9, s9, t6\n\t" + "or s10, s10, s1\n\t" + "slli s2, %[nr], 4\n\t" + "add s2, %[key], s2\n\t" + "lw t4, 0(s2)\n\t" + "lw t5, 4(s2)\n\t" + "lw t6, 8(s2)\n\t" + "lw s1, 12(s2)\n\t" + "xor s7, s7, t4\n\t" + "xor s8, s8, t5\n\t" + "xor s9, s9, t6\n\t" + "xor s10, s10, s1\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t4, s7, 24\n\t" + "srli t5, s8, 24\n\t" + "srli t6, s9, 24\n\t" + "srli s1, s10, 24\n\t" + "sb t4, 0(t0)\n\t" + "sb t5, 4(t0)\n\t" + "sb t6, 8(t0)\n\t" + "sb s1, 12(t0)\n\t" + "srli t4, s7, 16\n\t" + "srli t5, s8, 16\n\t" + "srli t6, s9, 16\n\t" + "srli s1, s10, 16\n\t" + "sb t4, 1(t0)\n\t" + "sb t5, 5(t0)\n\t" + "sb t6, 9(t0)\n\t" + "sb s1, 13(t0)\n\t" + "srli t4, s7, 8\n\t" + "srli t5, s8, 8\n\t" + "srli t6, s9, 8\n\t" + "srli s1, s10, 8\n\t" + "sb t4, 2(t0)\n\t" + "sb t5, 6(t0)\n\t" + "sb t6, 10(t0)\n\t" + "sb s1, 14(t0)\n\t" + "sb s7, 3(t0)\n\t" + "sb s8, 7(t0)\n\t" + "sb s9, 11(t0)\n\t" + "sb s10, 15(t0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t4, s7, 32\n\t" + "slli t5, s8, 32\n\t" + "slli t6, s9, 32\n\t" + "slli s1, s10, 32\n\t" + "srli t5, t5, 32\n\t" + "srli s1, s1, 32\n\t" + "or t5, t5, t4\n\t" + "or s1, s1, t6\n\t" +#else + /* pack t5, s8, s7 */ + ".word 0x097c4f33\n\t" + /* pack s1, s10, s9 */ + ".word 0x099d44b3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t5, t5 */ + ".word 0x6b8f5f13\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "sd t5, 0(t0)\n\t" + "sd s1, 8(t0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "xor t4, t4, t1\n\t" + "xor t5, t5, t2\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t4, 0(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd27_w_%=\n\t" + "sd t4, 0(%[out])\n\t" + "j L_ualn_sd27_e_%=\n\t" + "\n" + "L_ualn_sd27_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd27_h_%=\n\t" + "sw t4, 0(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sw t6, 4(%[out])\n\t" + "j L_ualn_sd27_e_%=\n\t" + "\n" + "L_ualn_sd27_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd27_b_%=\n\t" + "sh t4, 0(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sh t6, 2(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sh t6, 4(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sh t6, 6(%[out])\n\t" + "j L_ualn_sd27_e_%=\n\t" + "\n" + "L_ualn_sd27_b_%=:\n\t" + "sb t4, 0(%[out])\n\t" + "srli t6, t4, 8\n\t" + "sb t6, 1(%[out])\n\t" + "srli t6, t4, 16\n\t" + "sb t6, 2(%[out])\n\t" + "srli t6, t4, 24\n\t" + "sb t6, 3(%[out])\n\t" + "srli t6, t4, 32\n\t" + "sb t6, 4(%[out])\n\t" + "srli t6, t4, 40\n\t" + "sb t6, 5(%[out])\n\t" + "srli t6, t4, 48\n\t" + "sb t6, 6(%[out])\n\t" + "srli t6, t4, 56\n\t" + "sb t6, 7(%[out])\n\t" + "\n" + "L_ualn_sd27_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t5, 8(%[out])\n\t" +#else + "andi t6, %[out], 7\n\t" + "bnez t6, L_ualn_sd28_w_%=\n\t" + "sd t5, 8(%[out])\n\t" + "j L_ualn_sd28_e_%=\n\t" + "\n" + "L_ualn_sd28_w_%=:\n\t" + "andi t6, t6, 3\n\t" + "bnez t6, L_ualn_sd28_h_%=\n\t" + "sw t5, 8(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sw t6, 12(%[out])\n\t" + "j L_ualn_sd28_e_%=\n\t" + "\n" + "L_ualn_sd28_h_%=:\n\t" + "andi t6, t6, 1\n\t" + "bnez t6, L_ualn_sd28_b_%=\n\t" + "sh t5, 8(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sh t6, 10(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sh t6, 12(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sh t6, 14(%[out])\n\t" + "j L_ualn_sd28_e_%=\n\t" + "\n" + "L_ualn_sd28_b_%=:\n\t" + "sb t5, 8(%[out])\n\t" + "srli t6, t5, 8\n\t" + "sb t6, 9(%[out])\n\t" + "srli t6, t5, 16\n\t" + "sb t6, 10(%[out])\n\t" + "srli t6, t5, 24\n\t" + "sb t6, 11(%[out])\n\t" + "srli t6, t5, 32\n\t" + "sb t6, 12(%[out])\n\t" + "srli t6, t5, 40\n\t" + "sb t6, 13(%[out])\n\t" + "srli t6, t5, 48\n\t" + "sb t6, 14(%[out])\n\t" + "srli t6, t5, 56\n\t" + "sb t6, 15(%[out])\n\t" + "\n" + "L_ualn_sd28_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "\n" + "L_AES_XTS_decrypt_RISCV64_done:\n\t" + "ld ra, 16(sp)\n\t" + "addi sp, sp, 48\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), [i] "+r" (i), + [key] "+r" (key), [key2] "+r" (key2), [tmp] "+r" (tmp), + [nr] "+r" (nr) + : [te] "r" (te), [td] "r" (td), [td4] "r" (td4) + : "memory", "t0", "t1", "t2", "t4", "t5", "t6", "s1", "s2", "s3", "s4", + "s5", "s6", "s7", "s8", "s9", "s10" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_XTS */ +#ifdef HAVE_AESGCM +void AES_GCM_encrypt_RISCV64(const byte* in_p, byte* out_p, word32 sz_p, + const byte* nonce_p, word32 nonceSz_p, byte* tag_p, word32 tagSz_p, + const byte* aad_p, word32 aadSz_p, byte* key_p, byte* m0_p, byte* tmp_p, + byte* reg_p, int nr_p) +{ + register const byte* in __asm__ ("a0") = (const byte*)in_p; + register byte* out __asm__ ("a1") = (byte*)out_p; + register word32 sz __asm__ ("a2") = (word32)sz_p; + register const byte* nonce __asm__ ("a3") = (const byte*)nonce_p; + register word32 nonceSz __asm__ ("a4") = (word32)nonceSz_p; + register byte* tag __asm__ ("a5") = (byte*)tag_p; + register word32 tagSz __asm__ ("a6") = (word32)tagSz_p; + register const byte* aad __asm__ ("a7") = (const byte*)aad_p; + register word32 aadSz __asm__ ("t1") = (word32)aadSz_p; + register byte* key __asm__ ("t2") = (byte*)key_p; + register byte* m0 __asm__ ("t3") = (byte*)m0_p; + register byte* tmp __asm__ ("t4") = (byte*)tmp_p; + register byte* reg __asm__ ("t5") = (byte*)reg_p; + register int nr __asm__ ("t6") = (int)nr_p; + + const word8* r = L_AES_base_gcm_r; + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "sd %[aadSz], 0(sp)\n\t" + "sd %[key], 8(sp)\n\t" + "sd %[m0], 16(sp)\n\t" + "sd %[tmp], 24(sp)\n\t" + "sd %[reg], 32(sp)\n\t" + "sd %[nr], 40(sp)\n\t" + "addi sp, sp, -96\n\t" + "ld s1, 104(sp)\n\t" + "ld s2, 112(sp)\n\t" + "ld s3, 120(sp)\n\t" + "ld s4, 128(sp)\n\t" + "ld s5, 136(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 48(sp)\n\t" + "sd %[nonce], 56(sp)\n\t" + "sd %[nonceSz], 64(sp)\n\t" + "sd %[tag], 72(sp)\n\t" + "sd %[tagSz], 80(sp)\n\t" + "sd %[aad], 88(sp)\n\t" + "ld t0, 64(sp)\n\t" + "li t1, 12\n\t" + "bne t0, t1, L_AES_GCM_encrypt_RISCV64_nonce_ghash\n\t" + "ld t2, 56(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 0(t2)\n\t" +#else + "andi t0, t2, 7\n\t" + "bnez t0, L_ualn_ld29_w_%=\n\t" + "ld t3, 0(t2)\n\t" + "j L_ualn_ld29_e_%=\n\t" + "\n" + "L_ualn_ld29_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld29_h_%=\n\t" + "lwu t3, 0(t2)\n\t" + "lwu t0, 4(t2)\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld29_e_%=\n\t" + "\n" + "L_ualn_ld29_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld29_b_%=\n\t" + "lhu t3, 0(t2)\n\t" + "lhu t0, 2(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 4(t2)\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 6(t2)\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld29_e_%=\n\t" + "\n" + "L_ualn_ld29_b_%=:\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t0, 1(t2)\n\t" + "slli t0, t0, 8\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 2(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 3(t2)\n\t" + "slli t0, t0, 24\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 4(t2)\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 5(t2)\n\t" + "slli t0, t0, 40\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 6(t2)\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 7(t2)\n\t" + "slli t0, t0, 56\n\t" + "or t3, t3, t0\n\t" + "\n" + "L_ualn_ld29_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t3, 0(s4)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t3, 8(t2)\n\t" +#else + "andi t0, t2, 3\n\t" + "bnez t0, L_ualn_lw30_h_%=\n\t" + "lw t3, 8(t2)\n\t" + "j L_ualn_lw30_e_%=\n\t" + "\n" + "L_ualn_lw30_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_lw30_b_%=\n\t" + "lhu t3, 8(t2)\n\t" + "lhu t0, 10(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "addiw t3, t3, 0\n\t" + "j L_ualn_lw30_e_%=\n\t" + "\n" + "L_ualn_lw30_b_%=:\n\t" + "lbu t3, 8(t2)\n\t" + "lbu t0, 9(t2)\n\t" + "slli t0, t0, 8\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 10(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 11(t2)\n\t" + "slli t0, t0, 24\n\t" + "or t3, t3, t0\n\t" + "addiw t3, t3, 0\n\t" + "\n" + "L_ualn_lw30_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t3, 8(s4)\n\t" + "sb zero, 12(s4)\n\t" + "sb zero, 13(s4)\n\t" + "sb zero, 14(s4)\n\t" + "li t3, 1\n\t" + "sb t3, 15(s4)\n\t" + "j L_AES_GCM_encrypt_RISCV64_counter_done\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_nonce_ghash:\n\t" + "sd zero, 0(s3)\n\t" + "sd zero, 8(s3)\n\t" + "ld s9, 56(sp)\n\t" + "ld s10, 64(sp)\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_nonce_block_loop:\n\t" + "li t0, 16\n\t" + "blt s10, t0, L_AES_GCM_encrypt_RISCV64_nonce_partial\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld31_w_%=\n\t" + "ld t0, 0(s9)\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld31_h_%=\n\t" + "lwu t0, 0(s9)\n\t" + "lwu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld31_b_%=\n\t" + "lhu t0, 0(s9)\n\t" + "lhu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_b_%=:\n\t" + "lbu t0, 0(s9)\n\t" + "lbu t4, 1(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld31_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld32_w_%=\n\t" + "ld t1, 8(s9)\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld32_h_%=\n\t" + "lwu t1, 8(s9)\n\t" + "lwu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld32_b_%=\n\t" + "lhu t1, 8(s9)\n\t" + "lhu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_b_%=:\n\t" + "lbu t1, 8(s9)\n\t" + "lbu t4, 9(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld32_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult0:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done0\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult0\n\t" + "\n" + "L_AES_GCM_gmult_done0:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult0:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done0\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult0\n\t" + "\n" + "L_AES_GCM_gmult_done0:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult0:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit0:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip0\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip0:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next0\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next0:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit0\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult0\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s9, s9, 16\n\t" + "addi s10, s10, -16\n\t" + "j L_AES_GCM_encrypt_RISCV64_nonce_block_loop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_nonce_partial:\n\t" + "beqz s10, L_AES_GCM_encrypt_RISCV64_nonce_partial_done\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "li t1, 0\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_nonce_partial_byte:\n\t" + "add t2, s9, t1\n\t" + "lbu t2, 0(t2)\n\t" + "addi t3, sp, 32\n\t" + "add t3, t3, t1\n\t" + "sb t2, 0(t3)\n\t" + "addi t1, t1, 1\n\t" + "blt t1, s10, L_AES_GCM_encrypt_RISCV64_nonce_partial_byte\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld33_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld33_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld33_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld33_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld34_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld34_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld34_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld34_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult1:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done1\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult1\n\t" + "\n" + "L_AES_GCM_gmult_done1:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult1:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done1\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult1\n\t" + "\n" + "L_AES_GCM_gmult_done1:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult1:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit1:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip1\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip1:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next1\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next1:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit1\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult1\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "\n" + "L_AES_GCM_encrypt_RISCV64_nonce_partial_done:\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "ld t0, 64(sp)\n\t" + "slli t0, t0, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 43(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 44(sp)\n\t" + "sb t2, 45(sp)\n\t" + "sb t3, 46(sp)\n\t" + "sb t0, 47(sp)\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld35_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld35_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld35_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld35_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld36_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld36_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld36_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld36_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult2:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done2\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult2\n\t" + "\n" + "L_AES_GCM_gmult_done2:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult2:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done2\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult2\n\t" + "\n" + "L_AES_GCM_gmult_done2:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult2:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit2:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip2\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip2:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next2\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next2:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit2\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult2\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "ld t0, 0(s3)\n\t" + "sd t0, 0(s4)\n\t" + "ld t0, 8(s3)\n\t" + "sd t0, 8(s4)\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_counter_done:\n\t" + "addi s0, sp, 0\n\t" + "mv s8, %[in]\n\t" + "mv %[nonce], %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s4)\n\t" + "lbu t1, 4(s4)\n\t" + "lbu t2, 8(s4)\n\t" + "lbu t3, 12(s4)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s4)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s4)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s4)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw %[nonceSz], 0(s1)\n\t" + "lw %[tag], 4(s1)\n\t" + "lw %[tagSz], 8(s1)\n\t" + "lw %[aad], 12(s1)\n\t" + "xor %[nonceSz], t0, %[nonceSz]\n\t" + "xor %[tag], t1, %[tag]\n\t" + "xor %[tagSz], t2, %[tagSz]\n\t" + "xor %[aad], t3, %[aad]\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 16(s1)\n\t" + "lw t1, 20(s1)\n\t" + "lw t2, 24(s1)\n\t" + "lw t3, 28(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 32(s1)\n\t" + "lw t1, 36(s1)\n\t" + "lw t2, 40(s1)\n\t" + "lw t3, 44(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 48(s1)\n\t" + "lw t1, 52(s1)\n\t" + "lw t2, 56(s1)\n\t" + "lw t3, 60(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 64(s1)\n\t" + "lw t1, 68(s1)\n\t" + "lw t2, 72(s1)\n\t" + "lw t3, 76(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 80(s1)\n\t" + "lw t1, 84(s1)\n\t" + "lw t2, 88(s1)\n\t" + "lw t3, 92(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 96(s1)\n\t" + "lw t1, 100(s1)\n\t" + "lw t2, 104(s1)\n\t" + "lw t3, 108(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 112(s1)\n\t" + "lw t1, 116(s1)\n\t" + "lw t2, 120(s1)\n\t" + "lw t3, 124(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 128(s1)\n\t" + "lw t1, 132(s1)\n\t" + "lw t2, 136(s1)\n\t" + "lw t3, 140(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 144(s1)\n\t" + "lw t1, 148(s1)\n\t" + "lw t2, 152(s1)\n\t" + "lw t3, 156(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 10\n\t" + "ble s5, t4, L_AES_enc_block_14_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 160(s1)\n\t" + "lw t1, 164(s1)\n\t" + "lw t2, 168(s1)\n\t" + "lw t3, 172(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 176(s1)\n\t" + "lw t1, 180(s1)\n\t" + "lw t2, 184(s1)\n\t" + "lw t3, 188(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 12\n\t" + "ble s5, t4, L_AES_enc_block_14_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 192(s1)\n\t" + "lw t1, 196(s1)\n\t" + "lw t2, 200(s1)\n\t" + "lw t3, 204(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 208(s1)\n\t" + "lw t1, 212(s1)\n\t" + "lw t2, 216(s1)\n\t" + "lw t3, 220(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "\n" + "L_AES_enc_block_14_done:\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "li t4, 65280\n\t" + "and %[nonceSz], %[nonceSz], t4\n\t" + "and %[tag], %[tag], t4\n\t" + "and %[tagSz], %[tagSz], t4\n\t" + "and %[aad], %[aad], t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "slli t4, s5, 4\n\t" + "add t4, s1, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, %[nonceSz], 24\n\t" + "srli t1, %[tag], 24\n\t" + "srli t2, %[tagSz], 24\n\t" + "srli t3, %[aad], 24\n\t" + "sb t0, 0(s0)\n\t" + "sb t1, 4(s0)\n\t" + "sb t2, 8(s0)\n\t" + "sb t3, 12(s0)\n\t" + "srli t0, %[nonceSz], 16\n\t" + "srli t1, %[tag], 16\n\t" + "srli t2, %[tagSz], 16\n\t" + "srli t3, %[aad], 16\n\t" + "sb t0, 1(s0)\n\t" + "sb t1, 5(s0)\n\t" + "sb t2, 9(s0)\n\t" + "sb t3, 13(s0)\n\t" + "srli t0, %[nonceSz], 8\n\t" + "srli t1, %[tag], 8\n\t" + "srli t2, %[tagSz], 8\n\t" + "srli t3, %[aad], 8\n\t" + "sb t0, 2(s0)\n\t" + "sb t1, 6(s0)\n\t" + "sb t2, 10(s0)\n\t" + "sb t3, 14(s0)\n\t" + "sb %[nonceSz], 3(s0)\n\t" + "sb %[tag], 7(s0)\n\t" + "sb %[tagSz], 11(s0)\n\t" + "sb %[aad], 15(s0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, %[nonceSz], 32\n\t" + "slli t1, %[tag], 32\n\t" + "slli t2, %[tagSz], 32\n\t" + "slli t3, %[aad], 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(s0)\n\t" + "sd t3, 8(s0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv %[in], s8\n\t" + "mv %[out], %[nonce]\n\t" + "ld t0, 0(sp)\n\t" + "sd t0, 16(sp)\n\t" + "ld t0, 8(sp)\n\t" + "sd t0, 24(sp)\n\t" + "sd zero, 0(s3)\n\t" + "sd zero, 8(s3)\n\t" + "ld s9, 88(sp)\n\t" + "ld s10, 96(sp)\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_block_loop:\n\t" + "li t0, 16\n\t" + "blt s10, t0, L_AES_GCM_encrypt_RISCV64_aad_partial\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld37_w_%=\n\t" + "ld t0, 0(s9)\n\t" + "j L_ualn_ld37_e_%=\n\t" + "\n" + "L_ualn_ld37_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld37_h_%=\n\t" + "lwu t0, 0(s9)\n\t" + "lwu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld37_e_%=\n\t" + "\n" + "L_ualn_ld37_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld37_b_%=\n\t" + "lhu t0, 0(s9)\n\t" + "lhu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld37_e_%=\n\t" + "\n" + "L_ualn_ld37_b_%=:\n\t" + "lbu t0, 0(s9)\n\t" + "lbu t4, 1(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld37_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld38_w_%=\n\t" + "ld t1, 8(s9)\n\t" + "j L_ualn_ld38_e_%=\n\t" + "\n" + "L_ualn_ld38_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld38_h_%=\n\t" + "lwu t1, 8(s9)\n\t" + "lwu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld38_e_%=\n\t" + "\n" + "L_ualn_ld38_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld38_b_%=\n\t" + "lhu t1, 8(s9)\n\t" + "lhu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld38_e_%=\n\t" + "\n" + "L_ualn_ld38_b_%=:\n\t" + "lbu t1, 8(s9)\n\t" + "lbu t4, 9(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld38_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult3:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done3\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult3\n\t" + "\n" + "L_AES_GCM_gmult_done3:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult3:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done3\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult3\n\t" + "\n" + "L_AES_GCM_gmult_done3:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult3:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit3:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip3\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip3:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next3\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next3:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit3\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult3\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s9, s9, 16\n\t" + "addi s10, s10, -16\n\t" + "j L_AES_GCM_encrypt_RISCV64_aad_block_loop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_partial:\n\t" + "beqz s10, L_AES_GCM_encrypt_RISCV64_aad_partial_done\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "li t1, 0\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_partial_byte:\n\t" + "add t2, s9, t1\n\t" + "lbu t2, 0(t2)\n\t" + "addi t3, sp, 32\n\t" + "add t3, t3, t1\n\t" + "sb t2, 0(t3)\n\t" + "addi t1, t1, 1\n\t" + "blt t1, s10, L_AES_GCM_encrypt_RISCV64_aad_partial_byte\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld39_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld39_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld39_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld39_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld40_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld40_e_%=\n\t" + "\n" + "L_ualn_ld40_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld40_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld40_e_%=\n\t" + "\n" + "L_ualn_ld40_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld40_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld40_e_%=\n\t" + "\n" + "L_ualn_ld40_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld40_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult4:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done4\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult4\n\t" + "\n" + "L_AES_GCM_gmult_done4:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult4:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult4\n\t" + "\n" + "L_AES_GCM_gmult_done4:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult4:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit4:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip4\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip4:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next4\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next4:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit4\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult4\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "\n" + "L_AES_GCM_encrypt_RISCV64_aad_partial_done:\n\t" + "srli s10, %[sz], 4\n\t" + "beqz s10, L_AES_GCM_encrypt_RISCV64_blocks_done\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_block_loop:\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + "lwu t0, 12(s4)\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "srli t0, t0, 32\n\t" + "addi t0, t0, 1\n\t" + "slli t0, t0, 32\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "sw t0, 12(s4)\n\t" +#else + "lbu t0, 12(s4)\n\t" + "lbu t1, 13(s4)\n\t" + "lbu t2, 14(s4)\n\t" + "lbu t3, 15(s4)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s4)\n\t" + "sb t2, 13(s4)\n\t" + "sb t3, 14(s4)\n\t" + "sb t0, 15(s4)\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "addi s0, sp, 0\n\t" + "mv s8, %[in]\n\t" + "mv %[nonce], %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s4)\n\t" + "lbu t1, 4(s4)\n\t" + "lbu t2, 8(s4)\n\t" + "lbu t3, 12(s4)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s4)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s4)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s4)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw %[nonceSz], 0(s1)\n\t" + "lw %[tag], 4(s1)\n\t" + "lw %[tagSz], 8(s1)\n\t" + "lw %[aad], 12(s1)\n\t" + "xor %[nonceSz], t0, %[nonceSz]\n\t" + "xor %[tag], t1, %[tag]\n\t" + "xor %[tagSz], t2, %[tagSz]\n\t" + "xor %[aad], t3, %[aad]\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 16(s1)\n\t" + "lw t1, 20(s1)\n\t" + "lw t2, 24(s1)\n\t" + "lw t3, 28(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 32(s1)\n\t" + "lw t1, 36(s1)\n\t" + "lw t2, 40(s1)\n\t" + "lw t3, 44(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 48(s1)\n\t" + "lw t1, 52(s1)\n\t" + "lw t2, 56(s1)\n\t" + "lw t3, 60(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 64(s1)\n\t" + "lw t1, 68(s1)\n\t" + "lw t2, 72(s1)\n\t" + "lw t3, 76(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 80(s1)\n\t" + "lw t1, 84(s1)\n\t" + "lw t2, 88(s1)\n\t" + "lw t3, 92(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 96(s1)\n\t" + "lw t1, 100(s1)\n\t" + "lw t2, 104(s1)\n\t" + "lw t3, 108(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 112(s1)\n\t" + "lw t1, 116(s1)\n\t" + "lw t2, 120(s1)\n\t" + "lw t3, 124(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 128(s1)\n\t" + "lw t1, 132(s1)\n\t" + "lw t2, 136(s1)\n\t" + "lw t3, 140(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 144(s1)\n\t" + "lw t1, 148(s1)\n\t" + "lw t2, 152(s1)\n\t" + "lw t3, 156(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 10\n\t" + "ble s5, t4, L_AES_enc_block_15_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 160(s1)\n\t" + "lw t1, 164(s1)\n\t" + "lw t2, 168(s1)\n\t" + "lw t3, 172(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 176(s1)\n\t" + "lw t1, 180(s1)\n\t" + "lw t2, 184(s1)\n\t" + "lw t3, 188(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 12\n\t" + "ble s5, t4, L_AES_enc_block_15_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 192(s1)\n\t" + "lw t1, 196(s1)\n\t" + "lw t2, 200(s1)\n\t" + "lw t3, 204(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 208(s1)\n\t" + "lw t1, 212(s1)\n\t" + "lw t2, 216(s1)\n\t" + "lw t3, 220(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "\n" + "L_AES_enc_block_15_done:\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "li t4, 65280\n\t" + "and %[nonceSz], %[nonceSz], t4\n\t" + "and %[tag], %[tag], t4\n\t" + "and %[tagSz], %[tagSz], t4\n\t" + "and %[aad], %[aad], t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "slli t4, s5, 4\n\t" + "add t4, s1, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, %[nonceSz], 24\n\t" + "srli t1, %[tag], 24\n\t" + "srli t2, %[tagSz], 24\n\t" + "srli t3, %[aad], 24\n\t" + "sb t0, 0(s0)\n\t" + "sb t1, 4(s0)\n\t" + "sb t2, 8(s0)\n\t" + "sb t3, 12(s0)\n\t" + "srli t0, %[nonceSz], 16\n\t" + "srli t1, %[tag], 16\n\t" + "srli t2, %[tagSz], 16\n\t" + "srli t3, %[aad], 16\n\t" + "sb t0, 1(s0)\n\t" + "sb t1, 5(s0)\n\t" + "sb t2, 9(s0)\n\t" + "sb t3, 13(s0)\n\t" + "srli t0, %[nonceSz], 8\n\t" + "srli t1, %[tag], 8\n\t" + "srli t2, %[tagSz], 8\n\t" + "srli t3, %[aad], 8\n\t" + "sb t0, 2(s0)\n\t" + "sb t1, 6(s0)\n\t" + "sb t2, 10(s0)\n\t" + "sb t3, 14(s0)\n\t" + "sb %[nonceSz], 3(s0)\n\t" + "sb %[tag], 7(s0)\n\t" + "sb %[tagSz], 11(s0)\n\t" + "sb %[aad], 15(s0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, %[nonceSz], 32\n\t" + "slli t1, %[tag], 32\n\t" + "slli t2, %[tagSz], 32\n\t" + "slli t3, %[aad], 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(s0)\n\t" + "sd t3, 8(s0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv %[in], s8\n\t" + "mv %[out], %[nonce]\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[in])\n\t" +#else + "andi t0, %[in], 7\n\t" + "bnez t0, L_ualn_ld41_w_%=\n\t" + "ld t2, 0(%[in])\n\t" + "j L_ualn_ld41_e_%=\n\t" + "\n" + "L_ualn_ld41_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld41_h_%=\n\t" + "lwu t2, 0(%[in])\n\t" + "lwu t0, 4(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t2, t2, t0\n\t" + "j L_ualn_ld41_e_%=\n\t" + "\n" + "L_ualn_ld41_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld41_b_%=\n\t" + "lhu t2, 0(%[in])\n\t" + "lhu t0, 2(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t2, t2, t0\n\t" + "lhu t0, 4(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t2, t2, t0\n\t" + "lhu t0, 6(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t2, t2, t0\n\t" + "j L_ualn_ld41_e_%=\n\t" + "\n" + "L_ualn_ld41_b_%=:\n\t" + "lbu t2, 0(%[in])\n\t" + "lbu t0, 1(%[in])\n\t" + "slli t0, t0, 8\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 2(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 3(%[in])\n\t" + "slli t0, t0, 24\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 4(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 5(%[in])\n\t" + "slli t0, t0, 40\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 6(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 7(%[in])\n\t" + "slli t0, t0, 56\n\t" + "or t2, t2, t0\n\t" + "\n" + "L_ualn_ld41_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[in])\n\t" +#else + "andi t0, %[in], 7\n\t" + "bnez t0, L_ualn_ld42_w_%=\n\t" + "ld t3, 8(%[in])\n\t" + "j L_ualn_ld42_e_%=\n\t" + "\n" + "L_ualn_ld42_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld42_h_%=\n\t" + "lwu t3, 8(%[in])\n\t" + "lwu t0, 12(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld42_e_%=\n\t" + "\n" + "L_ualn_ld42_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld42_b_%=\n\t" + "lhu t3, 8(%[in])\n\t" + "lhu t0, 10(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 12(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 14(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld42_e_%=\n\t" + "\n" + "L_ualn_ld42_b_%=:\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t0, 9(%[in])\n\t" + "slli t0, t0, 8\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 10(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 11(%[in])\n\t" + "slli t0, t0, 24\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 12(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 13(%[in])\n\t" + "slli t0, t0, 40\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 14(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 15(%[in])\n\t" + "slli t0, t0, 56\n\t" + "or t3, t3, t0\n\t" + "\n" + "L_ualn_ld42_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "xor t2, t2, t4\n\t" + "xor t3, t3, t5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t0, %[out], 7\n\t" + "bnez t0, L_ualn_sd43_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd43_e_%=\n\t" + "\n" + "L_ualn_sd43_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_sd43_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t0, t2, 32\n\t" + "sw t0, 4(%[out])\n\t" + "j L_ualn_sd43_e_%=\n\t" + "\n" + "L_ualn_sd43_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_sd43_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t0, t2, 16\n\t" + "sh t0, 2(%[out])\n\t" + "srli t0, t2, 32\n\t" + "sh t0, 4(%[out])\n\t" + "srli t0, t2, 48\n\t" + "sh t0, 6(%[out])\n\t" + "j L_ualn_sd43_e_%=\n\t" + "\n" + "L_ualn_sd43_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t0, t2, 8\n\t" + "sb t0, 1(%[out])\n\t" + "srli t0, t2, 16\n\t" + "sb t0, 2(%[out])\n\t" + "srli t0, t2, 24\n\t" + "sb t0, 3(%[out])\n\t" + "srli t0, t2, 32\n\t" + "sb t0, 4(%[out])\n\t" + "srli t0, t2, 40\n\t" + "sb t0, 5(%[out])\n\t" + "srli t0, t2, 48\n\t" + "sb t0, 6(%[out])\n\t" + "srli t0, t2, 56\n\t" + "sb t0, 7(%[out])\n\t" + "\n" + "L_ualn_sd43_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t0, %[out], 7\n\t" + "bnez t0, L_ualn_sd44_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd44_e_%=\n\t" + "\n" + "L_ualn_sd44_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_sd44_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t0, t3, 32\n\t" + "sw t0, 12(%[out])\n\t" + "j L_ualn_sd44_e_%=\n\t" + "\n" + "L_ualn_sd44_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_sd44_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t0, t3, 16\n\t" + "sh t0, 10(%[out])\n\t" + "srli t0, t3, 32\n\t" + "sh t0, 12(%[out])\n\t" + "srli t0, t3, 48\n\t" + "sh t0, 14(%[out])\n\t" + "j L_ualn_sd44_e_%=\n\t" + "\n" + "L_ualn_sd44_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t0, t3, 8\n\t" + "sb t0, 9(%[out])\n\t" + "srli t0, t3, 16\n\t" + "sb t0, 10(%[out])\n\t" + "srli t0, t3, 24\n\t" + "sb t0, 11(%[out])\n\t" + "srli t0, t3, 32\n\t" + "sb t0, 12(%[out])\n\t" + "srli t0, t3, 40\n\t" + "sb t0, 13(%[out])\n\t" + "srli t0, t3, 48\n\t" + "sb t0, 14(%[out])\n\t" + "srli t0, t3, 56\n\t" + "sb t0, 15(%[out])\n\t" + "\n" + "L_ualn_sd44_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t2, 32(sp)\n\t" + "sd t3, 40(sp)\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld45_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld45_e_%=\n\t" + "\n" + "L_ualn_ld45_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld45_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld45_e_%=\n\t" + "\n" + "L_ualn_ld45_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld45_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld45_e_%=\n\t" + "\n" + "L_ualn_ld45_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld45_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld46_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld46_e_%=\n\t" + "\n" + "L_ualn_ld46_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld46_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld46_e_%=\n\t" + "\n" + "L_ualn_ld46_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld46_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld46_e_%=\n\t" + "\n" + "L_ualn_ld46_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld46_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult5:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done5\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult5\n\t" + "\n" + "L_AES_GCM_gmult_done5:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult5:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done5\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult5\n\t" + "\n" + "L_AES_GCM_gmult_done5:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult5:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit5:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip5\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip5:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next5\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next5:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit5\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult5\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi s10, s10, -1\n\t" + "bnez s10, L_AES_GCM_encrypt_RISCV64_block_loop\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_blocks_done:\n\t" + "andi s10, %[sz], 15\n\t" + "beqz s10, L_AES_GCM_encrypt_RISCV64_partial_done\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + "lwu t0, 12(s4)\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "srli t0, t0, 32\n\t" + "addi t0, t0, 1\n\t" + "slli t0, t0, 32\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "sw t0, 12(s4)\n\t" +#else + "lbu t0, 12(s4)\n\t" + "lbu t1, 13(s4)\n\t" + "lbu t2, 14(s4)\n\t" + "lbu t3, 15(s4)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s4)\n\t" + "sb t2, 13(s4)\n\t" + "sb t3, 14(s4)\n\t" + "sb t0, 15(s4)\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "addi s0, sp, 0\n\t" + "mv s8, %[in]\n\t" + "mv %[nonce], %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s4)\n\t" + "lbu t1, 4(s4)\n\t" + "lbu t2, 8(s4)\n\t" + "lbu t3, 12(s4)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s4)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s4)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s4)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw %[nonceSz], 0(s1)\n\t" + "lw %[tag], 4(s1)\n\t" + "lw %[tagSz], 8(s1)\n\t" + "lw %[aad], 12(s1)\n\t" + "xor %[nonceSz], t0, %[nonceSz]\n\t" + "xor %[tag], t1, %[tag]\n\t" + "xor %[tagSz], t2, %[tagSz]\n\t" + "xor %[aad], t3, %[aad]\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 16(s1)\n\t" + "lw t1, 20(s1)\n\t" + "lw t2, 24(s1)\n\t" + "lw t3, 28(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 32(s1)\n\t" + "lw t1, 36(s1)\n\t" + "lw t2, 40(s1)\n\t" + "lw t3, 44(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 48(s1)\n\t" + "lw t1, 52(s1)\n\t" + "lw t2, 56(s1)\n\t" + "lw t3, 60(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 64(s1)\n\t" + "lw t1, 68(s1)\n\t" + "lw t2, 72(s1)\n\t" + "lw t3, 76(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 80(s1)\n\t" + "lw t1, 84(s1)\n\t" + "lw t2, 88(s1)\n\t" + "lw t3, 92(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 96(s1)\n\t" + "lw t1, 100(s1)\n\t" + "lw t2, 104(s1)\n\t" + "lw t3, 108(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 112(s1)\n\t" + "lw t1, 116(s1)\n\t" + "lw t2, 120(s1)\n\t" + "lw t3, 124(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 128(s1)\n\t" + "lw t1, 132(s1)\n\t" + "lw t2, 136(s1)\n\t" + "lw t3, 140(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 144(s1)\n\t" + "lw t1, 148(s1)\n\t" + "lw t2, 152(s1)\n\t" + "lw t3, 156(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 10\n\t" + "ble s5, t4, L_AES_enc_block_16_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 160(s1)\n\t" + "lw t1, 164(s1)\n\t" + "lw t2, 168(s1)\n\t" + "lw t3, 172(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 176(s1)\n\t" + "lw t1, 180(s1)\n\t" + "lw t2, 184(s1)\n\t" + "lw t3, 188(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 12\n\t" + "ble s5, t4, L_AES_enc_block_16_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 192(s1)\n\t" + "lw t1, 196(s1)\n\t" + "lw t2, 200(s1)\n\t" + "lw t3, 204(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 208(s1)\n\t" + "lw t1, 212(s1)\n\t" + "lw t2, 216(s1)\n\t" + "lw t3, 220(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "\n" + "L_AES_enc_block_16_done:\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "li t4, 65280\n\t" + "and %[nonceSz], %[nonceSz], t4\n\t" + "and %[tag], %[tag], t4\n\t" + "and %[tagSz], %[tagSz], t4\n\t" + "and %[aad], %[aad], t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "slli t4, s5, 4\n\t" + "add t4, s1, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, %[nonceSz], 24\n\t" + "srli t1, %[tag], 24\n\t" + "srli t2, %[tagSz], 24\n\t" + "srli t3, %[aad], 24\n\t" + "sb t0, 0(s0)\n\t" + "sb t1, 4(s0)\n\t" + "sb t2, 8(s0)\n\t" + "sb t3, 12(s0)\n\t" + "srli t0, %[nonceSz], 16\n\t" + "srli t1, %[tag], 16\n\t" + "srli t2, %[tagSz], 16\n\t" + "srli t3, %[aad], 16\n\t" + "sb t0, 1(s0)\n\t" + "sb t1, 5(s0)\n\t" + "sb t2, 9(s0)\n\t" + "sb t3, 13(s0)\n\t" + "srli t0, %[nonceSz], 8\n\t" + "srli t1, %[tag], 8\n\t" + "srli t2, %[tagSz], 8\n\t" + "srli t3, %[aad], 8\n\t" + "sb t0, 2(s0)\n\t" + "sb t1, 6(s0)\n\t" + "sb t2, 10(s0)\n\t" + "sb t3, 14(s0)\n\t" + "sb %[nonceSz], 3(s0)\n\t" + "sb %[tag], 7(s0)\n\t" + "sb %[tagSz], 11(s0)\n\t" + "sb %[aad], 15(s0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, %[nonceSz], 32\n\t" + "slli t1, %[tag], 32\n\t" + "slli t2, %[tagSz], 32\n\t" + "slli t3, %[aad], 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(s0)\n\t" + "sd t3, 8(s0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv %[in], s8\n\t" + "mv %[out], %[nonce]\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "li t1, 0\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_partial_byte:\n\t" + "add t2, %[in], t1\n\t" + "lbu t2, 0(t2)\n\t" + "addi t3, sp, 0\n\t" + "add t3, t3, t1\n\t" + "lbu t3, 0(t3)\n\t" + "xor t4, t2, t3\n\t" + "add t5, %[out], t1\n\t" + "sb t4, 0(t5)\n\t" + "addi t5, sp, 32\n\t" + "add t5, t5, t1\n\t" + "sb t4, 0(t5)\n\t" + "addi t1, t1, 1\n\t" + "blt t1, s10, L_AES_GCM_encrypt_RISCV64_partial_byte\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld47_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld47_e_%=\n\t" + "\n" + "L_ualn_ld47_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld47_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld47_e_%=\n\t" + "\n" + "L_ualn_ld47_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld47_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld47_e_%=\n\t" + "\n" + "L_ualn_ld47_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld47_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld48_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld48_e_%=\n\t" + "\n" + "L_ualn_ld48_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld48_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld48_e_%=\n\t" + "\n" + "L_ualn_ld48_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld48_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld48_e_%=\n\t" + "\n" + "L_ualn_ld48_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld48_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult6:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done6\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult6\n\t" + "\n" + "L_AES_GCM_gmult_done6:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult6:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done6\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult6\n\t" + "\n" + "L_AES_GCM_gmult_done6:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult6:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit6:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip6\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip6:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next6\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next6:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit6\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult6\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "\n" + "L_AES_GCM_encrypt_RISCV64_partial_done:\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "ld t0, 96(sp)\n\t" + "slli t0, t0, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 35(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 36(sp)\n\t" + "sb t2, 37(sp)\n\t" + "sb t3, 38(sp)\n\t" + "sb t0, 39(sp)\n\t" + "slli t0, %[sz], 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 43(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 44(sp)\n\t" + "sb t2, 45(sp)\n\t" + "sb t3, 46(sp)\n\t" + "sb t0, 47(sp)\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld49_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld49_e_%=\n\t" + "\n" + "L_ualn_ld49_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld49_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld49_e_%=\n\t" + "\n" + "L_ualn_ld49_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld49_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld49_e_%=\n\t" + "\n" + "L_ualn_ld49_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld49_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld50_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld50_e_%=\n\t" + "\n" + "L_ualn_ld50_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld50_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld50_e_%=\n\t" + "\n" + "L_ualn_ld50_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld50_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld50_e_%=\n\t" + "\n" + "L_ualn_ld50_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld50_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult7:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done7\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult7\n\t" + "\n" + "L_AES_GCM_gmult_done7:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult7:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done7\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult7\n\t" + "\n" + "L_AES_GCM_gmult_done7:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult7:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit7:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip7\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip7:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next7\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next7:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit7\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult7\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" + "ld t2, 16(sp)\n\t" + "ld t3, 24(sp)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "sd t0, 32(sp)\n\t" + "sd t1, 40(sp)\n\t" + "ld %[tag], 72(sp)\n\t" + "ld %[tagSz], 80(sp)\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_encrypt_RISCV64_store_tag:\n\t" + "addi t3, sp, 32\n\t" + "add t3, t3, t2\n\t" + "lbu t3, 0(t3)\n\t" + "add t4, %[tag], t2\n\t" + "sb t3, 0(t4)\n\t" + "addi t2, t2, 1\n\t" + "blt t2, %[tagSz], L_AES_GCM_encrypt_RISCV64_store_tag\n\t" + "ld ra, 48(sp)\n\t" + "addi sp, sp, 96\n\t" + "ld %[aadSz], 0(sp)\n\t" + "ld %[key], 8(sp)\n\t" + "ld %[m0], 16(sp)\n\t" + "ld %[tmp], 24(sp)\n\t" + "ld %[reg], 32(sp)\n\t" + "ld %[nr], 40(sp)\n\t" + "addi sp, sp, 48\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), + [nonce] "+r" (nonce), [nonceSz] "+r" (nonceSz), [tag] "+r" (tag), + [tagSz] "+r" (tagSz), [aad] "+r" (aad), [aadSz] "+r" (aadSz), + [key] "+r" (key), [m0] "+r" (m0), [tmp] "+r" (tmp), [reg] "+r" (reg), + [nr] "+r" (nr) + : [r] "r" (r), [te] "r" (te) + : "memory", "t0", "s1", "s2", "s3", "s4", "s5", "s8", "s9", "s10", + "s11", "s0" + ); +} + +#ifdef HAVE_AES_DECRYPT +int AES_GCM_decrypt_RISCV64(byte* in_p, byte* out_p, word32 sz_p, + const byte* nonce_p, word32 nonceSz_p, const byte* tag_p, word32 tagSz_p, + const byte* aad_p, word32 aadSz_p, byte* key_p, byte* m0_p, byte* tmp_p, + byte* reg_p, int nr_p) +{ + register byte* in __asm__ ("a0") = (byte*)in_p; + register byte* out __asm__ ("a1") = (byte*)out_p; + register word32 sz __asm__ ("a2") = (word32)sz_p; + register const byte* nonce __asm__ ("a3") = (const byte*)nonce_p; + register word32 nonceSz __asm__ ("a4") = (word32)nonceSz_p; + register const byte* tag __asm__ ("a5") = (const byte*)tag_p; + register word32 tagSz __asm__ ("a6") = (word32)tagSz_p; + register const byte* aad __asm__ ("a7") = (const byte*)aad_p; + register word32 aadSz __asm__ ("t1") = (word32)aadSz_p; + register byte* key __asm__ ("t2") = (byte*)key_p; + register byte* m0 __asm__ ("t3") = (byte*)m0_p; + register byte* tmp __asm__ ("t4") = (byte*)tmp_p; + register byte* reg __asm__ ("t5") = (byte*)reg_p; + register int nr __asm__ ("t6") = (int)nr_p; + + const word8* r = L_AES_base_gcm_r; + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "sd %[aadSz], 0(sp)\n\t" + "sd %[key], 8(sp)\n\t" + "sd %[m0], 16(sp)\n\t" + "sd %[tmp], 24(sp)\n\t" + "sd %[reg], 32(sp)\n\t" + "sd %[nr], 40(sp)\n\t" + "addi sp, sp, -96\n\t" + "ld s1, 104(sp)\n\t" + "ld s2, 112(sp)\n\t" + "ld s3, 120(sp)\n\t" + "ld s4, 128(sp)\n\t" + "ld s5, 136(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 48(sp)\n\t" + "sd %[nonce], 56(sp)\n\t" + "sd %[nonceSz], 64(sp)\n\t" + "sd %[tag], 72(sp)\n\t" + "sd %[tagSz], 80(sp)\n\t" + "sd %[aad], 88(sp)\n\t" + "ld t0, 64(sp)\n\t" + "li t1, 12\n\t" + "bne t0, t1, L_AES_GCM_decrypt_RISCV64_nonce_ghash\n\t" + "ld t2, 56(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 0(t2)\n\t" +#else + "andi t0, t2, 7\n\t" + "bnez t0, L_ualn_ld51_w_%=\n\t" + "ld t3, 0(t2)\n\t" + "j L_ualn_ld51_e_%=\n\t" + "\n" + "L_ualn_ld51_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld51_h_%=\n\t" + "lwu t3, 0(t2)\n\t" + "lwu t0, 4(t2)\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld51_e_%=\n\t" + "\n" + "L_ualn_ld51_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld51_b_%=\n\t" + "lhu t3, 0(t2)\n\t" + "lhu t0, 2(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 4(t2)\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 6(t2)\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld51_e_%=\n\t" + "\n" + "L_ualn_ld51_b_%=:\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t0, 1(t2)\n\t" + "slli t0, t0, 8\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 2(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 3(t2)\n\t" + "slli t0, t0, 24\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 4(t2)\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 5(t2)\n\t" + "slli t0, t0, 40\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 6(t2)\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 7(t2)\n\t" + "slli t0, t0, 56\n\t" + "or t3, t3, t0\n\t" + "\n" + "L_ualn_ld51_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t3, 0(s4)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t3, 8(t2)\n\t" +#else + "andi t0, t2, 3\n\t" + "bnez t0, L_ualn_lw52_h_%=\n\t" + "lw t3, 8(t2)\n\t" + "j L_ualn_lw52_e_%=\n\t" + "\n" + "L_ualn_lw52_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_lw52_b_%=\n\t" + "lhu t3, 8(t2)\n\t" + "lhu t0, 10(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "addiw t3, t3, 0\n\t" + "j L_ualn_lw52_e_%=\n\t" + "\n" + "L_ualn_lw52_b_%=:\n\t" + "lbu t3, 8(t2)\n\t" + "lbu t0, 9(t2)\n\t" + "slli t0, t0, 8\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 10(t2)\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 11(t2)\n\t" + "slli t0, t0, 24\n\t" + "or t3, t3, t0\n\t" + "addiw t3, t3, 0\n\t" + "\n" + "L_ualn_lw52_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t3, 8(s4)\n\t" + "sb zero, 12(s4)\n\t" + "sb zero, 13(s4)\n\t" + "sb zero, 14(s4)\n\t" + "li t3, 1\n\t" + "sb t3, 15(s4)\n\t" + "j L_AES_GCM_decrypt_RISCV64_counter_done\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_nonce_ghash:\n\t" + "sd zero, 0(s3)\n\t" + "sd zero, 8(s3)\n\t" + "ld s9, 56(sp)\n\t" + "ld s10, 64(sp)\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_nonce_block_loop:\n\t" + "li t0, 16\n\t" + "blt s10, t0, L_AES_GCM_decrypt_RISCV64_nonce_partial\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld53_w_%=\n\t" + "ld t0, 0(s9)\n\t" + "j L_ualn_ld53_e_%=\n\t" + "\n" + "L_ualn_ld53_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld53_h_%=\n\t" + "lwu t0, 0(s9)\n\t" + "lwu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld53_e_%=\n\t" + "\n" + "L_ualn_ld53_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld53_b_%=\n\t" + "lhu t0, 0(s9)\n\t" + "lhu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld53_e_%=\n\t" + "\n" + "L_ualn_ld53_b_%=:\n\t" + "lbu t0, 0(s9)\n\t" + "lbu t4, 1(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld53_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld54_w_%=\n\t" + "ld t1, 8(s9)\n\t" + "j L_ualn_ld54_e_%=\n\t" + "\n" + "L_ualn_ld54_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld54_h_%=\n\t" + "lwu t1, 8(s9)\n\t" + "lwu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld54_e_%=\n\t" + "\n" + "L_ualn_ld54_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld54_b_%=\n\t" + "lhu t1, 8(s9)\n\t" + "lhu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld54_e_%=\n\t" + "\n" + "L_ualn_ld54_b_%=:\n\t" + "lbu t1, 8(s9)\n\t" + "lbu t4, 9(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld54_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult8:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done8\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult8\n\t" + "\n" + "L_AES_GCM_gmult_done8:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult8:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done8\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult8\n\t" + "\n" + "L_AES_GCM_gmult_done8:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult8:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit8:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip8\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip8:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next8\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next8:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit8\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult8\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s9, s9, 16\n\t" + "addi s10, s10, -16\n\t" + "j L_AES_GCM_decrypt_RISCV64_nonce_block_loop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_nonce_partial:\n\t" + "beqz s10, L_AES_GCM_decrypt_RISCV64_nonce_partial_done\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "li t1, 0\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_nonce_partial_byte:\n\t" + "add t2, s9, t1\n\t" + "lbu t2, 0(t2)\n\t" + "addi t3, sp, 32\n\t" + "add t3, t3, t1\n\t" + "sb t2, 0(t3)\n\t" + "addi t1, t1, 1\n\t" + "blt t1, s10, L_AES_GCM_decrypt_RISCV64_nonce_partial_byte\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld55_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld55_e_%=\n\t" + "\n" + "L_ualn_ld55_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld55_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld55_e_%=\n\t" + "\n" + "L_ualn_ld55_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld55_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld55_e_%=\n\t" + "\n" + "L_ualn_ld55_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld55_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld56_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld56_e_%=\n\t" + "\n" + "L_ualn_ld56_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld56_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld56_e_%=\n\t" + "\n" + "L_ualn_ld56_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld56_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld56_e_%=\n\t" + "\n" + "L_ualn_ld56_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld56_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult9:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done9\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult9\n\t" + "\n" + "L_AES_GCM_gmult_done9:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult9:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done9\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult9\n\t" + "\n" + "L_AES_GCM_gmult_done9:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult9:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit9:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip9\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip9:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next9\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next9:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit9\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult9\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "\n" + "L_AES_GCM_decrypt_RISCV64_nonce_partial_done:\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "ld t0, 64(sp)\n\t" + "slli t0, t0, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 43(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 44(sp)\n\t" + "sb t2, 45(sp)\n\t" + "sb t3, 46(sp)\n\t" + "sb t0, 47(sp)\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld57_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld57_e_%=\n\t" + "\n" + "L_ualn_ld57_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld57_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld57_e_%=\n\t" + "\n" + "L_ualn_ld57_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld57_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld57_e_%=\n\t" + "\n" + "L_ualn_ld57_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld57_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld58_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld58_e_%=\n\t" + "\n" + "L_ualn_ld58_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld58_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld58_e_%=\n\t" + "\n" + "L_ualn_ld58_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld58_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld58_e_%=\n\t" + "\n" + "L_ualn_ld58_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld58_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult10:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done10\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult10\n\t" + "\n" + "L_AES_GCM_gmult_done10:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult10:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done10\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult10\n\t" + "\n" + "L_AES_GCM_gmult_done10:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult10:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit10:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip10\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip10:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next10\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next10:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit10\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult10\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "ld t0, 0(s3)\n\t" + "sd t0, 0(s4)\n\t" + "ld t0, 8(s3)\n\t" + "sd t0, 8(s4)\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_counter_done:\n\t" + "addi s0, sp, 0\n\t" + "mv s8, %[in]\n\t" + "mv %[nonce], %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s4)\n\t" + "lbu t1, 4(s4)\n\t" + "lbu t2, 8(s4)\n\t" + "lbu t3, 12(s4)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s4)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s4)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s4)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw %[nonceSz], 0(s1)\n\t" + "lw %[tag], 4(s1)\n\t" + "lw %[tagSz], 8(s1)\n\t" + "lw %[aad], 12(s1)\n\t" + "xor %[nonceSz], t0, %[nonceSz]\n\t" + "xor %[tag], t1, %[tag]\n\t" + "xor %[tagSz], t2, %[tagSz]\n\t" + "xor %[aad], t3, %[aad]\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 16(s1)\n\t" + "lw t1, 20(s1)\n\t" + "lw t2, 24(s1)\n\t" + "lw t3, 28(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 32(s1)\n\t" + "lw t1, 36(s1)\n\t" + "lw t2, 40(s1)\n\t" + "lw t3, 44(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 48(s1)\n\t" + "lw t1, 52(s1)\n\t" + "lw t2, 56(s1)\n\t" + "lw t3, 60(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 64(s1)\n\t" + "lw t1, 68(s1)\n\t" + "lw t2, 72(s1)\n\t" + "lw t3, 76(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 80(s1)\n\t" + "lw t1, 84(s1)\n\t" + "lw t2, 88(s1)\n\t" + "lw t3, 92(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 96(s1)\n\t" + "lw t1, 100(s1)\n\t" + "lw t2, 104(s1)\n\t" + "lw t3, 108(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 112(s1)\n\t" + "lw t1, 116(s1)\n\t" + "lw t2, 120(s1)\n\t" + "lw t3, 124(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 128(s1)\n\t" + "lw t1, 132(s1)\n\t" + "lw t2, 136(s1)\n\t" + "lw t3, 140(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 144(s1)\n\t" + "lw t1, 148(s1)\n\t" + "lw t2, 152(s1)\n\t" + "lw t3, 156(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 10\n\t" + "ble s5, t4, L_AES_enc_block_17_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 160(s1)\n\t" + "lw t1, 164(s1)\n\t" + "lw t2, 168(s1)\n\t" + "lw t3, 172(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 176(s1)\n\t" + "lw t1, 180(s1)\n\t" + "lw t2, 184(s1)\n\t" + "lw t3, 188(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 12\n\t" + "ble s5, t4, L_AES_enc_block_17_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 192(s1)\n\t" + "lw t1, 196(s1)\n\t" + "lw t2, 200(s1)\n\t" + "lw t3, 204(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 208(s1)\n\t" + "lw t1, 212(s1)\n\t" + "lw t2, 216(s1)\n\t" + "lw t3, 220(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "\n" + "L_AES_enc_block_17_done:\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "li t4, 65280\n\t" + "and %[nonceSz], %[nonceSz], t4\n\t" + "and %[tag], %[tag], t4\n\t" + "and %[tagSz], %[tagSz], t4\n\t" + "and %[aad], %[aad], t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "slli t4, s5, 4\n\t" + "add t4, s1, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, %[nonceSz], 24\n\t" + "srli t1, %[tag], 24\n\t" + "srli t2, %[tagSz], 24\n\t" + "srli t3, %[aad], 24\n\t" + "sb t0, 0(s0)\n\t" + "sb t1, 4(s0)\n\t" + "sb t2, 8(s0)\n\t" + "sb t3, 12(s0)\n\t" + "srli t0, %[nonceSz], 16\n\t" + "srli t1, %[tag], 16\n\t" + "srli t2, %[tagSz], 16\n\t" + "srli t3, %[aad], 16\n\t" + "sb t0, 1(s0)\n\t" + "sb t1, 5(s0)\n\t" + "sb t2, 9(s0)\n\t" + "sb t3, 13(s0)\n\t" + "srli t0, %[nonceSz], 8\n\t" + "srli t1, %[tag], 8\n\t" + "srli t2, %[tagSz], 8\n\t" + "srli t3, %[aad], 8\n\t" + "sb t0, 2(s0)\n\t" + "sb t1, 6(s0)\n\t" + "sb t2, 10(s0)\n\t" + "sb t3, 14(s0)\n\t" + "sb %[nonceSz], 3(s0)\n\t" + "sb %[tag], 7(s0)\n\t" + "sb %[tagSz], 11(s0)\n\t" + "sb %[aad], 15(s0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, %[nonceSz], 32\n\t" + "slli t1, %[tag], 32\n\t" + "slli t2, %[tagSz], 32\n\t" + "slli t3, %[aad], 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(s0)\n\t" + "sd t3, 8(s0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv %[in], s8\n\t" + "mv %[out], %[nonce]\n\t" + "ld t0, 0(sp)\n\t" + "sd t0, 16(sp)\n\t" + "ld t0, 8(sp)\n\t" + "sd t0, 24(sp)\n\t" + "sd zero, 0(s3)\n\t" + "sd zero, 8(s3)\n\t" + "ld s9, 88(sp)\n\t" + "ld s10, 96(sp)\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_block_loop:\n\t" + "li t0, 16\n\t" + "blt s10, t0, L_AES_GCM_decrypt_RISCV64_aad_partial\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld59_w_%=\n\t" + "ld t0, 0(s9)\n\t" + "j L_ualn_ld59_e_%=\n\t" + "\n" + "L_ualn_ld59_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld59_h_%=\n\t" + "lwu t0, 0(s9)\n\t" + "lwu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld59_e_%=\n\t" + "\n" + "L_ualn_ld59_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld59_b_%=\n\t" + "lhu t0, 0(s9)\n\t" + "lhu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld59_e_%=\n\t" + "\n" + "L_ualn_ld59_b_%=:\n\t" + "lbu t0, 0(s9)\n\t" + "lbu t4, 1(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld59_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s9)\n\t" +#else + "andi t4, s9, 7\n\t" + "bnez t4, L_ualn_ld60_w_%=\n\t" + "ld t1, 8(s9)\n\t" + "j L_ualn_ld60_e_%=\n\t" + "\n" + "L_ualn_ld60_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld60_h_%=\n\t" + "lwu t1, 8(s9)\n\t" + "lwu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld60_e_%=\n\t" + "\n" + "L_ualn_ld60_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld60_b_%=\n\t" + "lhu t1, 8(s9)\n\t" + "lhu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld60_e_%=\n\t" + "\n" + "L_ualn_ld60_b_%=:\n\t" + "lbu t1, 8(s9)\n\t" + "lbu t4, 9(s9)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s9)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s9)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s9)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s9)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s9)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s9)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld60_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult11:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done11\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult11\n\t" + "\n" + "L_AES_GCM_gmult_done11:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult11:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done11\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult11\n\t" + "\n" + "L_AES_GCM_gmult_done11:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult11:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit11:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip11\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip11:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next11\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next11:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit11\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult11\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s9, s9, 16\n\t" + "addi s10, s10, -16\n\t" + "j L_AES_GCM_decrypt_RISCV64_aad_block_loop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_partial:\n\t" + "beqz s10, L_AES_GCM_decrypt_RISCV64_aad_partial_done\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "li t1, 0\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_partial_byte:\n\t" + "add t2, s9, t1\n\t" + "lbu t2, 0(t2)\n\t" + "addi t3, sp, 32\n\t" + "add t3, t3, t1\n\t" + "sb t2, 0(t3)\n\t" + "addi t1, t1, 1\n\t" + "blt t1, s10, L_AES_GCM_decrypt_RISCV64_aad_partial_byte\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld61_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld61_e_%=\n\t" + "\n" + "L_ualn_ld61_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld61_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld61_e_%=\n\t" + "\n" + "L_ualn_ld61_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld61_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld61_e_%=\n\t" + "\n" + "L_ualn_ld61_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld61_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld62_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld62_e_%=\n\t" + "\n" + "L_ualn_ld62_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld62_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld62_e_%=\n\t" + "\n" + "L_ualn_ld62_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld62_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld62_e_%=\n\t" + "\n" + "L_ualn_ld62_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld62_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult12:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done12\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult12\n\t" + "\n" + "L_AES_GCM_gmult_done12:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult12:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done12\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult12\n\t" + "\n" + "L_AES_GCM_gmult_done12:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult12:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit12:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip12\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip12:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next12\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next12:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit12\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult12\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "\n" + "L_AES_GCM_decrypt_RISCV64_aad_partial_done:\n\t" + "srli s10, %[sz], 4\n\t" + "beqz s10, L_AES_GCM_decrypt_RISCV64_blocks_done\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_block_loop:\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + "lwu t0, 12(s4)\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "srli t0, t0, 32\n\t" + "addi t0, t0, 1\n\t" + "slli t0, t0, 32\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "sw t0, 12(s4)\n\t" +#else + "lbu t0, 12(s4)\n\t" + "lbu t1, 13(s4)\n\t" + "lbu t2, 14(s4)\n\t" + "lbu t3, 15(s4)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s4)\n\t" + "sb t2, 13(s4)\n\t" + "sb t3, 14(s4)\n\t" + "sb t0, 15(s4)\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "addi s0, sp, 0\n\t" + "mv s8, %[in]\n\t" + "mv %[nonce], %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s4)\n\t" + "lbu t1, 4(s4)\n\t" + "lbu t2, 8(s4)\n\t" + "lbu t3, 12(s4)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s4)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s4)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s4)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw %[nonceSz], 0(s1)\n\t" + "lw %[tag], 4(s1)\n\t" + "lw %[tagSz], 8(s1)\n\t" + "lw %[aad], 12(s1)\n\t" + "xor %[nonceSz], t0, %[nonceSz]\n\t" + "xor %[tag], t1, %[tag]\n\t" + "xor %[tagSz], t2, %[tagSz]\n\t" + "xor %[aad], t3, %[aad]\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 16(s1)\n\t" + "lw t1, 20(s1)\n\t" + "lw t2, 24(s1)\n\t" + "lw t3, 28(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 32(s1)\n\t" + "lw t1, 36(s1)\n\t" + "lw t2, 40(s1)\n\t" + "lw t3, 44(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 48(s1)\n\t" + "lw t1, 52(s1)\n\t" + "lw t2, 56(s1)\n\t" + "lw t3, 60(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 64(s1)\n\t" + "lw t1, 68(s1)\n\t" + "lw t2, 72(s1)\n\t" + "lw t3, 76(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 80(s1)\n\t" + "lw t1, 84(s1)\n\t" + "lw t2, 88(s1)\n\t" + "lw t3, 92(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 96(s1)\n\t" + "lw t1, 100(s1)\n\t" + "lw t2, 104(s1)\n\t" + "lw t3, 108(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 112(s1)\n\t" + "lw t1, 116(s1)\n\t" + "lw t2, 120(s1)\n\t" + "lw t3, 124(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 128(s1)\n\t" + "lw t1, 132(s1)\n\t" + "lw t2, 136(s1)\n\t" + "lw t3, 140(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 144(s1)\n\t" + "lw t1, 148(s1)\n\t" + "lw t2, 152(s1)\n\t" + "lw t3, 156(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 10\n\t" + "ble s5, t4, L_AES_enc_block_18_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 160(s1)\n\t" + "lw t1, 164(s1)\n\t" + "lw t2, 168(s1)\n\t" + "lw t3, 172(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 176(s1)\n\t" + "lw t1, 180(s1)\n\t" + "lw t2, 184(s1)\n\t" + "lw t3, 188(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 12\n\t" + "ble s5, t4, L_AES_enc_block_18_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 192(s1)\n\t" + "lw t1, 196(s1)\n\t" + "lw t2, 200(s1)\n\t" + "lw t3, 204(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 208(s1)\n\t" + "lw t1, 212(s1)\n\t" + "lw t2, 216(s1)\n\t" + "lw t3, 220(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "\n" + "L_AES_enc_block_18_done:\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "li t4, 65280\n\t" + "and %[nonceSz], %[nonceSz], t4\n\t" + "and %[tag], %[tag], t4\n\t" + "and %[tagSz], %[tagSz], t4\n\t" + "and %[aad], %[aad], t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "slli t4, s5, 4\n\t" + "add t4, s1, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, %[nonceSz], 24\n\t" + "srli t1, %[tag], 24\n\t" + "srli t2, %[tagSz], 24\n\t" + "srli t3, %[aad], 24\n\t" + "sb t0, 0(s0)\n\t" + "sb t1, 4(s0)\n\t" + "sb t2, 8(s0)\n\t" + "sb t3, 12(s0)\n\t" + "srli t0, %[nonceSz], 16\n\t" + "srli t1, %[tag], 16\n\t" + "srli t2, %[tagSz], 16\n\t" + "srli t3, %[aad], 16\n\t" + "sb t0, 1(s0)\n\t" + "sb t1, 5(s0)\n\t" + "sb t2, 9(s0)\n\t" + "sb t3, 13(s0)\n\t" + "srli t0, %[nonceSz], 8\n\t" + "srli t1, %[tag], 8\n\t" + "srli t2, %[tagSz], 8\n\t" + "srli t3, %[aad], 8\n\t" + "sb t0, 2(s0)\n\t" + "sb t1, 6(s0)\n\t" + "sb t2, 10(s0)\n\t" + "sb t3, 14(s0)\n\t" + "sb %[nonceSz], 3(s0)\n\t" + "sb %[tag], 7(s0)\n\t" + "sb %[tagSz], 11(s0)\n\t" + "sb %[aad], 15(s0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, %[nonceSz], 32\n\t" + "slli t1, %[tag], 32\n\t" + "slli t2, %[tagSz], 32\n\t" + "slli t3, %[aad], 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(s0)\n\t" + "sd t3, 8(s0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv %[in], s8\n\t" + "mv %[out], %[nonce]\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t2, 0(%[in])\n\t" +#else + "andi t0, %[in], 7\n\t" + "bnez t0, L_ualn_ld63_w_%=\n\t" + "ld t2, 0(%[in])\n\t" + "j L_ualn_ld63_e_%=\n\t" + "\n" + "L_ualn_ld63_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld63_h_%=\n\t" + "lwu t2, 0(%[in])\n\t" + "lwu t0, 4(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t2, t2, t0\n\t" + "j L_ualn_ld63_e_%=\n\t" + "\n" + "L_ualn_ld63_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld63_b_%=\n\t" + "lhu t2, 0(%[in])\n\t" + "lhu t0, 2(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t2, t2, t0\n\t" + "lhu t0, 4(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t2, t2, t0\n\t" + "lhu t0, 6(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t2, t2, t0\n\t" + "j L_ualn_ld63_e_%=\n\t" + "\n" + "L_ualn_ld63_b_%=:\n\t" + "lbu t2, 0(%[in])\n\t" + "lbu t0, 1(%[in])\n\t" + "slli t0, t0, 8\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 2(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 3(%[in])\n\t" + "slli t0, t0, 24\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 4(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 5(%[in])\n\t" + "slli t0, t0, 40\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 6(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t2, t2, t0\n\t" + "lbu t0, 7(%[in])\n\t" + "slli t0, t0, 56\n\t" + "or t2, t2, t0\n\t" + "\n" + "L_ualn_ld63_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[in])\n\t" +#else + "andi t0, %[in], 7\n\t" + "bnez t0, L_ualn_ld64_w_%=\n\t" + "ld t3, 8(%[in])\n\t" + "j L_ualn_ld64_e_%=\n\t" + "\n" + "L_ualn_ld64_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld64_h_%=\n\t" + "lwu t3, 8(%[in])\n\t" + "lwu t0, 12(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld64_e_%=\n\t" + "\n" + "L_ualn_ld64_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld64_b_%=\n\t" + "lhu t3, 8(%[in])\n\t" + "lhu t0, 10(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 12(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lhu t0, 14(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "j L_ualn_ld64_e_%=\n\t" + "\n" + "L_ualn_ld64_b_%=:\n\t" + "lbu t3, 8(%[in])\n\t" + "lbu t0, 9(%[in])\n\t" + "slli t0, t0, 8\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 10(%[in])\n\t" + "slli t0, t0, 16\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 11(%[in])\n\t" + "slli t0, t0, 24\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 12(%[in])\n\t" + "slli t0, t0, 32\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 13(%[in])\n\t" + "slli t0, t0, 40\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 14(%[in])\n\t" + "slli t0, t0, 48\n\t" + "or t3, t3, t0\n\t" + "lbu t0, 15(%[in])\n\t" + "slli t0, t0, 56\n\t" + "or t3, t3, t0\n\t" + "\n" + "L_ualn_ld64_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t4, 0(sp)\n\t" + "ld t5, 8(sp)\n\t" + "xor t2, t2, t4\n\t" + "xor t3, t3, t5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 0(%[out])\n\t" +#else + "andi t0, %[out], 7\n\t" + "bnez t0, L_ualn_sd65_w_%=\n\t" + "sd t2, 0(%[out])\n\t" + "j L_ualn_sd65_e_%=\n\t" + "\n" + "L_ualn_sd65_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_sd65_h_%=\n\t" + "sw t2, 0(%[out])\n\t" + "srli t0, t2, 32\n\t" + "sw t0, 4(%[out])\n\t" + "j L_ualn_sd65_e_%=\n\t" + "\n" + "L_ualn_sd65_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_sd65_b_%=\n\t" + "sh t2, 0(%[out])\n\t" + "srli t0, t2, 16\n\t" + "sh t0, 2(%[out])\n\t" + "srli t0, t2, 32\n\t" + "sh t0, 4(%[out])\n\t" + "srli t0, t2, 48\n\t" + "sh t0, 6(%[out])\n\t" + "j L_ualn_sd65_e_%=\n\t" + "\n" + "L_ualn_sd65_b_%=:\n\t" + "sb t2, 0(%[out])\n\t" + "srli t0, t2, 8\n\t" + "sb t0, 1(%[out])\n\t" + "srli t0, t2, 16\n\t" + "sb t0, 2(%[out])\n\t" + "srli t0, t2, 24\n\t" + "sb t0, 3(%[out])\n\t" + "srli t0, t2, 32\n\t" + "sb t0, 4(%[out])\n\t" + "srli t0, t2, 40\n\t" + "sb t0, 5(%[out])\n\t" + "srli t0, t2, 48\n\t" + "sb t0, 6(%[out])\n\t" + "srli t0, t2, 56\n\t" + "sb t0, 7(%[out])\n\t" + "\n" + "L_ualn_sd65_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t3, 8(%[out])\n\t" +#else + "andi t0, %[out], 7\n\t" + "bnez t0, L_ualn_sd66_w_%=\n\t" + "sd t3, 8(%[out])\n\t" + "j L_ualn_sd66_e_%=\n\t" + "\n" + "L_ualn_sd66_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_sd66_h_%=\n\t" + "sw t3, 8(%[out])\n\t" + "srli t0, t3, 32\n\t" + "sw t0, 12(%[out])\n\t" + "j L_ualn_sd66_e_%=\n\t" + "\n" + "L_ualn_sd66_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_sd66_b_%=\n\t" + "sh t3, 8(%[out])\n\t" + "srli t0, t3, 16\n\t" + "sh t0, 10(%[out])\n\t" + "srli t0, t3, 32\n\t" + "sh t0, 12(%[out])\n\t" + "srli t0, t3, 48\n\t" + "sh t0, 14(%[out])\n\t" + "j L_ualn_sd66_e_%=\n\t" + "\n" + "L_ualn_sd66_b_%=:\n\t" + "sb t3, 8(%[out])\n\t" + "srli t0, t3, 8\n\t" + "sb t0, 9(%[out])\n\t" + "srli t0, t3, 16\n\t" + "sb t0, 10(%[out])\n\t" + "srli t0, t3, 24\n\t" + "sb t0, 11(%[out])\n\t" + "srli t0, t3, 32\n\t" + "sb t0, 12(%[out])\n\t" + "srli t0, t3, 40\n\t" + "sb t0, 13(%[out])\n\t" + "srli t0, t3, 48\n\t" + "sb t0, 14(%[out])\n\t" + "srli t0, t3, 56\n\t" + "sb t0, 15(%[out])\n\t" + "\n" + "L_ualn_sd66_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld67_w_%=\n\t" + "ld t0, 0(%[in])\n\t" + "j L_ualn_ld67_e_%=\n\t" + "\n" + "L_ualn_ld67_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld67_h_%=\n\t" + "lwu t0, 0(%[in])\n\t" + "lwu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld67_e_%=\n\t" + "\n" + "L_ualn_ld67_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld67_b_%=\n\t" + "lhu t0, 0(%[in])\n\t" + "lhu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld67_e_%=\n\t" + "\n" + "L_ualn_ld67_b_%=:\n\t" + "lbu t0, 0(%[in])\n\t" + "lbu t4, 1(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld67_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[in])\n\t" +#else + "andi t4, %[in], 7\n\t" + "bnez t4, L_ualn_ld68_w_%=\n\t" + "ld t1, 8(%[in])\n\t" + "j L_ualn_ld68_e_%=\n\t" + "\n" + "L_ualn_ld68_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld68_h_%=\n\t" + "lwu t1, 8(%[in])\n\t" + "lwu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld68_e_%=\n\t" + "\n" + "L_ualn_ld68_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld68_b_%=\n\t" + "lhu t1, 8(%[in])\n\t" + "lhu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld68_e_%=\n\t" + "\n" + "L_ualn_ld68_b_%=:\n\t" + "lbu t1, 8(%[in])\n\t" + "lbu t4, 9(%[in])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[in])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[in])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[in])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[in])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[in])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[in])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld68_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult13:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done13\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult13\n\t" + "\n" + "L_AES_GCM_gmult_done13:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult13:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done13\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult13\n\t" + "\n" + "L_AES_GCM_gmult_done13:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult13:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit13:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip13\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip13:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next13\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next13:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit13\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult13\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + "addi s10, s10, -1\n\t" + "bnez s10, L_AES_GCM_decrypt_RISCV64_block_loop\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_blocks_done:\n\t" + "andi s10, %[sz], 15\n\t" + "beqz s10, L_AES_GCM_decrypt_RISCV64_partial_done\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + "lwu t0, 12(s4)\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "srli t0, t0, 32\n\t" + "addi t0, t0, 1\n\t" + "slli t0, t0, 32\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "sw t0, 12(s4)\n\t" +#else + "lbu t0, 12(s4)\n\t" + "lbu t1, 13(s4)\n\t" + "lbu t2, 14(s4)\n\t" + "lbu t3, 15(s4)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s4)\n\t" + "sb t2, 13(s4)\n\t" + "sb t3, 14(s4)\n\t" + "sb t0, 15(s4)\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "addi s0, sp, 0\n\t" + "mv s8, %[in]\n\t" + "mv %[nonce], %[out]\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s4)\n\t" + "lbu t1, 4(s4)\n\t" + "lbu t2, 8(s4)\n\t" + "lbu t3, 12(s4)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s4)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s4)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s4)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s4)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s4)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s4)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s4)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw %[nonceSz], 0(s1)\n\t" + "lw %[tag], 4(s1)\n\t" + "lw %[tagSz], 8(s1)\n\t" + "lw %[aad], 12(s1)\n\t" + "xor %[nonceSz], t0, %[nonceSz]\n\t" + "xor %[tag], t1, %[tag]\n\t" + "xor %[tagSz], t2, %[tagSz]\n\t" + "xor %[aad], t3, %[aad]\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 16(s1)\n\t" + "lw t1, 20(s1)\n\t" + "lw t2, 24(s1)\n\t" + "lw t3, 28(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 32(s1)\n\t" + "lw t1, 36(s1)\n\t" + "lw t2, 40(s1)\n\t" + "lw t3, 44(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 48(s1)\n\t" + "lw t1, 52(s1)\n\t" + "lw t2, 56(s1)\n\t" + "lw t3, 60(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 64(s1)\n\t" + "lw t1, 68(s1)\n\t" + "lw t2, 72(s1)\n\t" + "lw t3, 76(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 80(s1)\n\t" + "lw t1, 84(s1)\n\t" + "lw t2, 88(s1)\n\t" + "lw t3, 92(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 96(s1)\n\t" + "lw t1, 100(s1)\n\t" + "lw t2, 104(s1)\n\t" + "lw t3, 108(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 112(s1)\n\t" + "lw t1, 116(s1)\n\t" + "lw t2, 120(s1)\n\t" + "lw t3, 124(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 128(s1)\n\t" + "lw t1, 132(s1)\n\t" + "lw t2, 136(s1)\n\t" + "lw t3, 140(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 144(s1)\n\t" + "lw t1, 148(s1)\n\t" + "lw t2, 152(s1)\n\t" + "lw t3, 156(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 10\n\t" + "ble s5, t4, L_AES_enc_block_19_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 160(s1)\n\t" + "lw t1, 164(s1)\n\t" + "lw t2, 168(s1)\n\t" + "lw t3, 172(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 176(s1)\n\t" + "lw t1, 180(s1)\n\t" + "lw t2, 184(s1)\n\t" + "lw t3, 188(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "li t4, 12\n\t" + "ble s5, t4, L_AES_enc_block_19_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "lw t0, 192(s1)\n\t" + "lw t1, 196(s1)\n\t" + "lw t2, 200(s1)\n\t" + "lw t3, 204(s1)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + "srliw t0, %[nonceSz], 24\n\t" + "srliw t1, %[tag], 24\n\t" + "srliw t2, %[tagSz], 24\n\t" + "srliw t3, %[aad], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw %[in], 0(t2)\n\t" + "lw %[out], 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, %[tag], 14\n\t" + "srliw t1, %[tagSz], 14\n\t" + "srliw t2, %[aad], 14\n\t" + "srliw t3, %[nonceSz], 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, %[tagSz], 6\n\t" + "srliw t1, %[aad], 6\n\t" + "srliw t2, %[nonceSz], 6\n\t" + "srliw t3, %[tag], 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, %[aad], 255\n\t" + "andi t1, %[nonceSz], 255\n\t" + "andi t2, %[tag], 255\n\t" + "andi t3, %[tagSz], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "lw t0, 208(s1)\n\t" + "lw t1, 212(s1)\n\t" + "lw t2, 216(s1)\n\t" + "lw t3, 220(s1)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor %[in], %[in], t2\n\t" + "xor %[out], %[out], t3\n\t" + "\n" + "L_AES_enc_block_19_done:\n\t" + "srliw t0, %[in], 6\n\t" + "srliw t1, %[out], 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw %[nonceSz], 0(t0)\n\t" + "lw %[tag], 0(t1)\n\t" + "lw %[tagSz], 0(t2)\n\t" + "lw %[aad], 0(t3)\n\t" + "li t4, 65280\n\t" + "and %[nonceSz], %[nonceSz], t4\n\t" + "and %[tag], %[tag], t4\n\t" + "and %[tagSz], %[tagSz], t4\n\t" + "and %[aad], %[aad], t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, %[out], 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, %[in], 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, %[in], 24\n\t" + "srliw t3, %[out], 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, %[in], 14\n\t" + "srliw t2, %[out], 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or %[nonceSz], %[nonceSz], t0\n\t" + "or %[tag], %[tag], t1\n\t" + "or %[tagSz], %[tagSz], t2\n\t" + "or %[aad], %[aad], t3\n\t" + "slli t4, s5, 4\n\t" + "add t4, s1, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor %[nonceSz], %[nonceSz], t0\n\t" + "xor %[tag], %[tag], t1\n\t" + "xor %[tagSz], %[tagSz], t2\n\t" + "xor %[aad], %[aad], t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, %[nonceSz], 24\n\t" + "srli t1, %[tag], 24\n\t" + "srli t2, %[tagSz], 24\n\t" + "srli t3, %[aad], 24\n\t" + "sb t0, 0(s0)\n\t" + "sb t1, 4(s0)\n\t" + "sb t2, 8(s0)\n\t" + "sb t3, 12(s0)\n\t" + "srli t0, %[nonceSz], 16\n\t" + "srli t1, %[tag], 16\n\t" + "srli t2, %[tagSz], 16\n\t" + "srli t3, %[aad], 16\n\t" + "sb t0, 1(s0)\n\t" + "sb t1, 5(s0)\n\t" + "sb t2, 9(s0)\n\t" + "sb t3, 13(s0)\n\t" + "srli t0, %[nonceSz], 8\n\t" + "srli t1, %[tag], 8\n\t" + "srli t2, %[tagSz], 8\n\t" + "srli t3, %[aad], 8\n\t" + "sb t0, 2(s0)\n\t" + "sb t1, 6(s0)\n\t" + "sb t2, 10(s0)\n\t" + "sb t3, 14(s0)\n\t" + "sb %[nonceSz], 3(s0)\n\t" + "sb %[tag], 7(s0)\n\t" + "sb %[tagSz], 11(s0)\n\t" + "sb %[aad], 15(s0)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, %[nonceSz], 32\n\t" + "slli t1, %[tag], 32\n\t" + "slli t2, %[tagSz], 32\n\t" + "slli t3, %[aad], 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(s0)\n\t" + "sd t3, 8(s0)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv %[in], s8\n\t" + "mv %[out], %[nonce]\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "li t1, 0\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_partial_byte:\n\t" + "add t2, %[in], t1\n\t" + "lbu t2, 0(t2)\n\t" + "addi t3, sp, 0\n\t" + "add t3, t3, t1\n\t" + "lbu t3, 0(t3)\n\t" + "xor t4, t2, t3\n\t" + "add t5, %[out], t1\n\t" + "sb t4, 0(t5)\n\t" + "addi t5, sp, 32\n\t" + "add t5, t5, t1\n\t" + "sb t2, 0(t5)\n\t" + "addi t1, t1, 1\n\t" + "blt t1, s10, L_AES_GCM_decrypt_RISCV64_partial_byte\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld69_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld69_e_%=\n\t" + "\n" + "L_ualn_ld69_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld69_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld69_e_%=\n\t" + "\n" + "L_ualn_ld69_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld69_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld69_e_%=\n\t" + "\n" + "L_ualn_ld69_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld69_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld70_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld70_e_%=\n\t" + "\n" + "L_ualn_ld70_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld70_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld70_e_%=\n\t" + "\n" + "L_ualn_ld70_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld70_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld70_e_%=\n\t" + "\n" + "L_ualn_ld70_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld70_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult14:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done14\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult14\n\t" + "\n" + "L_AES_GCM_gmult_done14:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult14:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done14\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult14\n\t" + "\n" + "L_AES_GCM_gmult_done14:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult14:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit14:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip14\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip14:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next14\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next14:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit14\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult14\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "\n" + "L_AES_GCM_decrypt_RISCV64_partial_done:\n\t" + "sd zero, 32(sp)\n\t" + "sd zero, 40(sp)\n\t" + "ld t0, 96(sp)\n\t" + "slli t0, t0, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 35(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 36(sp)\n\t" + "sb t2, 37(sp)\n\t" + "sb t3, 38(sp)\n\t" + "sb t0, 39(sp)\n\t" + "slli t0, %[sz], 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 43(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 44(sp)\n\t" + "sb t2, 45(sp)\n\t" + "sb t3, 46(sp)\n\t" + "sb t0, 47(sp)\n\t" + "addi s11, sp, 32\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld71_w_%=\n\t" + "ld t0, 0(s11)\n\t" + "j L_ualn_ld71_e_%=\n\t" + "\n" + "L_ualn_ld71_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld71_h_%=\n\t" + "lwu t0, 0(s11)\n\t" + "lwu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld71_e_%=\n\t" + "\n" + "L_ualn_ld71_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld71_b_%=\n\t" + "lhu t0, 0(s11)\n\t" + "lhu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld71_e_%=\n\t" + "\n" + "L_ualn_ld71_b_%=:\n\t" + "lbu t0, 0(s11)\n\t" + "lbu t4, 1(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld71_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s11)\n\t" +#else + "andi t4, s11, 7\n\t" + "bnez t4, L_ualn_ld72_w_%=\n\t" + "ld t1, 8(s11)\n\t" + "j L_ualn_ld72_e_%=\n\t" + "\n" + "L_ualn_ld72_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld72_h_%=\n\t" + "lwu t1, 8(s11)\n\t" + "lwu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld72_e_%=\n\t" + "\n" + "L_ualn_ld72_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld72_b_%=\n\t" + "lhu t1, 8(s11)\n\t" + "lhu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld72_e_%=\n\t" + "\n" + "L_ualn_ld72_b_%=:\n\t" + "lbu t1, 8(s11)\n\t" + "lbu t4, 9(s11)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s11)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s11)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s11)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s11)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s11)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s11)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld72_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s3)\n\t" + "ld t3, 8(s3)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s3)\n\t" + "sd t3, 8(s3)\n\t" +#ifdef GCM_TABLE + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult15:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done15\n\t" + "andi t2, %[tag], 255\n\t" + "srli t3, %[tag], 8\n\t" + "slli t4, %[nonceSz], 56\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult15\n\t" + "\n" + "L_AES_GCM_gmult_done15:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li %[nonceSz], 0\n\t" + "li %[tag], 0\n\t" + "li %[tagSz], 15\n\t" + "\n" + "L_AES_GCM_gmult15:\n\t" + "add t2, s3, %[tagSz]\n\t" + "lbu %[aad], 0(t2)\n\t" + "andi t2, %[aad], 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "srli t2, %[aad], 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s2, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor %[nonceSz], %[nonceSz], t3\n\t" + "xor %[tag], %[tag], t4\n\t" + "beqz %[tagSz], L_AES_GCM_gmult_done15\n\t" + "andi t2, %[tag], 15\n\t" + "srli t3, %[tag], 4\n\t" + "slli t4, %[nonceSz], 60\n\t" + "or %[tag], t3, t4\n\t" + "srli %[nonceSz], %[nonceSz], 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor %[nonceSz], %[nonceSz], t3\n\t" + "slli t4, t4, 48\n\t" + "xor %[nonceSz], %[nonceSz], t4\n\t" + "addi %[tagSz], %[tagSz], -1\n\t" + "j L_AES_GCM_gmult15\n\t" + "\n" + "L_AES_GCM_gmult_done15:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[nonceSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, %[tag], 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[nonceSz], t0, 8\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[nonceSz], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[nonceSz], %[nonceSz], 16\n\t" + "and %[nonceSz], %[nonceSz], t2\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" + "slli t3, %[nonceSz], 32\n\t" + "srli %[nonceSz], %[nonceSz], 32\n\t" + "or %[nonceSz], %[nonceSz], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli %[tag], t1, 8\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tag], t2\n\t" + "slli t3, t3, 16\n\t" + "srli %[tag], %[tag], 16\n\t" + "and %[tag], %[tag], t2\n\t" + "or %[tag], %[tag], t3\n\t" + "slli t3, %[tag], 32\n\t" + "srli %[tag], %[tag], 32\n\t" + "or %[tag], %[tag], t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li %[tagSz], 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult15:\n\t" + "add t0, s2, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit15:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip15\n\t" + "xor %[tagSz], %[tagSz], %[nonceSz]\n\t" + "xor t4, t4, %[tag]\n\t" + "\n" + "L_AES_GCM_gmult_skip15:\n\t" + "andi t0, %[tag], 1\n\t" + "slli t5, %[nonceSz], 63\n\t" + "srli %[tag], %[tag], 1\n\t" + "or %[tag], %[tag], t5\n\t" + "srli %[nonceSz], %[nonceSz], 1\n\t" + "beqz t0, L_AES_GCM_gmult_next15\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor %[nonceSz], %[nonceSz], t5\n\t" + "\n" + "L_AES_GCM_gmult_next15:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit15\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult15\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, %[tagSz], t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, %[tagSz], 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s3)\n\t" + "sd t1, 8(s3)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "ld t0, 0(s3)\n\t" + "ld t1, 8(s3)\n\t" + "ld t2, 16(sp)\n\t" + "ld t3, 24(sp)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "sd t0, 32(sp)\n\t" + "sd t1, 40(sp)\n\t" + "ld %[tag], 72(sp)\n\t" + "ld %[tagSz], 80(sp)\n\t" + "li t2, 0\n\t" + "li t5, 0\n\t" + "\n" + "L_AES_GCM_decrypt_RISCV64_check_tag:\n\t" + "addi t3, sp, 32\n\t" + "add t3, t3, t2\n\t" + "lbu t3, 0(t3)\n\t" + "add t4, %[tag], t2\n\t" + "lbu t4, 0(t4)\n\t" + "xor t3, t3, t4\n\t" + "or t5, t5, t3\n\t" + "addi t2, t2, 1\n\t" + "blt t2, %[tagSz], L_AES_GCM_decrypt_RISCV64_check_tag\n\t" + "negw t5, t5\n\t" + "sraiw t5, t5, 31\n\t" + "andi %[in], t5, -180\n\t" + "mv a0, %[in]\n\t" + "ld ra, 48(sp)\n\t" + "addi sp, sp, 96\n\t" + "ld %[aadSz], 0(sp)\n\t" + "ld %[key], 8(sp)\n\t" + "ld %[m0], 16(sp)\n\t" + "ld %[tmp], 24(sp)\n\t" + "ld %[reg], 32(sp)\n\t" + "ld %[nr], 40(sp)\n\t" + "addi sp, sp, 48\n\t" + : [in] "+r" (in), [out] "+r" (out), [sz] "+r" (sz), + [nonce] "+r" (nonce), [nonceSz] "+r" (nonceSz), [tag] "+r" (tag), + [tagSz] "+r" (tagSz), [aad] "+r" (aad), [aadSz] "+r" (aadSz), + [key] "+r" (key), [m0] "+r" (m0), [tmp] "+r" (tmp), [reg] "+r" (reg), + [nr] "+r" (nr) + : [r] "r" (r), [te] "r" (te) + : "memory", "t0", "s1", "s2", "s3", "s4", "s5", "s8", "s9", "s10", + "s11", "s0" + ); + return (word32)(size_t)in; +} + +#endif /* HAVE_AES_DECRYPT */ +#ifdef WOLFSSL_AESGCM_STREAM +void AES_GCM_init_RISCV64(const byte* key_p, int nr_p, const byte* nonce_p, + word32 nonceSz_p, byte* gcm_h_p, byte* counter_p, byte* initCtr_p) +{ + register const byte* key __asm__ ("a0") = (const byte*)key_p; + register int nr __asm__ ("a1") = (int)nr_p; + register const byte* nonce __asm__ ("a2") = (const byte*)nonce_p; + register word32 nonceSz __asm__ ("a3") = (word32)nonceSz_p; + register byte* gcm_h __asm__ ("a4") = (byte*)gcm_h_p; + register byte* counter __asm__ ("a5") = (byte*)counter_p; + register byte* initCtr __asm__ ("a6") = (byte*)initCtr_p; + + const word8* r = L_AES_base_gcm_r; + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "mv s3, %[key]\n\t" + "mv s6, %[nr]\n\t" + "mv s5, %[nonce]\n\t" + "mv s7, %[nonceSz]\n\t" + "mv s4, %[gcm_h]\n\t" + "mv s2, %[counter]\n\t" + "mv s9, %[initCtr]\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 32(sp)\n\t" + "li t0, 12\n\t" + "bne s7, t0, L_AES_GCM_init_RISCV64_nonce_ghash\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 0(s5)\n\t" +#else + "andi t0, s5, 7\n\t" + "bnez t0, L_ualn_ld73_w_%=\n\t" + "ld t1, 0(s5)\n\t" + "j L_ualn_ld73_e_%=\n\t" + "\n" + "L_ualn_ld73_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld73_h_%=\n\t" + "lwu t1, 0(s5)\n\t" + "lwu t0, 4(s5)\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld73_e_%=\n\t" + "\n" + "L_ualn_ld73_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld73_b_%=\n\t" + "lhu t1, 0(s5)\n\t" + "lhu t0, 2(s5)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 4(s5)\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lhu t0, 6(s5)\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "j L_ualn_ld73_e_%=\n\t" + "\n" + "L_ualn_ld73_b_%=:\n\t" + "lbu t1, 0(s5)\n\t" + "lbu t0, 1(s5)\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 2(s5)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 3(s5)\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 4(s5)\n\t" + "slli t0, t0, 32\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 5(s5)\n\t" + "slli t0, t0, 40\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 6(s5)\n\t" + "slli t0, t0, 48\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 7(s5)\n\t" + "slli t0, t0, 56\n\t" + "or t1, t1, t0\n\t" + "\n" + "L_ualn_ld73_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t1, 0(s2)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 8(s5)\n\t" +#else + "andi t0, s5, 3\n\t" + "bnez t0, L_ualn_lw74_h_%=\n\t" + "lw t1, 8(s5)\n\t" + "j L_ualn_lw74_e_%=\n\t" + "\n" + "L_ualn_lw74_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_lw74_b_%=\n\t" + "lhu t1, 8(s5)\n\t" + "lhu t0, 10(s5)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw74_e_%=\n\t" + "\n" + "L_ualn_lw74_b_%=:\n\t" + "lbu t1, 8(s5)\n\t" + "lbu t0, 9(s5)\n\t" + "slli t0, t0, 8\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 10(s5)\n\t" + "slli t0, t0, 16\n\t" + "or t1, t1, t0\n\t" + "lbu t0, 11(s5)\n\t" + "slli t0, t0, 24\n\t" + "or t1, t1, t0\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw74_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 8(s2)\n\t" + "sb zero, 12(s2)\n\t" + "sb zero, 13(s2)\n\t" + "sb zero, 14(s2)\n\t" + "li t1, 1\n\t" + "sb t1, 15(s2)\n\t" + "j L_AES_GCM_init_RISCV64_counter_done\n\t" + "\n" + "L_AES_GCM_init_RISCV64_nonce_ghash:\n\t" + "addi s10, sp, 0\n\t" + "sd zero, 0(s10)\n\t" + "sd zero, 8(s10)\n\t" + "srli s11, s7, 4\n\t" + "\n" + "L_AES_GCM_init_RISCV64_nonce_loop:\n\t" + "beqz s11, L_AES_GCM_init_RISCV64_nonce_partial\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_ld75_w_%=\n\t" + "ld t0, 0(s5)\n\t" + "j L_ualn_ld75_e_%=\n\t" + "\n" + "L_ualn_ld75_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld75_h_%=\n\t" + "lwu t0, 0(s5)\n\t" + "lwu t4, 4(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld75_e_%=\n\t" + "\n" + "L_ualn_ld75_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld75_b_%=\n\t" + "lhu t0, 0(s5)\n\t" + "lhu t4, 2(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld75_e_%=\n\t" + "\n" + "L_ualn_ld75_b_%=:\n\t" + "lbu t0, 0(s5)\n\t" + "lbu t4, 1(s5)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s5)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s5)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s5)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld75_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_ld76_w_%=\n\t" + "ld t1, 8(s5)\n\t" + "j L_ualn_ld76_e_%=\n\t" + "\n" + "L_ualn_ld76_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld76_h_%=\n\t" + "lwu t1, 8(s5)\n\t" + "lwu t4, 12(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld76_e_%=\n\t" + "\n" + "L_ualn_ld76_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld76_b_%=\n\t" + "lhu t1, 8(s5)\n\t" + "lhu t4, 10(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld76_e_%=\n\t" + "\n" + "L_ualn_ld76_b_%=:\n\t" + "lbu t1, 8(s5)\n\t" + "lbu t4, 9(s5)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s5)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s5)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s5)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld76_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s10)\n\t" + "ld t3, 8(s10)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s10)\n\t" + "sd t3, 8(s10)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult16:\n\t" + "add t2, s10, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done16\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult16\n\t" + "\n" + "L_AES_GCM_gmult_done16:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult16:\n\t" + "add t2, s10, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done16\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult16\n\t" + "\n" + "L_AES_GCM_gmult_done16:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s10)\n\t" + "ld t1, 8(s10)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult16:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit16:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip16\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip16:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next16\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next16:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit16\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult16\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s5, s5, 16\n\t" + "addi s11, s11, -1\n\t" + "j L_AES_GCM_init_RISCV64_nonce_loop\n\t" + "\n" + "L_AES_GCM_init_RISCV64_nonce_partial:\n\t" + "andi s11, s7, 15\n\t" + "beqz s11, L_AES_GCM_init_RISCV64_nonce_len\n\t" + "addi a0, sp, 16\n\t" + "sd zero, 0(a0)\n\t" + "sd zero, 8(a0)\n\t" + "li t1, 0\n\t" + "\n" + "L_AES_GCM_init_RISCV64_nonce_byte:\n\t" + "add t2, s5, t1\n\t" + "lbu t2, 0(t2)\n\t" + "addi t3, sp, 16\n\t" + "add t3, t3, t1\n\t" + "sb t2, 0(t3)\n\t" + "addi t1, t1, 1\n\t" + "blt t1, s11, L_AES_GCM_init_RISCV64_nonce_byte\n\t" + "addi a0, sp, 16\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld77_w_%=\n\t" + "ld t0, 0(a0)\n\t" + "j L_ualn_ld77_e_%=\n\t" + "\n" + "L_ualn_ld77_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld77_h_%=\n\t" + "lwu t0, 0(a0)\n\t" + "lwu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld77_e_%=\n\t" + "\n" + "L_ualn_ld77_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld77_b_%=\n\t" + "lhu t0, 0(a0)\n\t" + "lhu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld77_e_%=\n\t" + "\n" + "L_ualn_ld77_b_%=:\n\t" + "lbu t0, 0(a0)\n\t" + "lbu t4, 1(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld77_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld78_w_%=\n\t" + "ld t1, 8(a0)\n\t" + "j L_ualn_ld78_e_%=\n\t" + "\n" + "L_ualn_ld78_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld78_h_%=\n\t" + "lwu t1, 8(a0)\n\t" + "lwu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld78_e_%=\n\t" + "\n" + "L_ualn_ld78_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld78_b_%=\n\t" + "lhu t1, 8(a0)\n\t" + "lhu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld78_e_%=\n\t" + "\n" + "L_ualn_ld78_b_%=:\n\t" + "lbu t1, 8(a0)\n\t" + "lbu t4, 9(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld78_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s10)\n\t" + "ld t3, 8(s10)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s10)\n\t" + "sd t3, 8(s10)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult17:\n\t" + "add t2, s10, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done17\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult17\n\t" + "\n" + "L_AES_GCM_gmult_done17:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult17:\n\t" + "add t2, s10, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done17\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult17\n\t" + "\n" + "L_AES_GCM_gmult_done17:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s10)\n\t" + "ld t1, 8(s10)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult17:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit17:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip17\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip17:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next17\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next17:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit17\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult17\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "\n" + "L_AES_GCM_init_RISCV64_nonce_len:\n\t" + "addi a0, sp, 16\n\t" + "sd zero, 0(a0)\n\t" + "sd zero, 8(a0)\n\t" + "slli t0, s7, 3\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 28(sp)\n\t" + "sb t2, 29(sp)\n\t" + "sb t3, 30(sp)\n\t" + "sb t0, 31(sp)\n\t" + "addi a0, sp, 16\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld79_w_%=\n\t" + "ld t0, 0(a0)\n\t" + "j L_ualn_ld79_e_%=\n\t" + "\n" + "L_ualn_ld79_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld79_h_%=\n\t" + "lwu t0, 0(a0)\n\t" + "lwu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld79_e_%=\n\t" + "\n" + "L_ualn_ld79_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld79_b_%=\n\t" + "lhu t0, 0(a0)\n\t" + "lhu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld79_e_%=\n\t" + "\n" + "L_ualn_ld79_b_%=:\n\t" + "lbu t0, 0(a0)\n\t" + "lbu t4, 1(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld79_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld80_w_%=\n\t" + "ld t1, 8(a0)\n\t" + "j L_ualn_ld80_e_%=\n\t" + "\n" + "L_ualn_ld80_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld80_h_%=\n\t" + "lwu t1, 8(a0)\n\t" + "lwu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld80_e_%=\n\t" + "\n" + "L_ualn_ld80_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld80_b_%=\n\t" + "lhu t1, 8(a0)\n\t" + "lhu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld80_e_%=\n\t" + "\n" + "L_ualn_ld80_b_%=:\n\t" + "lbu t1, 8(a0)\n\t" + "lbu t4, 9(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld80_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s10)\n\t" + "ld t3, 8(s10)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s10)\n\t" + "sd t3, 8(s10)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult18:\n\t" + "add t2, s10, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done18\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult18\n\t" + "\n" + "L_AES_GCM_gmult_done18:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult18:\n\t" + "add t2, s10, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done18\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult18\n\t" + "\n" + "L_AES_GCM_gmult_done18:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s10)\n\t" + "ld t1, 8(s10)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult18:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit18:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip18\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip18:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next18\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next18:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit18\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult18\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s10)\n\t" + "sd t1, 8(s10)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "ld t0, 0(s10)\n\t" + "sd t0, 0(s2)\n\t" + "ld t0, 8(s10)\n\t" + "sd t0, 8(s2)\n\t" + "\n" + "L_AES_GCM_init_RISCV64_counter_done:\n\t" + "addi a1, sp, 16\n\t" + "mv a2, s1\n\t" + "mv a3, s2\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s2)\n\t" + "lbu t1, 4(s2)\n\t" + "lbu t2, 8(s2)\n\t" + "lbu t3, 12(s2)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s2)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s2)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s2)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s2)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s2)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s2)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s2)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s2)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s2)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s2)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s2)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s2)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s2)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s2)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw a4, 0(s3)\n\t" + "lw a5, 4(s3)\n\t" + "lw a6, 8(s3)\n\t" + "lw a7, 12(s3)\n\t" + "xor a4, t0, a4\n\t" + "xor a5, t1, a5\n\t" + "xor a6, t2, a6\n\t" + "xor a7, t3, a7\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 16(s3)\n\t" + "lw t1, 20(s3)\n\t" + "lw t2, 24(s3)\n\t" + "lw t3, 28(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 32(s3)\n\t" + "lw t1, 36(s3)\n\t" + "lw t2, 40(s3)\n\t" + "lw t3, 44(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 48(s3)\n\t" + "lw t1, 52(s3)\n\t" + "lw t2, 56(s3)\n\t" + "lw t3, 60(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 64(s3)\n\t" + "lw t1, 68(s3)\n\t" + "lw t2, 72(s3)\n\t" + "lw t3, 76(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 80(s3)\n\t" + "lw t1, 84(s3)\n\t" + "lw t2, 88(s3)\n\t" + "lw t3, 92(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 96(s3)\n\t" + "lw t1, 100(s3)\n\t" + "lw t2, 104(s3)\n\t" + "lw t3, 108(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 112(s3)\n\t" + "lw t1, 116(s3)\n\t" + "lw t2, 120(s3)\n\t" + "lw t3, 124(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 128(s3)\n\t" + "lw t1, 132(s3)\n\t" + "lw t2, 136(s3)\n\t" + "lw t3, 140(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 144(s3)\n\t" + "lw t1, 148(s3)\n\t" + "lw t2, 152(s3)\n\t" + "lw t3, 156(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 10\n\t" + "ble s6, t4, L_AES_enc_block_20_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 160(s3)\n\t" + "lw t1, 164(s3)\n\t" + "lw t2, 168(s3)\n\t" + "lw t3, 172(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 176(s3)\n\t" + "lw t1, 180(s3)\n\t" + "lw t2, 184(s3)\n\t" + "lw t3, 188(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 12\n\t" + "ble s6, t4, L_AES_enc_block_20_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 192(s3)\n\t" + "lw t1, 196(s3)\n\t" + "lw t2, 200(s3)\n\t" + "lw t3, 204(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 208(s3)\n\t" + "lw t1, 212(s3)\n\t" + "lw t2, 216(s3)\n\t" + "lw t3, 220(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "\n" + "L_AES_enc_block_20_done:\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "li t4, 65280\n\t" + "and a4, a4, t4\n\t" + "and a5, a5, t4\n\t" + "and a6, a6, t4\n\t" + "and a7, a7, t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "slli t4, s6, 4\n\t" + "add t4, s3, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, a4, 24\n\t" + "srli t1, a5, 24\n\t" + "srli t2, a6, 24\n\t" + "srli t3, a7, 24\n\t" + "sb t0, 0(a1)\n\t" + "sb t1, 4(a1)\n\t" + "sb t2, 8(a1)\n\t" + "sb t3, 12(a1)\n\t" + "srli t0, a4, 16\n\t" + "srli t1, a5, 16\n\t" + "srli t2, a6, 16\n\t" + "srli t3, a7, 16\n\t" + "sb t0, 1(a1)\n\t" + "sb t1, 5(a1)\n\t" + "sb t2, 9(a1)\n\t" + "sb t3, 13(a1)\n\t" + "srli t0, a4, 8\n\t" + "srli t1, a5, 8\n\t" + "srli t2, a6, 8\n\t" + "srli t3, a7, 8\n\t" + "sb t0, 2(a1)\n\t" + "sb t1, 6(a1)\n\t" + "sb t2, 10(a1)\n\t" + "sb t3, 14(a1)\n\t" + "sb a4, 3(a1)\n\t" + "sb a5, 7(a1)\n\t" + "sb a6, 11(a1)\n\t" + "sb a7, 15(a1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, a4, 32\n\t" + "slli t1, a5, 32\n\t" + "slli t2, a6, 32\n\t" + "slli t3, a7, 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(a1)\n\t" + "sd t3, 8(a1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv s1, a2\n\t" + "mv s2, a3\n\t" + "addi a1, sp, 16\n\t" + "ld t0, 0(a1)\n\t" + "sd t0, 0(s9)\n\t" + "ld t0, 8(a1)\n\t" + "sd t0, 8(s9)\n\t" + "ld ra, 32(sp)\n\t" + "addi sp, sp, 48\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [nonce] "+r" (nonce), + [nonceSz] "+r" (nonceSz), [gcm_h] "+r" (gcm_h), + [counter] "+r" (counter), [initCtr] "+r" (initCtr) + : [r] "r" (r), [te] "r" (te) + : "memory", "s3", "s6", "s5", "s7", "s4", "s2", "s9", "t0", "t1", "t2", + "t3", "t4", "t5", "a7", "t6", "s10", "s11", "s1" + ); +} + +void AES_GCM_ghash_block_RISCV64(const byte* data, byte* tag, byte* gcm_h) +{ + const word8* r = L_AES_base_gcm_r; + + __asm__ __volatile__ ( + "mv s2, %[tag]\n\t" + "mv s4, %[gcm_h]\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[data])\n\t" +#else + "andi t4, %[data], 7\n\t" + "bnez t4, L_ualn_ld81_w_%=\n\t" + "ld t0, 0(%[data])\n\t" + "j L_ualn_ld81_e_%=\n\t" + "\n" + "L_ualn_ld81_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld81_h_%=\n\t" + "lwu t0, 0(%[data])\n\t" + "lwu t4, 4(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld81_e_%=\n\t" + "\n" + "L_ualn_ld81_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld81_b_%=\n\t" + "lhu t0, 0(%[data])\n\t" + "lhu t4, 2(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld81_e_%=\n\t" + "\n" + "L_ualn_ld81_b_%=:\n\t" + "lbu t0, 0(%[data])\n\t" + "lbu t4, 1(%[data])\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(%[data])\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(%[data])\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(%[data])\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld81_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[data])\n\t" +#else + "andi t4, %[data], 7\n\t" + "bnez t4, L_ualn_ld82_w_%=\n\t" + "ld t1, 8(%[data])\n\t" + "j L_ualn_ld82_e_%=\n\t" + "\n" + "L_ualn_ld82_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld82_h_%=\n\t" + "lwu t1, 8(%[data])\n\t" + "lwu t4, 12(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld82_e_%=\n\t" + "\n" + "L_ualn_ld82_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld82_b_%=\n\t" + "lhu t1, 8(%[data])\n\t" + "lhu t4, 10(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld82_e_%=\n\t" + "\n" + "L_ualn_ld82_b_%=:\n\t" + "lbu t1, 8(%[data])\n\t" + "lbu t4, 9(%[data])\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(%[data])\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(%[data])\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(%[data])\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(%[data])\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(%[data])\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(%[data])\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld82_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult19:\n\t" + "add t2, s2, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done19\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult19\n\t" + "\n" + "L_AES_GCM_gmult_done19:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult19:\n\t" + "add t2, s2, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done19\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult19\n\t" + "\n" + "L_AES_GCM_gmult_done19:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult19:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit19:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip19\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip19:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next19\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next19:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit19\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult19\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + : [data] "+r" (data), [tag] "+r" (tag), [gcm_h] "+r" (gcm_h) + : [r] "r" (r) + : "memory", "s2", "s4", "t0", "t1", "t2", "t3", "t4", "t5", "a4", "a5", + "a6", "a7" + ); +} + +void AES_GCM_aad_update_RISCV64(const byte* addt, word32 abytes, byte* tag, + byte* h) +{ + const word8* r = L_AES_base_gcm_r; + + __asm__ __volatile__ ( + "mv s5, %[addt]\n\t" + "mv s9, %[abytes]\n\t" + "mv s2, %[tag]\n\t" + "mv s4, %[h]\n\t" + "srli s10, s9, 4\n\t" + "beqz s10, L_AES_GCM_aad_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_aad_update_RISCV64_loop:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_ld83_w_%=\n\t" + "ld t0, 0(s5)\n\t" + "j L_ualn_ld83_e_%=\n\t" + "\n" + "L_ualn_ld83_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld83_h_%=\n\t" + "lwu t0, 0(s5)\n\t" + "lwu t4, 4(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld83_e_%=\n\t" + "\n" + "L_ualn_ld83_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld83_b_%=\n\t" + "lhu t0, 0(s5)\n\t" + "lhu t4, 2(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld83_e_%=\n\t" + "\n" + "L_ualn_ld83_b_%=:\n\t" + "lbu t0, 0(s5)\n\t" + "lbu t4, 1(s5)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s5)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s5)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s5)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld83_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_ld84_w_%=\n\t" + "ld t1, 8(s5)\n\t" + "j L_ualn_ld84_e_%=\n\t" + "\n" + "L_ualn_ld84_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld84_h_%=\n\t" + "lwu t1, 8(s5)\n\t" + "lwu t4, 12(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld84_e_%=\n\t" + "\n" + "L_ualn_ld84_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld84_b_%=\n\t" + "lhu t1, 8(s5)\n\t" + "lhu t4, 10(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld84_e_%=\n\t" + "\n" + "L_ualn_ld84_b_%=:\n\t" + "lbu t1, 8(s5)\n\t" + "lbu t4, 9(s5)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s5)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s5)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s5)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s5)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s5)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s5)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld84_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult20:\n\t" + "add t2, s2, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done20\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult20\n\t" + "\n" + "L_AES_GCM_gmult_done20:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult20:\n\t" + "add t2, s2, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done20\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult20\n\t" + "\n" + "L_AES_GCM_gmult_done20:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult20:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit20:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip20\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip20:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next20\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next20:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit20\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult20\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s5, s5, 16\n\t" + "addi s10, s10, -1\n\t" + "bnez s10, L_AES_GCM_aad_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_aad_update_RISCV64_done:\n\t" + : [addt] "+r" (addt), [abytes] "+r" (abytes), [tag] "+r" (tag), + [h] "+r" (h) + : [r] "r" (r) + : "memory", "s5", "s9", "s2", "s4", "s10", "t0", "t1", "t2", "t3", "t4", + "t5", "a4", "a5", "a6", "a7" + ); +} + +void AES_GCM_encrypt_block_RISCV64(const byte* key, int nr, byte* out, + const byte* in, byte* counter) +{ + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "mv s3, %[key]\n\t" + "mv s6, %[nr]\n\t" + "mv s5, %[out]\n\t" + "mv s7, %[in]\n\t" + "mv s2, %[counter]\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 32(sp)\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + "lwu t0, 12(s2)\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "srli t0, t0, 32\n\t" + "addi t0, t0, 1\n\t" + "slli t0, t0, 32\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "sw t0, 12(s2)\n\t" +#else + "lbu t0, 12(s2)\n\t" + "lbu t1, 13(s2)\n\t" + "lbu t2, 14(s2)\n\t" + "lbu t3, 15(s2)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s2)\n\t" + "sb t2, 13(s2)\n\t" + "sb t3, 14(s2)\n\t" + "sb t0, 15(s2)\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "addi a1, sp, 16\n\t" + "mv a2, s1\n\t" + "mv a3, s2\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s2)\n\t" + "lbu t1, 4(s2)\n\t" + "lbu t2, 8(s2)\n\t" + "lbu t3, 12(s2)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s2)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s2)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s2)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s2)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s2)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s2)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s2)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s2)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s2)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s2)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s2)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s2)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s2)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s2)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw a4, 0(s3)\n\t" + "lw a5, 4(s3)\n\t" + "lw a6, 8(s3)\n\t" + "lw a7, 12(s3)\n\t" + "xor a4, t0, a4\n\t" + "xor a5, t1, a5\n\t" + "xor a6, t2, a6\n\t" + "xor a7, t3, a7\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 16(s3)\n\t" + "lw t1, 20(s3)\n\t" + "lw t2, 24(s3)\n\t" + "lw t3, 28(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 32(s3)\n\t" + "lw t1, 36(s3)\n\t" + "lw t2, 40(s3)\n\t" + "lw t3, 44(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 48(s3)\n\t" + "lw t1, 52(s3)\n\t" + "lw t2, 56(s3)\n\t" + "lw t3, 60(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 64(s3)\n\t" + "lw t1, 68(s3)\n\t" + "lw t2, 72(s3)\n\t" + "lw t3, 76(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 80(s3)\n\t" + "lw t1, 84(s3)\n\t" + "lw t2, 88(s3)\n\t" + "lw t3, 92(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 96(s3)\n\t" + "lw t1, 100(s3)\n\t" + "lw t2, 104(s3)\n\t" + "lw t3, 108(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 112(s3)\n\t" + "lw t1, 116(s3)\n\t" + "lw t2, 120(s3)\n\t" + "lw t3, 124(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 128(s3)\n\t" + "lw t1, 132(s3)\n\t" + "lw t2, 136(s3)\n\t" + "lw t3, 140(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 144(s3)\n\t" + "lw t1, 148(s3)\n\t" + "lw t2, 152(s3)\n\t" + "lw t3, 156(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 10\n\t" + "ble s6, t4, L_AES_enc_block_21_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 160(s3)\n\t" + "lw t1, 164(s3)\n\t" + "lw t2, 168(s3)\n\t" + "lw t3, 172(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 176(s3)\n\t" + "lw t1, 180(s3)\n\t" + "lw t2, 184(s3)\n\t" + "lw t3, 188(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 12\n\t" + "ble s6, t4, L_AES_enc_block_21_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 192(s3)\n\t" + "lw t1, 196(s3)\n\t" + "lw t2, 200(s3)\n\t" + "lw t3, 204(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 208(s3)\n\t" + "lw t1, 212(s3)\n\t" + "lw t2, 216(s3)\n\t" + "lw t3, 220(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "\n" + "L_AES_enc_block_21_done:\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "li t4, 65280\n\t" + "and a4, a4, t4\n\t" + "and a5, a5, t4\n\t" + "and a6, a6, t4\n\t" + "and a7, a7, t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "slli t4, s6, 4\n\t" + "add t4, s3, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, a4, 24\n\t" + "srli t1, a5, 24\n\t" + "srli t2, a6, 24\n\t" + "srli t3, a7, 24\n\t" + "sb t0, 0(a1)\n\t" + "sb t1, 4(a1)\n\t" + "sb t2, 8(a1)\n\t" + "sb t3, 12(a1)\n\t" + "srli t0, a4, 16\n\t" + "srli t1, a5, 16\n\t" + "srli t2, a6, 16\n\t" + "srli t3, a7, 16\n\t" + "sb t0, 1(a1)\n\t" + "sb t1, 5(a1)\n\t" + "sb t2, 9(a1)\n\t" + "sb t3, 13(a1)\n\t" + "srli t0, a4, 8\n\t" + "srli t1, a5, 8\n\t" + "srli t2, a6, 8\n\t" + "srli t3, a7, 8\n\t" + "sb t0, 2(a1)\n\t" + "sb t1, 6(a1)\n\t" + "sb t2, 10(a1)\n\t" + "sb t3, 14(a1)\n\t" + "sb a4, 3(a1)\n\t" + "sb a5, 7(a1)\n\t" + "sb a6, 11(a1)\n\t" + "sb a7, 15(a1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, a4, 32\n\t" + "slli t1, a5, 32\n\t" + "slli t2, a6, 32\n\t" + "slli t3, a7, 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(a1)\n\t" + "sd t3, 8(a1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv s1, a2\n\t" + "mv s2, a3\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld85_w_%=\n\t" + "ld t0, 0(s7)\n\t" + "j L_ualn_ld85_e_%=\n\t" + "\n" + "L_ualn_ld85_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld85_h_%=\n\t" + "lwu t0, 0(s7)\n\t" + "lwu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld85_e_%=\n\t" + "\n" + "L_ualn_ld85_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld85_b_%=\n\t" + "lhu t0, 0(s7)\n\t" + "lhu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld85_e_%=\n\t" + "\n" + "L_ualn_ld85_b_%=:\n\t" + "lbu t0, 0(s7)\n\t" + "lbu t4, 1(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld85_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld86_w_%=\n\t" + "ld t1, 8(s7)\n\t" + "j L_ualn_ld86_e_%=\n\t" + "\n" + "L_ualn_ld86_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld86_h_%=\n\t" + "lwu t1, 8(s7)\n\t" + "lwu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld86_e_%=\n\t" + "\n" + "L_ualn_ld86_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld86_b_%=\n\t" + "lhu t1, 8(s7)\n\t" + "lhu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld86_e_%=\n\t" + "\n" + "L_ualn_ld86_b_%=:\n\t" + "lbu t1, 8(s7)\n\t" + "lbu t4, 9(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld86_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 16(sp)\n\t" + "ld t3, 24(sp)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t0, 0(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_sd87_w_%=\n\t" + "sd t0, 0(s5)\n\t" + "j L_ualn_sd87_e_%=\n\t" + "\n" + "L_ualn_sd87_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd87_h_%=\n\t" + "sw t0, 0(s5)\n\t" + "srli t4, t0, 32\n\t" + "sw t4, 4(s5)\n\t" + "j L_ualn_sd87_e_%=\n\t" + "\n" + "L_ualn_sd87_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd87_b_%=\n\t" + "sh t0, 0(s5)\n\t" + "srli t4, t0, 16\n\t" + "sh t4, 2(s5)\n\t" + "srli t4, t0, 32\n\t" + "sh t4, 4(s5)\n\t" + "srli t4, t0, 48\n\t" + "sh t4, 6(s5)\n\t" + "j L_ualn_sd87_e_%=\n\t" + "\n" + "L_ualn_sd87_b_%=:\n\t" + "sb t0, 0(s5)\n\t" + "srli t4, t0, 8\n\t" + "sb t4, 1(s5)\n\t" + "srli t4, t0, 16\n\t" + "sb t4, 2(s5)\n\t" + "srli t4, t0, 24\n\t" + "sb t4, 3(s5)\n\t" + "srli t4, t0, 32\n\t" + "sb t4, 4(s5)\n\t" + "srli t4, t0, 40\n\t" + "sb t4, 5(s5)\n\t" + "srli t4, t0, 48\n\t" + "sb t4, 6(s5)\n\t" + "srli t4, t0, 56\n\t" + "sb t4, 7(s5)\n\t" + "\n" + "L_ualn_sd87_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t1, 8(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_sd88_w_%=\n\t" + "sd t1, 8(s5)\n\t" + "j L_ualn_sd88_e_%=\n\t" + "\n" + "L_ualn_sd88_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd88_h_%=\n\t" + "sw t1, 8(s5)\n\t" + "srli t4, t1, 32\n\t" + "sw t4, 12(s5)\n\t" + "j L_ualn_sd88_e_%=\n\t" + "\n" + "L_ualn_sd88_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd88_b_%=\n\t" + "sh t1, 8(s5)\n\t" + "srli t4, t1, 16\n\t" + "sh t4, 10(s5)\n\t" + "srli t4, t1, 32\n\t" + "sh t4, 12(s5)\n\t" + "srli t4, t1, 48\n\t" + "sh t4, 14(s5)\n\t" + "j L_ualn_sd88_e_%=\n\t" + "\n" + "L_ualn_sd88_b_%=:\n\t" + "sb t1, 8(s5)\n\t" + "srli t4, t1, 8\n\t" + "sb t4, 9(s5)\n\t" + "srli t4, t1, 16\n\t" + "sb t4, 10(s5)\n\t" + "srli t4, t1, 24\n\t" + "sb t4, 11(s5)\n\t" + "srli t4, t1, 32\n\t" + "sb t4, 12(s5)\n\t" + "srli t4, t1, 40\n\t" + "sb t4, 13(s5)\n\t" + "srli t4, t1, 48\n\t" + "sb t4, 14(s5)\n\t" + "srli t4, t1, 56\n\t" + "sb t4, 15(s5)\n\t" + "\n" + "L_ualn_sd88_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld ra, 32(sp)\n\t" + "addi sp, sp, 48\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [counter] "+r" (counter) + : [te] "r" (te) + : "memory", "s3", "s6", "s5", "s7", "s2", "t0", "t1", "t2", "t3", "t4", + "t5", "t6", "s1", "a1", "a2", "a3", "a4", "a5", "a6", "a7" + ); +} + +void AES_GCM_encrypt_update_RISCV64(const byte* key_p, int nr_p, byte* out_p, + const byte* in_p, word32 nbytes_p, byte* tag_p, byte* h_p, byte* counter_p) +{ + register const byte* key __asm__ ("a0") = (const byte*)key_p; + register int nr __asm__ ("a1") = (int)nr_p; + register byte* out __asm__ ("a2") = (byte*)out_p; + register const byte* in __asm__ ("a3") = (const byte*)in_p; + register word32 nbytes __asm__ ("a4") = (word32)nbytes_p; + register byte* tag __asm__ ("a5") = (byte*)tag_p; + register byte* h __asm__ ("a6") = (byte*)h_p; + register byte* counter __asm__ ("a7") = (byte*)counter_p; + + const word8* r = L_AES_base_gcm_r; + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "mv s3, %[key]\n\t" + "mv s6, %[nr]\n\t" + "mv s5, %[out]\n\t" + "mv s7, %[in]\n\t" + "mv s9, %[nbytes]\n\t" + "mv s2, %[tag]\n\t" + "mv s4, %[h]\n\t" + "mv s1, %[counter]\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 32(sp)\n\t" + "srli s10, s9, 4\n\t" + "beqz s10, L_AES_GCM_encrypt_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_loop:\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + "lwu t0, 12(s1)\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "srli t0, t0, 32\n\t" + "addi t0, t0, 1\n\t" + "slli t0, t0, 32\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "sw t0, 12(s1)\n\t" +#else + "lbu t0, 12(s1)\n\t" + "lbu t1, 13(s1)\n\t" + "lbu t2, 14(s1)\n\t" + "lbu t3, 15(s1)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s1)\n\t" + "sb t2, 13(s1)\n\t" + "sb t3, 14(s1)\n\t" + "sb t0, 15(s1)\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "addi a1, sp, 16\n\t" + "mv a2, s1\n\t" + "mv a3, s2\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s1)\n\t" + "lbu t1, 4(s1)\n\t" + "lbu t2, 8(s1)\n\t" + "lbu t3, 12(s1)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s1)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s1)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s1)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s1)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s1)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s1)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s1)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s1)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s1)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s1)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s1)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s1)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s1)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s1)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw a4, 0(s3)\n\t" + "lw a5, 4(s3)\n\t" + "lw a6, 8(s3)\n\t" + "lw a7, 12(s3)\n\t" + "xor a4, t0, a4\n\t" + "xor a5, t1, a5\n\t" + "xor a6, t2, a6\n\t" + "xor a7, t3, a7\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 16(s3)\n\t" + "lw t1, 20(s3)\n\t" + "lw t2, 24(s3)\n\t" + "lw t3, 28(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 32(s3)\n\t" + "lw t1, 36(s3)\n\t" + "lw t2, 40(s3)\n\t" + "lw t3, 44(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 48(s3)\n\t" + "lw t1, 52(s3)\n\t" + "lw t2, 56(s3)\n\t" + "lw t3, 60(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 64(s3)\n\t" + "lw t1, 68(s3)\n\t" + "lw t2, 72(s3)\n\t" + "lw t3, 76(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 80(s3)\n\t" + "lw t1, 84(s3)\n\t" + "lw t2, 88(s3)\n\t" + "lw t3, 92(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 96(s3)\n\t" + "lw t1, 100(s3)\n\t" + "lw t2, 104(s3)\n\t" + "lw t3, 108(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 112(s3)\n\t" + "lw t1, 116(s3)\n\t" + "lw t2, 120(s3)\n\t" + "lw t3, 124(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 128(s3)\n\t" + "lw t1, 132(s3)\n\t" + "lw t2, 136(s3)\n\t" + "lw t3, 140(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 144(s3)\n\t" + "lw t1, 148(s3)\n\t" + "lw t2, 152(s3)\n\t" + "lw t3, 156(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 10\n\t" + "ble s6, t4, L_AES_enc_block_22_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 160(s3)\n\t" + "lw t1, 164(s3)\n\t" + "lw t2, 168(s3)\n\t" + "lw t3, 172(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 176(s3)\n\t" + "lw t1, 180(s3)\n\t" + "lw t2, 184(s3)\n\t" + "lw t3, 188(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 12\n\t" + "ble s6, t4, L_AES_enc_block_22_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 192(s3)\n\t" + "lw t1, 196(s3)\n\t" + "lw t2, 200(s3)\n\t" + "lw t3, 204(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 208(s3)\n\t" + "lw t1, 212(s3)\n\t" + "lw t2, 216(s3)\n\t" + "lw t3, 220(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "\n" + "L_AES_enc_block_22_done:\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "li t4, 65280\n\t" + "and a4, a4, t4\n\t" + "and a5, a5, t4\n\t" + "and a6, a6, t4\n\t" + "and a7, a7, t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "slli t4, s6, 4\n\t" + "add t4, s3, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, a4, 24\n\t" + "srli t1, a5, 24\n\t" + "srli t2, a6, 24\n\t" + "srli t3, a7, 24\n\t" + "sb t0, 0(a1)\n\t" + "sb t1, 4(a1)\n\t" + "sb t2, 8(a1)\n\t" + "sb t3, 12(a1)\n\t" + "srli t0, a4, 16\n\t" + "srli t1, a5, 16\n\t" + "srli t2, a6, 16\n\t" + "srli t3, a7, 16\n\t" + "sb t0, 1(a1)\n\t" + "sb t1, 5(a1)\n\t" + "sb t2, 9(a1)\n\t" + "sb t3, 13(a1)\n\t" + "srli t0, a4, 8\n\t" + "srli t1, a5, 8\n\t" + "srli t2, a6, 8\n\t" + "srli t3, a7, 8\n\t" + "sb t0, 2(a1)\n\t" + "sb t1, 6(a1)\n\t" + "sb t2, 10(a1)\n\t" + "sb t3, 14(a1)\n\t" + "sb a4, 3(a1)\n\t" + "sb a5, 7(a1)\n\t" + "sb a6, 11(a1)\n\t" + "sb a7, 15(a1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, a4, 32\n\t" + "slli t1, a5, 32\n\t" + "slli t2, a6, 32\n\t" + "slli t3, a7, 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(a1)\n\t" + "sd t3, 8(a1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv s1, a2\n\t" + "mv s2, a3\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld89_w_%=\n\t" + "ld t0, 0(s7)\n\t" + "j L_ualn_ld89_e_%=\n\t" + "\n" + "L_ualn_ld89_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld89_h_%=\n\t" + "lwu t0, 0(s7)\n\t" + "lwu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld89_e_%=\n\t" + "\n" + "L_ualn_ld89_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld89_b_%=\n\t" + "lhu t0, 0(s7)\n\t" + "lhu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld89_e_%=\n\t" + "\n" + "L_ualn_ld89_b_%=:\n\t" + "lbu t0, 0(s7)\n\t" + "lbu t4, 1(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld89_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld90_w_%=\n\t" + "ld t1, 8(s7)\n\t" + "j L_ualn_ld90_e_%=\n\t" + "\n" + "L_ualn_ld90_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld90_h_%=\n\t" + "lwu t1, 8(s7)\n\t" + "lwu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld90_e_%=\n\t" + "\n" + "L_ualn_ld90_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld90_b_%=\n\t" + "lhu t1, 8(s7)\n\t" + "lhu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld90_e_%=\n\t" + "\n" + "L_ualn_ld90_b_%=:\n\t" + "lbu t1, 8(s7)\n\t" + "lbu t4, 9(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld90_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 16(sp)\n\t" + "ld t3, 24(sp)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t0, 0(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_sd91_w_%=\n\t" + "sd t0, 0(s5)\n\t" + "j L_ualn_sd91_e_%=\n\t" + "\n" + "L_ualn_sd91_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd91_h_%=\n\t" + "sw t0, 0(s5)\n\t" + "srli t4, t0, 32\n\t" + "sw t4, 4(s5)\n\t" + "j L_ualn_sd91_e_%=\n\t" + "\n" + "L_ualn_sd91_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd91_b_%=\n\t" + "sh t0, 0(s5)\n\t" + "srli t4, t0, 16\n\t" + "sh t4, 2(s5)\n\t" + "srli t4, t0, 32\n\t" + "sh t4, 4(s5)\n\t" + "srli t4, t0, 48\n\t" + "sh t4, 6(s5)\n\t" + "j L_ualn_sd91_e_%=\n\t" + "\n" + "L_ualn_sd91_b_%=:\n\t" + "sb t0, 0(s5)\n\t" + "srli t4, t0, 8\n\t" + "sb t4, 1(s5)\n\t" + "srli t4, t0, 16\n\t" + "sb t4, 2(s5)\n\t" + "srli t4, t0, 24\n\t" + "sb t4, 3(s5)\n\t" + "srli t4, t0, 32\n\t" + "sb t4, 4(s5)\n\t" + "srli t4, t0, 40\n\t" + "sb t4, 5(s5)\n\t" + "srli t4, t0, 48\n\t" + "sb t4, 6(s5)\n\t" + "srli t4, t0, 56\n\t" + "sb t4, 7(s5)\n\t" + "\n" + "L_ualn_sd91_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t1, 8(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_sd92_w_%=\n\t" + "sd t1, 8(s5)\n\t" + "j L_ualn_sd92_e_%=\n\t" + "\n" + "L_ualn_sd92_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd92_h_%=\n\t" + "sw t1, 8(s5)\n\t" + "srli t4, t1, 32\n\t" + "sw t4, 12(s5)\n\t" + "j L_ualn_sd92_e_%=\n\t" + "\n" + "L_ualn_sd92_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd92_b_%=\n\t" + "sh t1, 8(s5)\n\t" + "srli t4, t1, 16\n\t" + "sh t4, 10(s5)\n\t" + "srli t4, t1, 32\n\t" + "sh t4, 12(s5)\n\t" + "srli t4, t1, 48\n\t" + "sh t4, 14(s5)\n\t" + "j L_ualn_sd92_e_%=\n\t" + "\n" + "L_ualn_sd92_b_%=:\n\t" + "sb t1, 8(s5)\n\t" + "srli t4, t1, 8\n\t" + "sb t4, 9(s5)\n\t" + "srli t4, t1, 16\n\t" + "sb t4, 10(s5)\n\t" + "srli t4, t1, 24\n\t" + "sb t4, 11(s5)\n\t" + "srli t4, t1, 32\n\t" + "sb t4, 12(s5)\n\t" + "srli t4, t1, 40\n\t" + "sb t4, 13(s5)\n\t" + "srli t4, t1, 48\n\t" + "sb t4, 14(s5)\n\t" + "srli t4, t1, 56\n\t" + "sb t4, 15(s5)\n\t" + "\n" + "L_ualn_sd92_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi a1, sp, 16\n\t" + "sd t0, 0(a1)\n\t" + "sd t1, 8(a1)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(a1)\n\t" +#else + "andi t4, a1, 7\n\t" + "bnez t4, L_ualn_ld93_w_%=\n\t" + "ld t0, 0(a1)\n\t" + "j L_ualn_ld93_e_%=\n\t" + "\n" + "L_ualn_ld93_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld93_h_%=\n\t" + "lwu t0, 0(a1)\n\t" + "lwu t4, 4(a1)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld93_e_%=\n\t" + "\n" + "L_ualn_ld93_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld93_b_%=\n\t" + "lhu t0, 0(a1)\n\t" + "lhu t4, 2(a1)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(a1)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(a1)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld93_e_%=\n\t" + "\n" + "L_ualn_ld93_b_%=:\n\t" + "lbu t0, 0(a1)\n\t" + "lbu t4, 1(a1)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(a1)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(a1)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(a1)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(a1)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(a1)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(a1)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld93_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(a1)\n\t" +#else + "andi t4, a1, 7\n\t" + "bnez t4, L_ualn_ld94_w_%=\n\t" + "ld t1, 8(a1)\n\t" + "j L_ualn_ld94_e_%=\n\t" + "\n" + "L_ualn_ld94_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld94_h_%=\n\t" + "lwu t1, 8(a1)\n\t" + "lwu t4, 12(a1)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld94_e_%=\n\t" + "\n" + "L_ualn_ld94_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld94_b_%=\n\t" + "lhu t1, 8(a1)\n\t" + "lhu t4, 10(a1)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(a1)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(a1)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld94_e_%=\n\t" + "\n" + "L_ualn_ld94_b_%=:\n\t" + "lbu t1, 8(a1)\n\t" + "lbu t4, 9(a1)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(a1)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(a1)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(a1)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(a1)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(a1)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(a1)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld94_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult21:\n\t" + "add t2, s2, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done21\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult21\n\t" + "\n" + "L_AES_GCM_gmult_done21:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult21:\n\t" + "add t2, s2, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done21\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult21\n\t" + "\n" + "L_AES_GCM_gmult_done21:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult21:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit21:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip21\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip21:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next21\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next21:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit21\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult21\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s7, s7, 16\n\t" + "addi s5, s5, 16\n\t" + "addi s10, s10, -1\n\t" + "bnez s10, L_AES_GCM_encrypt_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_encrypt_update_RISCV64_done:\n\t" + "ld ra, 32(sp)\n\t" + "addi sp, sp, 48\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [nbytes] "+r" (nbytes), [tag] "+r" (tag), [h] "+r" (h), + [counter] "+r" (counter) + : [r] "r" (r), [te] "r" (te) + : "memory", "s3", "s6", "s5", "s7", "s9", "s2", "s4", "s1", "s10", "t0", + "t1", "t2", "t3", "t4", "t5", "t6" + ); +} + +void AES_GCM_encrypt_final_RISCV64(byte* tag_p, byte* authTag_p, + word32 tbytes_p, word32 nbytes_p, word32 abytes_p, byte* h_p, + byte* initCtr_p) +{ + register byte* tag __asm__ ("a0") = (byte*)tag_p; + register byte* authTag __asm__ ("a1") = (byte*)authTag_p; + register word32 tbytes __asm__ ("a2") = (word32)tbytes_p; + register word32 nbytes __asm__ ("a3") = (word32)nbytes_p; + register word32 abytes __asm__ ("a4") = (word32)abytes_p; + register byte* h __asm__ ("a5") = (byte*)h_p; + register byte* initCtr __asm__ ("a6") = (byte*)initCtr_p; + + const word8* r = L_AES_base_gcm_r; + + __asm__ __volatile__ ( + "addi sp, sp, -16\n\t" + "mv s2, %[tag]\n\t" + "mv s5, %[authTag]\n\t" + "mv s6, %[tbytes]\n\t" + "mv s9, %[nbytes]\n\t" + "mv s1, %[abytes]\n\t" + "mv s4, %[h]\n\t" + "mv s7, %[initCtr]\n\t" + "sd zero, 0(sp)\n\t" + "sd zero, 8(sp)\n\t" + "slli t0, s1, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 3(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 4(sp)\n\t" + "sb t2, 5(sp)\n\t" + "sb t3, 6(sp)\n\t" + "sb t0, 7(sp)\n\t" + "slli t0, s9, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 11(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(sp)\n\t" + "sb t2, 13(sp)\n\t" + "sb t3, 14(sp)\n\t" + "sb t0, 15(sp)\n\t" + "addi a0, sp, 0\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld95_w_%=\n\t" + "ld t0, 0(a0)\n\t" + "j L_ualn_ld95_e_%=\n\t" + "\n" + "L_ualn_ld95_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld95_h_%=\n\t" + "lwu t0, 0(a0)\n\t" + "lwu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld95_e_%=\n\t" + "\n" + "L_ualn_ld95_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld95_b_%=\n\t" + "lhu t0, 0(a0)\n\t" + "lhu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld95_e_%=\n\t" + "\n" + "L_ualn_ld95_b_%=:\n\t" + "lbu t0, 0(a0)\n\t" + "lbu t4, 1(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld95_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld96_w_%=\n\t" + "ld t1, 8(a0)\n\t" + "j L_ualn_ld96_e_%=\n\t" + "\n" + "L_ualn_ld96_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld96_h_%=\n\t" + "lwu t1, 8(a0)\n\t" + "lwu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld96_e_%=\n\t" + "\n" + "L_ualn_ld96_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld96_b_%=\n\t" + "lhu t1, 8(a0)\n\t" + "lhu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld96_e_%=\n\t" + "\n" + "L_ualn_ld96_b_%=:\n\t" + "lbu t1, 8(a0)\n\t" + "lbu t4, 9(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld96_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult22:\n\t" + "add t2, s2, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done22\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult22\n\t" + "\n" + "L_AES_GCM_gmult_done22:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult22:\n\t" + "add t2, s2, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done22\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult22\n\t" + "\n" + "L_AES_GCM_gmult_done22:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult22:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit22:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip22\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip22:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next22\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next22:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit22\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult22\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" + "ld t2, 0(s7)\n\t" + "ld t3, 8(s7)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_encrypt_final_RISCV64_store_tag:\n\t" + "add t3, s2, t2\n\t" + "lbu t3, 0(t3)\n\t" + "add t4, s5, t2\n\t" + "sb t3, 0(t4)\n\t" + "addi t2, t2, 1\n\t" + "blt t2, s6, L_AES_GCM_encrypt_final_RISCV64_store_tag\n\t" + "addi sp, sp, 16\n\t" + : [tag] "+r" (tag), [authTag] "+r" (authTag), [tbytes] "+r" (tbytes), + [nbytes] "+r" (nbytes), [abytes] "+r" (abytes), [h] "+r" (h), + [initCtr] "+r" (initCtr) + : [r] "r" (r) + : "memory", "s2", "s5", "s6", "s9", "s1", "s4", "s7", "t0", "t1", "t2", + "t3", "t4", "t5", "a7" + ); +} + +#ifdef HAVE_AES_DECRYPT +void AES_GCM_decrypt_update_RISCV64(const byte* key_p, int nr_p, byte* out_p, + const byte* in_p, word32 nbytes_p, byte* tag_p, byte* h_p, byte* counter_p) +{ + register const byte* key __asm__ ("a0") = (const byte*)key_p; + register int nr __asm__ ("a1") = (int)nr_p; + register byte* out __asm__ ("a2") = (byte*)out_p; + register const byte* in __asm__ ("a3") = (const byte*)in_p; + register word32 nbytes __asm__ ("a4") = (word32)nbytes_p; + register byte* tag __asm__ ("a5") = (byte*)tag_p; + register byte* h __asm__ ("a6") = (byte*)h_p; + register byte* counter __asm__ ("a7") = (byte*)counter_p; + + const word8* r = L_AES_base_gcm_r; + const word32* te = L_AES_base_te; + + __asm__ __volatile__ ( + "addi sp, sp, -48\n\t" + "mv s3, %[key]\n\t" + "mv s6, %[nr]\n\t" + "mv s5, %[out]\n\t" + "mv s7, %[in]\n\t" + "mv s9, %[nbytes]\n\t" + "mv s2, %[tag]\n\t" + "mv s4, %[h]\n\t" + "mv s1, %[counter]\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + " .option arch, +zba\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "sd ra, 32(sp)\n\t" + "srli s10, s9, 4\n\t" + "beqz s10, L_AES_GCM_decrypt_update_RISCV64_done\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_loop:\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + "lwu t0, 12(s1)\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "srli t0, t0, 32\n\t" + "addi t0, t0, 1\n\t" + "slli t0, t0, 32\n\t" + /* rev8 t0, t0 */ + ".word 0x6b82d293\n\t" + "sw t0, 12(s1)\n\t" +#else + "lbu t0, 12(s1)\n\t" + "lbu t1, 13(s1)\n\t" + "lbu t2, 14(s1)\n\t" + "lbu t3, 15(s1)\n\t" + "slli t0, t0, 24\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 8\n\t" + "or t0, t0, t1\n\t" + "or t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "addi t0, t0, 1\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(s1)\n\t" + "sb t2, 13(s1)\n\t" + "sb t3, 14(s1)\n\t" + "sb t0, 15(s1)\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "addi a1, sp, 16\n\t" + "mv a2, s1\n\t" + "mv a3, s2\n\t" + /* Load input block (big endian) and AddRoundKey */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu t0, 0(s1)\n\t" + "lbu t1, 4(s1)\n\t" + "lbu t2, 8(s1)\n\t" + "lbu t3, 12(s1)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 1(s1)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 5(s1)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 9(s1)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 13(s1)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 2(s1)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 6(s1)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 10(s1)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 14(s1)\n\t" + "or t3, t3, t4\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "lbu t4, 3(s1)\n\t" + "or t0, t0, t4\n\t" + "lbu t5, 7(s1)\n\t" + "or t1, t1, t5\n\t" + "lbu t6, 11(s1)\n\t" + "or t2, t2, t6\n\t" + "lbu t4, 15(s1)\n\t" + "or t3, t3, t4\n\t" +#else + "ld t1, 0(s1)\n\t" + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + "srli t0, t1, 32\n\t" + "ld t3, 8(s1)\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "srli t2, t3, 32\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw a4, 0(s3)\n\t" + "lw a5, 4(s3)\n\t" + "lw a6, 8(s3)\n\t" + "lw a7, 12(s3)\n\t" + "xor a4, t0, a4\n\t" + "xor a5, t1, a5\n\t" + "xor a6, t2, a6\n\t" + "xor a7, t3, a7\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 16(s3)\n\t" + "lw t1, 20(s3)\n\t" + "lw t2, 24(s3)\n\t" + "lw t3, 28(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 32(s3)\n\t" + "lw t1, 36(s3)\n\t" + "lw t2, 40(s3)\n\t" + "lw t3, 44(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 48(s3)\n\t" + "lw t1, 52(s3)\n\t" + "lw t2, 56(s3)\n\t" + "lw t3, 60(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 64(s3)\n\t" + "lw t1, 68(s3)\n\t" + "lw t2, 72(s3)\n\t" + "lw t3, 76(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 80(s3)\n\t" + "lw t1, 84(s3)\n\t" + "lw t2, 88(s3)\n\t" + "lw t3, 92(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 96(s3)\n\t" + "lw t1, 100(s3)\n\t" + "lw t2, 104(s3)\n\t" + "lw t3, 108(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 112(s3)\n\t" + "lw t1, 116(s3)\n\t" + "lw t2, 120(s3)\n\t" + "lw t3, 124(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 128(s3)\n\t" + "lw t1, 132(s3)\n\t" + "lw t2, 136(s3)\n\t" + "lw t3, 140(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 144(s3)\n\t" + "lw t1, 148(s3)\n\t" + "lw t2, 152(s3)\n\t" + "lw t3, 156(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 10\n\t" + "ble s6, t4, L_AES_enc_block_23_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 160(s3)\n\t" + "lw t1, 164(s3)\n\t" + "lw t2, 168(s3)\n\t" + "lw t3, 172(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 176(s3)\n\t" + "lw t1, 180(s3)\n\t" + "lw t2, 184(s3)\n\t" + "lw t3, 188(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "li t4, 12\n\t" + "ble s6, t4, L_AES_enc_block_23_done\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "lw t0, 192(s3)\n\t" + "lw t1, 196(s3)\n\t" + "lw t2, 200(s3)\n\t" + "lw t3, 204(s3)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + "srliw t0, a4, 24\n\t" + "srliw t1, a5, 24\n\t" + "srliw t2, a6, 24\n\t" + "srliw t3, a7, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, %[te]\n\t" + "sh2add t1, t1, %[te]\n\t" + "sh2add t2, t2, %[te]\n\t" + "sh2add t3, t3, %[te]\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t5, 0(t0)\n\t" + "lw t6, 0(t1)\n\t" + "lw s1, 0(t2)\n\t" + "lw s2, 0(t3)\n\t" + "addi t4, %[te], 1024\n\t" + "srliw t0, a5, 14\n\t" + "srliw t1, a6, 14\n\t" + "srliw t2, a7, 14\n\t" + "srliw t3, a4, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, a6, 6\n\t" + "srliw t1, a7, 6\n\t" + "srliw t2, a4, 6\n\t" + "srliw t3, a5, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "addi t4, t4, 1024\n\t" + "andi t0, a7, 255\n\t" + "andi t1, a4, 255\n\t" + "andi t2, a5, 255\n\t" + "andi t3, a6, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slliw t0, t0, 2\n\t" + "slliw t1, t1, 2\n\t" + "slliw t2, t2, 2\n\t" + "slliw t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "lw t0, 208(s3)\n\t" + "lw t1, 212(s3)\n\t" + "lw t2, 216(s3)\n\t" + "lw t3, 220(s3)\n\t" + "xor t5, t5, t0\n\t" + "xor t6, t6, t1\n\t" + "xor s1, s1, t2\n\t" + "xor s2, s2, t3\n\t" + "\n" + "L_AES_enc_block_23_done:\n\t" + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw a4, 0(t0)\n\t" + "lw a5, 0(t1)\n\t" + "lw a6, 0(t2)\n\t" + "lw a7, 0(t3)\n\t" + "li t4, 65280\n\t" + "and a4, a4, t4\n\t" + "and a5, a5, t4\n\t" + "and a6, a6, t4\n\t" + "and a7, a7, t4\n\t" + "addi t4, %[te], 1024\n\t" + "andi t0, s2, 255\n\t" + "andi t1, t5, 255\n\t" + "andi t2, t6, 255\n\t" + "andi t3, s1, 255\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lbu t0, 0(t0)\n\t" + "lbu t1, 0(t1)\n\t" + "lbu t2, 0(t2)\n\t" + "lbu t3, 0(t3)\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "addi t4, t4, 1024\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" +#if defined(WOLFSSL_RISCV_BASE_ADDRESS) + "sh2add t0, t0, t4\n\t" + "sh2add t1, t1, t4\n\t" + "sh2add t2, t2, t4\n\t" + "sh2add t3, t3, t4\n\t" +#else + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_ADDRESS) */ + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 4278190080\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "li t4, 3072\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 1020\n\t" + "andi t1, t1, 1020\n\t" + "andi t2, t2, 1020\n\t" + "andi t3, t3, 1020\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, 0(t0)\n\t" + "lw t1, 0(t1)\n\t" + "lw t2, 0(t2)\n\t" + "lw t3, 0(t3)\n\t" + "li t4, 16711680\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + "slli t4, s6, 4\n\t" + "add t4, s3, t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + /* Store output block (big endian) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "srli t0, a4, 24\n\t" + "srli t1, a5, 24\n\t" + "srli t2, a6, 24\n\t" + "srli t3, a7, 24\n\t" + "sb t0, 0(a1)\n\t" + "sb t1, 4(a1)\n\t" + "sb t2, 8(a1)\n\t" + "sb t3, 12(a1)\n\t" + "srli t0, a4, 16\n\t" + "srli t1, a5, 16\n\t" + "srli t2, a6, 16\n\t" + "srli t3, a7, 16\n\t" + "sb t0, 1(a1)\n\t" + "sb t1, 5(a1)\n\t" + "sb t2, 9(a1)\n\t" + "sb t3, 13(a1)\n\t" + "srli t0, a4, 8\n\t" + "srli t1, a5, 8\n\t" + "srli t2, a6, 8\n\t" + "srli t3, a7, 8\n\t" + "sb t0, 2(a1)\n\t" + "sb t1, 6(a1)\n\t" + "sb t2, 10(a1)\n\t" + "sb t3, 14(a1)\n\t" + "sb a4, 3(a1)\n\t" + "sb a5, 7(a1)\n\t" + "sb a6, 11(a1)\n\t" + "sb a7, 15(a1)\n\t" +#else +#if !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, a4, 32\n\t" + "slli t1, a5, 32\n\t" + "slli t2, a6, 32\n\t" + "slli t3, a7, 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" +#else + /* pack t1, a5, a4 */ + ".word 0x08e7c333\n\t" + /* pack t3, a7, a6 */ + ".word 0x0908ce33\n\t" +#endif /* !defined(WOLFSSL_RISCV_BIT_MANIPULATION) */ + /* rev8 t1, t1 */ + ".word 0x6b835313\n\t" + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" + "sd t1, 0(a1)\n\t" + "sd t3, 8(a1)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "mv s1, a2\n\t" + "mv s2, a3\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld97_w_%=\n\t" + "ld t0, 0(s7)\n\t" + "j L_ualn_ld97_e_%=\n\t" + "\n" + "L_ualn_ld97_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld97_h_%=\n\t" + "lwu t0, 0(s7)\n\t" + "lwu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld97_e_%=\n\t" + "\n" + "L_ualn_ld97_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld97_b_%=\n\t" + "lhu t0, 0(s7)\n\t" + "lhu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld97_e_%=\n\t" + "\n" + "L_ualn_ld97_b_%=:\n\t" + "lbu t0, 0(s7)\n\t" + "lbu t4, 1(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld97_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld98_w_%=\n\t" + "ld t1, 8(s7)\n\t" + "j L_ualn_ld98_e_%=\n\t" + "\n" + "L_ualn_ld98_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld98_h_%=\n\t" + "lwu t1, 8(s7)\n\t" + "lwu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld98_e_%=\n\t" + "\n" + "L_ualn_ld98_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld98_b_%=\n\t" + "lhu t1, 8(s7)\n\t" + "lhu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld98_e_%=\n\t" + "\n" + "L_ualn_ld98_b_%=:\n\t" + "lbu t1, 8(s7)\n\t" + "lbu t4, 9(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld98_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 16(sp)\n\t" + "ld t3, 24(sp)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t0, 0(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_sd99_w_%=\n\t" + "sd t0, 0(s5)\n\t" + "j L_ualn_sd99_e_%=\n\t" + "\n" + "L_ualn_sd99_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd99_h_%=\n\t" + "sw t0, 0(s5)\n\t" + "srli t4, t0, 32\n\t" + "sw t4, 4(s5)\n\t" + "j L_ualn_sd99_e_%=\n\t" + "\n" + "L_ualn_sd99_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd99_b_%=\n\t" + "sh t0, 0(s5)\n\t" + "srli t4, t0, 16\n\t" + "sh t4, 2(s5)\n\t" + "srli t4, t0, 32\n\t" + "sh t4, 4(s5)\n\t" + "srli t4, t0, 48\n\t" + "sh t4, 6(s5)\n\t" + "j L_ualn_sd99_e_%=\n\t" + "\n" + "L_ualn_sd99_b_%=:\n\t" + "sb t0, 0(s5)\n\t" + "srli t4, t0, 8\n\t" + "sb t4, 1(s5)\n\t" + "srli t4, t0, 16\n\t" + "sb t4, 2(s5)\n\t" + "srli t4, t0, 24\n\t" + "sb t4, 3(s5)\n\t" + "srli t4, t0, 32\n\t" + "sb t4, 4(s5)\n\t" + "srli t4, t0, 40\n\t" + "sb t4, 5(s5)\n\t" + "srli t4, t0, 48\n\t" + "sb t4, 6(s5)\n\t" + "srli t4, t0, 56\n\t" + "sb t4, 7(s5)\n\t" + "\n" + "L_ualn_sd99_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t1, 8(s5)\n\t" +#else + "andi t4, s5, 7\n\t" + "bnez t4, L_ualn_sd100_w_%=\n\t" + "sd t1, 8(s5)\n\t" + "j L_ualn_sd100_e_%=\n\t" + "\n" + "L_ualn_sd100_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_sd100_h_%=\n\t" + "sw t1, 8(s5)\n\t" + "srli t4, t1, 32\n\t" + "sw t4, 12(s5)\n\t" + "j L_ualn_sd100_e_%=\n\t" + "\n" + "L_ualn_sd100_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_sd100_b_%=\n\t" + "sh t1, 8(s5)\n\t" + "srli t4, t1, 16\n\t" + "sh t4, 10(s5)\n\t" + "srli t4, t1, 32\n\t" + "sh t4, 12(s5)\n\t" + "srli t4, t1, 48\n\t" + "sh t4, 14(s5)\n\t" + "j L_ualn_sd100_e_%=\n\t" + "\n" + "L_ualn_sd100_b_%=:\n\t" + "sb t1, 8(s5)\n\t" + "srli t4, t1, 8\n\t" + "sb t4, 9(s5)\n\t" + "srli t4, t1, 16\n\t" + "sb t4, 10(s5)\n\t" + "srli t4, t1, 24\n\t" + "sb t4, 11(s5)\n\t" + "srli t4, t1, 32\n\t" + "sb t4, 12(s5)\n\t" + "srli t4, t1, 40\n\t" + "sb t4, 13(s5)\n\t" + "srli t4, t1, 48\n\t" + "sb t4, 14(s5)\n\t" + "srli t4, t1, 56\n\t" + "sb t4, 15(s5)\n\t" + "\n" + "L_ualn_sd100_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld101_w_%=\n\t" + "ld t0, 0(s7)\n\t" + "j L_ualn_ld101_e_%=\n\t" + "\n" + "L_ualn_ld101_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld101_h_%=\n\t" + "lwu t0, 0(s7)\n\t" + "lwu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld101_e_%=\n\t" + "\n" + "L_ualn_ld101_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld101_b_%=\n\t" + "lhu t0, 0(s7)\n\t" + "lhu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld101_e_%=\n\t" + "\n" + "L_ualn_ld101_b_%=:\n\t" + "lbu t0, 0(s7)\n\t" + "lbu t4, 1(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld101_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(s7)\n\t" +#else + "andi t4, s7, 7\n\t" + "bnez t4, L_ualn_ld102_w_%=\n\t" + "ld t1, 8(s7)\n\t" + "j L_ualn_ld102_e_%=\n\t" + "\n" + "L_ualn_ld102_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld102_h_%=\n\t" + "lwu t1, 8(s7)\n\t" + "lwu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld102_e_%=\n\t" + "\n" + "L_ualn_ld102_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld102_b_%=\n\t" + "lhu t1, 8(s7)\n\t" + "lhu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld102_e_%=\n\t" + "\n" + "L_ualn_ld102_b_%=:\n\t" + "lbu t1, 8(s7)\n\t" + "lbu t4, 9(s7)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(s7)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(s7)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(s7)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(s7)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(s7)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(s7)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld102_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult23:\n\t" + "add t2, s2, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done23\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult23\n\t" + "\n" + "L_AES_GCM_gmult_done23:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult23:\n\t" + "add t2, s2, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done23\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult23\n\t" + "\n" + "L_AES_GCM_gmult_done23:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult23:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit23:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip23\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip23:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next23\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next23:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit23\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult23\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "addi s7, s7, 16\n\t" + "addi s5, s5, 16\n\t" + "addi s10, s10, -1\n\t" + "bnez s10, L_AES_GCM_decrypt_update_RISCV64_loop\n\t" + "\n" + "L_AES_GCM_decrypt_update_RISCV64_done:\n\t" + "ld ra, 32(sp)\n\t" + "addi sp, sp, 48\n\t" + : [key] "+r" (key), [nr] "+r" (nr), [out] "+r" (out), [in] "+r" (in), + [nbytes] "+r" (nbytes), [tag] "+r" (tag), [h] "+r" (h), + [counter] "+r" (counter) + : [r] "r" (r), [te] "r" (te) + : "memory", "s3", "s6", "s5", "s7", "s9", "s2", "s4", "s1", "s10", "t0", + "t1", "t2", "t3", "t4", "t5", "t6" + ); +} + +void AES_GCM_decrypt_final_RISCV64(byte* tag_p, const byte* authTag_p, + word32 tbytes_p, word32 nbytes_p, word32 abytes_p, byte* h_p, + byte* initCtr_p, int* res_p) +{ + register byte* tag __asm__ ("a0") = (byte*)tag_p; + register const byte* authTag __asm__ ("a1") = (const byte*)authTag_p; + register word32 tbytes __asm__ ("a2") = (word32)tbytes_p; + register word32 nbytes __asm__ ("a3") = (word32)nbytes_p; + register word32 abytes __asm__ ("a4") = (word32)abytes_p; + register byte* h __asm__ ("a5") = (byte*)h_p; + register byte* initCtr __asm__ ("a6") = (byte*)initCtr_p; + register int* res __asm__ ("a7") = (int*)res_p; + + const word8* r = L_AES_base_gcm_r; + + __asm__ __volatile__ ( + "addi sp, sp, -16\n\t" + "mv s2, %[tag]\n\t" + "mv s5, %[authTag]\n\t" + "mv s6, %[tbytes]\n\t" + "mv s9, %[nbytes]\n\t" + "mv s1, %[abytes]\n\t" + "mv s4, %[h]\n\t" + "mv s7, %[initCtr]\n\t" + "mv s3, %[res]\n\t" + "sd zero, 0(sp)\n\t" + "sd zero, 8(sp)\n\t" + "slli t0, s1, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 3(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 4(sp)\n\t" + "sb t2, 5(sp)\n\t" + "sb t3, 6(sp)\n\t" + "sb t0, 7(sp)\n\t" + "slli t0, s9, 3\n\t" + "srli t1, t0, 32\n\t" + "andi t1, t1, 7\n\t" + "sb t1, 11(sp)\n\t" + "srli t1, t0, 24\n\t" + "srli t2, t0, 16\n\t" + "srli t3, t0, 8\n\t" + "sb t1, 12(sp)\n\t" + "sb t2, 13(sp)\n\t" + "sb t3, 14(sp)\n\t" + "sb t0, 15(sp)\n\t" + "addi a0, sp, 0\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld103_w_%=\n\t" + "ld t0, 0(a0)\n\t" + "j L_ualn_ld103_e_%=\n\t" + "\n" + "L_ualn_ld103_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld103_h_%=\n\t" + "lwu t0, 0(a0)\n\t" + "lwu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld103_e_%=\n\t" + "\n" + "L_ualn_ld103_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld103_b_%=\n\t" + "lhu t0, 0(a0)\n\t" + "lhu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lhu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "j L_ualn_ld103_e_%=\n\t" + "\n" + "L_ualn_ld103_b_%=:\n\t" + "lbu t0, 0(a0)\n\t" + "lbu t4, 1(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 2(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 3(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 4(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 5(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 6(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t0, t0, t4\n\t" + "lbu t4, 7(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t0, t0, t4\n\t" + "\n" + "L_ualn_ld103_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(a0)\n\t" +#else + "andi t4, a0, 7\n\t" + "bnez t4, L_ualn_ld104_w_%=\n\t" + "ld t1, 8(a0)\n\t" + "j L_ualn_ld104_e_%=\n\t" + "\n" + "L_ualn_ld104_w_%=:\n\t" + "andi t4, t4, 3\n\t" + "bnez t4, L_ualn_ld104_h_%=\n\t" + "lwu t1, 8(a0)\n\t" + "lwu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld104_e_%=\n\t" + "\n" + "L_ualn_ld104_h_%=:\n\t" + "andi t4, t4, 1\n\t" + "bnez t4, L_ualn_ld104_b_%=\n\t" + "lhu t1, 8(a0)\n\t" + "lhu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lhu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "j L_ualn_ld104_e_%=\n\t" + "\n" + "L_ualn_ld104_b_%=:\n\t" + "lbu t1, 8(a0)\n\t" + "lbu t4, 9(a0)\n\t" + "slli t4, t4, 8\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 10(a0)\n\t" + "slli t4, t4, 16\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 11(a0)\n\t" + "slli t4, t4, 24\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 12(a0)\n\t" + "slli t4, t4, 32\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 13(a0)\n\t" + "slli t4, t4, 40\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 14(a0)\n\t" + "slli t4, t4, 48\n\t" + "or t1, t1, t4\n\t" + "lbu t4, 15(a0)\n\t" + "slli t4, t4, 56\n\t" + "or t1, t1, t4\n\t" + "\n" + "L_ualn_ld104_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t2, 0(s2)\n\t" + "ld t3, 8(s2)\n\t" + "xor t2, t2, t0\n\t" + "xor t3, t3, t1\n\t" + "sd t2, 0(s2)\n\t" + "sd t3, 8(s2)\n\t" +#ifdef GCM_TABLE + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult24:\n\t" + "add t2, s2, a6\n\t" + "lbu t2, 0(t2)\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done24\n\t" + "andi t2, a5, 255\n\t" + "srli t3, a5, 8\n\t" + "slli t4, a4, 56\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 8\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "or a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult24\n\t" + "\n" + "L_AES_GCM_gmult_done24:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else +#ifdef GCM_TABLE_4BIT + "li a4, 0\n\t" + "li a5, 0\n\t" + "li a6, 15\n\t" + "\n" + "L_AES_GCM_gmult24:\n\t" + "add t2, s2, a6\n\t" + "lbu a7, 0(t2)\n\t" + "andi t2, a7, 15\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "srli t2, a7, 4\n\t" + "slli t2, t2, 4\n\t" + "add t2, s4, t2\n\t" + "ld t3, 0(t2)\n\t" + "ld t4, 8(t2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t3, t3 */ + ".word 0x6b8e5e13\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t3, t3, 8\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t3, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t3, t3, 16\n\t" + "and t3, t3, t0\n\t" + "or t3, t3, t1\n\t" + "slli t1, t3, 32\n\t" + "srli t3, t3, 32\n\t" + "or t3, t3, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t4, t4 */ + ".word 0x6b8ede93\n\t" +#else + "li t0, 255\n\t" + "slli t1, t0, 16\n\t" + "or t0, t0, t1\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 8\n\t" + "srli t4, t4, 8\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "li t0, 65535\n\t" + "slli t1, t0, 32\n\t" + "or t0, t0, t1\n\t" + "and t1, t4, t0\n\t" + "slli t1, t1, 16\n\t" + "srli t4, t4, 16\n\t" + "and t4, t4, t0\n\t" + "or t4, t4, t1\n\t" + "slli t1, t4, 32\n\t" + "srli t4, t4, 32\n\t" + "or t4, t4, t1\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, t3\n\t" + "xor a5, a5, t4\n\t" + "beqz a6, L_AES_GCM_gmult_done24\n\t" + "andi t2, a5, 15\n\t" + "srli t3, a5, 4\n\t" + "slli t4, a4, 60\n\t" + "or a5, t3, t4\n\t" + "srli a4, a4, 4\n\t" + "slli t2, t2, 1\n\t" + "add t2, %[r], t2\n\t" + "lbu t3, 0(t2)\n\t" + "lbu t4, 1(t2)\n\t" + "slli t3, t3, 56\n\t" + "xor a4, a4, t3\n\t" + "slli t4, t4, 48\n\t" + "xor a4, a4, t4\n\t" + "addi a6, a6, -1\n\t" + "j L_AES_GCM_gmult24\n\t" + "\n" + "L_AES_GCM_gmult_done24:\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a4 */ + ".word 0x6b875293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a4, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, a5 */ + ".word 0x6b87d313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, a5, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" +#else + "addi sp, sp, -16\n\t" + "sd t5, 0(sp)\n\t" + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a4, t0 */ + ".word 0x6b82d713\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a4, t0, 8\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a4, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a4, a4, 16\n\t" + "and a4, a4, t2\n\t" + "or a4, a4, t3\n\t" + "slli t3, a4, 32\n\t" + "srli a4, a4, 32\n\t" + "or a4, a4, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 a5, t1 */ + ".word 0x6b835793\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 8\n\t" + "srli a5, t1, 8\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a5, t2\n\t" + "slli t3, t3, 16\n\t" + "srli a5, a5, 16\n\t" + "and a5, a5, t2\n\t" + "or a5, a5, t3\n\t" + "slli t3, a5, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "li a6, 0\n\t" + "li t4, 0\n\t" + "li t2, 0\n\t" + "\n" + "L_AES_GCM_gmult24:\n\t" + "add t0, s4, t2\n\t" + "lbu t3, 0(t0)\n\t" + "li t1, 8\n\t" + "\n" + "L_AES_GCM_gmult_bit24:\n\t" + "andi t0, t3, 128\n\t" + "beqz t0, L_AES_GCM_gmult_skip24\n\t" + "xor a6, a6, a4\n\t" + "xor t4, t4, a5\n\t" + "\n" + "L_AES_GCM_gmult_skip24:\n\t" + "andi t0, a5, 1\n\t" + "slli t5, a4, 63\n\t" + "srli a5, a5, 1\n\t" + "or a5, a5, t5\n\t" + "srli a4, a4, 1\n\t" + "beqz t0, L_AES_GCM_gmult_next24\n\t" + "li t5, 225\n\t" + "slli t5, t5, 56\n\t" + "xor a4, a4, t5\n\t" + "\n" + "L_AES_GCM_gmult_next24:\n\t" + "slli t3, t3, 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_AES_GCM_gmult_bit24\n\t" + "addi t2, t2, 1\n\t" + "li t0, 16\n\t" + "blt t2, t0, L_AES_GCM_gmult24\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t0, a6 */ + ".word 0x6b885293\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, a6, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t0, a6, 8\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t0, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t0, t0, 16\n\t" + "and t0, t0, t2\n\t" + "or t0, t0, t3\n\t" + "slli t3, t0, 32\n\t" + "srli t0, t0, 32\n\t" + "or t0, t0, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rev8 t1, t4 */ + ".word 0x6b8ed313\n\t" +#else + "li t2, 255\n\t" + "slli t3, t2, 16\n\t" + "or t2, t2, t3\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t4, t2\n\t" + "slli t3, t3, 8\n\t" + "srli t1, t4, 8\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "li t2, 65535\n\t" + "slli t3, t2, 32\n\t" + "or t2, t2, t3\n\t" + "and t3, t1, t2\n\t" + "slli t3, t3, 16\n\t" + "srli t1, t1, 16\n\t" + "and t1, t1, t2\n\t" + "or t1, t1, t3\n\t" + "slli t3, t1, 32\n\t" + "srli t1, t1, 32\n\t" + "or t1, t1, t3\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "ld t5, 0(sp)\n\t" + "addi sp, sp, 16\n\t" +#endif /* GCM_TABLE_4BIT */ +#endif /* GCM_TABLE */ + "ld t0, 0(s2)\n\t" + "ld t1, 8(s2)\n\t" + "ld t2, 0(s7)\n\t" + "ld t3, 8(s7)\n\t" + "xor t0, t0, t2\n\t" + "xor t1, t1, t3\n\t" + "sd t0, 0(s2)\n\t" + "sd t1, 8(s2)\n\t" + "li t2, 0\n\t" + "li t5, 0\n\t" + "\n" + "L_AES_GCM_decrypt_final_RISCV64_check_tag:\n\t" + "add t3, s2, t2\n\t" + "lbu t3, 0(t3)\n\t" + "add t4, s5, t2\n\t" + "lbu t4, 0(t4)\n\t" + "xor t3, t3, t4\n\t" + "or t5, t5, t3\n\t" + "addi t2, t2, 1\n\t" + "blt t2, s6, L_AES_GCM_decrypt_final_RISCV64_check_tag\n\t" + "sltiu t5, t5, 1\n\t" + "sw t5, 0(s3)\n\t" + "addi sp, sp, 16\n\t" + : [tag] "+r" (tag), [authTag] "+r" (authTag), [tbytes] "+r" (tbytes), + [nbytes] "+r" (nbytes), [abytes] "+r" (abytes), [h] "+r" (h), + [initCtr] "+r" (initCtr), [res] "+r" (res) + : [r] "r" (r) + : "memory", "s2", "s5", "s6", "s9", "s1", "s4", "s7", "s3", "t0", "t1", + "t2", "t3", "t4", "t5" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AESGCM_STREAM */ +#endif /* HAVE_AESGCM */ +#endif /* WOLFSSL_RISCV_SCALAR_CRYPTO_ASM */ +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ +#endif /* WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm.S b/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm.S new file mode 100644 index 00000000000..a00e871beed --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm.S @@ -0,0 +1,5659 @@ +/* riscv-64-chacha-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./chacha/chacha.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm.S + */ +#ifdef WOLFSSL_RISCV_ASM +#ifndef WOLFSSL_RISCV_ASM_INLINE +#ifdef HAVE_CHACHA + .text + .globl wc_chacha_setiv + .type wc_chacha_setiv,@function + .align 2 +wc_chacha_setiv: + # Set counter and 96-bit nonce: X[12]=counter, X[13..15]=iv +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t0, 0(a1) +#else + andi t3, a1, 3 + bnez t3, L_ualn_lw1_h + lw t0, 0(a1) + j L_ualn_lw1_e +L_ualn_lw1_h: + andi t3, t3, 1 + bnez t3, L_ualn_lw1_b + lhu t0, 0(a1) + lhu t3, 2(a1) + slli t3, t3, 16 + or t0, t0, t3 + addiw t0, t0, 0 + j L_ualn_lw1_e +L_ualn_lw1_b: + lbu t0, 0(a1) + lbu t3, 1(a1) + slli t3, t3, 8 + or t0, t0, t3 + lbu t3, 2(a1) + slli t3, t3, 16 + or t0, t0, t3 + lbu t3, 3(a1) + slli t3, t3, 24 + or t0, t0, t3 + addiw t0, t0, 0 +L_ualn_lw1_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 4(a1) +#else + andi t3, a1, 3 + bnez t3, L_ualn_lw2_h + lw t1, 4(a1) + j L_ualn_lw2_e +L_ualn_lw2_h: + andi t3, t3, 1 + bnez t3, L_ualn_lw2_b + lhu t1, 4(a1) + lhu t3, 6(a1) + slli t3, t3, 16 + or t1, t1, t3 + addiw t1, t1, 0 + j L_ualn_lw2_e +L_ualn_lw2_b: + lbu t1, 4(a1) + lbu t3, 5(a1) + slli t3, t3, 8 + or t1, t1, t3 + lbu t3, 6(a1) + slli t3, t3, 16 + or t1, t1, t3 + lbu t3, 7(a1) + slli t3, t3, 24 + or t1, t1, t3 + addiw t1, t1, 0 +L_ualn_lw2_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t2, 8(a1) +#else + andi t3, a1, 3 + bnez t3, L_ualn_lw3_h + lw t2, 8(a1) + j L_ualn_lw3_e +L_ualn_lw3_h: + andi t3, t3, 1 + bnez t3, L_ualn_lw3_b + lhu t2, 8(a1) + lhu t3, 10(a1) + slli t3, t3, 16 + or t2, t2, t3 + addiw t2, t2, 0 + j L_ualn_lw3_e +L_ualn_lw3_b: + lbu t2, 8(a1) + lbu t3, 9(a1) + slli t3, t3, 8 + or t2, t2, t3 + lbu t3, 10(a1) + slli t3, t3, 16 + or t2, t2, t3 + lbu t3, 11(a1) + slli t3, t3, 24 + or t2, t2, t3 + addiw t2, t2, 0 +L_ualn_lw3_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw a2, 48(a0) + sw t0, 52(a0) + sw t1, 56(a0) + sw t2, 60(a0) + ret + .size wc_chacha_setiv,.-wc_chacha_setiv + .section .rodata + .type L_chacha20_riscv64_setkey_constants, %object + .size L_chacha20_riscv64_setkey_constants, 32 + # 4-byte aligned, 32-bit aligned + .align 2 +L_chacha20_riscv64_setkey_constants: + .long 0x61707865,0x3120646e,0x79622d36,0x6b206574 + .long 0x61707865,0x3320646e,0x79622d32,0x6b206574 + .text + .globl wc_chacha_setkey + .type wc_chacha_setkey,@function + .align 2 +wc_chacha_setkey: + la t0, L_chacha20_riscv64_setkey_constants + # keySz 16 -> tau (offset 0); keySz 32 -> sigma (offset 16) + addi a2, a2, -16 + add t0, t0, a2 + # X[0..3] = constants + lw t1, 0(t0) + sw t1, 0(a0) + lw t1, 4(t0) + sw t1, 4(a0) + lw t1, 8(t0) + sw t1, 8(a0) + lw t1, 12(t0) + sw t1, 12(a0) + # X[4..7] = key[0..15] +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 0(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw4_h + lw t1, 0(a1) + j L_ualn_lw4_e +L_ualn_lw4_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw4_b + lhu t1, 0(a1) + lhu t2, 2(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw4_e +L_ualn_lw4_b: + lbu t1, 0(a1) + lbu t2, 1(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 2(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 3(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw4_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 16(a0) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 4(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw5_h + lw t1, 4(a1) + j L_ualn_lw5_e +L_ualn_lw5_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw5_b + lhu t1, 4(a1) + lhu t2, 6(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw5_e +L_ualn_lw5_b: + lbu t1, 4(a1) + lbu t2, 5(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 6(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 7(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw5_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 20(a0) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 8(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw6_h + lw t1, 8(a1) + j L_ualn_lw6_e +L_ualn_lw6_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw6_b + lhu t1, 8(a1) + lhu t2, 10(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw6_e +L_ualn_lw6_b: + lbu t1, 8(a1) + lbu t2, 9(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 10(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 11(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw6_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 24(a0) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 12(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw7_h + lw t1, 12(a1) + j L_ualn_lw7_e +L_ualn_lw7_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw7_b + lhu t1, 12(a1) + lhu t2, 14(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw7_e +L_ualn_lw7_b: + lbu t1, 12(a1) + lbu t2, 13(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 14(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 15(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw7_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 28(a0) + # X[8..11] = key[0..15] (16-byte) or key[16..31] (32-byte) + add a1, a1, a2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 0(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw8_h + lw t1, 0(a1) + j L_ualn_lw8_e +L_ualn_lw8_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw8_b + lhu t1, 0(a1) + lhu t2, 2(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw8_e +L_ualn_lw8_b: + lbu t1, 0(a1) + lbu t2, 1(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 2(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 3(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw8_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 32(a0) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 4(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw9_h + lw t1, 4(a1) + j L_ualn_lw9_e +L_ualn_lw9_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw9_b + lhu t1, 4(a1) + lhu t2, 6(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw9_e +L_ualn_lw9_b: + lbu t1, 4(a1) + lbu t2, 5(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 6(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 7(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw9_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 36(a0) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 8(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw10_h + lw t1, 8(a1) + j L_ualn_lw10_e +L_ualn_lw10_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw10_b + lhu t1, 8(a1) + lhu t2, 10(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw10_e +L_ualn_lw10_b: + lbu t1, 8(a1) + lbu t2, 9(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 10(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 11(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw10_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 40(a0) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t1, 12(a1) +#else + andi t2, a1, 3 + bnez t2, L_ualn_lw11_h + lw t1, 12(a1) + j L_ualn_lw11_e +L_ualn_lw11_h: + andi t2, t2, 1 + bnez t2, L_ualn_lw11_b + lhu t1, 12(a1) + lhu t2, 14(a1) + slli t2, t2, 16 + or t1, t1, t2 + addiw t1, t1, 0 + j L_ualn_lw11_e +L_ualn_lw11_b: + lbu t1, 12(a1) + lbu t2, 13(a1) + slli t2, t2, 8 + or t1, t1, t2 + lbu t2, 14(a1) + slli t2, t2, 16 + or t1, t1, t2 + lbu t2, 15(a1) + slli t2, t2, 24 + or t1, t1, t2 + addiw t1, t1, 0 +L_ualn_lw11_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sw t1, 44(a0) + ret + .size wc_chacha_setkey,.-wc_chacha_setkey + .text + .globl wc_chacha_use_over + .type wc_chacha_use_over,@function + .align 2 +wc_chacha_use_over: +L_chacha20_riscv64_use_over_loop_8: + li t2, 8 + bltu a3, t2, L_chacha20_riscv64_use_over_lt_4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a2) +#else + andi t3, a2, 7 + bnez t3, L_ualn_ld12_w + ld t0, 0(a2) + j L_ualn_ld12_e +L_ualn_ld12_w: + andi t3, t3, 3 + bnez t3, L_ualn_ld12_h + lwu t0, 0(a2) + lwu t3, 4(a2) + slli t3, t3, 32 + or t0, t0, t3 + j L_ualn_ld12_e +L_ualn_ld12_h: + andi t3, t3, 1 + bnez t3, L_ualn_ld12_b + lhu t0, 0(a2) + lhu t3, 2(a2) + slli t3, t3, 16 + or t0, t0, t3 + lhu t3, 4(a2) + slli t3, t3, 32 + or t0, t0, t3 + lhu t3, 6(a2) + slli t3, t3, 48 + or t0, t0, t3 + j L_ualn_ld12_e +L_ualn_ld12_b: + lbu t0, 0(a2) + lbu t3, 1(a2) + slli t3, t3, 8 + or t0, t0, t3 + lbu t3, 2(a2) + slli t3, t3, 16 + or t0, t0, t3 + lbu t3, 3(a2) + slli t3, t3, 24 + or t0, t0, t3 + lbu t3, 4(a2) + slli t3, t3, 32 + or t0, t0, t3 + lbu t3, 5(a2) + slli t3, t3, 40 + or t0, t0, t3 + lbu t3, 6(a2) + slli t3, t3, 48 + or t0, t0, t3 + lbu t3, 7(a2) + slli t3, t3, 56 + or t0, t0, t3 +L_ualn_ld12_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld t1, 0(a0) + xor t0, t0, t1 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t0, 0(a1) +#else + andi t3, a1, 7 + bnez t3, L_ualn_sd13_w + sd t0, 0(a1) + j L_ualn_sd13_e +L_ualn_sd13_w: + andi t3, t3, 3 + bnez t3, L_ualn_sd13_h + sw t0, 0(a1) + srli t3, t0, 32 + sw t3, 4(a1) + j L_ualn_sd13_e +L_ualn_sd13_h: + andi t3, t3, 1 + bnez t3, L_ualn_sd13_b + sh t0, 0(a1) + srli t3, t0, 16 + sh t3, 2(a1) + srli t3, t0, 32 + sh t3, 4(a1) + srli t3, t0, 48 + sh t3, 6(a1) + j L_ualn_sd13_e +L_ualn_sd13_b: + sb t0, 0(a1) + srli t3, t0, 8 + sb t3, 1(a1) + srli t3, t0, 16 + sb t3, 2(a1) + srli t3, t0, 24 + sb t3, 3(a1) + srli t3, t0, 32 + sb t3, 4(a1) + srli t3, t0, 40 + sb t3, 5(a1) + srli t3, t0, 48 + sb t3, 6(a1) + srli t3, t0, 56 + sb t3, 7(a1) +L_ualn_sd13_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, 8 + addi a0, a0, 8 + addi a1, a1, 8 + addi a3, a3, -8 + j L_chacha20_riscv64_use_over_loop_8 +L_chacha20_riscv64_use_over_lt_4: + li t2, 4 + bltu a3, t2, L_chacha20_riscv64_use_over_lt_2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw t0, 0(a2) +#else + andi t3, a2, 3 + bnez t3, L_ualn_lw14_h + lw t0, 0(a2) + j L_ualn_lw14_e +L_ualn_lw14_h: + andi t3, t3, 1 + bnez t3, L_ualn_lw14_b + lhu t0, 0(a2) + lhu t3, 2(a2) + slli t3, t3, 16 + or t0, t0, t3 + addiw t0, t0, 0 + j L_ualn_lw14_e +L_ualn_lw14_b: + lbu t0, 0(a2) + lbu t3, 1(a2) + slli t3, t3, 8 + or t0, t0, t3 + lbu t3, 2(a2) + slli t3, t3, 16 + or t0, t0, t3 + lbu t3, 3(a2) + slli t3, t3, 24 + or t0, t0, t3 + addiw t0, t0, 0 +L_ualn_lw14_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw t1, 0(a0) + xor t0, t0, t1 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t0, 0(a1) +#else + andi t3, a1, 3 + bnez t3, L_ualn_sw15_h + sw t0, 0(a1) + j L_ualn_sw15_e +L_ualn_sw15_h: + andi t3, t3, 1 + bnez t3, L_ualn_sw15_b + sh t0, 0(a1) + srli t3, t0, 16 + sh t3, 2(a1) + j L_ualn_sw15_e +L_ualn_sw15_b: + sb t0, 0(a1) + srli t3, t0, 8 + sb t3, 1(a1) + srli t3, t0, 16 + sb t3, 2(a1) + srli t3, t0, 24 + sb t3, 3(a1) +L_ualn_sw15_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, 4 + addi a0, a0, 4 + addi a1, a1, 4 + addi a3, a3, -4 +L_chacha20_riscv64_use_over_lt_2: + li t2, 2 + bltu a3, t2, L_chacha20_riscv64_use_over_lt_1 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lh t0, 0(a2) +#else + lbu t0, 0(a2) + lb t3, 1(a2) + slli t3, t3, 8 + or t0, t0, t3 +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lh t1, 0(a0) + xor t0, t0, t1 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sh t0, 0(a1) +#else + sb t0, 0(a1) + srli t3, t0, 8 + sb t3, 1(a1) +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, 2 + addi a0, a0, 2 + addi a1, a1, 2 + addi a3, a3, -2 +L_chacha20_riscv64_use_over_lt_1: + beqz a3, L_chacha20_riscv64_use_over_done + lb t0, 0(a2) + lb t1, 0(a0) + xor t0, t0, t1 + sb t0, 0(a1) +L_chacha20_riscv64_use_over_done: + ret + .size wc_chacha_use_over,.-wc_chacha_use_over +#ifdef WOLFSSL_RISCV_VECTOR + .text + .globl wc_chacha_crypt_bytes + .type wc_chacha_crypt_bytes,@function + .align 2 +wc_chacha_crypt_bytes: + addi sp, sp, -96 + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + .option arch, +v +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + .option arch, +zvkb +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + .option arch, +zbb +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + # VLEN == 128: 4 x 32-bit elements per vector register + vsetivli zero, 4, e32, m1, ta, ma + # Ensure 64-bit length has top bits clear + slli a3, a3, 32 + srli a3, a3, 32 + # ctx->left = (CHACHA_CHUNK_BYTES - (len & 63)) & 63 + andi s6, a3, 63 + li s7, 64 + sub s6, s7, s6 + andi s6, s6, 63 + sw s6, 64(a0) + # Six-block (384-byte) tier, looped + li s7, 384 + bltu a3, s7, L_chacha20_riscv64_vec_after_384 + # Load state; build lane-rotate indices v25/v26/v27 + mv s8, a0 + vl4re32.v v28, (s8) + vid.v v20 + vslidedown.vi v25, v20, 1 + vslideup.vi v25, v20, 3 + vslidedown.vi v26, v20, 2 + vslideup.vi v26, v20, 2 + vslidedown.vi v27, v20, 3 + vslideup.vi v27, v20, 1 + # n384 = len / 384; len -= n384 * 384; ctx->X[12] += n384 * 6 + li s6, 384 + divu s11, a3, s6 + mul s7, s11, s6 + sub a3, a3, s7 + slli s7, s11, 1 + add s7, s7, s11 + slli s7, s7, 1 + lw s6, 48(a0) + add s6, s6, s7 + sw s6, 48(a0) +L_chacha20_riscv64_vec_384_outer: + # Scalar state (X[12] from running counter v31) + ld t0, 0(a0) + ld t2, 8(a0) + ld t4, 16(a0) + ld t6, 24(a0) + ld a5, 32(a0) + ld a7, 40(a0) + lw s3, 52(a0) + ld s4, 56(a0) + srli t1, t0, 32 + srli t3, t2, 32 + srli t5, t4, 32 + srli a4, t6, 32 + srli a6, a5, 32 + srli s1, a7, 32 + srli s5, s4, 32 + vmv.x.s s2, v31 + # Vector blocks = state; counters base+1 .. base+4; scalar base+5 + vmv4r.v v0, v28 + vmv4r.v v4, v28 + vmv4r.v v8, v28 + vmv4r.v v12, v28 + vmv4r.v v16, v28 + addi s7, s2, 1 + vmv.s.x v7, s7 + addi s7, s2, 2 + vmv.s.x v11, s7 + addi s7, s2, 3 + vmv.s.x v15, s7 + addi s7, s2, 4 + vmv.s.x v19, s7 + addi s2, s2, 5 + li s10, 10 +L_chacha20_riscv64_vec_384_loop: + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + vadd.vv v12, v12, v13 + vadd.vv v16, v16, v17 + add t0, t0, t4 + add t1, t1, t5 + add t2, t2, t6 + add t3, t3, a4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + vxor.vv v15, v15, v12 + vxor.vv v19, v19, v16 + xor s2, s2, t0 + xor s3, s3, t1 + xor s4, s4, t2 + xor s5, s5, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 + vror.vi v7, v7, 16 + vror.vi v11, v11, 16 + vror.vi v15, v15, 16 + vror.vi v19, v19, 16 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s2, s2, 16 + .word 0x6109591b + # roriw s3, s3, 16 + .word 0x6109d99b + # roriw s4, s4, 16 + .word 0x610a5a1b + # roriw s5, s5, 16 + .word 0x610ada9b +#else + slli s6, s2, 16 + slli s7, s3, 16 + slli s8, s4, 16 + slli s9, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + srliw s5, s5, 16 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 16 + vsll.vi v21, v7, 16 + vsll.vi v22, v11, 16 + vsll.vi v23, v15, 16 + vsll.vi v24, v19, 16 + vsrl.vi v3, v3, 16 + vsrl.vi v7, v7, 16 + vsrl.vi v11, v11, 16 + vsrl.vi v15, v15, 16 + vsrl.vi v19, v19, 16 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + vor.vv v15, v15, v23 + vor.vv v19, v19, v24 + slli s6, s2, 16 + slli s7, s3, 16 + slli s8, s4, 16 + slli s9, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + srliw s5, s5, 16 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + vadd.vv v14, v14, v15 + vadd.vv v18, v18, v19 + add a5, a5, s2 + add a6, a6, s3 + add a7, a7, s4 + add s1, s1, s5 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + vxor.vv v13, v13, v14 + vxor.vv v17, v17, v18 + xor t4, t4, a5 + xor t5, t5, a6 + xor t6, t6, a7 + xor a4, a4, s1 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 + vror.vi v5, v5, 20 + vror.vi v9, v9, 20 + vror.vi v13, v13, 20 + vror.vi v17, v17, 20 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t4, t4, 20 + .word 0x614ede9b + # roriw t5, t5, 20 + .word 0x614f5f1b + # roriw t6, t6, 20 + .word 0x614fdf9b + # roriw a4, a4, 20 + .word 0x6147571b +#else + slli s6, t4, 12 + slli s7, t5, 12 + slli s8, t6, 12 + slli s9, a4, 12 + srliw t4, t4, 20 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 12 + vsll.vi v21, v5, 12 + vsll.vi v22, v9, 12 + vsll.vi v23, v13, 12 + vsll.vi v24, v17, 12 + vsrl.vi v1, v1, 20 + vsrl.vi v5, v5, 20 + vsrl.vi v9, v9, 20 + vsrl.vi v13, v13, 20 + vsrl.vi v17, v17, 20 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + vor.vv v13, v13, v23 + vor.vv v17, v17, v24 + slli s6, t4, 12 + slli s7, t5, 12 + slli s8, t6, 12 + slli s9, a4, 12 + srliw t4, t4, 20 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + vadd.vv v12, v12, v13 + vadd.vv v16, v16, v17 + add t0, t0, t4 + add t1, t1, t5 + add t2, t2, t6 + add t3, t3, a4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + vxor.vv v15, v15, v12 + vxor.vv v19, v19, v16 + xor s2, s2, t0 + xor s3, s3, t1 + xor s4, s4, t2 + xor s5, s5, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 + vror.vi v7, v7, 24 + vror.vi v11, v11, 24 + vror.vi v15, v15, 24 + vror.vi v19, v19, 24 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s2, s2, 24 + .word 0x6189591b + # roriw s3, s3, 24 + .word 0x6189d99b + # roriw s4, s4, 24 + .word 0x618a5a1b + # roriw s5, s5, 24 + .word 0x618ada9b +#else + slli s6, s2, 8 + slli s7, s3, 8 + slli s8, s4, 8 + slli s9, s5, 8 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + srliw s5, s5, 24 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 8 + vsll.vi v21, v7, 8 + vsll.vi v22, v11, 8 + vsll.vi v23, v15, 8 + vsll.vi v24, v19, 8 + vsrl.vi v3, v3, 24 + vsrl.vi v7, v7, 24 + vsrl.vi v11, v11, 24 + vsrl.vi v15, v15, 24 + vsrl.vi v19, v19, 24 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + vor.vv v15, v15, v23 + vor.vv v19, v19, v24 + slli s6, s2, 8 + slli s7, s3, 8 + slli s8, s4, 8 + slli s9, s5, 8 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + srliw s5, s5, 24 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + vadd.vv v14, v14, v15 + vadd.vv v18, v18, v19 + add a5, a5, s2 + add a6, a6, s3 + add a7, a7, s4 + add s1, s1, s5 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + vxor.vv v13, v13, v14 + vxor.vv v17, v17, v18 + xor t4, t4, a5 + xor t5, t5, a6 + xor t6, t6, a7 + xor a4, a4, s1 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 + vror.vi v5, v5, 25 + vror.vi v9, v9, 25 + vror.vi v13, v13, 25 + vror.vi v17, v17, 25 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t4, t4, 25 + .word 0x619ede9b + # roriw t5, t5, 25 + .word 0x619f5f1b + # roriw t6, t6, 25 + .word 0x619fdf9b + # roriw a4, a4, 25 + .word 0x6197571b +#else + slli s6, t4, 7 + slli s7, t5, 7 + slli s8, t6, 7 + slli s9, a4, 7 + srliw t4, t4, 25 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 7 + vsll.vi v21, v5, 7 + vsll.vi v22, v9, 7 + vsll.vi v23, v13, 7 + vsll.vi v24, v17, 7 + vsrl.vi v1, v1, 25 + vsrl.vi v5, v5, 25 + vsrl.vi v9, v9, 25 + vsrl.vi v13, v13, 25 + vsrl.vi v17, v17, 25 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + vor.vv v13, v13, v23 + vor.vv v17, v17, v24 + slli s6, t4, 7 + slli s7, t5, 7 + slli s8, t6, 7 + slli s9, a4, 7 + srliw t4, t4, 25 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vrgather.vv v20, v3, v27 + vrgather.vv v21, v7, v27 + vrgather.vv v22, v11, v27 + vrgather.vv v23, v15, v27 + vrgather.vv v24, v19, v27 + vmv.v.v v3, v20 + vmv.v.v v7, v21 + vmv.v.v v11, v22 + vmv.v.v v15, v23 + vmv.v.v v19, v24 + vrgather.vv v20, v1, v25 + vrgather.vv v21, v5, v25 + vrgather.vv v22, v9, v25 + vrgather.vv v23, v13, v25 + vrgather.vv v24, v17, v25 + vmv.v.v v1, v20 + vmv.v.v v5, v21 + vmv.v.v v9, v22 + vmv.v.v v13, v23 + vmv.v.v v17, v24 + vrgather.vv v20, v2, v26 + vrgather.vv v21, v6, v26 + vrgather.vv v22, v10, v26 + vrgather.vv v23, v14, v26 + vrgather.vv v24, v18, v26 + vmv.v.v v2, v20 + vmv.v.v v6, v21 + vmv.v.v v10, v22 + vmv.v.v v14, v23 + vmv.v.v v18, v24 + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + vadd.vv v12, v12, v13 + vadd.vv v16, v16, v17 + add t0, t0, t5 + add t1, t1, t6 + add t2, t2, a4 + add t3, t3, t4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + vxor.vv v15, v15, v12 + vxor.vv v19, v19, v16 + xor s5, s5, t0 + xor s2, s2, t1 + xor s3, s3, t2 + xor s4, s4, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 + vror.vi v7, v7, 16 + vror.vi v11, v11, 16 + vror.vi v15, v15, 16 + vror.vi v19, v19, 16 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s5, s5, 16 + .word 0x610ada9b + # roriw s2, s2, 16 + .word 0x6109591b + # roriw s3, s3, 16 + .word 0x6109d99b + # roriw s4, s4, 16 + .word 0x610a5a1b +#else + slli s6, s5, 16 + slli s7, s2, 16 + slli s8, s3, 16 + slli s9, s4, 16 + srliw s5, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 16 + vsll.vi v21, v7, 16 + vsll.vi v22, v11, 16 + vsll.vi v23, v15, 16 + vsll.vi v24, v19, 16 + vsrl.vi v3, v3, 16 + vsrl.vi v7, v7, 16 + vsrl.vi v11, v11, 16 + vsrl.vi v15, v15, 16 + vsrl.vi v19, v19, 16 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + vor.vv v15, v15, v23 + vor.vv v19, v19, v24 + slli s6, s5, 16 + slli s7, s2, 16 + slli s8, s3, 16 + slli s9, s4, 16 + srliw s5, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + vadd.vv v14, v14, v15 + vadd.vv v18, v18, v19 + add a7, a7, s5 + add s1, s1, s2 + add a5, a5, s3 + add a6, a6, s4 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + vxor.vv v13, v13, v14 + vxor.vv v17, v17, v18 + xor t5, t5, a7 + xor t6, t6, s1 + xor a4, a4, a5 + xor t4, t4, a6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 + vror.vi v5, v5, 20 + vror.vi v9, v9, 20 + vror.vi v13, v13, 20 + vror.vi v17, v17, 20 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t5, t5, 20 + .word 0x614f5f1b + # roriw t6, t6, 20 + .word 0x614fdf9b + # roriw a4, a4, 20 + .word 0x6147571b + # roriw t4, t4, 20 + .word 0x614ede9b +#else + slli s6, t5, 12 + slli s7, t6, 12 + slli s8, a4, 12 + slli s9, t4, 12 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + srliw t4, t4, 20 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 12 + vsll.vi v21, v5, 12 + vsll.vi v22, v9, 12 + vsll.vi v23, v13, 12 + vsll.vi v24, v17, 12 + vsrl.vi v1, v1, 20 + vsrl.vi v5, v5, 20 + vsrl.vi v9, v9, 20 + vsrl.vi v13, v13, 20 + vsrl.vi v17, v17, 20 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + vor.vv v13, v13, v23 + vor.vv v17, v17, v24 + slli s6, t5, 12 + slli s7, t6, 12 + slli s8, a4, 12 + slli s9, t4, 12 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + srliw t4, t4, 20 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + vadd.vv v12, v12, v13 + vadd.vv v16, v16, v17 + add t0, t0, t5 + add t1, t1, t6 + add t2, t2, a4 + add t3, t3, t4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + vxor.vv v15, v15, v12 + vxor.vv v19, v19, v16 + xor s5, s5, t0 + xor s2, s2, t1 + xor s3, s3, t2 + xor s4, s4, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 + vror.vi v7, v7, 24 + vror.vi v11, v11, 24 + vror.vi v15, v15, 24 + vror.vi v19, v19, 24 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s5, s5, 24 + .word 0x618ada9b + # roriw s2, s2, 24 + .word 0x6189591b + # roriw s3, s3, 24 + .word 0x6189d99b + # roriw s4, s4, 24 + .word 0x618a5a1b +#else + slli s6, s5, 8 + slli s7, s2, 8 + slli s8, s3, 8 + slli s9, s4, 8 + srliw s5, s5, 24 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 8 + vsll.vi v21, v7, 8 + vsll.vi v22, v11, 8 + vsll.vi v23, v15, 8 + vsll.vi v24, v19, 8 + vsrl.vi v3, v3, 24 + vsrl.vi v7, v7, 24 + vsrl.vi v11, v11, 24 + vsrl.vi v15, v15, 24 + vsrl.vi v19, v19, 24 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + vor.vv v15, v15, v23 + vor.vv v19, v19, v24 + slli s6, s5, 8 + slli s7, s2, 8 + slli s8, s3, 8 + slli s9, s4, 8 + srliw s5, s5, 24 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + vadd.vv v14, v14, v15 + vadd.vv v18, v18, v19 + add a7, a7, s5 + add s1, s1, s2 + add a5, a5, s3 + add a6, a6, s4 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + vxor.vv v13, v13, v14 + vxor.vv v17, v17, v18 + xor t5, t5, a7 + xor t6, t6, s1 + xor a4, a4, a5 + xor t4, t4, a6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 + vror.vi v5, v5, 25 + vror.vi v9, v9, 25 + vror.vi v13, v13, 25 + vror.vi v17, v17, 25 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t5, t5, 25 + .word 0x619f5f1b + # roriw t6, t6, 25 + .word 0x619fdf9b + # roriw a4, a4, 25 + .word 0x6197571b + # roriw t4, t4, 25 + .word 0x619ede9b +#else + slli s6, t5, 7 + slli s7, t6, 7 + slli s8, a4, 7 + slli s9, t4, 7 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + srliw t4, t4, 25 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 7 + vsll.vi v21, v5, 7 + vsll.vi v22, v9, 7 + vsll.vi v23, v13, 7 + vsll.vi v24, v17, 7 + vsrl.vi v1, v1, 25 + vsrl.vi v5, v5, 25 + vsrl.vi v9, v9, 25 + vsrl.vi v13, v13, 25 + vsrl.vi v17, v17, 25 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + vor.vv v13, v13, v23 + vor.vv v17, v17, v24 + slli s6, t5, 7 + slli s7, t6, 7 + slli s8, a4, 7 + slli s9, t4, 7 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + srliw t4, t4, 25 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vrgather.vv v20, v3, v25 + vrgather.vv v21, v7, v25 + vrgather.vv v22, v11, v25 + vrgather.vv v23, v15, v25 + vrgather.vv v24, v19, v25 + vmv.v.v v3, v20 + vmv.v.v v7, v21 + vmv.v.v v11, v22 + vmv.v.v v15, v23 + vmv.v.v v19, v24 + vrgather.vv v20, v1, v27 + vrgather.vv v21, v5, v27 + vrgather.vv v22, v9, v27 + vrgather.vv v23, v13, v27 + vrgather.vv v24, v17, v27 + vmv.v.v v1, v20 + vmv.v.v v5, v21 + vmv.v.v v9, v22 + vmv.v.v v13, v23 + vmv.v.v v17, v24 + vrgather.vv v20, v2, v26 + vrgather.vv v21, v6, v26 + vrgather.vv v22, v10, v26 + vrgather.vv v23, v14, v26 + vrgather.vv v24, v18, v26 + vmv.v.v v2, v20 + vmv.v.v v6, v21 + vmv.v.v v10, v22 + vmv.v.v v14, v23 + vmv.v.v v18, v24 + addi s10, s10, -1 + bnez s10, L_chacha20_riscv64_vec_384_loop + # Block 1: add back, XOR message, store + mv s8, a2 + vl4re32.v v20, (s8) + addi a2, a2, 64 + vadd.vv v0, v0, v28 + vadd.vv v1, v1, v29 + vadd.vv v2, v2, v30 + vadd.vv v3, v3, v31 + vxor.vv v0, v0, v20 + vxor.vv v1, v1, v21 + vxor.vv v2, v2, v22 + vxor.vv v3, v3, v23 + mv s8, a1 + vs4r.v v0, (s8) + addi a1, a1, 64 + vmv.x.s s6, v31 + # Blocks 2-5 (vector) + addi s6, s6, 1 + vmv.s.x v31, s6 + mv s8, a2 + vl4re32.v v20, (s8) + addi a2, a2, 64 + vadd.vv v4, v4, v28 + vadd.vv v5, v5, v29 + vadd.vv v6, v6, v30 + vadd.vv v7, v7, v31 + vxor.vv v4, v4, v20 + vxor.vv v5, v5, v21 + vxor.vv v6, v6, v22 + vxor.vv v7, v7, v23 + mv s8, a1 + vs4r.v v4, (s8) + addi a1, a1, 64 + addi s6, s6, 1 + vmv.s.x v31, s6 + mv s8, a2 + vl4re32.v v20, (s8) + addi a2, a2, 64 + vadd.vv v8, v8, v28 + vadd.vv v9, v9, v29 + vadd.vv v10, v10, v30 + vadd.vv v11, v11, v31 + vxor.vv v8, v8, v20 + vxor.vv v9, v9, v21 + vxor.vv v10, v10, v22 + vxor.vv v11, v11, v23 + mv s8, a1 + vs4r.v v8, (s8) + addi a1, a1, 64 + addi s6, s6, 1 + vmv.s.x v31, s6 + mv s8, a2 + vl4re32.v v20, (s8) + addi a2, a2, 64 + vadd.vv v12, v12, v28 + vadd.vv v13, v13, v29 + vadd.vv v14, v14, v30 + vadd.vv v15, v15, v31 + vxor.vv v12, v12, v20 + vxor.vv v13, v13, v21 + vxor.vv v14, v14, v22 + vxor.vv v15, v15, v23 + mv s8, a1 + vs4r.v v12, (s8) + addi a1, a1, 64 + addi s6, s6, 1 + vmv.s.x v31, s6 + mv s8, a2 + vl4re32.v v20, (s8) + addi a2, a2, 64 + vadd.vv v16, v16, v28 + vadd.vv v17, v17, v29 + vadd.vv v18, v18, v30 + vadd.vv v19, v19, v31 + vxor.vv v16, v16, v20 + vxor.vv v17, v17, v21 + vxor.vv v18, v18, v22 + vxor.vv v19, v19, v23 + mv s8, a1 + vs4r.v v16, (s8) + addi a1, a1, 64 + # Block 6 (scalar) + addi s6, s6, 1 + mv s8, a2 + vl4re32.v v20, (s8) + addi a2, a2, 64 + vmv.s.x v0, t0 + vmv.s.x v1, t4 + vmv.s.x v2, a5 + vmv.s.x v3, s2 + vmv.s.x v4, t1 + vmv.s.x v5, t5 + vmv.s.x v6, a6 + vmv.s.x v7, s3 + vslideup.vi v0, v4, 1 + vslideup.vi v1, v5, 1 + vslideup.vi v2, v6, 1 + vslideup.vi v3, v7, 1 + vmv.s.x v4, t2 + vmv.s.x v5, t6 + vmv.s.x v6, a7 + vmv.s.x v7, s4 + vslideup.vi v0, v4, 2 + vslideup.vi v1, v5, 2 + vslideup.vi v2, v6, 2 + vslideup.vi v3, v7, 2 + vmv.s.x v4, t3 + vmv.s.x v5, a4 + vmv.s.x v6, s1 + vmv.s.x v7, s5 + vslideup.vi v0, v4, 3 + vslideup.vi v1, v5, 3 + vslideup.vi v2, v6, 3 + vslideup.vi v3, v7, 3 + vmv.s.x v31, s6 + vadd.vv v0, v0, v28 + vadd.vv v1, v1, v29 + vadd.vv v2, v2, v30 + vadd.vv v3, v3, v31 + vxor.vv v0, v0, v20 + vxor.vv v1, v1, v21 + vxor.vv v2, v2, v22 + vxor.vv v3, v3, v23 + mv s8, a1 + vs4r.v v0, (s8) + addi a1, a1, 64 + # Advance running counter for next iteration + addi s6, s6, 1 + vmv.s.x v31, s6 + addi s11, s11, -1 + bnez s11, L_chacha20_riscv64_vec_384_outer +L_chacha20_riscv64_vec_after_384: + # Four-block (256-byte) tier + li s7, 256 + bltu a3, s7, L_chacha20_riscv64_vec_after_256 + # Load state to encrypt + mv s8, a0 + vl4re32.v v16, (s8) + vid.v v20 + vslidedown.vi v23, v20, 1 + vslideup.vi v23, v20, 3 + vslidedown.vi v24, v20, 2 + vslideup.vi v24, v20, 2 + vslidedown.vi v25, v20, 3 + vslideup.vi v25, v20, 1 + ld t0, 0(a0) + ld t2, 8(a0) + ld t4, 16(a0) + ld t6, 24(a0) + ld a5, 32(a0) + ld a7, 40(a0) + ld s2, 48(a0) + ld s4, 56(a0) + srli t1, t0, 32 + srli t3, t2, 32 + srli t5, t4, 32 + srli a4, t6, 32 + srli a6, a5, 32 + srli s1, a7, 32 + srli s3, s2, 32 + srli s5, s4, 32 + # Block counters: 1=base, 2=base+1, 3=base+2, 4(scalar)=base+3 + vmv4r.v v0, v16 + addi s6, s2, 1 + vmv4r.v v4, v16 + addi s7, s2, 2 + vmv4r.v v8, v16 + addi s2, s2, 3 + vmv.s.x v7, s6 + vmv.s.x v11, s7 + li s10, 10 +L_chacha20_riscv64_vec_256_loop: + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + add t0, t0, t4 + add t1, t1, t5 + add t2, t2, t6 + add t3, t3, a4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + xor s2, s2, t0 + xor s3, s3, t1 + xor s4, s4, t2 + xor s5, s5, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 + vror.vi v7, v7, 16 + vror.vi v11, v11, 16 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s2, s2, 16 + .word 0x6109591b + # roriw s3, s3, 16 + .word 0x6109d99b + # roriw s4, s4, 16 + .word 0x610a5a1b + # roriw s5, s5, 16 + .word 0x610ada9b +#else + slli s6, s2, 16 + slli s7, s3, 16 + slli s8, s4, 16 + slli s9, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + srliw s5, s5, 16 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 16 + vsll.vi v21, v7, 16 + vsll.vi v22, v11, 16 + vsrl.vi v3, v3, 16 + vsrl.vi v7, v7, 16 + vsrl.vi v11, v11, 16 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + slli s6, s2, 16 + slli s7, s3, 16 + slli s8, s4, 16 + slli s9, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + srliw s5, s5, 16 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + add a5, a5, s2 + add a6, a6, s3 + add a7, a7, s4 + add s1, s1, s5 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + xor t4, t4, a5 + xor t5, t5, a6 + xor t6, t6, a7 + xor a4, a4, s1 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 + vror.vi v5, v5, 20 + vror.vi v9, v9, 20 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t4, t4, 20 + .word 0x614ede9b + # roriw t5, t5, 20 + .word 0x614f5f1b + # roriw t6, t6, 20 + .word 0x614fdf9b + # roriw a4, a4, 20 + .word 0x6147571b +#else + slli s6, t4, 12 + slli s7, t5, 12 + slli s8, t6, 12 + slli s9, a4, 12 + srliw t4, t4, 20 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 12 + vsll.vi v21, v5, 12 + vsll.vi v22, v9, 12 + vsrl.vi v1, v1, 20 + vsrl.vi v5, v5, 20 + vsrl.vi v9, v9, 20 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + slli s6, t4, 12 + slli s7, t5, 12 + slli s8, t6, 12 + slli s9, a4, 12 + srliw t4, t4, 20 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + add t0, t0, t4 + add t1, t1, t5 + add t2, t2, t6 + add t3, t3, a4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + xor s2, s2, t0 + xor s3, s3, t1 + xor s4, s4, t2 + xor s5, s5, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 + vror.vi v7, v7, 24 + vror.vi v11, v11, 24 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s2, s2, 24 + .word 0x6189591b + # roriw s3, s3, 24 + .word 0x6189d99b + # roriw s4, s4, 24 + .word 0x618a5a1b + # roriw s5, s5, 24 + .word 0x618ada9b +#else + slli s6, s2, 8 + slli s7, s3, 8 + slli s8, s4, 8 + slli s9, s5, 8 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + srliw s5, s5, 24 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 8 + vsll.vi v21, v7, 8 + vsll.vi v22, v11, 8 + vsrl.vi v3, v3, 24 + vsrl.vi v7, v7, 24 + vsrl.vi v11, v11, 24 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + slli s6, s2, 8 + slli s7, s3, 8 + slli s8, s4, 8 + slli s9, s5, 8 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + srliw s5, s5, 24 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + add a5, a5, s2 + add a6, a6, s3 + add a7, a7, s4 + add s1, s1, s5 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + xor t4, t4, a5 + xor t5, t5, a6 + xor t6, t6, a7 + xor a4, a4, s1 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 + vror.vi v5, v5, 25 + vror.vi v9, v9, 25 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t4, t4, 25 + .word 0x619ede9b + # roriw t5, t5, 25 + .word 0x619f5f1b + # roriw t6, t6, 25 + .word 0x619fdf9b + # roriw a4, a4, 25 + .word 0x6197571b +#else + slli s6, t4, 7 + slli s7, t5, 7 + slli s8, t6, 7 + slli s9, a4, 7 + srliw t4, t4, 25 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 7 + vsll.vi v21, v5, 7 + vsll.vi v22, v9, 7 + vsrl.vi v1, v1, 25 + vsrl.vi v5, v5, 25 + vsrl.vi v9, v9, 25 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + slli s6, t4, 7 + slli s7, t5, 7 + slli s8, t6, 7 + slli s9, a4, 7 + srliw t4, t4, 25 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vrgather.vv v20, v3, v25 + vrgather.vv v21, v7, v25 + vrgather.vv v22, v11, v25 + vmv.v.v v3, v20 + vmv.v.v v7, v21 + vmv.v.v v11, v22 + vrgather.vv v20, v1, v23 + vrgather.vv v21, v5, v23 + vrgather.vv v22, v9, v23 + vmv.v.v v1, v20 + vmv.v.v v5, v21 + vmv.v.v v9, v22 + vrgather.vv v20, v2, v24 + vrgather.vv v21, v6, v24 + vrgather.vv v22, v10, v24 + vmv.v.v v2, v20 + vmv.v.v v6, v21 + vmv.v.v v10, v22 + addi s10, s10, -1 + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + add t0, t0, t5 + add t1, t1, t6 + add t2, t2, a4 + add t3, t3, t4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + xor s5, s5, t0 + xor s2, s2, t1 + xor s3, s3, t2 + xor s4, s4, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 + vror.vi v7, v7, 16 + vror.vi v11, v11, 16 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s5, s5, 16 + .word 0x610ada9b + # roriw s2, s2, 16 + .word 0x6109591b + # roriw s3, s3, 16 + .word 0x6109d99b + # roriw s4, s4, 16 + .word 0x610a5a1b +#else + slli s6, s5, 16 + slli s7, s2, 16 + slli s8, s3, 16 + slli s9, s4, 16 + srliw s5, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 16 + vsll.vi v21, v7, 16 + vsll.vi v22, v11, 16 + vsrl.vi v3, v3, 16 + vsrl.vi v7, v7, 16 + vsrl.vi v11, v11, 16 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + slli s6, s5, 16 + slli s7, s2, 16 + slli s8, s3, 16 + slli s9, s4, 16 + srliw s5, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + add a7, a7, s5 + add s1, s1, s2 + add a5, a5, s3 + add a6, a6, s4 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + xor t5, t5, a7 + xor t6, t6, s1 + xor a4, a4, a5 + xor t4, t4, a6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 + vror.vi v5, v5, 20 + vror.vi v9, v9, 20 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t5, t5, 20 + .word 0x614f5f1b + # roriw t6, t6, 20 + .word 0x614fdf9b + # roriw a4, a4, 20 + .word 0x6147571b + # roriw t4, t4, 20 + .word 0x614ede9b +#else + slli s6, t5, 12 + slli s7, t6, 12 + slli s8, a4, 12 + slli s9, t4, 12 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + srliw t4, t4, 20 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 12 + vsll.vi v21, v5, 12 + vsll.vi v22, v9, 12 + vsrl.vi v1, v1, 20 + vsrl.vi v5, v5, 20 + vsrl.vi v9, v9, 20 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + slli s6, t5, 12 + slli s7, t6, 12 + slli s8, a4, 12 + slli s9, t4, 12 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + srliw t4, t4, 20 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vadd.vv v8, v8, v9 + add t0, t0, t5 + add t1, t1, t6 + add t2, t2, a4 + add t3, t3, t4 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 + vxor.vv v11, v11, v8 + xor s5, s5, t0 + xor s2, s2, t1 + xor s3, s3, t2 + xor s4, s4, t3 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 + vror.vi v7, v7, 24 + vror.vi v11, v11, 24 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw s5, s5, 24 + .word 0x618ada9b + # roriw s2, s2, 24 + .word 0x6189591b + # roriw s3, s3, 24 + .word 0x6189d99b + # roriw s4, s4, 24 + .word 0x618a5a1b +#else + slli s6, s5, 8 + slli s7, s2, 8 + slli s8, s3, 8 + slli s9, s4, 8 + srliw s5, s5, 24 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v3, 8 + vsll.vi v21, v7, 8 + vsll.vi v22, v11, 8 + vsrl.vi v3, v3, 24 + vsrl.vi v7, v7, 24 + vsrl.vi v11, v11, 24 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 + vor.vv v11, v11, v22 + slli s6, s5, 8 + slli s7, s2, 8 + slli s8, s3, 8 + slli s9, s4, 8 + srliw s5, s5, 24 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vadd.vv v10, v10, v11 + add a7, a7, s5 + add s1, s1, s2 + add a5, a5, s3 + add a6, a6, s4 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 + vxor.vv v9, v9, v10 + xor t5, t5, a7 + xor t6, t6, s1 + xor a4, a4, a5 + xor t4, t4, a6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 + vror.vi v5, v5, 25 + vror.vi v9, v9, 25 +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + # roriw t5, t5, 25 + .word 0x619f5f1b + # roriw t6, t6, 25 + .word 0x619fdf9b + # roriw a4, a4, 25 + .word 0x6197571b + # roriw t4, t4, 25 + .word 0x619ede9b +#else + slli s6, t5, 7 + slli s7, t6, 7 + slli s8, a4, 7 + slli s9, t4, 7 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + srliw t4, t4, 25 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + vsll.vi v20, v1, 7 + vsll.vi v21, v5, 7 + vsll.vi v22, v9, 7 + vsrl.vi v1, v1, 25 + vsrl.vi v5, v5, 25 + vsrl.vi v9, v9, 25 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 + vor.vv v9, v9, v22 + slli s6, t5, 7 + slli s7, t6, 7 + slli s8, a4, 7 + slli s9, t4, 7 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + srliw t4, t4, 25 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vrgather.vv v20, v3, v23 + vrgather.vv v21, v7, v23 + vrgather.vv v22, v11, v23 + vmv.v.v v3, v20 + vmv.v.v v7, v21 + vmv.v.v v11, v22 + vrgather.vv v20, v1, v25 + vrgather.vv v21, v5, v25 + vrgather.vv v22, v9, v25 + vmv.v.v v1, v20 + vmv.v.v v5, v21 + vmv.v.v v9, v22 + vrgather.vv v20, v2, v24 + vrgather.vv v21, v6, v24 + vrgather.vv v22, v10, v24 + vmv.v.v v2, v20 + vmv.v.v v6, v21 + vmv.v.v v10, v22 + bnez s10, L_chacha20_riscv64_vec_256_loop + # Block 1: add back, XOR message, store + mv s8, a2 + vl4re32.v v12, (s8) + addi a2, a2, 64 + vadd.vv v0, v0, v16 + vadd.vv v1, v1, v17 + vadd.vv v2, v2, v18 + vadd.vv v3, v3, v19 + vxor.vv v0, v0, v12 + vxor.vv v1, v1, v13 + vxor.vv v2, v2, v14 + vxor.vv v3, v3, v15 + mv s8, a2 + vl4re32.v v12, (s8) + addi a2, a2, 64 + vmv.x.s s6, v19 + mv s8, a1 + vs4r.v v0, (s8) + addi a1, a1, 64 + # Block 2 + addi s6, s6, 1 + vmv.s.x v19, s6 + vadd.vv v4, v4, v16 + vadd.vv v5, v5, v17 + vadd.vv v6, v6, v18 + vadd.vv v7, v7, v19 + vxor.vv v4, v4, v12 + vxor.vv v5, v5, v13 + vxor.vv v6, v6, v14 + vxor.vv v7, v7, v15 + mv s8, a2 + vl4re32.v v12, (s8) + addi a2, a2, 64 + mv s8, a1 + vs4r.v v4, (s8) + addi a1, a1, 64 + # Block 3 + addi s6, s6, 1 + vmv.s.x v19, s6 + vadd.vv v8, v8, v16 + vadd.vv v9, v9, v17 + vadd.vv v10, v10, v18 + vadd.vv v11, v11, v19 + vxor.vv v8, v8, v12 + vxor.vv v9, v9, v13 + vxor.vv v10, v10, v14 + vxor.vv v11, v11, v15 + mv s8, a2 + vl4re32.v v12, (s8) + mv s8, a1 + vs4r.v v8, (s8) + addi a1, a1, 64 + # Block 4 (scalar): recombine, add back, XOR message, store + addi s6, s6, 1 + vmv.s.x v0, t0 + vmv.s.x v1, t4 + vmv.s.x v2, a5 + vmv.s.x v3, s2 + vmv.s.x v4, t1 + vmv.s.x v5, t5 + vmv.s.x v6, a6 + vmv.s.x v7, s3 + vslideup.vi v0, v4, 1 + vslideup.vi v1, v5, 1 + vslideup.vi v2, v6, 1 + vslideup.vi v3, v7, 1 + vmv.s.x v4, t2 + vmv.s.x v5, t6 + vmv.s.x v6, a7 + vmv.s.x v7, s4 + vslideup.vi v0, v4, 2 + vslideup.vi v1, v5, 2 + vslideup.vi v2, v6, 2 + vslideup.vi v3, v7, 2 + vmv.s.x v4, t3 + vmv.s.x v5, a4 + vmv.s.x v6, s1 + vmv.s.x v7, s5 + vslideup.vi v0, v4, 3 + vslideup.vi v1, v5, 3 + vslideup.vi v2, v6, 3 + vslideup.vi v3, v7, 3 + vmv.s.x v19, s6 + vadd.vv v0, v0, v16 + vadd.vv v1, v1, v17 + vadd.vv v2, v2, v18 + vadd.vv v3, v3, v19 + vxor.vv v0, v0, v12 + vxor.vv v1, v1, v13 + vxor.vv v2, v2, v14 + vxor.vv v3, v3, v15 + mv s8, a1 + vs4r.v v0, (s8) + addi a1, a1, 64 + # Advance pointers, length and counter by 4 blocks + addi a2, a2, 64 + addi a3, a3, -256 + lw s6, 48(a0) + addi s6, s6, 4 + sw s6, 48(a0) +L_chacha20_riscv64_vec_after_256: + # Two-block (128-byte) tier + li s7, 128 + bltu a3, s7, L_chacha20_riscv64_vec_after_128 + # Load state to encrypt + mv s8, a0 + vl4re32.v v16, (s8) + # Advance ctx->X[12] by 2 blocks + lw s6, 48(a0) + addi s6, s6, 2 + sw s6, 48(a0) + # Counter increment {1,0,0,0} and lane-rotate indices + vmv.v.i v22, 0 + li s6, 1 + vmv.s.x v22, s6 + vid.v v20 + vslidedown.vi v23, v20, 1 + vslideup.vi v23, v20, 3 + vslidedown.vi v24, v20, 2 + vslideup.vi v24, v20, 2 + vslidedown.vi v25, v20, 3 + vslideup.vi v25, v20, 1 + vmv4r.v v0, v16 + vmv4r.v v4, v16 + # Second block counter += 1 + vadd.vv v7, v7, v22 + li s6, 10 +L_chacha20_riscv64_vec_128_loop: + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 + vror.vi v7, v7, 16 +#else + vsll.vi v20, v3, 16 + vsll.vi v21, v7, 16 + vsrl.vi v3, v3, 16 + vsrl.vi v7, v7, 16 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 + vror.vi v5, v5, 20 +#else + vsll.vi v20, v1, 12 + vsll.vi v21, v5, 12 + vsrl.vi v1, v1, 20 + vsrl.vi v5, v5, 20 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 + vror.vi v7, v7, 24 +#else + vsll.vi v20, v3, 8 + vsll.vi v21, v7, 8 + vsrl.vi v3, v3, 24 + vsrl.vi v7, v7, 24 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 + vror.vi v5, v5, 25 +#else + vsll.vi v20, v1, 7 + vsll.vi v21, v5, 7 + vsrl.vi v1, v1, 25 + vsrl.vi v5, v5, 25 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vrgather.vv v20, v3, v25 + vrgather.vv v21, v7, v25 + vmv.v.v v3, v20 + vmv.v.v v7, v21 + vrgather.vv v20, v1, v23 + vrgather.vv v21, v5, v23 + vmv.v.v v1, v20 + vmv.v.v v5, v21 + vrgather.vv v20, v2, v24 + vrgather.vv v21, v6, v24 + vmv.v.v v2, v20 + vmv.v.v v6, v21 + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 + vror.vi v7, v7, 16 +#else + vsll.vi v20, v3, 16 + vsll.vi v21, v7, 16 + vsrl.vi v3, v3, 16 + vsrl.vi v7, v7, 16 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 + vror.vi v5, v5, 20 +#else + vsll.vi v20, v1, 12 + vsll.vi v21, v5, 12 + vsrl.vi v1, v1, 20 + vsrl.vi v5, v5, 20 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vadd.vv v4, v4, v5 + vxor.vv v3, v3, v0 + vxor.vv v7, v7, v4 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 + vror.vi v7, v7, 24 +#else + vsll.vi v20, v3, 8 + vsll.vi v21, v7, 8 + vsrl.vi v3, v3, 24 + vsrl.vi v7, v7, 24 + vor.vv v3, v3, v20 + vor.vv v7, v7, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vadd.vv v6, v6, v7 + vxor.vv v1, v1, v2 + vxor.vv v5, v5, v6 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 + vror.vi v5, v5, 25 +#else + vsll.vi v20, v1, 7 + vsll.vi v21, v5, 7 + vsrl.vi v1, v1, 25 + vsrl.vi v5, v5, 25 + vor.vv v1, v1, v20 + vor.vv v5, v5, v21 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vrgather.vv v20, v3, v23 + vrgather.vv v21, v7, v23 + vmv.v.v v3, v20 + vmv.v.v v7, v21 + vrgather.vv v20, v1, v25 + vrgather.vv v21, v5, v25 + vmv.v.v v1, v20 + vmv.v.v v5, v21 + vrgather.vv v20, v2, v24 + vrgather.vv v21, v6, v24 + vmv.v.v v2, v20 + vmv.v.v v6, v21 + addi s6, s6, -1 + bnez s6, L_chacha20_riscv64_vec_128_loop + # Add back state, XOR message, store - block 1 + vadd.vv v0, v0, v16 + vadd.vv v1, v1, v17 + vadd.vv v2, v2, v18 + vadd.vv v3, v3, v19 + mv s8, a2 + vl4re32.v v12, (s8) + vxor.vv v0, v0, v12 + vxor.vv v1, v1, v13 + vxor.vv v2, v2, v14 + vxor.vv v3, v3, v15 + mv s8, a1 + vs4r.v v0, (s8) + addi a2, a2, 64 + addi a1, a1, 64 + # Add back state, XOR message, store - block 2 + vadd.vv v19, v19, v22 + vadd.vv v4, v4, v16 + vadd.vv v5, v5, v17 + vadd.vv v6, v6, v18 + vadd.vv v7, v7, v19 + mv s8, a2 + vl4re32.v v12, (s8) + vxor.vv v4, v4, v12 + vxor.vv v5, v5, v13 + vxor.vv v6, v6, v14 + vxor.vv v7, v7, v15 + mv s8, a1 + vs4r.v v4, (s8) + addi a2, a2, 64 + addi a1, a1, 64 + addi a3, a3, -128 +L_chacha20_riscv64_vec_after_128: + beqz a3, L_chacha20_riscv64_vec_done + # Load state to encrypt + mv s8, a0 + vl4re32.v v8, (s8) + # Advance ctx->X[12] by number of blocks: (len + 63) / 64 + addi s6, a3, 63 + srli s6, s6, 6 + lw s7, 48(a0) + add s7, s7, s6 + sw s7, 48(a0) + # Counter increment {1,0,0,0} + vmv.v.i v13, 0 + li s6, 1 + vmv.s.x v13, s6 +L_chacha20_riscv64_vec_64_loop: + vmv4r.v v0, v8 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 3 + vslideup.vi v12, v3, 1 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 1 + vslideup.vi v12, v1, 3 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 16 +#else + vsll.vi v12, v3, 16 + vsrl.vi v3, v3, 16 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 20 +#else + vsll.vi v12, v1, 12 + vsrl.vi v1, v1, 20 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v0, v0, v1 + vxor.vv v3, v3, v0 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v3, v3, 24 +#else + vsll.vi v12, v3, 8 + vsrl.vi v3, v3, 24 + vor.vv v3, v3, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vadd.vv v2, v2, v3 + vxor.vv v1, v1, v2 +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + vror.vi v1, v1, 25 +#else + vsll.vi v12, v1, 7 + vsrl.vi v1, v1, 25 + vor.vv v1, v1, v12 +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + vslidedown.vi v12, v3, 1 + vslideup.vi v12, v3, 3 + vmv.v.v v3, v12 + vslidedown.vi v12, v1, 3 + vslideup.vi v12, v1, 1 + vmv.v.v v1, v12 + vslidedown.vi v12, v2, 2 + vslideup.vi v12, v2, 2 + vmv.v.v v2, v12 + addi s7, a3, -64 + # Add back state + vadd.vv v0, v0, v8 + vadd.vv v1, v1, v9 + vadd.vv v2, v2, v10 + vadd.vv v3, v3, v11 + bltz s7, L_chacha20_riscv64_vec_64_lt_64 + # Encipher 64 bytes + mv s8, a2 + vl4re32.v v4, (s8) + vxor.vv v4, v4, v0 + vxor.vv v5, v5, v1 + vxor.vv v6, v6, v2 + vxor.vv v7, v7, v3 + mv s8, a1 + vs4r.v v4, (s8) + addi a3, a3, -64 + addi a1, a1, 64 + addi a2, a2, 64 + vadd.vv v11, v11, v13 + bnez a3, L_chacha20_riscv64_vec_64_loop + j L_chacha20_riscv64_vec_done +L_chacha20_riscv64_vec_64_lt_64: + # Store full keystream block for leftovers + addi s8, a0, 72 + addi s7, a3, -32 + vs4r.v v0, (s8) + bltz s7, L_chacha20_riscv64_vec_64_lt_32 + # Encipher 32 bytes + mv s8, a2 + vl2re32.v v4, (s8) + vxor.vv v4, v4, v0 + vxor.vv v5, v5, v1 + mv s8, a1 + vs2r.v v4, (s8) + addi a3, a3, -32 + addi a1, a1, 32 + addi a2, a2, 32 + beqz a3, L_chacha20_riscv64_vec_done + vmv2r.v v0, v2 +L_chacha20_riscv64_vec_64_lt_32: + addi s7, a3, -16 + bltz s7, L_chacha20_riscv64_vec_64_lt_16 + # Encipher 16 bytes + mv s8, a2 + vl1re32.v v4, (s8) + vxor.vv v4, v4, v0 + mv s8, a1 + vs1r.v v4, (s8) + addi a3, a3, -16 + addi a1, a1, 16 + addi a2, a2, 16 + beqz a3, L_chacha20_riscv64_vec_done + vmv.v.v v0, v1 +L_chacha20_riscv64_vec_64_lt_16: + addi s7, a3, -8 + bltz s7, L_chacha20_riscv64_vec_64_lt_8 + # Encipher 8 bytes + vsetivli zero, 2, e64, m1, ta, ma + vmv.x.s s6, v0 + vsetivli zero, 4, e32, m1, ta, ma + ld s7, 0(a2) + xor s7, s7, s6 + sd s7, 0(a1) + addi a3, a3, -8 + addi a1, a1, 8 + addi a2, a2, 8 + beqz a3, L_chacha20_riscv64_vec_done + vslidedown.vi v0, v0, 2 +L_chacha20_riscv64_vec_64_lt_8: + addi a3, a3, -1 + vsetivli zero, 2, e64, m1, ta, ma + vmv.x.s s6, v0 + vsetivli zero, 4, e32, m1, ta, ma +L_chacha20_riscv64_vec_64_loop_lt_8: + # Encipher byte at a time + addi a3, a3, -1 + lb s7, 0(a2) + addi a2, a2, 1 + xor s7, s7, s6 + sb s7, 0(a1) + addi a1, a1, 1 + srli s6, s6, 8 + bgez a3, L_chacha20_riscv64_vec_64_loop_lt_8 +L_chacha20_riscv64_vec_done: + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + ret + .size wc_chacha_crypt_bytes,.-wc_chacha_crypt_bytes +#else + .text + .globl wc_chacha_crypt_bytes + .type wc_chacha_crypt_bytes,@function + .align 2 +wc_chacha_crypt_bytes: + addi sp, sp, -96 + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + .option arch, +zbb, +zbkb +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + # Ensure 64-bit length has top bits clear + slli a3, a3, 32 + srli a3, a3, 32 + # ctx->left = (CHACHA_CHUNK_BYTES - (len & 63)) & 63 + andi s6, a3, 63 + li s7, 64 + sub s6, s7, s6 + andi s6, s6, 63 + sw s6, 64(a0) + # over = ctx->over + addi s11, a0, 72 +L_chacha20_riscv64_outer: + # Load state into working registers + ld t0, 0(a0) + ld t2, 8(a0) + ld t4, 16(a0) + ld t6, 24(a0) + ld a5, 32(a0) + ld a7, 40(a0) + ld s2, 48(a0) + ld s4, 56(a0) + srli t1, t0, 32 + srli t3, t2, 32 + srli t5, t4, 32 + srli a4, t6, 32 + srli a6, a5, 32 + srli s1, a7, 32 + srli s3, s2, 32 + srli s5, s4, 32 + # 10 double rounds + li s10, 10 +L_chacha20_riscv64_loop: + add t0, t0, t4 + add t1, t1, t5 + add t2, t2, t6 + add t3, t3, a4 + xor s2, s2, t0 + xor s3, s3, t1 + xor s4, s4, t2 + xor s5, s5, t3 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw s2, s2, 16 + .word 0x6109591b + # roriw s3, s3, 16 + .word 0x6109d99b + # roriw s4, s4, 16 + .word 0x610a5a1b + # roriw s5, s5, 16 + .word 0x610ada9b +#else + slli s6, s2, 16 + slli s7, s3, 16 + slli s8, s4, 16 + slli s9, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + srliw s5, s5, 16 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + add a5, a5, s2 + add a6, a6, s3 + add a7, a7, s4 + add s1, s1, s5 + xor t4, t4, a5 + xor t5, t5, a6 + xor t6, t6, a7 + xor a4, a4, s1 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw t4, t4, 20 + .word 0x614ede9b + # roriw t5, t5, 20 + .word 0x614f5f1b + # roriw t6, t6, 20 + .word 0x614fdf9b + # roriw a4, a4, 20 + .word 0x6147571b +#else + slli s6, t4, 12 + slli s7, t5, 12 + slli s8, t6, 12 + slli s9, a4, 12 + srliw t4, t4, 20 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + add t0, t0, t4 + add t1, t1, t5 + add t2, t2, t6 + add t3, t3, a4 + xor s2, s2, t0 + xor s3, s3, t1 + xor s4, s4, t2 + xor s5, s5, t3 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw s2, s2, 24 + .word 0x6189591b + # roriw s3, s3, 24 + .word 0x6189d99b + # roriw s4, s4, 24 + .word 0x618a5a1b + # roriw s5, s5, 24 + .word 0x618ada9b +#else + slli s6, s2, 8 + slli s7, s3, 8 + slli s8, s4, 8 + slli s9, s5, 8 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + srliw s5, s5, 24 + or s2, s2, s6 + or s3, s3, s7 + or s4, s4, s8 + or s5, s5, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + add a5, a5, s2 + add a6, a6, s3 + add a7, a7, s4 + add s1, s1, s5 + xor t4, t4, a5 + xor t5, t5, a6 + xor t6, t6, a7 + xor a4, a4, s1 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw t4, t4, 25 + .word 0x619ede9b + # roriw t5, t5, 25 + .word 0x619f5f1b + # roriw t6, t6, 25 + .word 0x619fdf9b + # roriw a4, a4, 25 + .word 0x6197571b +#else + slli s6, t4, 7 + slli s7, t5, 7 + slli s8, t6, 7 + slli s9, a4, 7 + srliw t4, t4, 25 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + or t4, t4, s6 + or t5, t5, s7 + or t6, t6, s8 + or a4, a4, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + addi s10, s10, -1 + add t0, t0, t5 + add t1, t1, t6 + add t2, t2, a4 + add t3, t3, t4 + xor s5, s5, t0 + xor s2, s2, t1 + xor s3, s3, t2 + xor s4, s4, t3 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw s5, s5, 16 + .word 0x610ada9b + # roriw s2, s2, 16 + .word 0x6109591b + # roriw s3, s3, 16 + .word 0x6109d99b + # roriw s4, s4, 16 + .word 0x610a5a1b +#else + slli s6, s5, 16 + slli s7, s2, 16 + slli s8, s3, 16 + slli s9, s4, 16 + srliw s5, s5, 16 + srliw s2, s2, 16 + srliw s3, s3, 16 + srliw s4, s4, 16 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + add a7, a7, s5 + add s1, s1, s2 + add a5, a5, s3 + add a6, a6, s4 + xor t5, t5, a7 + xor t6, t6, s1 + xor a4, a4, a5 + xor t4, t4, a6 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw t5, t5, 20 + .word 0x614f5f1b + # roriw t6, t6, 20 + .word 0x614fdf9b + # roriw a4, a4, 20 + .word 0x6147571b + # roriw t4, t4, 20 + .word 0x614ede9b +#else + slli s6, t5, 12 + slli s7, t6, 12 + slli s8, a4, 12 + slli s9, t4, 12 + srliw t5, t5, 20 + srliw t6, t6, 20 + srliw a4, a4, 20 + srliw t4, t4, 20 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + add t0, t0, t5 + add t1, t1, t6 + add t2, t2, a4 + add t3, t3, t4 + xor s5, s5, t0 + xor s2, s2, t1 + xor s3, s3, t2 + xor s4, s4, t3 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw s5, s5, 24 + .word 0x618ada9b + # roriw s2, s2, 24 + .word 0x6189591b + # roriw s3, s3, 24 + .word 0x6189d99b + # roriw s4, s4, 24 + .word 0x618a5a1b +#else + slli s6, s5, 8 + slli s7, s2, 8 + slli s8, s3, 8 + slli s9, s4, 8 + srliw s5, s5, 24 + srliw s2, s2, 24 + srliw s3, s3, 24 + srliw s4, s4, 24 + or s5, s5, s6 + or s2, s2, s7 + or s3, s3, s8 + or s4, s4, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + add a7, a7, s5 + add s1, s1, s2 + add a5, a5, s3 + add a6, a6, s4 + xor t5, t5, a7 + xor t6, t6, s1 + xor a4, a4, a5 + xor t4, t4, a6 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # roriw t5, t5, 25 + .word 0x619f5f1b + # roriw t6, t6, 25 + .word 0x619fdf9b + # roriw a4, a4, 25 + .word 0x6197571b + # roriw t4, t4, 25 + .word 0x619ede9b +#else + slli s6, t5, 7 + slli s7, t6, 7 + slli s8, a4, 7 + slli s9, t4, 7 + srliw t5, t5, 25 + srliw t6, t6, 25 + srliw a4, a4, 25 + srliw t4, t4, 25 + or t5, t5, s6 + or t6, t6, s7 + or a4, a4, s8 + or t4, t4, s9 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + bnez s10, L_chacha20_riscv64_loop + addi a3, a3, -64 + # Add original state back in; increment block counter X[12] + ld s6, 0(a0) + ld s7, 8(a0) + ld s8, 16(a0) + ld s9, 24(a0) + add t0, t0, s6 + add t2, t2, s7 + add t4, t4, s8 + add t6, t6, s9 + srli s6, s6, 32 + srli s7, s7, 32 + srli s8, s8, 32 + srli s9, s9, 32 + add t1, t1, s6 + add t3, t3, s7 + add t5, t5, s8 + add a4, a4, s9 + ld s6, 32(a0) + ld s7, 40(a0) + ld s8, 48(a0) + ld s9, 56(a0) + add a5, a5, s6 + add a7, a7, s7 + add s2, s2, s8 + add s4, s4, s9 + srli s6, s6, 32 + srli s7, s7, 32 + srli s9, s9, 32 + add a6, a6, s6 + add s1, s1, s7 + add s5, s5, s9 + srli s9, s8, 32 + add s3, s3, s9 + addi s8, s8, 1 + sw s8, 48(a0) + bltz a3, L_chacha20_riscv64_over + # XOR full 64-byte block of message and store +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + # pack t0, t0, t1 + .word 0x0862c2b3 + # pack t2, t2, t3 + .word 0x09c3c3b3 + # pack t4, t4, t5 + .word 0x09eeceb3 + # pack t6, t6, a4 + .word 0x08efcfb3 + # pack a5, a5, a6 + .word 0x0907c7b3 + # pack a7, a7, s1 + .word 0x0898c8b3 + # pack s2, s2, s3 + .word 0x09394933 + # pack s4, s4, s5 + .word 0x095a4a33 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 0(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld16_w + ld t1, 0(a2) + j L_ualn_ld16_e +L_ualn_ld16_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld16_h + lwu t1, 0(a2) + lwu s10, 4(a2) + slli s10, s10, 32 + or t1, t1, s10 + j L_ualn_ld16_e +L_ualn_ld16_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld16_b + lhu t1, 0(a2) + lhu s10, 2(a2) + slli s10, s10, 16 + or t1, t1, s10 + lhu s10, 4(a2) + slli s10, s10, 32 + or t1, t1, s10 + lhu s10, 6(a2) + slli s10, s10, 48 + or t1, t1, s10 + j L_ualn_ld16_e +L_ualn_ld16_b: + lbu t1, 0(a2) + lbu s10, 1(a2) + slli s10, s10, 8 + or t1, t1, s10 + lbu s10, 2(a2) + slli s10, s10, 16 + or t1, t1, s10 + lbu s10, 3(a2) + slli s10, s10, 24 + or t1, t1, s10 + lbu s10, 4(a2) + slli s10, s10, 32 + or t1, t1, s10 + lbu s10, 5(a2) + slli s10, s10, 40 + or t1, t1, s10 + lbu s10, 6(a2) + slli s10, s10, 48 + or t1, t1, s10 + lbu s10, 7(a2) + slli s10, s10, 56 + or t1, t1, s10 +L_ualn_ld16_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 8(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld17_w + ld t3, 8(a2) + j L_ualn_ld17_e +L_ualn_ld17_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld17_h + lwu t3, 8(a2) + lwu s10, 12(a2) + slli s10, s10, 32 + or t3, t3, s10 + j L_ualn_ld17_e +L_ualn_ld17_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld17_b + lhu t3, 8(a2) + lhu s10, 10(a2) + slli s10, s10, 16 + or t3, t3, s10 + lhu s10, 12(a2) + slli s10, s10, 32 + or t3, t3, s10 + lhu s10, 14(a2) + slli s10, s10, 48 + or t3, t3, s10 + j L_ualn_ld17_e +L_ualn_ld17_b: + lbu t3, 8(a2) + lbu s10, 9(a2) + slli s10, s10, 8 + or t3, t3, s10 + lbu s10, 10(a2) + slli s10, s10, 16 + or t3, t3, s10 + lbu s10, 11(a2) + slli s10, s10, 24 + or t3, t3, s10 + lbu s10, 12(a2) + slli s10, s10, 32 + or t3, t3, s10 + lbu s10, 13(a2) + slli s10, s10, 40 + or t3, t3, s10 + lbu s10, 14(a2) + slli s10, s10, 48 + or t3, t3, s10 + lbu s10, 15(a2) + slli s10, s10, 56 + or t3, t3, s10 +L_ualn_ld17_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t5, 16(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld18_w + ld t5, 16(a2) + j L_ualn_ld18_e +L_ualn_ld18_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld18_h + lwu t5, 16(a2) + lwu s10, 20(a2) + slli s10, s10, 32 + or t5, t5, s10 + j L_ualn_ld18_e +L_ualn_ld18_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld18_b + lhu t5, 16(a2) + lhu s10, 18(a2) + slli s10, s10, 16 + or t5, t5, s10 + lhu s10, 20(a2) + slli s10, s10, 32 + or t5, t5, s10 + lhu s10, 22(a2) + slli s10, s10, 48 + or t5, t5, s10 + j L_ualn_ld18_e +L_ualn_ld18_b: + lbu t5, 16(a2) + lbu s10, 17(a2) + slli s10, s10, 8 + or t5, t5, s10 + lbu s10, 18(a2) + slli s10, s10, 16 + or t5, t5, s10 + lbu s10, 19(a2) + slli s10, s10, 24 + or t5, t5, s10 + lbu s10, 20(a2) + slli s10, s10, 32 + or t5, t5, s10 + lbu s10, 21(a2) + slli s10, s10, 40 + or t5, t5, s10 + lbu s10, 22(a2) + slli s10, s10, 48 + or t5, t5, s10 + lbu s10, 23(a2) + slli s10, s10, 56 + or t5, t5, s10 +L_ualn_ld18_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 24(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld19_w + ld a4, 24(a2) + j L_ualn_ld19_e +L_ualn_ld19_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld19_h + lwu a4, 24(a2) + lwu s10, 28(a2) + slli s10, s10, 32 + or a4, a4, s10 + j L_ualn_ld19_e +L_ualn_ld19_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld19_b + lhu a4, 24(a2) + lhu s10, 26(a2) + slli s10, s10, 16 + or a4, a4, s10 + lhu s10, 28(a2) + slli s10, s10, 32 + or a4, a4, s10 + lhu s10, 30(a2) + slli s10, s10, 48 + or a4, a4, s10 + j L_ualn_ld19_e +L_ualn_ld19_b: + lbu a4, 24(a2) + lbu s10, 25(a2) + slli s10, s10, 8 + or a4, a4, s10 + lbu s10, 26(a2) + slli s10, s10, 16 + or a4, a4, s10 + lbu s10, 27(a2) + slli s10, s10, 24 + or a4, a4, s10 + lbu s10, 28(a2) + slli s10, s10, 32 + or a4, a4, s10 + lbu s10, 29(a2) + slli s10, s10, 40 + or a4, a4, s10 + lbu s10, 30(a2) + slli s10, s10, 48 + or a4, a4, s10 + lbu s10, 31(a2) + slli s10, s10, 56 + or a4, a4, s10 +L_ualn_ld19_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 32(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld20_w + ld a6, 32(a2) + j L_ualn_ld20_e +L_ualn_ld20_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld20_h + lwu a6, 32(a2) + lwu s10, 36(a2) + slli s10, s10, 32 + or a6, a6, s10 + j L_ualn_ld20_e +L_ualn_ld20_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld20_b + lhu a6, 32(a2) + lhu s10, 34(a2) + slli s10, s10, 16 + or a6, a6, s10 + lhu s10, 36(a2) + slli s10, s10, 32 + or a6, a6, s10 + lhu s10, 38(a2) + slli s10, s10, 48 + or a6, a6, s10 + j L_ualn_ld20_e +L_ualn_ld20_b: + lbu a6, 32(a2) + lbu s10, 33(a2) + slli s10, s10, 8 + or a6, a6, s10 + lbu s10, 34(a2) + slli s10, s10, 16 + or a6, a6, s10 + lbu s10, 35(a2) + slli s10, s10, 24 + or a6, a6, s10 + lbu s10, 36(a2) + slli s10, s10, 32 + or a6, a6, s10 + lbu s10, 37(a2) + slli s10, s10, 40 + or a6, a6, s10 + lbu s10, 38(a2) + slli s10, s10, 48 + or a6, a6, s10 + lbu s10, 39(a2) + slli s10, s10, 56 + or a6, a6, s10 +L_ualn_ld20_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s1, 40(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld21_w + ld s1, 40(a2) + j L_ualn_ld21_e +L_ualn_ld21_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld21_h + lwu s1, 40(a2) + lwu s10, 44(a2) + slli s10, s10, 32 + or s1, s1, s10 + j L_ualn_ld21_e +L_ualn_ld21_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld21_b + lhu s1, 40(a2) + lhu s10, 42(a2) + slli s10, s10, 16 + or s1, s1, s10 + lhu s10, 44(a2) + slli s10, s10, 32 + or s1, s1, s10 + lhu s10, 46(a2) + slli s10, s10, 48 + or s1, s1, s10 + j L_ualn_ld21_e +L_ualn_ld21_b: + lbu s1, 40(a2) + lbu s10, 41(a2) + slli s10, s10, 8 + or s1, s1, s10 + lbu s10, 42(a2) + slli s10, s10, 16 + or s1, s1, s10 + lbu s10, 43(a2) + slli s10, s10, 24 + or s1, s1, s10 + lbu s10, 44(a2) + slli s10, s10, 32 + or s1, s1, s10 + lbu s10, 45(a2) + slli s10, s10, 40 + or s1, s1, s10 + lbu s10, 46(a2) + slli s10, s10, 48 + or s1, s1, s10 + lbu s10, 47(a2) + slli s10, s10, 56 + or s1, s1, s10 +L_ualn_ld21_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s3, 48(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld22_w + ld s3, 48(a2) + j L_ualn_ld22_e +L_ualn_ld22_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld22_h + lwu s3, 48(a2) + lwu s10, 52(a2) + slli s10, s10, 32 + or s3, s3, s10 + j L_ualn_ld22_e +L_ualn_ld22_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld22_b + lhu s3, 48(a2) + lhu s10, 50(a2) + slli s10, s10, 16 + or s3, s3, s10 + lhu s10, 52(a2) + slli s10, s10, 32 + or s3, s3, s10 + lhu s10, 54(a2) + slli s10, s10, 48 + or s3, s3, s10 + j L_ualn_ld22_e +L_ualn_ld22_b: + lbu s3, 48(a2) + lbu s10, 49(a2) + slli s10, s10, 8 + or s3, s3, s10 + lbu s10, 50(a2) + slli s10, s10, 16 + or s3, s3, s10 + lbu s10, 51(a2) + slli s10, s10, 24 + or s3, s3, s10 + lbu s10, 52(a2) + slli s10, s10, 32 + or s3, s3, s10 + lbu s10, 53(a2) + slli s10, s10, 40 + or s3, s3, s10 + lbu s10, 54(a2) + slli s10, s10, 48 + or s3, s3, s10 + lbu s10, 55(a2) + slli s10, s10, 56 + or s3, s3, s10 +L_ualn_ld22_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s5, 56(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld23_w + ld s5, 56(a2) + j L_ualn_ld23_e +L_ualn_ld23_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld23_h + lwu s5, 56(a2) + lwu s10, 60(a2) + slli s10, s10, 32 + or s5, s5, s10 + j L_ualn_ld23_e +L_ualn_ld23_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld23_b + lhu s5, 56(a2) + lhu s10, 58(a2) + slli s10, s10, 16 + or s5, s5, s10 + lhu s10, 60(a2) + slli s10, s10, 32 + or s5, s5, s10 + lhu s10, 62(a2) + slli s10, s10, 48 + or s5, s5, s10 + j L_ualn_ld23_e +L_ualn_ld23_b: + lbu s5, 56(a2) + lbu s10, 57(a2) + slli s10, s10, 8 + or s5, s5, s10 + lbu s10, 58(a2) + slli s10, s10, 16 + or s5, s5, s10 + lbu s10, 59(a2) + slli s10, s10, 24 + or s5, s5, s10 + lbu s10, 60(a2) + slli s10, s10, 32 + or s5, s5, s10 + lbu s10, 61(a2) + slli s10, s10, 40 + or s5, s5, s10 + lbu s10, 62(a2) + slli s10, s10, 48 + or s5, s5, s10 + lbu s10, 63(a2) + slli s10, s10, 56 + or s5, s5, s10 +L_ualn_ld23_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t0, t0, t1 + xor t2, t2, t3 + xor t4, t4, t5 + xor t6, t6, a4 + xor a5, a5, a6 + xor a7, a7, s1 + xor s2, s2, s3 + xor s4, s4, s5 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t0, 0(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd24_w + sd t0, 0(a1) + j L_ualn_sd24_e +L_ualn_sd24_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd24_h + sw t0, 0(a1) + srli s10, t0, 32 + sw s10, 4(a1) + j L_ualn_sd24_e +L_ualn_sd24_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd24_b + sh t0, 0(a1) + srli s10, t0, 16 + sh s10, 2(a1) + srli s10, t0, 32 + sh s10, 4(a1) + srli s10, t0, 48 + sh s10, 6(a1) + j L_ualn_sd24_e +L_ualn_sd24_b: + sb t0, 0(a1) + srli s10, t0, 8 + sb s10, 1(a1) + srli s10, t0, 16 + sb s10, 2(a1) + srli s10, t0, 24 + sb s10, 3(a1) + srli s10, t0, 32 + sb s10, 4(a1) + srli s10, t0, 40 + sb s10, 5(a1) + srli s10, t0, 48 + sb s10, 6(a1) + srli s10, t0, 56 + sb s10, 7(a1) +L_ualn_sd24_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t2, 8(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd25_w + sd t2, 8(a1) + j L_ualn_sd25_e +L_ualn_sd25_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd25_h + sw t2, 8(a1) + srli s10, t2, 32 + sw s10, 12(a1) + j L_ualn_sd25_e +L_ualn_sd25_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd25_b + sh t2, 8(a1) + srli s10, t2, 16 + sh s10, 10(a1) + srli s10, t2, 32 + sh s10, 12(a1) + srli s10, t2, 48 + sh s10, 14(a1) + j L_ualn_sd25_e +L_ualn_sd25_b: + sb t2, 8(a1) + srli s10, t2, 8 + sb s10, 9(a1) + srli s10, t2, 16 + sb s10, 10(a1) + srli s10, t2, 24 + sb s10, 11(a1) + srli s10, t2, 32 + sb s10, 12(a1) + srli s10, t2, 40 + sb s10, 13(a1) + srli s10, t2, 48 + sb s10, 14(a1) + srli s10, t2, 56 + sb s10, 15(a1) +L_ualn_sd25_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t4, 16(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd26_w + sd t4, 16(a1) + j L_ualn_sd26_e +L_ualn_sd26_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd26_h + sw t4, 16(a1) + srli s10, t4, 32 + sw s10, 20(a1) + j L_ualn_sd26_e +L_ualn_sd26_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd26_b + sh t4, 16(a1) + srli s10, t4, 16 + sh s10, 18(a1) + srli s10, t4, 32 + sh s10, 20(a1) + srli s10, t4, 48 + sh s10, 22(a1) + j L_ualn_sd26_e +L_ualn_sd26_b: + sb t4, 16(a1) + srli s10, t4, 8 + sb s10, 17(a1) + srli s10, t4, 16 + sb s10, 18(a1) + srli s10, t4, 24 + sb s10, 19(a1) + srli s10, t4, 32 + sb s10, 20(a1) + srli s10, t4, 40 + sb s10, 21(a1) + srli s10, t4, 48 + sb s10, 22(a1) + srli s10, t4, 56 + sb s10, 23(a1) +L_ualn_sd26_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd t6, 24(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd27_w + sd t6, 24(a1) + j L_ualn_sd27_e +L_ualn_sd27_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd27_h + sw t6, 24(a1) + srli s10, t6, 32 + sw s10, 28(a1) + j L_ualn_sd27_e +L_ualn_sd27_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd27_b + sh t6, 24(a1) + srli s10, t6, 16 + sh s10, 26(a1) + srli s10, t6, 32 + sh s10, 28(a1) + srli s10, t6, 48 + sh s10, 30(a1) + j L_ualn_sd27_e +L_ualn_sd27_b: + sb t6, 24(a1) + srli s10, t6, 8 + sb s10, 25(a1) + srli s10, t6, 16 + sb s10, 26(a1) + srli s10, t6, 24 + sb s10, 27(a1) + srli s10, t6, 32 + sb s10, 28(a1) + srli s10, t6, 40 + sb s10, 29(a1) + srli s10, t6, 48 + sb s10, 30(a1) + srli s10, t6, 56 + sb s10, 31(a1) +L_ualn_sd27_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd a5, 32(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd28_w + sd a5, 32(a1) + j L_ualn_sd28_e +L_ualn_sd28_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd28_h + sw a5, 32(a1) + srli s10, a5, 32 + sw s10, 36(a1) + j L_ualn_sd28_e +L_ualn_sd28_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd28_b + sh a5, 32(a1) + srli s10, a5, 16 + sh s10, 34(a1) + srli s10, a5, 32 + sh s10, 36(a1) + srli s10, a5, 48 + sh s10, 38(a1) + j L_ualn_sd28_e +L_ualn_sd28_b: + sb a5, 32(a1) + srli s10, a5, 8 + sb s10, 33(a1) + srli s10, a5, 16 + sb s10, 34(a1) + srli s10, a5, 24 + sb s10, 35(a1) + srli s10, a5, 32 + sb s10, 36(a1) + srli s10, a5, 40 + sb s10, 37(a1) + srli s10, a5, 48 + sb s10, 38(a1) + srli s10, a5, 56 + sb s10, 39(a1) +L_ualn_sd28_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd a7, 40(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd29_w + sd a7, 40(a1) + j L_ualn_sd29_e +L_ualn_sd29_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd29_h + sw a7, 40(a1) + srli s10, a7, 32 + sw s10, 44(a1) + j L_ualn_sd29_e +L_ualn_sd29_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd29_b + sh a7, 40(a1) + srli s10, a7, 16 + sh s10, 42(a1) + srli s10, a7, 32 + sh s10, 44(a1) + srli s10, a7, 48 + sh s10, 46(a1) + j L_ualn_sd29_e +L_ualn_sd29_b: + sb a7, 40(a1) + srli s10, a7, 8 + sb s10, 41(a1) + srli s10, a7, 16 + sb s10, 42(a1) + srli s10, a7, 24 + sb s10, 43(a1) + srli s10, a7, 32 + sb s10, 44(a1) + srli s10, a7, 40 + sb s10, 45(a1) + srli s10, a7, 48 + sb s10, 46(a1) + srli s10, a7, 56 + sb s10, 47(a1) +L_ualn_sd29_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd s2, 48(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd30_w + sd s2, 48(a1) + j L_ualn_sd30_e +L_ualn_sd30_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd30_h + sw s2, 48(a1) + srli s10, s2, 32 + sw s10, 52(a1) + j L_ualn_sd30_e +L_ualn_sd30_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd30_b + sh s2, 48(a1) + srli s10, s2, 16 + sh s10, 50(a1) + srli s10, s2, 32 + sh s10, 52(a1) + srli s10, s2, 48 + sh s10, 54(a1) + j L_ualn_sd30_e +L_ualn_sd30_b: + sb s2, 48(a1) + srli s10, s2, 8 + sb s10, 49(a1) + srli s10, s2, 16 + sb s10, 50(a1) + srli s10, s2, 24 + sb s10, 51(a1) + srli s10, s2, 32 + sb s10, 52(a1) + srli s10, s2, 40 + sb s10, 53(a1) + srli s10, s2, 48 + sb s10, 54(a1) + srli s10, s2, 56 + sb s10, 55(a1) +L_ualn_sd30_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd s4, 56(a1) +#else + andi s10, a1, 7 + bnez s10, L_ualn_sd31_w + sd s4, 56(a1) + j L_ualn_sd31_e +L_ualn_sd31_w: + andi s10, s10, 3 + bnez s10, L_ualn_sd31_h + sw s4, 56(a1) + srli s10, s4, 32 + sw s10, 60(a1) + j L_ualn_sd31_e +L_ualn_sd31_h: + andi s10, s10, 1 + bnez s10, L_ualn_sd31_b + sh s4, 56(a1) + srli s10, s4, 16 + sh s10, 58(a1) + srli s10, s4, 32 + sh s10, 60(a1) + srli s10, s4, 48 + sh s10, 62(a1) + j L_ualn_sd31_e +L_ualn_sd31_b: + sb s4, 56(a1) + srli s10, s4, 8 + sb s10, 57(a1) + srli s10, s4, 16 + sb s10, 58(a1) + srli s10, s4, 24 + sb s10, 59(a1) + srli s10, s4, 32 + sb s10, 60(a1) + srli s10, s4, 40 + sb s10, 61(a1) + srli s10, s4, 48 + sb s10, 62(a1) + srli s10, s4, 56 + sb s10, 63(a1) +L_ualn_sd31_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#else +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s6, 0(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld32_w + ld s6, 0(a2) + j L_ualn_ld32_e +L_ualn_ld32_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld32_h + lwu s6, 0(a2) + lwu s10, 4(a2) + slli s10, s10, 32 + or s6, s6, s10 + j L_ualn_ld32_e +L_ualn_ld32_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld32_b + lhu s6, 0(a2) + lhu s10, 2(a2) + slli s10, s10, 16 + or s6, s6, s10 + lhu s10, 4(a2) + slli s10, s10, 32 + or s6, s6, s10 + lhu s10, 6(a2) + slli s10, s10, 48 + or s6, s6, s10 + j L_ualn_ld32_e +L_ualn_ld32_b: + lbu s6, 0(a2) + lbu s10, 1(a2) + slli s10, s10, 8 + or s6, s6, s10 + lbu s10, 2(a2) + slli s10, s10, 16 + or s6, s6, s10 + lbu s10, 3(a2) + slli s10, s10, 24 + or s6, s6, s10 + lbu s10, 4(a2) + slli s10, s10, 32 + or s6, s6, s10 + lbu s10, 5(a2) + slli s10, s10, 40 + or s6, s6, s10 + lbu s10, 6(a2) + slli s10, s10, 48 + or s6, s6, s10 + lbu s10, 7(a2) + slli s10, s10, 56 + or s6, s6, s10 +L_ualn_ld32_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s7, 8(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld33_w + ld s7, 8(a2) + j L_ualn_ld33_e +L_ualn_ld33_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld33_h + lwu s7, 8(a2) + lwu s10, 12(a2) + slli s10, s10, 32 + or s7, s7, s10 + j L_ualn_ld33_e +L_ualn_ld33_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld33_b + lhu s7, 8(a2) + lhu s10, 10(a2) + slli s10, s10, 16 + or s7, s7, s10 + lhu s10, 12(a2) + slli s10, s10, 32 + or s7, s7, s10 + lhu s10, 14(a2) + slli s10, s10, 48 + or s7, s7, s10 + j L_ualn_ld33_e +L_ualn_ld33_b: + lbu s7, 8(a2) + lbu s10, 9(a2) + slli s10, s10, 8 + or s7, s7, s10 + lbu s10, 10(a2) + slli s10, s10, 16 + or s7, s7, s10 + lbu s10, 11(a2) + slli s10, s10, 24 + or s7, s7, s10 + lbu s10, 12(a2) + slli s10, s10, 32 + or s7, s7, s10 + lbu s10, 13(a2) + slli s10, s10, 40 + or s7, s7, s10 + lbu s10, 14(a2) + slli s10, s10, 48 + or s7, s7, s10 + lbu s10, 15(a2) + slli s10, s10, 56 + or s7, s7, s10 +L_ualn_ld33_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s8, 16(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld34_w + ld s8, 16(a2) + j L_ualn_ld34_e +L_ualn_ld34_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld34_h + lwu s8, 16(a2) + lwu s10, 20(a2) + slli s10, s10, 32 + or s8, s8, s10 + j L_ualn_ld34_e +L_ualn_ld34_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld34_b + lhu s8, 16(a2) + lhu s10, 18(a2) + slli s10, s10, 16 + or s8, s8, s10 + lhu s10, 20(a2) + slli s10, s10, 32 + or s8, s8, s10 + lhu s10, 22(a2) + slli s10, s10, 48 + or s8, s8, s10 + j L_ualn_ld34_e +L_ualn_ld34_b: + lbu s8, 16(a2) + lbu s10, 17(a2) + slli s10, s10, 8 + or s8, s8, s10 + lbu s10, 18(a2) + slli s10, s10, 16 + or s8, s8, s10 + lbu s10, 19(a2) + slli s10, s10, 24 + or s8, s8, s10 + lbu s10, 20(a2) + slli s10, s10, 32 + or s8, s8, s10 + lbu s10, 21(a2) + slli s10, s10, 40 + or s8, s8, s10 + lbu s10, 22(a2) + slli s10, s10, 48 + or s8, s8, s10 + lbu s10, 23(a2) + slli s10, s10, 56 + or s8, s8, s10 +L_ualn_ld34_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s9, 24(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld35_w + ld s9, 24(a2) + j L_ualn_ld35_e +L_ualn_ld35_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld35_h + lwu s9, 24(a2) + lwu s10, 28(a2) + slli s10, s10, 32 + or s9, s9, s10 + j L_ualn_ld35_e +L_ualn_ld35_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld35_b + lhu s9, 24(a2) + lhu s10, 26(a2) + slli s10, s10, 16 + or s9, s9, s10 + lhu s10, 28(a2) + slli s10, s10, 32 + or s9, s9, s10 + lhu s10, 30(a2) + slli s10, s10, 48 + or s9, s9, s10 + j L_ualn_ld35_e +L_ualn_ld35_b: + lbu s9, 24(a2) + lbu s10, 25(a2) + slli s10, s10, 8 + or s9, s9, s10 + lbu s10, 26(a2) + slli s10, s10, 16 + or s9, s9, s10 + lbu s10, 27(a2) + slli s10, s10, 24 + or s9, s9, s10 + lbu s10, 28(a2) + slli s10, s10, 32 + or s9, s9, s10 + lbu s10, 29(a2) + slli s10, s10, 40 + or s9, s9, s10 + lbu s10, 30(a2) + slli s10, s10, 48 + or s9, s9, s10 + lbu s10, 31(a2) + slli s10, s10, 56 + or s9, s9, s10 +L_ualn_ld35_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor t0, t0, s6 + xor t2, t2, s7 + xor t4, t4, s8 + xor t6, t6, s9 + srli s6, s6, 32 + srli s7, s7, 32 + srli s8, s8, 32 + srli s9, s9, 32 + xor t1, t1, s6 + xor t3, t3, s7 + xor t5, t5, s8 + xor a4, a4, s9 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s6, 32(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld36_w + ld s6, 32(a2) + j L_ualn_ld36_e +L_ualn_ld36_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld36_h + lwu s6, 32(a2) + lwu s10, 36(a2) + slli s10, s10, 32 + or s6, s6, s10 + j L_ualn_ld36_e +L_ualn_ld36_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld36_b + lhu s6, 32(a2) + lhu s10, 34(a2) + slli s10, s10, 16 + or s6, s6, s10 + lhu s10, 36(a2) + slli s10, s10, 32 + or s6, s6, s10 + lhu s10, 38(a2) + slli s10, s10, 48 + or s6, s6, s10 + j L_ualn_ld36_e +L_ualn_ld36_b: + lbu s6, 32(a2) + lbu s10, 33(a2) + slli s10, s10, 8 + or s6, s6, s10 + lbu s10, 34(a2) + slli s10, s10, 16 + or s6, s6, s10 + lbu s10, 35(a2) + slli s10, s10, 24 + or s6, s6, s10 + lbu s10, 36(a2) + slli s10, s10, 32 + or s6, s6, s10 + lbu s10, 37(a2) + slli s10, s10, 40 + or s6, s6, s10 + lbu s10, 38(a2) + slli s10, s10, 48 + or s6, s6, s10 + lbu s10, 39(a2) + slli s10, s10, 56 + or s6, s6, s10 +L_ualn_ld36_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s7, 40(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld37_w + ld s7, 40(a2) + j L_ualn_ld37_e +L_ualn_ld37_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld37_h + lwu s7, 40(a2) + lwu s10, 44(a2) + slli s10, s10, 32 + or s7, s7, s10 + j L_ualn_ld37_e +L_ualn_ld37_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld37_b + lhu s7, 40(a2) + lhu s10, 42(a2) + slli s10, s10, 16 + or s7, s7, s10 + lhu s10, 44(a2) + slli s10, s10, 32 + or s7, s7, s10 + lhu s10, 46(a2) + slli s10, s10, 48 + or s7, s7, s10 + j L_ualn_ld37_e +L_ualn_ld37_b: + lbu s7, 40(a2) + lbu s10, 41(a2) + slli s10, s10, 8 + or s7, s7, s10 + lbu s10, 42(a2) + slli s10, s10, 16 + or s7, s7, s10 + lbu s10, 43(a2) + slli s10, s10, 24 + or s7, s7, s10 + lbu s10, 44(a2) + slli s10, s10, 32 + or s7, s7, s10 + lbu s10, 45(a2) + slli s10, s10, 40 + or s7, s7, s10 + lbu s10, 46(a2) + slli s10, s10, 48 + or s7, s7, s10 + lbu s10, 47(a2) + slli s10, s10, 56 + or s7, s7, s10 +L_ualn_ld37_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s8, 48(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld38_w + ld s8, 48(a2) + j L_ualn_ld38_e +L_ualn_ld38_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld38_h + lwu s8, 48(a2) + lwu s10, 52(a2) + slli s10, s10, 32 + or s8, s8, s10 + j L_ualn_ld38_e +L_ualn_ld38_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld38_b + lhu s8, 48(a2) + lhu s10, 50(a2) + slli s10, s10, 16 + or s8, s8, s10 + lhu s10, 52(a2) + slli s10, s10, 32 + or s8, s8, s10 + lhu s10, 54(a2) + slli s10, s10, 48 + or s8, s8, s10 + j L_ualn_ld38_e +L_ualn_ld38_b: + lbu s8, 48(a2) + lbu s10, 49(a2) + slli s10, s10, 8 + or s8, s8, s10 + lbu s10, 50(a2) + slli s10, s10, 16 + or s8, s8, s10 + lbu s10, 51(a2) + slli s10, s10, 24 + or s8, s8, s10 + lbu s10, 52(a2) + slli s10, s10, 32 + or s8, s8, s10 + lbu s10, 53(a2) + slli s10, s10, 40 + or s8, s8, s10 + lbu s10, 54(a2) + slli s10, s10, 48 + or s8, s8, s10 + lbu s10, 55(a2) + slli s10, s10, 56 + or s8, s8, s10 +L_ualn_ld38_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s9, 56(a2) +#else + andi s10, a2, 7 + bnez s10, L_ualn_ld39_w + ld s9, 56(a2) + j L_ualn_ld39_e +L_ualn_ld39_w: + andi s10, s10, 3 + bnez s10, L_ualn_ld39_h + lwu s9, 56(a2) + lwu s10, 60(a2) + slli s10, s10, 32 + or s9, s9, s10 + j L_ualn_ld39_e +L_ualn_ld39_h: + andi s10, s10, 1 + bnez s10, L_ualn_ld39_b + lhu s9, 56(a2) + lhu s10, 58(a2) + slli s10, s10, 16 + or s9, s9, s10 + lhu s10, 60(a2) + slli s10, s10, 32 + or s9, s9, s10 + lhu s10, 62(a2) + slli s10, s10, 48 + or s9, s9, s10 + j L_ualn_ld39_e +L_ualn_ld39_b: + lbu s9, 56(a2) + lbu s10, 57(a2) + slli s10, s10, 8 + or s9, s9, s10 + lbu s10, 58(a2) + slli s10, s10, 16 + or s9, s9, s10 + lbu s10, 59(a2) + slli s10, s10, 24 + or s9, s9, s10 + lbu s10, 60(a2) + slli s10, s10, 32 + or s9, s9, s10 + lbu s10, 61(a2) + slli s10, s10, 40 + or s9, s9, s10 + lbu s10, 62(a2) + slli s10, s10, 48 + or s9, s9, s10 + lbu s10, 63(a2) + slli s10, s10, 56 + or s9, s9, s10 +L_ualn_ld39_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + xor a5, a5, s6 + xor a7, a7, s7 + xor s2, s2, s8 + xor s4, s4, s9 + srli s6, s6, 32 + srli s7, s7, 32 + srli s8, s8, 32 + srli s9, s9, 32 + xor a6, a6, s6 + xor s1, s1, s7 + xor s3, s3, s8 + xor s5, s5, s9 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t0, 0(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw40_h + sw t0, 0(a1) + j L_ualn_sw40_e +L_ualn_sw40_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw40_b + sh t0, 0(a1) + srli s10, t0, 16 + sh s10, 2(a1) + j L_ualn_sw40_e +L_ualn_sw40_b: + sb t0, 0(a1) + srli s10, t0, 8 + sb s10, 1(a1) + srli s10, t0, 16 + sb s10, 2(a1) + srli s10, t0, 24 + sb s10, 3(a1) +L_ualn_sw40_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t1, 4(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw41_h + sw t1, 4(a1) + j L_ualn_sw41_e +L_ualn_sw41_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw41_b + sh t1, 4(a1) + srli s10, t1, 16 + sh s10, 6(a1) + j L_ualn_sw41_e +L_ualn_sw41_b: + sb t1, 4(a1) + srli s10, t1, 8 + sb s10, 5(a1) + srli s10, t1, 16 + sb s10, 6(a1) + srli s10, t1, 24 + sb s10, 7(a1) +L_ualn_sw41_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t2, 8(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw42_h + sw t2, 8(a1) + j L_ualn_sw42_e +L_ualn_sw42_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw42_b + sh t2, 8(a1) + srli s10, t2, 16 + sh s10, 10(a1) + j L_ualn_sw42_e +L_ualn_sw42_b: + sb t2, 8(a1) + srli s10, t2, 8 + sb s10, 9(a1) + srli s10, t2, 16 + sb s10, 10(a1) + srli s10, t2, 24 + sb s10, 11(a1) +L_ualn_sw42_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t3, 12(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw43_h + sw t3, 12(a1) + j L_ualn_sw43_e +L_ualn_sw43_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw43_b + sh t3, 12(a1) + srli s10, t3, 16 + sh s10, 14(a1) + j L_ualn_sw43_e +L_ualn_sw43_b: + sb t3, 12(a1) + srli s10, t3, 8 + sb s10, 13(a1) + srli s10, t3, 16 + sb s10, 14(a1) + srli s10, t3, 24 + sb s10, 15(a1) +L_ualn_sw43_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t4, 16(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw44_h + sw t4, 16(a1) + j L_ualn_sw44_e +L_ualn_sw44_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw44_b + sh t4, 16(a1) + srli s10, t4, 16 + sh s10, 18(a1) + j L_ualn_sw44_e +L_ualn_sw44_b: + sb t4, 16(a1) + srli s10, t4, 8 + sb s10, 17(a1) + srli s10, t4, 16 + sb s10, 18(a1) + srli s10, t4, 24 + sb s10, 19(a1) +L_ualn_sw44_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t5, 20(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw45_h + sw t5, 20(a1) + j L_ualn_sw45_e +L_ualn_sw45_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw45_b + sh t5, 20(a1) + srli s10, t5, 16 + sh s10, 22(a1) + j L_ualn_sw45_e +L_ualn_sw45_b: + sb t5, 20(a1) + srli s10, t5, 8 + sb s10, 21(a1) + srli s10, t5, 16 + sb s10, 22(a1) + srli s10, t5, 24 + sb s10, 23(a1) +L_ualn_sw45_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw t6, 24(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw46_h + sw t6, 24(a1) + j L_ualn_sw46_e +L_ualn_sw46_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw46_b + sh t6, 24(a1) + srli s10, t6, 16 + sh s10, 26(a1) + j L_ualn_sw46_e +L_ualn_sw46_b: + sb t6, 24(a1) + srli s10, t6, 8 + sb s10, 25(a1) + srli s10, t6, 16 + sb s10, 26(a1) + srli s10, t6, 24 + sb s10, 27(a1) +L_ualn_sw46_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw a4, 28(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw47_h + sw a4, 28(a1) + j L_ualn_sw47_e +L_ualn_sw47_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw47_b + sh a4, 28(a1) + srli s10, a4, 16 + sh s10, 30(a1) + j L_ualn_sw47_e +L_ualn_sw47_b: + sb a4, 28(a1) + srli s10, a4, 8 + sb s10, 29(a1) + srli s10, a4, 16 + sb s10, 30(a1) + srli s10, a4, 24 + sb s10, 31(a1) +L_ualn_sw47_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw a5, 32(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw48_h + sw a5, 32(a1) + j L_ualn_sw48_e +L_ualn_sw48_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw48_b + sh a5, 32(a1) + srli s10, a5, 16 + sh s10, 34(a1) + j L_ualn_sw48_e +L_ualn_sw48_b: + sb a5, 32(a1) + srli s10, a5, 8 + sb s10, 33(a1) + srli s10, a5, 16 + sb s10, 34(a1) + srli s10, a5, 24 + sb s10, 35(a1) +L_ualn_sw48_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw a6, 36(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw49_h + sw a6, 36(a1) + j L_ualn_sw49_e +L_ualn_sw49_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw49_b + sh a6, 36(a1) + srli s10, a6, 16 + sh s10, 38(a1) + j L_ualn_sw49_e +L_ualn_sw49_b: + sb a6, 36(a1) + srli s10, a6, 8 + sb s10, 37(a1) + srli s10, a6, 16 + sb s10, 38(a1) + srli s10, a6, 24 + sb s10, 39(a1) +L_ualn_sw49_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw a7, 40(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw50_h + sw a7, 40(a1) + j L_ualn_sw50_e +L_ualn_sw50_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw50_b + sh a7, 40(a1) + srli s10, a7, 16 + sh s10, 42(a1) + j L_ualn_sw50_e +L_ualn_sw50_b: + sb a7, 40(a1) + srli s10, a7, 8 + sb s10, 41(a1) + srli s10, a7, 16 + sb s10, 42(a1) + srli s10, a7, 24 + sb s10, 43(a1) +L_ualn_sw50_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw s1, 44(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw51_h + sw s1, 44(a1) + j L_ualn_sw51_e +L_ualn_sw51_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw51_b + sh s1, 44(a1) + srli s10, s1, 16 + sh s10, 46(a1) + j L_ualn_sw51_e +L_ualn_sw51_b: + sb s1, 44(a1) + srli s10, s1, 8 + sb s10, 45(a1) + srli s10, s1, 16 + sb s10, 46(a1) + srli s10, s1, 24 + sb s10, 47(a1) +L_ualn_sw51_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw s2, 48(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw52_h + sw s2, 48(a1) + j L_ualn_sw52_e +L_ualn_sw52_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw52_b + sh s2, 48(a1) + srli s10, s2, 16 + sh s10, 50(a1) + j L_ualn_sw52_e +L_ualn_sw52_b: + sb s2, 48(a1) + srli s10, s2, 8 + sb s10, 49(a1) + srli s10, s2, 16 + sb s10, 50(a1) + srli s10, s2, 24 + sb s10, 51(a1) +L_ualn_sw52_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw s3, 52(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw53_h + sw s3, 52(a1) + j L_ualn_sw53_e +L_ualn_sw53_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw53_b + sh s3, 52(a1) + srli s10, s3, 16 + sh s10, 54(a1) + j L_ualn_sw53_e +L_ualn_sw53_b: + sb s3, 52(a1) + srli s10, s3, 8 + sb s10, 53(a1) + srli s10, s3, 16 + sb s10, 54(a1) + srli s10, s3, 24 + sb s10, 55(a1) +L_ualn_sw53_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw s4, 56(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw54_h + sw s4, 56(a1) + j L_ualn_sw54_e +L_ualn_sw54_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw54_b + sh s4, 56(a1) + srli s10, s4, 16 + sh s10, 58(a1) + j L_ualn_sw54_e +L_ualn_sw54_b: + sb s4, 56(a1) + srli s10, s4, 8 + sb s10, 57(a1) + srli s10, s4, 16 + sb s10, 58(a1) + srli s10, s4, 24 + sb s10, 59(a1) +L_ualn_sw54_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw s5, 60(a1) +#else + andi s10, a1, 3 + bnez s10, L_ualn_sw55_h + sw s5, 60(a1) + j L_ualn_sw55_e +L_ualn_sw55_h: + andi s10, s10, 1 + bnez s10, L_ualn_sw55_b + sh s5, 60(a1) + srli s10, s5, 16 + sh s10, 62(a1) + j L_ualn_sw55_e +L_ualn_sw55_b: + sb s5, 60(a1) + srli s10, s5, 8 + sb s10, 61(a1) + srli s10, s5, 16 + sb s10, 62(a1) + srli s10, s5, 24 + sb s10, 63(a1) +L_ualn_sw55_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + addi a2, a2, 64 + addi a1, a1, 64 + bnez a3, L_chacha20_riscv64_outer + j L_chacha20_riscv64_done +L_chacha20_riscv64_over: + # Partial last block: save keystream block, XOR remaining bytes + addi s10, a3, 64 + sw t0, 0(s11) + sw t1, 4(s11) + sw t2, 8(s11) + sw t3, 12(s11) + sw t4, 16(s11) + sw t5, 20(s11) + sw t6, 24(s11) + sw a4, 28(s11) + sw a5, 32(s11) + sw a6, 36(s11) + sw a7, 40(s11) + sw s1, 44(s11) + sw s2, 48(s11) + sw s3, 52(s11) + sw s4, 56(s11) + sw s5, 60(s11) +L_chacha20_riscv64_over_loop_8: + li s8, 8 + bltu s10, s8, L_chacha20_riscv64_over_lt_4 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld s6, 0(a2) +#else + andi s9, a2, 7 + bnez s9, L_ualn_ld56_w + ld s6, 0(a2) + j L_ualn_ld56_e +L_ualn_ld56_w: + andi s9, s9, 3 + bnez s9, L_ualn_ld56_h + lwu s6, 0(a2) + lwu s9, 4(a2) + slli s9, s9, 32 + or s6, s6, s9 + j L_ualn_ld56_e +L_ualn_ld56_h: + andi s9, s9, 1 + bnez s9, L_ualn_ld56_b + lhu s6, 0(a2) + lhu s9, 2(a2) + slli s9, s9, 16 + or s6, s6, s9 + lhu s9, 4(a2) + slli s9, s9, 32 + or s6, s6, s9 + lhu s9, 6(a2) + slli s9, s9, 48 + or s6, s6, s9 + j L_ualn_ld56_e +L_ualn_ld56_b: + lbu s6, 0(a2) + lbu s9, 1(a2) + slli s9, s9, 8 + or s6, s6, s9 + lbu s9, 2(a2) + slli s9, s9, 16 + or s6, s6, s9 + lbu s9, 3(a2) + slli s9, s9, 24 + or s6, s6, s9 + lbu s9, 4(a2) + slli s9, s9, 32 + or s6, s6, s9 + lbu s9, 5(a2) + slli s9, s9, 40 + or s6, s6, s9 + lbu s9, 6(a2) + slli s9, s9, 48 + or s6, s6, s9 + lbu s9, 7(a2) + slli s9, s9, 56 + or s6, s6, s9 +L_ualn_ld56_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + ld s7, 0(s11) + xor s6, s6, s7 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sd s6, 0(a1) +#else + andi s9, a1, 7 + bnez s9, L_ualn_sd57_w + sd s6, 0(a1) + j L_ualn_sd57_e +L_ualn_sd57_w: + andi s9, s9, 3 + bnez s9, L_ualn_sd57_h + sw s6, 0(a1) + srli s9, s6, 32 + sw s9, 4(a1) + j L_ualn_sd57_e +L_ualn_sd57_h: + andi s9, s9, 1 + bnez s9, L_ualn_sd57_b + sh s6, 0(a1) + srli s9, s6, 16 + sh s9, 2(a1) + srli s9, s6, 32 + sh s9, 4(a1) + srli s9, s6, 48 + sh s9, 6(a1) + j L_ualn_sd57_e +L_ualn_sd57_b: + sb s6, 0(a1) + srli s9, s6, 8 + sb s9, 1(a1) + srli s9, s6, 16 + sb s9, 2(a1) + srli s9, s6, 24 + sb s9, 3(a1) + srli s9, s6, 32 + sb s9, 4(a1) + srli s9, s6, 40 + sb s9, 5(a1) + srli s9, s6, 48 + sb s9, 6(a1) + srli s9, s6, 56 + sb s9, 7(a1) +L_ualn_sd57_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, 8 + addi s11, s11, 8 + addi a1, a1, 8 + addi s10, s10, -8 + j L_chacha20_riscv64_over_loop_8 +L_chacha20_riscv64_over_lt_4: + li s8, 4 + bltu s10, s8, L_chacha20_riscv64_over_lt_2 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lw s6, 0(a2) +#else + andi s9, a2, 3 + bnez s9, L_ualn_lw58_h + lw s6, 0(a2) + j L_ualn_lw58_e +L_ualn_lw58_h: + andi s9, s9, 1 + bnez s9, L_ualn_lw58_b + lhu s6, 0(a2) + lhu s9, 2(a2) + slli s9, s9, 16 + or s6, s6, s9 + addiw s6, s6, 0 + j L_ualn_lw58_e +L_ualn_lw58_b: + lbu s6, 0(a2) + lbu s9, 1(a2) + slli s9, s9, 8 + or s6, s6, s9 + lbu s9, 2(a2) + slli s9, s9, 16 + or s6, s6, s9 + lbu s9, 3(a2) + slli s9, s9, 24 + or s6, s6, s9 + addiw s6, s6, 0 +L_ualn_lw58_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lw s7, 0(s11) + xor s6, s6, s7 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sw s6, 0(a1) +#else + andi s9, a1, 3 + bnez s9, L_ualn_sw59_h + sw s6, 0(a1) + j L_ualn_sw59_e +L_ualn_sw59_h: + andi s9, s9, 1 + bnez s9, L_ualn_sw59_b + sh s6, 0(a1) + srli s9, s6, 16 + sh s9, 2(a1) + j L_ualn_sw59_e +L_ualn_sw59_b: + sb s6, 0(a1) + srli s9, s6, 8 + sb s9, 1(a1) + srli s9, s6, 16 + sb s9, 2(a1) + srli s9, s6, 24 + sb s9, 3(a1) +L_ualn_sw59_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, 4 + addi s11, s11, 4 + addi a1, a1, 4 + addi s10, s10, -4 +L_chacha20_riscv64_over_lt_2: + li s8, 2 + bltu s10, s8, L_chacha20_riscv64_over_lt_1 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lh s6, 0(a2) +#else + lbu s6, 0(a2) + lb s9, 1(a2) + slli s9, s9, 8 + or s6, s6, s9 +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + lh s7, 0(s11) + xor s6, s6, s7 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + sh s6, 0(a1) +#else + sb s6, 0(a1) + srli s9, s6, 8 + sb s9, 1(a1) +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, 2 + addi s11, s11, 2 + addi a1, a1, 2 + addi s10, s10, -2 +L_chacha20_riscv64_over_lt_1: + beqz s10, L_chacha20_riscv64_done + lb s6, 0(a2) + lb s7, 0(s11) + xor s6, s6, s7 + sb s6, 0(a1) +L_chacha20_riscv64_done: + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + ret + .size wc_chacha_crypt_bytes,.-wc_chacha_crypt_bytes +#endif /* WOLFSSL_RISCV_VECTOR */ +#endif /* HAVE_CHACHA */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm_c.c b/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm_c.c new file mode 100644 index 00000000000..ce1a5dc827e --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm_c.c @@ -0,0 +1,5861 @@ +/* riscv-64-chacha-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./chacha/chacha.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-chacha-asm.c + */ +#ifdef WOLFSSL_RISCV_ASM +#ifdef WOLFSSL_RISCV_ASM_INLINE +#include + +#ifdef HAVE_CHACHA +void wc_chacha_setiv(word32* x, const byte* iv, word32 counter) +{ + __asm__ __volatile__ ( + /* Set counter and 96-bit nonce: X[12]=counter, X[13..15]=iv */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t0, 0(%[iv])\n\t" +#else + "andi t3, %[iv], 3\n\t" + "bnez t3, L_ualn_lw1_h_%=\n\t" + "lw t0, 0(%[iv])\n\t" + "j L_ualn_lw1_e_%=\n\t" + "\n" + "L_ualn_lw1_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_lw1_b_%=\n\t" + "lhu t0, 0(%[iv])\n\t" + "lhu t3, 2(%[iv])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "addiw t0, t0, 0\n\t" + "j L_ualn_lw1_e_%=\n\t" + "\n" + "L_ualn_lw1_b_%=:\n\t" + "lbu t0, 0(%[iv])\n\t" + "lbu t3, 1(%[iv])\n\t" + "slli t3, t3, 8\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 2(%[iv])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 3(%[iv])\n\t" + "slli t3, t3, 24\n\t" + "or t0, t0, t3\n\t" + "addiw t0, t0, 0\n\t" + "\n" + "L_ualn_lw1_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 4(%[iv])\n\t" +#else + "andi t3, %[iv], 3\n\t" + "bnez t3, L_ualn_lw2_h_%=\n\t" + "lw t1, 4(%[iv])\n\t" + "j L_ualn_lw2_e_%=\n\t" + "\n" + "L_ualn_lw2_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_lw2_b_%=\n\t" + "lhu t1, 4(%[iv])\n\t" + "lhu t3, 6(%[iv])\n\t" + "slli t3, t3, 16\n\t" + "or t1, t1, t3\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw2_e_%=\n\t" + "\n" + "L_ualn_lw2_b_%=:\n\t" + "lbu t1, 4(%[iv])\n\t" + "lbu t3, 5(%[iv])\n\t" + "slli t3, t3, 8\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 6(%[iv])\n\t" + "slli t3, t3, 16\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 7(%[iv])\n\t" + "slli t3, t3, 24\n\t" + "or t1, t1, t3\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw2_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t2, 8(%[iv])\n\t" +#else + "andi t3, %[iv], 3\n\t" + "bnez t3, L_ualn_lw3_h_%=\n\t" + "lw t2, 8(%[iv])\n\t" + "j L_ualn_lw3_e_%=\n\t" + "\n" + "L_ualn_lw3_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_lw3_b_%=\n\t" + "lhu t2, 8(%[iv])\n\t" + "lhu t3, 10(%[iv])\n\t" + "slli t3, t3, 16\n\t" + "or t2, t2, t3\n\t" + "addiw t2, t2, 0\n\t" + "j L_ualn_lw3_e_%=\n\t" + "\n" + "L_ualn_lw3_b_%=:\n\t" + "lbu t2, 8(%[iv])\n\t" + "lbu t3, 9(%[iv])\n\t" + "slli t3, t3, 8\n\t" + "or t2, t2, t3\n\t" + "lbu t3, 10(%[iv])\n\t" + "slli t3, t3, 16\n\t" + "or t2, t2, t3\n\t" + "lbu t3, 11(%[iv])\n\t" + "slli t3, t3, 24\n\t" + "or t2, t2, t3\n\t" + "addiw t2, t2, 0\n\t" + "\n" + "L_ualn_lw3_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw %[counter], 48(%[x])\n\t" + "sw t0, 52(%[x])\n\t" + "sw t1, 56(%[x])\n\t" + "sw t2, 60(%[x])\n\t" + : [x] "+r" (x), [iv] "+r" (iv), [counter] "+r" (counter) + : + : "memory", "t0", "t1", "t2", "t3" + ); +} + +XALIGNED(8) static const word32 L_chacha20_riscv64_setkey_constants[] = { + 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574, + 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574, +}; + +void wc_chacha_setkey(word32* x, const byte* key, word32 keySz) +{ + const word32* constants = L_chacha20_riscv64_setkey_constants; + + __asm__ __volatile__ ( + /* keySz 16 -> tau (offset 0); keySz 32 -> sigma (offset 16) */ + "addi %[keySz], %[keySz], -16\n\t" + "add %[constants], %[constants], %[keySz]\n\t" + /* X[0..3] = constants */ + "lw t1, 0(%[constants])\n\t" + "sw t1, 0(%[x])\n\t" + "lw t1, 4(%[constants])\n\t" + "sw t1, 4(%[x])\n\t" + "lw t1, 8(%[constants])\n\t" + "sw t1, 8(%[x])\n\t" + "lw t1, 12(%[constants])\n\t" + "sw t1, 12(%[x])\n\t" + /* X[4..7] = key[0..15] */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 0(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw4_h_%=\n\t" + "lw t1, 0(%[key])\n\t" + "j L_ualn_lw4_e_%=\n\t" + "\n" + "L_ualn_lw4_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw4_b_%=\n\t" + "lhu t1, 0(%[key])\n\t" + "lhu t2, 2(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw4_e_%=\n\t" + "\n" + "L_ualn_lw4_b_%=:\n\t" + "lbu t1, 0(%[key])\n\t" + "lbu t2, 1(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 2(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 3(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw4_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 16(%[x])\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 4(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw5_h_%=\n\t" + "lw t1, 4(%[key])\n\t" + "j L_ualn_lw5_e_%=\n\t" + "\n" + "L_ualn_lw5_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw5_b_%=\n\t" + "lhu t1, 4(%[key])\n\t" + "lhu t2, 6(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw5_e_%=\n\t" + "\n" + "L_ualn_lw5_b_%=:\n\t" + "lbu t1, 4(%[key])\n\t" + "lbu t2, 5(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 6(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 7(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw5_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 20(%[x])\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 8(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw6_h_%=\n\t" + "lw t1, 8(%[key])\n\t" + "j L_ualn_lw6_e_%=\n\t" + "\n" + "L_ualn_lw6_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw6_b_%=\n\t" + "lhu t1, 8(%[key])\n\t" + "lhu t2, 10(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw6_e_%=\n\t" + "\n" + "L_ualn_lw6_b_%=:\n\t" + "lbu t1, 8(%[key])\n\t" + "lbu t2, 9(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 10(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 11(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw6_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 24(%[x])\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 12(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw7_h_%=\n\t" + "lw t1, 12(%[key])\n\t" + "j L_ualn_lw7_e_%=\n\t" + "\n" + "L_ualn_lw7_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw7_b_%=\n\t" + "lhu t1, 12(%[key])\n\t" + "lhu t2, 14(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw7_e_%=\n\t" + "\n" + "L_ualn_lw7_b_%=:\n\t" + "lbu t1, 12(%[key])\n\t" + "lbu t2, 13(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 14(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 15(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw7_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 28(%[x])\n\t" + /* X[8..11] = key[0..15] (16-byte) or key[16..31] (32-byte) */ + "add %[key], %[key], %[keySz]\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 0(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw8_h_%=\n\t" + "lw t1, 0(%[key])\n\t" + "j L_ualn_lw8_e_%=\n\t" + "\n" + "L_ualn_lw8_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw8_b_%=\n\t" + "lhu t1, 0(%[key])\n\t" + "lhu t2, 2(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw8_e_%=\n\t" + "\n" + "L_ualn_lw8_b_%=:\n\t" + "lbu t1, 0(%[key])\n\t" + "lbu t2, 1(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 2(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 3(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw8_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 32(%[x])\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 4(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw9_h_%=\n\t" + "lw t1, 4(%[key])\n\t" + "j L_ualn_lw9_e_%=\n\t" + "\n" + "L_ualn_lw9_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw9_b_%=\n\t" + "lhu t1, 4(%[key])\n\t" + "lhu t2, 6(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw9_e_%=\n\t" + "\n" + "L_ualn_lw9_b_%=:\n\t" + "lbu t1, 4(%[key])\n\t" + "lbu t2, 5(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 6(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 7(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw9_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 36(%[x])\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 8(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw10_h_%=\n\t" + "lw t1, 8(%[key])\n\t" + "j L_ualn_lw10_e_%=\n\t" + "\n" + "L_ualn_lw10_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw10_b_%=\n\t" + "lhu t1, 8(%[key])\n\t" + "lhu t2, 10(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw10_e_%=\n\t" + "\n" + "L_ualn_lw10_b_%=:\n\t" + "lbu t1, 8(%[key])\n\t" + "lbu t2, 9(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 10(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 11(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw10_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 40(%[x])\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t1, 12(%[key])\n\t" +#else + "andi t2, %[key], 3\n\t" + "bnez t2, L_ualn_lw11_h_%=\n\t" + "lw t1, 12(%[key])\n\t" + "j L_ualn_lw11_e_%=\n\t" + "\n" + "L_ualn_lw11_h_%=:\n\t" + "andi t2, t2, 1\n\t" + "bnez t2, L_ualn_lw11_b_%=\n\t" + "lhu t1, 12(%[key])\n\t" + "lhu t2, 14(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "j L_ualn_lw11_e_%=\n\t" + "\n" + "L_ualn_lw11_b_%=:\n\t" + "lbu t1, 12(%[key])\n\t" + "lbu t2, 13(%[key])\n\t" + "slli t2, t2, 8\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 14(%[key])\n\t" + "slli t2, t2, 16\n\t" + "or t1, t1, t2\n\t" + "lbu t2, 15(%[key])\n\t" + "slli t2, t2, 24\n\t" + "or t1, t1, t2\n\t" + "addiw t1, t1, 0\n\t" + "\n" + "L_ualn_lw11_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sw t1, 44(%[x])\n\t" + : [x] "+r" (x), [key] "+r" (key), [keySz] "+r" (keySz) + : [constants] "r" (constants) + : "memory", "t1", "t2" + ); +} + +void wc_chacha_use_over(byte* over, byte* output, const byte* input, word32 len) +{ + __asm__ __volatile__ ( + "\n" + "L_chacha20_riscv64_use_over_loop_8_%=:\n\t" + "li t2, 8\n\t" + "bltu %[len], t2, L_chacha20_riscv64_use_over_lt_4_%=\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[input])\n\t" +#else + "andi t3, %[input], 7\n\t" + "bnez t3, L_ualn_ld12_w_%=\n\t" + "ld t0, 0(%[input])\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_w_%=:\n\t" + "andi t3, t3, 3\n\t" + "bnez t3, L_ualn_ld12_h_%=\n\t" + "lwu t0, 0(%[input])\n\t" + "lwu t3, 4(%[input])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_ld12_b_%=\n\t" + "lhu t0, 0(%[input])\n\t" + "lhu t3, 2(%[input])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lhu t3, 4(%[input])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "lhu t3, 6(%[input])\n\t" + "slli t3, t3, 48\n\t" + "or t0, t0, t3\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_b_%=:\n\t" + "lbu t0, 0(%[input])\n\t" + "lbu t3, 1(%[input])\n\t" + "slli t3, t3, 8\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 2(%[input])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 3(%[input])\n\t" + "slli t3, t3, 24\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 4(%[input])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 5(%[input])\n\t" + "slli t3, t3, 40\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 6(%[input])\n\t" + "slli t3, t3, 48\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 7(%[input])\n\t" + "slli t3, t3, 56\n\t" + "or t0, t0, t3\n\t" + "\n" + "L_ualn_ld12_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld t1, 0(%[over])\n\t" + "xor t0, t0, t1\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t0, 0(%[output])\n\t" +#else + "andi t3, %[output], 7\n\t" + "bnez t3, L_ualn_sd13_w_%=\n\t" + "sd t0, 0(%[output])\n\t" + "j L_ualn_sd13_e_%=\n\t" + "\n" + "L_ualn_sd13_w_%=:\n\t" + "andi t3, t3, 3\n\t" + "bnez t3, L_ualn_sd13_h_%=\n\t" + "sw t0, 0(%[output])\n\t" + "srli t3, t0, 32\n\t" + "sw t3, 4(%[output])\n\t" + "j L_ualn_sd13_e_%=\n\t" + "\n" + "L_ualn_sd13_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_sd13_b_%=\n\t" + "sh t0, 0(%[output])\n\t" + "srli t3, t0, 16\n\t" + "sh t3, 2(%[output])\n\t" + "srli t3, t0, 32\n\t" + "sh t3, 4(%[output])\n\t" + "srli t3, t0, 48\n\t" + "sh t3, 6(%[output])\n\t" + "j L_ualn_sd13_e_%=\n\t" + "\n" + "L_ualn_sd13_b_%=:\n\t" + "sb t0, 0(%[output])\n\t" + "srli t3, t0, 8\n\t" + "sb t3, 1(%[output])\n\t" + "srli t3, t0, 16\n\t" + "sb t3, 2(%[output])\n\t" + "srli t3, t0, 24\n\t" + "sb t3, 3(%[output])\n\t" + "srli t3, t0, 32\n\t" + "sb t3, 4(%[output])\n\t" + "srli t3, t0, 40\n\t" + "sb t3, 5(%[output])\n\t" + "srli t3, t0, 48\n\t" + "sb t3, 6(%[output])\n\t" + "srli t3, t0, 56\n\t" + "sb t3, 7(%[output])\n\t" + "\n" + "L_ualn_sd13_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[input], %[input], 8\n\t" + "addi %[over], %[over], 8\n\t" + "addi %[output], %[output], 8\n\t" + "addi %[len], %[len], -8\n\t" + "j L_chacha20_riscv64_use_over_loop_8_%=\n\t" + "\n" + "L_chacha20_riscv64_use_over_lt_4_%=:\n\t" + "li t2, 4\n\t" + "bltu %[len], t2, L_chacha20_riscv64_use_over_lt_2_%=\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw t0, 0(%[input])\n\t" +#else + "andi t3, %[input], 3\n\t" + "bnez t3, L_ualn_lw14_h_%=\n\t" + "lw t0, 0(%[input])\n\t" + "j L_ualn_lw14_e_%=\n\t" + "\n" + "L_ualn_lw14_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_lw14_b_%=\n\t" + "lhu t0, 0(%[input])\n\t" + "lhu t3, 2(%[input])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "addiw t0, t0, 0\n\t" + "j L_ualn_lw14_e_%=\n\t" + "\n" + "L_ualn_lw14_b_%=:\n\t" + "lbu t0, 0(%[input])\n\t" + "lbu t3, 1(%[input])\n\t" + "slli t3, t3, 8\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 2(%[input])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 3(%[input])\n\t" + "slli t3, t3, 24\n\t" + "or t0, t0, t3\n\t" + "addiw t0, t0, 0\n\t" + "\n" + "L_ualn_lw14_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw t1, 0(%[over])\n\t" + "xor t0, t0, t1\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t0, 0(%[output])\n\t" +#else + "andi t3, %[output], 3\n\t" + "bnez t3, L_ualn_sw15_h_%=\n\t" + "sw t0, 0(%[output])\n\t" + "j L_ualn_sw15_e_%=\n\t" + "\n" + "L_ualn_sw15_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_sw15_b_%=\n\t" + "sh t0, 0(%[output])\n\t" + "srli t3, t0, 16\n\t" + "sh t3, 2(%[output])\n\t" + "j L_ualn_sw15_e_%=\n\t" + "\n" + "L_ualn_sw15_b_%=:\n\t" + "sb t0, 0(%[output])\n\t" + "srli t3, t0, 8\n\t" + "sb t3, 1(%[output])\n\t" + "srli t3, t0, 16\n\t" + "sb t3, 2(%[output])\n\t" + "srli t3, t0, 24\n\t" + "sb t3, 3(%[output])\n\t" + "\n" + "L_ualn_sw15_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[input], %[input], 4\n\t" + "addi %[over], %[over], 4\n\t" + "addi %[output], %[output], 4\n\t" + "addi %[len], %[len], -4\n\t" + "\n" + "L_chacha20_riscv64_use_over_lt_2_%=:\n\t" + "li t2, 2\n\t" + "bltu %[len], t2, L_chacha20_riscv64_use_over_lt_1_%=\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lh t0, 0(%[input])\n\t" +#else + "lbu t0, 0(%[input])\n\t" + "lb t3, 1(%[input])\n\t" + "slli t3, t3, 8\n\t" + "or t0, t0, t3\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lh t1, 0(%[over])\n\t" + "xor t0, t0, t1\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sh t0, 0(%[output])\n\t" +#else + "sb t0, 0(%[output])\n\t" + "srli t3, t0, 8\n\t" + "sb t3, 1(%[output])\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[input], %[input], 2\n\t" + "addi %[over], %[over], 2\n\t" + "addi %[output], %[output], 2\n\t" + "addi %[len], %[len], -2\n\t" + "\n" + "L_chacha20_riscv64_use_over_lt_1_%=:\n\t" + "beqz %[len], L_chacha20_riscv64_use_over_done_%=\n\t" + "lb t0, 0(%[input])\n\t" + "lb t1, 0(%[over])\n\t" + "xor t0, t0, t1\n\t" + "sb t0, 0(%[output])\n\t" + "\n" + "L_chacha20_riscv64_use_over_done_%=:\n\t" + : [over] "+r" (over), [output] "+r" (output), [input] "+r" (input), + [len] "+r" (len) + : + : "memory", "t0", "t1", "t2", "t3" + ); +} + +#ifdef WOLFSSL_RISCV_VECTOR +void wc_chacha_crypt_bytes(ChaCha* ctx, byte* c, const byte* m, word32 len) +{ + __asm__ __volatile__ ( + " .option arch, +v\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + " .option arch, +zvkb\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + " .option arch, +zbb\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + /* VLEN == 128: 4 x 32-bit elements per vector register */ + "vsetivli zero, 4, e32, m1, ta, ma\n\t" + /* Ensure 64-bit length has top bits clear */ + "slli %[len], %[len], 32\n\t" + "srli %[len], %[len], 32\n\t" + /* ctx->left = (CHACHA_CHUNK_BYTES - (len & 63)) & 63 */ + "andi s6, %[len], 63\n\t" + "li s7, 64\n\t" + "sub s6, s7, s6\n\t" + "andi s6, s6, 63\n\t" + "sw s6, 64(%[ctx])\n\t" + /* Six-block (384-byte) tier, looped */ + "li s7, 384\n\t" + "bltu %[len], s7, L_chacha20_riscv64_vec_after_384_%=\n\t" + /* Load state; build lane-rotate indices v25/v26/v27 */ + "mv s8, %[ctx]\n\t" + "vl4re32.v v28, (s8)\n\t" + "vid.v v20\n\t" + "vslidedown.vi v25, v20, 1\n\t" + "vslideup.vi v25, v20, 3\n\t" + "vslidedown.vi v26, v20, 2\n\t" + "vslideup.vi v26, v20, 2\n\t" + "vslidedown.vi v27, v20, 3\n\t" + "vslideup.vi v27, v20, 1\n\t" + /* n384 = len / 384; len -= n384 * 384; ctx->X[12] += n384 * 6 */ + "li s6, 384\n\t" + "divu s11, %[len], s6\n\t" + "mul s7, s11, s6\n\t" + "sub %[len], %[len], s7\n\t" + "slli s7, s11, 1\n\t" + "add s7, s7, s11\n\t" + "slli s7, s7, 1\n\t" + "lw s6, 48(%[ctx])\n\t" + "add s6, s6, s7\n\t" + "sw s6, 48(%[ctx])\n\t" + "\n" + "L_chacha20_riscv64_vec_384_outer_%=:\n\t" + /* Scalar state (X[12] from running counter v31) */ + "ld t0, 0(%[ctx])\n\t" + "ld t2, 8(%[ctx])\n\t" + "ld t4, 16(%[ctx])\n\t" + "ld t6, 24(%[ctx])\n\t" + "ld a5, 32(%[ctx])\n\t" + "ld a7, 40(%[ctx])\n\t" + "lw s3, 52(%[ctx])\n\t" + "ld s4, 56(%[ctx])\n\t" + "srli t1, t0, 32\n\t" + "srli t3, t2, 32\n\t" + "srli t5, t4, 32\n\t" + "srli a4, t6, 32\n\t" + "srli a6, a5, 32\n\t" + "srli s1, a7, 32\n\t" + "srli s5, s4, 32\n\t" + "vmv.x.s s2, v31\n\t" + /* Vector blocks = state; counters base+1 .. base+4; scalar base+5 */ + "vmv4r.v v0, v28\n\t" + "vmv4r.v v4, v28\n\t" + "vmv4r.v v8, v28\n\t" + "vmv4r.v v12, v28\n\t" + "vmv4r.v v16, v28\n\t" + "addi s7, s2, 1\n\t" + "vmv.s.x v7, s7\n\t" + "addi s7, s2, 2\n\t" + "vmv.s.x v11, s7\n\t" + "addi s7, s2, 3\n\t" + "vmv.s.x v15, s7\n\t" + "addi s7, s2, 4\n\t" + "vmv.s.x v19, s7\n\t" + "addi s2, s2, 5\n\t" + "li s10, 10\n\t" + "\n" + "L_chacha20_riscv64_vec_384_loop_%=:\n\t" + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "vadd.vv v12, v12, v13\n\t" + "vadd.vv v16, v16, v17\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, a4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "vxor.vv v15, v15, v12\n\t" + "vxor.vv v19, v19, v16\n\t" + "xor s2, s2, t0\n\t" + "xor s3, s3, t1\n\t" + "xor s4, s4, t2\n\t" + "xor s5, s5, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" + "vror.vi v7, v7, 16\n\t" + "vror.vi v11, v11, 16\n\t" + "vror.vi v15, v15, 16\n\t" + "vror.vi v19, v19, 16\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s2, s2, 16 */ + ".word 0x6109591b\n\t" + /* roriw s3, s3, 16 */ + ".word 0x6109d99b\n\t" + /* roriw s4, s4, 16 */ + ".word 0x610a5a1b\n\t" + /* roriw s5, s5, 16 */ + ".word 0x610ada9b\n\t" +#else + "slli s6, s2, 16\n\t" + "slli s7, s3, 16\n\t" + "slli s8, s4, 16\n\t" + "slli s9, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 16\n\t" + "vsll.vi v21, v7, 16\n\t" + "vsll.vi v22, v11, 16\n\t" + "vsll.vi v23, v15, 16\n\t" + "vsll.vi v24, v19, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vsrl.vi v7, v7, 16\n\t" + "vsrl.vi v11, v11, 16\n\t" + "vsrl.vi v15, v15, 16\n\t" + "vsrl.vi v19, v19, 16\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "vor.vv v15, v15, v23\n\t" + "vor.vv v19, v19, v24\n\t" + "slli s6, s2, 16\n\t" + "slli s7, s3, 16\n\t" + "slli s8, s4, 16\n\t" + "slli s9, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "vadd.vv v14, v14, v15\n\t" + "vadd.vv v18, v18, v19\n\t" + "add a5, a5, s2\n\t" + "add a6, a6, s3\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s5\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "vxor.vv v13, v13, v14\n\t" + "vxor.vv v17, v17, v18\n\t" + "xor t4, t4, a5\n\t" + "xor t5, t5, a6\n\t" + "xor t6, t6, a7\n\t" + "xor a4, a4, s1\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" + "vror.vi v5, v5, 20\n\t" + "vror.vi v9, v9, 20\n\t" + "vror.vi v13, v13, 20\n\t" + "vror.vi v17, v17, 20\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t4, t4, 20 */ + ".word 0x614ede9b\n\t" + /* roriw t5, t5, 20 */ + ".word 0x614f5f1b\n\t" + /* roriw t6, t6, 20 */ + ".word 0x614fdf9b\n\t" + /* roriw a4, a4, 20 */ + ".word 0x6147571b\n\t" +#else + "slli s6, t4, 12\n\t" + "slli s7, t5, 12\n\t" + "slli s8, t6, 12\n\t" + "slli s9, a4, 12\n\t" + "srliw t4, t4, 20\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 12\n\t" + "vsll.vi v21, v5, 12\n\t" + "vsll.vi v22, v9, 12\n\t" + "vsll.vi v23, v13, 12\n\t" + "vsll.vi v24, v17, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vsrl.vi v5, v5, 20\n\t" + "vsrl.vi v9, v9, 20\n\t" + "vsrl.vi v13, v13, 20\n\t" + "vsrl.vi v17, v17, 20\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "vor.vv v13, v13, v23\n\t" + "vor.vv v17, v17, v24\n\t" + "slli s6, t4, 12\n\t" + "slli s7, t5, 12\n\t" + "slli s8, t6, 12\n\t" + "slli s9, a4, 12\n\t" + "srliw t4, t4, 20\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "vadd.vv v12, v12, v13\n\t" + "vadd.vv v16, v16, v17\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, a4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "vxor.vv v15, v15, v12\n\t" + "vxor.vv v19, v19, v16\n\t" + "xor s2, s2, t0\n\t" + "xor s3, s3, t1\n\t" + "xor s4, s4, t2\n\t" + "xor s5, s5, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" + "vror.vi v7, v7, 24\n\t" + "vror.vi v11, v11, 24\n\t" + "vror.vi v15, v15, 24\n\t" + "vror.vi v19, v19, 24\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s2, s2, 24 */ + ".word 0x6189591b\n\t" + /* roriw s3, s3, 24 */ + ".word 0x6189d99b\n\t" + /* roriw s4, s4, 24 */ + ".word 0x618a5a1b\n\t" + /* roriw s5, s5, 24 */ + ".word 0x618ada9b\n\t" +#else + "slli s6, s2, 8\n\t" + "slli s7, s3, 8\n\t" + "slli s8, s4, 8\n\t" + "slli s9, s5, 8\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "srliw s5, s5, 24\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 8\n\t" + "vsll.vi v21, v7, 8\n\t" + "vsll.vi v22, v11, 8\n\t" + "vsll.vi v23, v15, 8\n\t" + "vsll.vi v24, v19, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vsrl.vi v7, v7, 24\n\t" + "vsrl.vi v11, v11, 24\n\t" + "vsrl.vi v15, v15, 24\n\t" + "vsrl.vi v19, v19, 24\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "vor.vv v15, v15, v23\n\t" + "vor.vv v19, v19, v24\n\t" + "slli s6, s2, 8\n\t" + "slli s7, s3, 8\n\t" + "slli s8, s4, 8\n\t" + "slli s9, s5, 8\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "srliw s5, s5, 24\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "vadd.vv v14, v14, v15\n\t" + "vadd.vv v18, v18, v19\n\t" + "add a5, a5, s2\n\t" + "add a6, a6, s3\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s5\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "vxor.vv v13, v13, v14\n\t" + "vxor.vv v17, v17, v18\n\t" + "xor t4, t4, a5\n\t" + "xor t5, t5, a6\n\t" + "xor t6, t6, a7\n\t" + "xor a4, a4, s1\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" + "vror.vi v5, v5, 25\n\t" + "vror.vi v9, v9, 25\n\t" + "vror.vi v13, v13, 25\n\t" + "vror.vi v17, v17, 25\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t4, t4, 25 */ + ".word 0x619ede9b\n\t" + /* roriw t5, t5, 25 */ + ".word 0x619f5f1b\n\t" + /* roriw t6, t6, 25 */ + ".word 0x619fdf9b\n\t" + /* roriw a4, a4, 25 */ + ".word 0x6197571b\n\t" +#else + "slli s6, t4, 7\n\t" + "slli s7, t5, 7\n\t" + "slli s8, t6, 7\n\t" + "slli s9, a4, 7\n\t" + "srliw t4, t4, 25\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 7\n\t" + "vsll.vi v21, v5, 7\n\t" + "vsll.vi v22, v9, 7\n\t" + "vsll.vi v23, v13, 7\n\t" + "vsll.vi v24, v17, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vsrl.vi v5, v5, 25\n\t" + "vsrl.vi v9, v9, 25\n\t" + "vsrl.vi v13, v13, 25\n\t" + "vsrl.vi v17, v17, 25\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "vor.vv v13, v13, v23\n\t" + "vor.vv v17, v17, v24\n\t" + "slli s6, t4, 7\n\t" + "slli s7, t5, 7\n\t" + "slli s8, t6, 7\n\t" + "slli s9, a4, 7\n\t" + "srliw t4, t4, 25\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vrgather.vv v20, v3, v27\n\t" + "vrgather.vv v21, v7, v27\n\t" + "vrgather.vv v22, v11, v27\n\t" + "vrgather.vv v23, v15, v27\n\t" + "vrgather.vv v24, v19, v27\n\t" + "vmv.v.v v3, v20\n\t" + "vmv.v.v v7, v21\n\t" + "vmv.v.v v11, v22\n\t" + "vmv.v.v v15, v23\n\t" + "vmv.v.v v19, v24\n\t" + "vrgather.vv v20, v1, v25\n\t" + "vrgather.vv v21, v5, v25\n\t" + "vrgather.vv v22, v9, v25\n\t" + "vrgather.vv v23, v13, v25\n\t" + "vrgather.vv v24, v17, v25\n\t" + "vmv.v.v v1, v20\n\t" + "vmv.v.v v5, v21\n\t" + "vmv.v.v v9, v22\n\t" + "vmv.v.v v13, v23\n\t" + "vmv.v.v v17, v24\n\t" + "vrgather.vv v20, v2, v26\n\t" + "vrgather.vv v21, v6, v26\n\t" + "vrgather.vv v22, v10, v26\n\t" + "vrgather.vv v23, v14, v26\n\t" + "vrgather.vv v24, v18, v26\n\t" + "vmv.v.v v2, v20\n\t" + "vmv.v.v v6, v21\n\t" + "vmv.v.v v10, v22\n\t" + "vmv.v.v v14, v23\n\t" + "vmv.v.v v18, v24\n\t" + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "vadd.vv v12, v12, v13\n\t" + "vadd.vv v16, v16, v17\n\t" + "add t0, t0, t5\n\t" + "add t1, t1, t6\n\t" + "add t2, t2, a4\n\t" + "add t3, t3, t4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "vxor.vv v15, v15, v12\n\t" + "vxor.vv v19, v19, v16\n\t" + "xor s5, s5, t0\n\t" + "xor s2, s2, t1\n\t" + "xor s3, s3, t2\n\t" + "xor s4, s4, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" + "vror.vi v7, v7, 16\n\t" + "vror.vi v11, v11, 16\n\t" + "vror.vi v15, v15, 16\n\t" + "vror.vi v19, v19, 16\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s5, s5, 16 */ + ".word 0x610ada9b\n\t" + /* roriw s2, s2, 16 */ + ".word 0x6109591b\n\t" + /* roriw s3, s3, 16 */ + ".word 0x6109d99b\n\t" + /* roriw s4, s4, 16 */ + ".word 0x610a5a1b\n\t" +#else + "slli s6, s5, 16\n\t" + "slli s7, s2, 16\n\t" + "slli s8, s3, 16\n\t" + "slli s9, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 16\n\t" + "vsll.vi v21, v7, 16\n\t" + "vsll.vi v22, v11, 16\n\t" + "vsll.vi v23, v15, 16\n\t" + "vsll.vi v24, v19, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vsrl.vi v7, v7, 16\n\t" + "vsrl.vi v11, v11, 16\n\t" + "vsrl.vi v15, v15, 16\n\t" + "vsrl.vi v19, v19, 16\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "vor.vv v15, v15, v23\n\t" + "vor.vv v19, v19, v24\n\t" + "slli s6, s5, 16\n\t" + "slli s7, s2, 16\n\t" + "slli s8, s3, 16\n\t" + "slli s9, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "vadd.vv v14, v14, v15\n\t" + "vadd.vv v18, v18, v19\n\t" + "add a7, a7, s5\n\t" + "add s1, s1, s2\n\t" + "add a5, a5, s3\n\t" + "add a6, a6, s4\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "vxor.vv v13, v13, v14\n\t" + "vxor.vv v17, v17, v18\n\t" + "xor t5, t5, a7\n\t" + "xor t6, t6, s1\n\t" + "xor a4, a4, a5\n\t" + "xor t4, t4, a6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" + "vror.vi v5, v5, 20\n\t" + "vror.vi v9, v9, 20\n\t" + "vror.vi v13, v13, 20\n\t" + "vror.vi v17, v17, 20\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t5, t5, 20 */ + ".word 0x614f5f1b\n\t" + /* roriw t6, t6, 20 */ + ".word 0x614fdf9b\n\t" + /* roriw a4, a4, 20 */ + ".word 0x6147571b\n\t" + /* roriw t4, t4, 20 */ + ".word 0x614ede9b\n\t" +#else + "slli s6, t5, 12\n\t" + "slli s7, t6, 12\n\t" + "slli s8, a4, 12\n\t" + "slli s9, t4, 12\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "srliw t4, t4, 20\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 12\n\t" + "vsll.vi v21, v5, 12\n\t" + "vsll.vi v22, v9, 12\n\t" + "vsll.vi v23, v13, 12\n\t" + "vsll.vi v24, v17, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vsrl.vi v5, v5, 20\n\t" + "vsrl.vi v9, v9, 20\n\t" + "vsrl.vi v13, v13, 20\n\t" + "vsrl.vi v17, v17, 20\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "vor.vv v13, v13, v23\n\t" + "vor.vv v17, v17, v24\n\t" + "slli s6, t5, 12\n\t" + "slli s7, t6, 12\n\t" + "slli s8, a4, 12\n\t" + "slli s9, t4, 12\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "srliw t4, t4, 20\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "vadd.vv v12, v12, v13\n\t" + "vadd.vv v16, v16, v17\n\t" + "add t0, t0, t5\n\t" + "add t1, t1, t6\n\t" + "add t2, t2, a4\n\t" + "add t3, t3, t4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "vxor.vv v15, v15, v12\n\t" + "vxor.vv v19, v19, v16\n\t" + "xor s5, s5, t0\n\t" + "xor s2, s2, t1\n\t" + "xor s3, s3, t2\n\t" + "xor s4, s4, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" + "vror.vi v7, v7, 24\n\t" + "vror.vi v11, v11, 24\n\t" + "vror.vi v15, v15, 24\n\t" + "vror.vi v19, v19, 24\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s5, s5, 24 */ + ".word 0x618ada9b\n\t" + /* roriw s2, s2, 24 */ + ".word 0x6189591b\n\t" + /* roriw s3, s3, 24 */ + ".word 0x6189d99b\n\t" + /* roriw s4, s4, 24 */ + ".word 0x618a5a1b\n\t" +#else + "slli s6, s5, 8\n\t" + "slli s7, s2, 8\n\t" + "slli s8, s3, 8\n\t" + "slli s9, s4, 8\n\t" + "srliw s5, s5, 24\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 8\n\t" + "vsll.vi v21, v7, 8\n\t" + "vsll.vi v22, v11, 8\n\t" + "vsll.vi v23, v15, 8\n\t" + "vsll.vi v24, v19, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vsrl.vi v7, v7, 24\n\t" + "vsrl.vi v11, v11, 24\n\t" + "vsrl.vi v15, v15, 24\n\t" + "vsrl.vi v19, v19, 24\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "vor.vv v15, v15, v23\n\t" + "vor.vv v19, v19, v24\n\t" + "slli s6, s5, 8\n\t" + "slli s7, s2, 8\n\t" + "slli s8, s3, 8\n\t" + "slli s9, s4, 8\n\t" + "srliw s5, s5, 24\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "vadd.vv v14, v14, v15\n\t" + "vadd.vv v18, v18, v19\n\t" + "add a7, a7, s5\n\t" + "add s1, s1, s2\n\t" + "add a5, a5, s3\n\t" + "add a6, a6, s4\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "vxor.vv v13, v13, v14\n\t" + "vxor.vv v17, v17, v18\n\t" + "xor t5, t5, a7\n\t" + "xor t6, t6, s1\n\t" + "xor a4, a4, a5\n\t" + "xor t4, t4, a6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" + "vror.vi v5, v5, 25\n\t" + "vror.vi v9, v9, 25\n\t" + "vror.vi v13, v13, 25\n\t" + "vror.vi v17, v17, 25\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t5, t5, 25 */ + ".word 0x619f5f1b\n\t" + /* roriw t6, t6, 25 */ + ".word 0x619fdf9b\n\t" + /* roriw a4, a4, 25 */ + ".word 0x6197571b\n\t" + /* roriw t4, t4, 25 */ + ".word 0x619ede9b\n\t" +#else + "slli s6, t5, 7\n\t" + "slli s7, t6, 7\n\t" + "slli s8, a4, 7\n\t" + "slli s9, t4, 7\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "srliw t4, t4, 25\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 7\n\t" + "vsll.vi v21, v5, 7\n\t" + "vsll.vi v22, v9, 7\n\t" + "vsll.vi v23, v13, 7\n\t" + "vsll.vi v24, v17, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vsrl.vi v5, v5, 25\n\t" + "vsrl.vi v9, v9, 25\n\t" + "vsrl.vi v13, v13, 25\n\t" + "vsrl.vi v17, v17, 25\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "vor.vv v13, v13, v23\n\t" + "vor.vv v17, v17, v24\n\t" + "slli s6, t5, 7\n\t" + "slli s7, t6, 7\n\t" + "slli s8, a4, 7\n\t" + "slli s9, t4, 7\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "srliw t4, t4, 25\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vrgather.vv v20, v3, v25\n\t" + "vrgather.vv v21, v7, v25\n\t" + "vrgather.vv v22, v11, v25\n\t" + "vrgather.vv v23, v15, v25\n\t" + "vrgather.vv v24, v19, v25\n\t" + "vmv.v.v v3, v20\n\t" + "vmv.v.v v7, v21\n\t" + "vmv.v.v v11, v22\n\t" + "vmv.v.v v15, v23\n\t" + "vmv.v.v v19, v24\n\t" + "vrgather.vv v20, v1, v27\n\t" + "vrgather.vv v21, v5, v27\n\t" + "vrgather.vv v22, v9, v27\n\t" + "vrgather.vv v23, v13, v27\n\t" + "vrgather.vv v24, v17, v27\n\t" + "vmv.v.v v1, v20\n\t" + "vmv.v.v v5, v21\n\t" + "vmv.v.v v9, v22\n\t" + "vmv.v.v v13, v23\n\t" + "vmv.v.v v17, v24\n\t" + "vrgather.vv v20, v2, v26\n\t" + "vrgather.vv v21, v6, v26\n\t" + "vrgather.vv v22, v10, v26\n\t" + "vrgather.vv v23, v14, v26\n\t" + "vrgather.vv v24, v18, v26\n\t" + "vmv.v.v v2, v20\n\t" + "vmv.v.v v6, v21\n\t" + "vmv.v.v v10, v22\n\t" + "vmv.v.v v14, v23\n\t" + "vmv.v.v v18, v24\n\t" + "addi s10, s10, -1\n\t" + "bnez s10, L_chacha20_riscv64_vec_384_loop_%=\n\t" + /* Block 1: add back, XOR message, store */ + "mv s8, %[m]\n\t" + "vl4re32.v v20, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vadd.vv v0, v0, v28\n\t" + "vadd.vv v1, v1, v29\n\t" + "vadd.vv v2, v2, v30\n\t" + "vadd.vv v3, v3, v31\n\t" + "vxor.vv v0, v0, v20\n\t" + "vxor.vv v1, v1, v21\n\t" + "vxor.vv v2, v2, v22\n\t" + "vxor.vv v3, v3, v23\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v0, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + "vmv.x.s s6, v31\n\t" + /* Blocks 2-5 (vector) */ + "addi s6, s6, 1\n\t" + "vmv.s.x v31, s6\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v20, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vadd.vv v4, v4, v28\n\t" + "vadd.vv v5, v5, v29\n\t" + "vadd.vv v6, v6, v30\n\t" + "vadd.vv v7, v7, v31\n\t" + "vxor.vv v4, v4, v20\n\t" + "vxor.vv v5, v5, v21\n\t" + "vxor.vv v6, v6, v22\n\t" + "vxor.vv v7, v7, v23\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v4, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + "addi s6, s6, 1\n\t" + "vmv.s.x v31, s6\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v20, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vadd.vv v8, v8, v28\n\t" + "vadd.vv v9, v9, v29\n\t" + "vadd.vv v10, v10, v30\n\t" + "vadd.vv v11, v11, v31\n\t" + "vxor.vv v8, v8, v20\n\t" + "vxor.vv v9, v9, v21\n\t" + "vxor.vv v10, v10, v22\n\t" + "vxor.vv v11, v11, v23\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v8, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + "addi s6, s6, 1\n\t" + "vmv.s.x v31, s6\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v20, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vadd.vv v12, v12, v28\n\t" + "vadd.vv v13, v13, v29\n\t" + "vadd.vv v14, v14, v30\n\t" + "vadd.vv v15, v15, v31\n\t" + "vxor.vv v12, v12, v20\n\t" + "vxor.vv v13, v13, v21\n\t" + "vxor.vv v14, v14, v22\n\t" + "vxor.vv v15, v15, v23\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v12, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + "addi s6, s6, 1\n\t" + "vmv.s.x v31, s6\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v20, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vadd.vv v16, v16, v28\n\t" + "vadd.vv v17, v17, v29\n\t" + "vadd.vv v18, v18, v30\n\t" + "vadd.vv v19, v19, v31\n\t" + "vxor.vv v16, v16, v20\n\t" + "vxor.vv v17, v17, v21\n\t" + "vxor.vv v18, v18, v22\n\t" + "vxor.vv v19, v19, v23\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v16, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + /* Block 6 (scalar) */ + "addi s6, s6, 1\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v20, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vmv.s.x v0, t0\n\t" + "vmv.s.x v1, t4\n\t" + "vmv.s.x v2, a5\n\t" + "vmv.s.x v3, s2\n\t" + "vmv.s.x v4, t1\n\t" + "vmv.s.x v5, t5\n\t" + "vmv.s.x v6, a6\n\t" + "vmv.s.x v7, s3\n\t" + "vslideup.vi v0, v4, 1\n\t" + "vslideup.vi v1, v5, 1\n\t" + "vslideup.vi v2, v6, 1\n\t" + "vslideup.vi v3, v7, 1\n\t" + "vmv.s.x v4, t2\n\t" + "vmv.s.x v5, t6\n\t" + "vmv.s.x v6, a7\n\t" + "vmv.s.x v7, s4\n\t" + "vslideup.vi v0, v4, 2\n\t" + "vslideup.vi v1, v5, 2\n\t" + "vslideup.vi v2, v6, 2\n\t" + "vslideup.vi v3, v7, 2\n\t" + "vmv.s.x v4, t3\n\t" + "vmv.s.x v5, a4\n\t" + "vmv.s.x v6, s1\n\t" + "vmv.s.x v7, s5\n\t" + "vslideup.vi v0, v4, 3\n\t" + "vslideup.vi v1, v5, 3\n\t" + "vslideup.vi v2, v6, 3\n\t" + "vslideup.vi v3, v7, 3\n\t" + "vmv.s.x v31, s6\n\t" + "vadd.vv v0, v0, v28\n\t" + "vadd.vv v1, v1, v29\n\t" + "vadd.vv v2, v2, v30\n\t" + "vadd.vv v3, v3, v31\n\t" + "vxor.vv v0, v0, v20\n\t" + "vxor.vv v1, v1, v21\n\t" + "vxor.vv v2, v2, v22\n\t" + "vxor.vv v3, v3, v23\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v0, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + /* Advance running counter for next iteration */ + "addi s6, s6, 1\n\t" + "vmv.s.x v31, s6\n\t" + "addi s11, s11, -1\n\t" + "bnez s11, L_chacha20_riscv64_vec_384_outer_%=\n\t" + "\n" + "L_chacha20_riscv64_vec_after_384_%=:\n\t" + /* Four-block (256-byte) tier */ + "li s7, 256\n\t" + "bltu %[len], s7, L_chacha20_riscv64_vec_after_256_%=\n\t" + /* Load state to encrypt */ + "mv s8, %[ctx]\n\t" + "vl4re32.v v16, (s8)\n\t" + "vid.v v20\n\t" + "vslidedown.vi v23, v20, 1\n\t" + "vslideup.vi v23, v20, 3\n\t" + "vslidedown.vi v24, v20, 2\n\t" + "vslideup.vi v24, v20, 2\n\t" + "vslidedown.vi v25, v20, 3\n\t" + "vslideup.vi v25, v20, 1\n\t" + "ld t0, 0(%[ctx])\n\t" + "ld t2, 8(%[ctx])\n\t" + "ld t4, 16(%[ctx])\n\t" + "ld t6, 24(%[ctx])\n\t" + "ld a5, 32(%[ctx])\n\t" + "ld a7, 40(%[ctx])\n\t" + "ld s2, 48(%[ctx])\n\t" + "ld s4, 56(%[ctx])\n\t" + "srli t1, t0, 32\n\t" + "srli t3, t2, 32\n\t" + "srli t5, t4, 32\n\t" + "srli a4, t6, 32\n\t" + "srli a6, a5, 32\n\t" + "srli s1, a7, 32\n\t" + "srli s3, s2, 32\n\t" + "srli s5, s4, 32\n\t" + /* Block counters: 1=base, 2=base+1, 3=base+2, 4(scalar)=base+3 */ + "vmv4r.v v0, v16\n\t" + "addi s6, s2, 1\n\t" + "vmv4r.v v4, v16\n\t" + "addi s7, s2, 2\n\t" + "vmv4r.v v8, v16\n\t" + "addi s2, s2, 3\n\t" + "vmv.s.x v7, s6\n\t" + "vmv.s.x v11, s7\n\t" + "li s10, 10\n\t" + "\n" + "L_chacha20_riscv64_vec_256_loop_%=:\n\t" + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, a4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "xor s2, s2, t0\n\t" + "xor s3, s3, t1\n\t" + "xor s4, s4, t2\n\t" + "xor s5, s5, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" + "vror.vi v7, v7, 16\n\t" + "vror.vi v11, v11, 16\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s2, s2, 16 */ + ".word 0x6109591b\n\t" + /* roriw s3, s3, 16 */ + ".word 0x6109d99b\n\t" + /* roriw s4, s4, 16 */ + ".word 0x610a5a1b\n\t" + /* roriw s5, s5, 16 */ + ".word 0x610ada9b\n\t" +#else + "slli s6, s2, 16\n\t" + "slli s7, s3, 16\n\t" + "slli s8, s4, 16\n\t" + "slli s9, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 16\n\t" + "vsll.vi v21, v7, 16\n\t" + "vsll.vi v22, v11, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vsrl.vi v7, v7, 16\n\t" + "vsrl.vi v11, v11, 16\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "slli s6, s2, 16\n\t" + "slli s7, s3, 16\n\t" + "slli s8, s4, 16\n\t" + "slli s9, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "add a5, a5, s2\n\t" + "add a6, a6, s3\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s5\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "xor t4, t4, a5\n\t" + "xor t5, t5, a6\n\t" + "xor t6, t6, a7\n\t" + "xor a4, a4, s1\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" + "vror.vi v5, v5, 20\n\t" + "vror.vi v9, v9, 20\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t4, t4, 20 */ + ".word 0x614ede9b\n\t" + /* roriw t5, t5, 20 */ + ".word 0x614f5f1b\n\t" + /* roriw t6, t6, 20 */ + ".word 0x614fdf9b\n\t" + /* roriw a4, a4, 20 */ + ".word 0x6147571b\n\t" +#else + "slli s6, t4, 12\n\t" + "slli s7, t5, 12\n\t" + "slli s8, t6, 12\n\t" + "slli s9, a4, 12\n\t" + "srliw t4, t4, 20\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 12\n\t" + "vsll.vi v21, v5, 12\n\t" + "vsll.vi v22, v9, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vsrl.vi v5, v5, 20\n\t" + "vsrl.vi v9, v9, 20\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "slli s6, t4, 12\n\t" + "slli s7, t5, 12\n\t" + "slli s8, t6, 12\n\t" + "slli s9, a4, 12\n\t" + "srliw t4, t4, 20\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, a4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "xor s2, s2, t0\n\t" + "xor s3, s3, t1\n\t" + "xor s4, s4, t2\n\t" + "xor s5, s5, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" + "vror.vi v7, v7, 24\n\t" + "vror.vi v11, v11, 24\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s2, s2, 24 */ + ".word 0x6189591b\n\t" + /* roriw s3, s3, 24 */ + ".word 0x6189d99b\n\t" + /* roriw s4, s4, 24 */ + ".word 0x618a5a1b\n\t" + /* roriw s5, s5, 24 */ + ".word 0x618ada9b\n\t" +#else + "slli s6, s2, 8\n\t" + "slli s7, s3, 8\n\t" + "slli s8, s4, 8\n\t" + "slli s9, s5, 8\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "srliw s5, s5, 24\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 8\n\t" + "vsll.vi v21, v7, 8\n\t" + "vsll.vi v22, v11, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vsrl.vi v7, v7, 24\n\t" + "vsrl.vi v11, v11, 24\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "slli s6, s2, 8\n\t" + "slli s7, s3, 8\n\t" + "slli s8, s4, 8\n\t" + "slli s9, s5, 8\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "srliw s5, s5, 24\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "add a5, a5, s2\n\t" + "add a6, a6, s3\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s5\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "xor t4, t4, a5\n\t" + "xor t5, t5, a6\n\t" + "xor t6, t6, a7\n\t" + "xor a4, a4, s1\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" + "vror.vi v5, v5, 25\n\t" + "vror.vi v9, v9, 25\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t4, t4, 25 */ + ".word 0x619ede9b\n\t" + /* roriw t5, t5, 25 */ + ".word 0x619f5f1b\n\t" + /* roriw t6, t6, 25 */ + ".word 0x619fdf9b\n\t" + /* roriw a4, a4, 25 */ + ".word 0x6197571b\n\t" +#else + "slli s6, t4, 7\n\t" + "slli s7, t5, 7\n\t" + "slli s8, t6, 7\n\t" + "slli s9, a4, 7\n\t" + "srliw t4, t4, 25\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 7\n\t" + "vsll.vi v21, v5, 7\n\t" + "vsll.vi v22, v9, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vsrl.vi v5, v5, 25\n\t" + "vsrl.vi v9, v9, 25\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "slli s6, t4, 7\n\t" + "slli s7, t5, 7\n\t" + "slli s8, t6, 7\n\t" + "slli s9, a4, 7\n\t" + "srliw t4, t4, 25\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vrgather.vv v20, v3, v25\n\t" + "vrgather.vv v21, v7, v25\n\t" + "vrgather.vv v22, v11, v25\n\t" + "vmv.v.v v3, v20\n\t" + "vmv.v.v v7, v21\n\t" + "vmv.v.v v11, v22\n\t" + "vrgather.vv v20, v1, v23\n\t" + "vrgather.vv v21, v5, v23\n\t" + "vrgather.vv v22, v9, v23\n\t" + "vmv.v.v v1, v20\n\t" + "vmv.v.v v5, v21\n\t" + "vmv.v.v v9, v22\n\t" + "vrgather.vv v20, v2, v24\n\t" + "vrgather.vv v21, v6, v24\n\t" + "vrgather.vv v22, v10, v24\n\t" + "vmv.v.v v2, v20\n\t" + "vmv.v.v v6, v21\n\t" + "vmv.v.v v10, v22\n\t" + "addi s10, s10, -1\n\t" + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "add t0, t0, t5\n\t" + "add t1, t1, t6\n\t" + "add t2, t2, a4\n\t" + "add t3, t3, t4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "xor s5, s5, t0\n\t" + "xor s2, s2, t1\n\t" + "xor s3, s3, t2\n\t" + "xor s4, s4, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" + "vror.vi v7, v7, 16\n\t" + "vror.vi v11, v11, 16\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s5, s5, 16 */ + ".word 0x610ada9b\n\t" + /* roriw s2, s2, 16 */ + ".word 0x6109591b\n\t" + /* roriw s3, s3, 16 */ + ".word 0x6109d99b\n\t" + /* roriw s4, s4, 16 */ + ".word 0x610a5a1b\n\t" +#else + "slli s6, s5, 16\n\t" + "slli s7, s2, 16\n\t" + "slli s8, s3, 16\n\t" + "slli s9, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 16\n\t" + "vsll.vi v21, v7, 16\n\t" + "vsll.vi v22, v11, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vsrl.vi v7, v7, 16\n\t" + "vsrl.vi v11, v11, 16\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "slli s6, s5, 16\n\t" + "slli s7, s2, 16\n\t" + "slli s8, s3, 16\n\t" + "slli s9, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "add a7, a7, s5\n\t" + "add s1, s1, s2\n\t" + "add a5, a5, s3\n\t" + "add a6, a6, s4\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "xor t5, t5, a7\n\t" + "xor t6, t6, s1\n\t" + "xor a4, a4, a5\n\t" + "xor t4, t4, a6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" + "vror.vi v5, v5, 20\n\t" + "vror.vi v9, v9, 20\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t5, t5, 20 */ + ".word 0x614f5f1b\n\t" + /* roriw t6, t6, 20 */ + ".word 0x614fdf9b\n\t" + /* roriw a4, a4, 20 */ + ".word 0x6147571b\n\t" + /* roriw t4, t4, 20 */ + ".word 0x614ede9b\n\t" +#else + "slli s6, t5, 12\n\t" + "slli s7, t6, 12\n\t" + "slli s8, a4, 12\n\t" + "slli s9, t4, 12\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "srliw t4, t4, 20\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 12\n\t" + "vsll.vi v21, v5, 12\n\t" + "vsll.vi v22, v9, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vsrl.vi v5, v5, 20\n\t" + "vsrl.vi v9, v9, 20\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "slli s6, t5, 12\n\t" + "slli s7, t6, 12\n\t" + "slli s8, a4, 12\n\t" + "slli s9, t4, 12\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "srliw t4, t4, 20\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vadd.vv v8, v8, v9\n\t" + "add t0, t0, t5\n\t" + "add t1, t1, t6\n\t" + "add t2, t2, a4\n\t" + "add t3, t3, t4\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" + "vxor.vv v11, v11, v8\n\t" + "xor s5, s5, t0\n\t" + "xor s2, s2, t1\n\t" + "xor s3, s3, t2\n\t" + "xor s4, s4, t3\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" + "vror.vi v7, v7, 24\n\t" + "vror.vi v11, v11, 24\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw s5, s5, 24 */ + ".word 0x618ada9b\n\t" + /* roriw s2, s2, 24 */ + ".word 0x6189591b\n\t" + /* roriw s3, s3, 24 */ + ".word 0x6189d99b\n\t" + /* roriw s4, s4, 24 */ + ".word 0x618a5a1b\n\t" +#else + "slli s6, s5, 8\n\t" + "slli s7, s2, 8\n\t" + "slli s8, s3, 8\n\t" + "slli s9, s4, 8\n\t" + "srliw s5, s5, 24\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v3, 8\n\t" + "vsll.vi v21, v7, 8\n\t" + "vsll.vi v22, v11, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vsrl.vi v7, v7, 24\n\t" + "vsrl.vi v11, v11, 24\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" + "vor.vv v11, v11, v22\n\t" + "slli s6, s5, 8\n\t" + "slli s7, s2, 8\n\t" + "slli s8, s3, 8\n\t" + "slli s9, s4, 8\n\t" + "srliw s5, s5, 24\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vadd.vv v10, v10, v11\n\t" + "add a7, a7, s5\n\t" + "add s1, s1, s2\n\t" + "add a5, a5, s3\n\t" + "add a6, a6, s4\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" + "vxor.vv v9, v9, v10\n\t" + "xor t5, t5, a7\n\t" + "xor t6, t6, s1\n\t" + "xor a4, a4, a5\n\t" + "xor t4, t4, a6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" + "vror.vi v5, v5, 25\n\t" + "vror.vi v9, v9, 25\n\t" +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* roriw t5, t5, 25 */ + ".word 0x619f5f1b\n\t" + /* roriw t6, t6, 25 */ + ".word 0x619fdf9b\n\t" + /* roriw a4, a4, 25 */ + ".word 0x6197571b\n\t" + /* roriw t4, t4, 25 */ + ".word 0x619ede9b\n\t" +#else + "slli s6, t5, 7\n\t" + "slli s7, t6, 7\n\t" + "slli s8, a4, 7\n\t" + "slli s9, t4, 7\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "srliw t4, t4, 25\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ +#else + "vsll.vi v20, v1, 7\n\t" + "vsll.vi v21, v5, 7\n\t" + "vsll.vi v22, v9, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vsrl.vi v5, v5, 25\n\t" + "vsrl.vi v9, v9, 25\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" + "vor.vv v9, v9, v22\n\t" + "slli s6, t5, 7\n\t" + "slli s7, t6, 7\n\t" + "slli s8, a4, 7\n\t" + "slli s9, t4, 7\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "srliw t4, t4, 25\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vrgather.vv v20, v3, v23\n\t" + "vrgather.vv v21, v7, v23\n\t" + "vrgather.vv v22, v11, v23\n\t" + "vmv.v.v v3, v20\n\t" + "vmv.v.v v7, v21\n\t" + "vmv.v.v v11, v22\n\t" + "vrgather.vv v20, v1, v25\n\t" + "vrgather.vv v21, v5, v25\n\t" + "vrgather.vv v22, v9, v25\n\t" + "vmv.v.v v1, v20\n\t" + "vmv.v.v v5, v21\n\t" + "vmv.v.v v9, v22\n\t" + "vrgather.vv v20, v2, v24\n\t" + "vrgather.vv v21, v6, v24\n\t" + "vrgather.vv v22, v10, v24\n\t" + "vmv.v.v v2, v20\n\t" + "vmv.v.v v6, v21\n\t" + "vmv.v.v v10, v22\n\t" + "bnez s10, L_chacha20_riscv64_vec_256_loop_%=\n\t" + /* Block 1: add back, XOR message, store */ + "mv s8, %[m]\n\t" + "vl4re32.v v12, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vadd.vv v0, v0, v16\n\t" + "vadd.vv v1, v1, v17\n\t" + "vadd.vv v2, v2, v18\n\t" + "vadd.vv v3, v3, v19\n\t" + "vxor.vv v0, v0, v12\n\t" + "vxor.vv v1, v1, v13\n\t" + "vxor.vv v2, v2, v14\n\t" + "vxor.vv v3, v3, v15\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v12, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "vmv.x.s s6, v19\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v0, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + /* Block 2 */ + "addi s6, s6, 1\n\t" + "vmv.s.x v19, s6\n\t" + "vadd.vv v4, v4, v16\n\t" + "vadd.vv v5, v5, v17\n\t" + "vadd.vv v6, v6, v18\n\t" + "vadd.vv v7, v7, v19\n\t" + "vxor.vv v4, v4, v12\n\t" + "vxor.vv v5, v5, v13\n\t" + "vxor.vv v6, v6, v14\n\t" + "vxor.vv v7, v7, v15\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v12, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v4, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + /* Block 3 */ + "addi s6, s6, 1\n\t" + "vmv.s.x v19, s6\n\t" + "vadd.vv v8, v8, v16\n\t" + "vadd.vv v9, v9, v17\n\t" + "vadd.vv v10, v10, v18\n\t" + "vadd.vv v11, v11, v19\n\t" + "vxor.vv v8, v8, v12\n\t" + "vxor.vv v9, v9, v13\n\t" + "vxor.vv v10, v10, v14\n\t" + "vxor.vv v11, v11, v15\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v12, (s8)\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v8, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + /* Block 4 (scalar): recombine, add back, XOR message, store */ + "addi s6, s6, 1\n\t" + "vmv.s.x v0, t0\n\t" + "vmv.s.x v1, t4\n\t" + "vmv.s.x v2, a5\n\t" + "vmv.s.x v3, s2\n\t" + "vmv.s.x v4, t1\n\t" + "vmv.s.x v5, t5\n\t" + "vmv.s.x v6, a6\n\t" + "vmv.s.x v7, s3\n\t" + "vslideup.vi v0, v4, 1\n\t" + "vslideup.vi v1, v5, 1\n\t" + "vslideup.vi v2, v6, 1\n\t" + "vslideup.vi v3, v7, 1\n\t" + "vmv.s.x v4, t2\n\t" + "vmv.s.x v5, t6\n\t" + "vmv.s.x v6, a7\n\t" + "vmv.s.x v7, s4\n\t" + "vslideup.vi v0, v4, 2\n\t" + "vslideup.vi v1, v5, 2\n\t" + "vslideup.vi v2, v6, 2\n\t" + "vslideup.vi v3, v7, 2\n\t" + "vmv.s.x v4, t3\n\t" + "vmv.s.x v5, a4\n\t" + "vmv.s.x v6, s1\n\t" + "vmv.s.x v7, s5\n\t" + "vslideup.vi v0, v4, 3\n\t" + "vslideup.vi v1, v5, 3\n\t" + "vslideup.vi v2, v6, 3\n\t" + "vslideup.vi v3, v7, 3\n\t" + "vmv.s.x v19, s6\n\t" + "vadd.vv v0, v0, v16\n\t" + "vadd.vv v1, v1, v17\n\t" + "vadd.vv v2, v2, v18\n\t" + "vadd.vv v3, v3, v19\n\t" + "vxor.vv v0, v0, v12\n\t" + "vxor.vv v1, v1, v13\n\t" + "vxor.vv v2, v2, v14\n\t" + "vxor.vv v3, v3, v15\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v0, (s8)\n\t" + "addi %[c], %[c], 64\n\t" + /* Advance pointers, length and counter by 4 blocks */ + "addi %[m], %[m], 64\n\t" + "addi %[len], %[len], -256\n\t" + "lw s6, 48(%[ctx])\n\t" + "addi s6, s6, 4\n\t" + "sw s6, 48(%[ctx])\n\t" + "\n" + "L_chacha20_riscv64_vec_after_256_%=:\n\t" + /* Two-block (128-byte) tier */ + "li s7, 128\n\t" + "bltu %[len], s7, L_chacha20_riscv64_vec_after_128_%=\n\t" + /* Load state to encrypt */ + "mv s8, %[ctx]\n\t" + "vl4re32.v v16, (s8)\n\t" + /* Advance ctx->X[12] by 2 blocks */ + "lw s6, 48(%[ctx])\n\t" + "addi s6, s6, 2\n\t" + "sw s6, 48(%[ctx])\n\t" + /* Counter increment {1,0,0,0} and lane-rotate indices */ + "vmv.v.i v22, 0\n\t" + "li s6, 1\n\t" + "vmv.s.x v22, s6\n\t" + "vid.v v20\n\t" + "vslidedown.vi v23, v20, 1\n\t" + "vslideup.vi v23, v20, 3\n\t" + "vslidedown.vi v24, v20, 2\n\t" + "vslideup.vi v24, v20, 2\n\t" + "vslidedown.vi v25, v20, 3\n\t" + "vslideup.vi v25, v20, 1\n\t" + "vmv4r.v v0, v16\n\t" + "vmv4r.v v4, v16\n\t" + /* Second block counter += 1 */ + "vadd.vv v7, v7, v22\n\t" + "li s6, 10\n\t" + "\n" + "L_chacha20_riscv64_vec_128_loop_%=:\n\t" + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" + "vror.vi v7, v7, 16\n\t" +#else + "vsll.vi v20, v3, 16\n\t" + "vsll.vi v21, v7, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vsrl.vi v7, v7, 16\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" + "vror.vi v5, v5, 20\n\t" +#else + "vsll.vi v20, v1, 12\n\t" + "vsll.vi v21, v5, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vsrl.vi v5, v5, 20\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" + "vror.vi v7, v7, 24\n\t" +#else + "vsll.vi v20, v3, 8\n\t" + "vsll.vi v21, v7, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vsrl.vi v7, v7, 24\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" + "vror.vi v5, v5, 25\n\t" +#else + "vsll.vi v20, v1, 7\n\t" + "vsll.vi v21, v5, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vsrl.vi v5, v5, 25\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vrgather.vv v20, v3, v25\n\t" + "vrgather.vv v21, v7, v25\n\t" + "vmv.v.v v3, v20\n\t" + "vmv.v.v v7, v21\n\t" + "vrgather.vv v20, v1, v23\n\t" + "vrgather.vv v21, v5, v23\n\t" + "vmv.v.v v1, v20\n\t" + "vmv.v.v v5, v21\n\t" + "vrgather.vv v20, v2, v24\n\t" + "vrgather.vv v21, v6, v24\n\t" + "vmv.v.v v2, v20\n\t" + "vmv.v.v v6, v21\n\t" + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" + "vror.vi v7, v7, 16\n\t" +#else + "vsll.vi v20, v3, 16\n\t" + "vsll.vi v21, v7, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vsrl.vi v7, v7, 16\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" + "vror.vi v5, v5, 20\n\t" +#else + "vsll.vi v20, v1, 12\n\t" + "vsll.vi v21, v5, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vsrl.vi v5, v5, 20\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vadd.vv v4, v4, v5\n\t" + "vxor.vv v3, v3, v0\n\t" + "vxor.vv v7, v7, v4\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" + "vror.vi v7, v7, 24\n\t" +#else + "vsll.vi v20, v3, 8\n\t" + "vsll.vi v21, v7, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vsrl.vi v7, v7, 24\n\t" + "vor.vv v3, v3, v20\n\t" + "vor.vv v7, v7, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vadd.vv v6, v6, v7\n\t" + "vxor.vv v1, v1, v2\n\t" + "vxor.vv v5, v5, v6\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" + "vror.vi v5, v5, 25\n\t" +#else + "vsll.vi v20, v1, 7\n\t" + "vsll.vi v21, v5, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vsrl.vi v5, v5, 25\n\t" + "vor.vv v1, v1, v20\n\t" + "vor.vv v5, v5, v21\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vrgather.vv v20, v3, v23\n\t" + "vrgather.vv v21, v7, v23\n\t" + "vmv.v.v v3, v20\n\t" + "vmv.v.v v7, v21\n\t" + "vrgather.vv v20, v1, v25\n\t" + "vrgather.vv v21, v5, v25\n\t" + "vmv.v.v v1, v20\n\t" + "vmv.v.v v5, v21\n\t" + "vrgather.vv v20, v2, v24\n\t" + "vrgather.vv v21, v6, v24\n\t" + "vmv.v.v v2, v20\n\t" + "vmv.v.v v6, v21\n\t" + "addi s6, s6, -1\n\t" + "bnez s6, L_chacha20_riscv64_vec_128_loop_%=\n\t" + /* Add back state, XOR message, store - block 1 */ + "vadd.vv v0, v0, v16\n\t" + "vadd.vv v1, v1, v17\n\t" + "vadd.vv v2, v2, v18\n\t" + "vadd.vv v3, v3, v19\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v12, (s8)\n\t" + "vxor.vv v0, v0, v12\n\t" + "vxor.vv v1, v1, v13\n\t" + "vxor.vv v2, v2, v14\n\t" + "vxor.vv v3, v3, v15\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v0, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "addi %[c], %[c], 64\n\t" + /* Add back state, XOR message, store - block 2 */ + "vadd.vv v19, v19, v22\n\t" + "vadd.vv v4, v4, v16\n\t" + "vadd.vv v5, v5, v17\n\t" + "vadd.vv v6, v6, v18\n\t" + "vadd.vv v7, v7, v19\n\t" + "mv s8, %[m]\n\t" + "vl4re32.v v12, (s8)\n\t" + "vxor.vv v4, v4, v12\n\t" + "vxor.vv v5, v5, v13\n\t" + "vxor.vv v6, v6, v14\n\t" + "vxor.vv v7, v7, v15\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v4, (s8)\n\t" + "addi %[m], %[m], 64\n\t" + "addi %[c], %[c], 64\n\t" + "addi %[len], %[len], -128\n\t" + "\n" + "L_chacha20_riscv64_vec_after_128_%=:\n\t" + "beqz %[len], L_chacha20_riscv64_vec_done_%=\n\t" + /* Load state to encrypt */ + "mv s8, %[ctx]\n\t" + "vl4re32.v v8, (s8)\n\t" + /* Advance ctx->X[12] by number of blocks: (len + 63) / 64 */ + "addi s6, %[len], 63\n\t" + "srli s6, s6, 6\n\t" + "lw s7, 48(%[ctx])\n\t" + "add s7, s7, s6\n\t" + "sw s7, 48(%[ctx])\n\t" + /* Counter increment {1,0,0,0} */ + "vmv.v.i v13, 0\n\t" + "li s6, 1\n\t" + "vmv.s.x v13, s6\n\t" + "\n" + "L_chacha20_riscv64_vec_64_loop_%=:\n\t" + "vmv4r.v v0, v8\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 3\n\t" + "vslideup.vi v12, v3, 1\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 1\n\t" + "vslideup.vi v12, v1, 3\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 16\n\t" +#else + "vsll.vi v12, v3, 16\n\t" + "vsrl.vi v3, v3, 16\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 20\n\t" +#else + "vsll.vi v12, v1, 12\n\t" + "vsrl.vi v1, v1, 20\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v0, v0, v1\n\t" + "vxor.vv v3, v3, v0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v3, v3, 24\n\t" +#else + "vsll.vi v12, v3, 8\n\t" + "vsrl.vi v3, v3, 24\n\t" + "vor.vv v3, v3, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vadd.vv v2, v2, v3\n\t" + "vxor.vv v1, v1, v2\n\t" +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "vror.vi v1, v1, 25\n\t" +#else + "vsll.vi v12, v1, 7\n\t" + "vsrl.vi v1, v1, 25\n\t" + "vor.vv v1, v1, v12\n\t" +#endif /* WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + "vslidedown.vi v12, v3, 1\n\t" + "vslideup.vi v12, v3, 3\n\t" + "vmv.v.v v3, v12\n\t" + "vslidedown.vi v12, v1, 3\n\t" + "vslideup.vi v12, v1, 1\n\t" + "vmv.v.v v1, v12\n\t" + "vslidedown.vi v12, v2, 2\n\t" + "vslideup.vi v12, v2, 2\n\t" + "vmv.v.v v2, v12\n\t" + "addi s7, %[len], -64\n\t" + /* Add back state */ + "vadd.vv v0, v0, v8\n\t" + "vadd.vv v1, v1, v9\n\t" + "vadd.vv v2, v2, v10\n\t" + "vadd.vv v3, v3, v11\n\t" + "bltz s7, L_chacha20_riscv64_vec_64_lt_64_%=\n\t" + /* Encipher 64 bytes */ + "mv s8, %[m]\n\t" + "vl4re32.v v4, (s8)\n\t" + "vxor.vv v4, v4, v0\n\t" + "vxor.vv v5, v5, v1\n\t" + "vxor.vv v6, v6, v2\n\t" + "vxor.vv v7, v7, v3\n\t" + "mv s8, %[c]\n\t" + "vs4r.v v4, (s8)\n\t" + "addi %[len], %[len], -64\n\t" + "addi %[c], %[c], 64\n\t" + "addi %[m], %[m], 64\n\t" + "vadd.vv v11, v11, v13\n\t" + "bnez %[len], L_chacha20_riscv64_vec_64_loop_%=\n\t" + "j L_chacha20_riscv64_vec_done_%=\n\t" + "\n" + "L_chacha20_riscv64_vec_64_lt_64_%=:\n\t" + /* Store full keystream block for leftovers */ + "addi s8, %[ctx], 72\n\t" + "addi s7, %[len], -32\n\t" + "vs4r.v v0, (s8)\n\t" + "bltz s7, L_chacha20_riscv64_vec_64_lt_32_%=\n\t" + /* Encipher 32 bytes */ + "mv s8, %[m]\n\t" + "vl2re32.v v4, (s8)\n\t" + "vxor.vv v4, v4, v0\n\t" + "vxor.vv v5, v5, v1\n\t" + "mv s8, %[c]\n\t" + "vs2r.v v4, (s8)\n\t" + "addi %[len], %[len], -32\n\t" + "addi %[c], %[c], 32\n\t" + "addi %[m], %[m], 32\n\t" + "beqz %[len], L_chacha20_riscv64_vec_done_%=\n\t" + "vmv2r.v v0, v2\n\t" + "\n" + "L_chacha20_riscv64_vec_64_lt_32_%=:\n\t" + "addi s7, %[len], -16\n\t" + "bltz s7, L_chacha20_riscv64_vec_64_lt_16_%=\n\t" + /* Encipher 16 bytes */ + "mv s8, %[m]\n\t" + "vl1re32.v v4, (s8)\n\t" + "vxor.vv v4, v4, v0\n\t" + "mv s8, %[c]\n\t" + "vs1r.v v4, (s8)\n\t" + "addi %[len], %[len], -16\n\t" + "addi %[c], %[c], 16\n\t" + "addi %[m], %[m], 16\n\t" + "beqz %[len], L_chacha20_riscv64_vec_done_%=\n\t" + "vmv.v.v v0, v1\n\t" + "\n" + "L_chacha20_riscv64_vec_64_lt_16_%=:\n\t" + "addi s7, %[len], -8\n\t" + "bltz s7, L_chacha20_riscv64_vec_64_lt_8_%=\n\t" + /* Encipher 8 bytes */ + "vsetivli zero, 2, e64, m1, ta, ma\n\t" + "vmv.x.s s6, v0\n\t" + "vsetivli zero, 4, e32, m1, ta, ma\n\t" + "ld s7, 0(%[m])\n\t" + "xor s7, s7, s6\n\t" + "sd s7, 0(%[c])\n\t" + "addi %[len], %[len], -8\n\t" + "addi %[c], %[c], 8\n\t" + "addi %[m], %[m], 8\n\t" + "beqz %[len], L_chacha20_riscv64_vec_done_%=\n\t" + "vslidedown.vi v0, v0, 2\n\t" + "\n" + "L_chacha20_riscv64_vec_64_lt_8_%=:\n\t" + "addi %[len], %[len], -1\n\t" + "vsetivli zero, 2, e64, m1, ta, ma\n\t" + "vmv.x.s s6, v0\n\t" + "vsetivli zero, 4, e32, m1, ta, ma\n\t" + "\n" + "L_chacha20_riscv64_vec_64_loop_lt_8_%=:\n\t" + /* Encipher byte at a time */ + "addi %[len], %[len], -1\n\t" + "lb s7, 0(%[m])\n\t" + "addi %[m], %[m], 1\n\t" + "xor s7, s7, s6\n\t" + "sb s7, 0(%[c])\n\t" + "addi %[c], %[c], 1\n\t" + "srli s6, s6, 8\n\t" + "bgez %[len], L_chacha20_riscv64_vec_64_loop_lt_8_%=\n\t" + "\n" + "L_chacha20_riscv64_vec_done_%=:\n\t" + : [ctx] "+r" (ctx), [c] "+r" (c), [m] "+r" (m), [len] "+r" (len) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", "a6", + "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", + "s11" +#ifdef WOLFSSL_RISCV_VECTOR + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR */ + ); +} + +#else +void wc_chacha_crypt_bytes(ChaCha* ctx, byte* c, const byte* m, word32 len) +{ + __asm__ __volatile__ ( +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + " .option arch, +zbb, +zbkb\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + /* Ensure 64-bit length has top bits clear */ + "slli %[len], %[len], 32\n\t" + "srli %[len], %[len], 32\n\t" + /* ctx->left = (CHACHA_CHUNK_BYTES - (len & 63)) & 63 */ + "andi s6, %[len], 63\n\t" + "li s7, 64\n\t" + "sub s6, s7, s6\n\t" + "andi s6, s6, 63\n\t" + "sw s6, 64(%[ctx])\n\t" + /* over = ctx->over */ + "addi s11, %[ctx], 72\n\t" + "\n" + "L_chacha20_riscv64_outer_%=:\n\t" + /* Load state into working registers */ + "ld t0, 0(%[ctx])\n\t" + "ld t2, 8(%[ctx])\n\t" + "ld t4, 16(%[ctx])\n\t" + "ld t6, 24(%[ctx])\n\t" + "ld a5, 32(%[ctx])\n\t" + "ld a7, 40(%[ctx])\n\t" + "ld s2, 48(%[ctx])\n\t" + "ld s4, 56(%[ctx])\n\t" + "srli t1, t0, 32\n\t" + "srli t3, t2, 32\n\t" + "srli t5, t4, 32\n\t" + "srli a4, t6, 32\n\t" + "srli a6, a5, 32\n\t" + "srli s1, a7, 32\n\t" + "srli s3, s2, 32\n\t" + "srli s5, s4, 32\n\t" + /* 10 double rounds */ + "li s10, 10\n\t" + "\n" + "L_chacha20_riscv64_loop_%=:\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, a4\n\t" + "xor s2, s2, t0\n\t" + "xor s3, s3, t1\n\t" + "xor s4, s4, t2\n\t" + "xor s5, s5, t3\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw s2, s2, 16 */ + ".word 0x6109591b\n\t" + /* roriw s3, s3, 16 */ + ".word 0x6109d99b\n\t" + /* roriw s4, s4, 16 */ + ".word 0x610a5a1b\n\t" + /* roriw s5, s5, 16 */ + ".word 0x610ada9b\n\t" +#else + "slli s6, s2, 16\n\t" + "slli s7, s3, 16\n\t" + "slli s8, s4, 16\n\t" + "slli s9, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "add a5, a5, s2\n\t" + "add a6, a6, s3\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s5\n\t" + "xor t4, t4, a5\n\t" + "xor t5, t5, a6\n\t" + "xor t6, t6, a7\n\t" + "xor a4, a4, s1\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw t4, t4, 20 */ + ".word 0x614ede9b\n\t" + /* roriw t5, t5, 20 */ + ".word 0x614f5f1b\n\t" + /* roriw t6, t6, 20 */ + ".word 0x614fdf9b\n\t" + /* roriw a4, a4, 20 */ + ".word 0x6147571b\n\t" +#else + "slli s6, t4, 12\n\t" + "slli s7, t5, 12\n\t" + "slli s8, t6, 12\n\t" + "slli s9, a4, 12\n\t" + "srliw t4, t4, 20\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "add t0, t0, t4\n\t" + "add t1, t1, t5\n\t" + "add t2, t2, t6\n\t" + "add t3, t3, a4\n\t" + "xor s2, s2, t0\n\t" + "xor s3, s3, t1\n\t" + "xor s4, s4, t2\n\t" + "xor s5, s5, t3\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw s2, s2, 24 */ + ".word 0x6189591b\n\t" + /* roriw s3, s3, 24 */ + ".word 0x6189d99b\n\t" + /* roriw s4, s4, 24 */ + ".word 0x618a5a1b\n\t" + /* roriw s5, s5, 24 */ + ".word 0x618ada9b\n\t" +#else + "slli s6, s2, 8\n\t" + "slli s7, s3, 8\n\t" + "slli s8, s4, 8\n\t" + "slli s9, s5, 8\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "srliw s5, s5, 24\n\t" + "or s2, s2, s6\n\t" + "or s3, s3, s7\n\t" + "or s4, s4, s8\n\t" + "or s5, s5, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "add a5, a5, s2\n\t" + "add a6, a6, s3\n\t" + "add a7, a7, s4\n\t" + "add s1, s1, s5\n\t" + "xor t4, t4, a5\n\t" + "xor t5, t5, a6\n\t" + "xor t6, t6, a7\n\t" + "xor a4, a4, s1\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw t4, t4, 25 */ + ".word 0x619ede9b\n\t" + /* roriw t5, t5, 25 */ + ".word 0x619f5f1b\n\t" + /* roriw t6, t6, 25 */ + ".word 0x619fdf9b\n\t" + /* roriw a4, a4, 25 */ + ".word 0x6197571b\n\t" +#else + "slli s6, t4, 7\n\t" + "slli s7, t5, 7\n\t" + "slli s8, t6, 7\n\t" + "slli s9, a4, 7\n\t" + "srliw t4, t4, 25\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "or t4, t4, s6\n\t" + "or t5, t5, s7\n\t" + "or t6, t6, s8\n\t" + "or a4, a4, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "addi s10, s10, -1\n\t" + "add t0, t0, t5\n\t" + "add t1, t1, t6\n\t" + "add t2, t2, a4\n\t" + "add t3, t3, t4\n\t" + "xor s5, s5, t0\n\t" + "xor s2, s2, t1\n\t" + "xor s3, s3, t2\n\t" + "xor s4, s4, t3\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw s5, s5, 16 */ + ".word 0x610ada9b\n\t" + /* roriw s2, s2, 16 */ + ".word 0x6109591b\n\t" + /* roriw s3, s3, 16 */ + ".word 0x6109d99b\n\t" + /* roriw s4, s4, 16 */ + ".word 0x610a5a1b\n\t" +#else + "slli s6, s5, 16\n\t" + "slli s7, s2, 16\n\t" + "slli s8, s3, 16\n\t" + "slli s9, s4, 16\n\t" + "srliw s5, s5, 16\n\t" + "srliw s2, s2, 16\n\t" + "srliw s3, s3, 16\n\t" + "srliw s4, s4, 16\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "add a7, a7, s5\n\t" + "add s1, s1, s2\n\t" + "add a5, a5, s3\n\t" + "add a6, a6, s4\n\t" + "xor t5, t5, a7\n\t" + "xor t6, t6, s1\n\t" + "xor a4, a4, a5\n\t" + "xor t4, t4, a6\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw t5, t5, 20 */ + ".word 0x614f5f1b\n\t" + /* roriw t6, t6, 20 */ + ".word 0x614fdf9b\n\t" + /* roriw a4, a4, 20 */ + ".word 0x6147571b\n\t" + /* roriw t4, t4, 20 */ + ".word 0x614ede9b\n\t" +#else + "slli s6, t5, 12\n\t" + "slli s7, t6, 12\n\t" + "slli s8, a4, 12\n\t" + "slli s9, t4, 12\n\t" + "srliw t5, t5, 20\n\t" + "srliw t6, t6, 20\n\t" + "srliw a4, a4, 20\n\t" + "srliw t4, t4, 20\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "add t0, t0, t5\n\t" + "add t1, t1, t6\n\t" + "add t2, t2, a4\n\t" + "add t3, t3, t4\n\t" + "xor s5, s5, t0\n\t" + "xor s2, s2, t1\n\t" + "xor s3, s3, t2\n\t" + "xor s4, s4, t3\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw s5, s5, 24 */ + ".word 0x618ada9b\n\t" + /* roriw s2, s2, 24 */ + ".word 0x6189591b\n\t" + /* roriw s3, s3, 24 */ + ".word 0x6189d99b\n\t" + /* roriw s4, s4, 24 */ + ".word 0x618a5a1b\n\t" +#else + "slli s6, s5, 8\n\t" + "slli s7, s2, 8\n\t" + "slli s8, s3, 8\n\t" + "slli s9, s4, 8\n\t" + "srliw s5, s5, 24\n\t" + "srliw s2, s2, 24\n\t" + "srliw s3, s3, 24\n\t" + "srliw s4, s4, 24\n\t" + "or s5, s5, s6\n\t" + "or s2, s2, s7\n\t" + "or s3, s3, s8\n\t" + "or s4, s4, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "add a7, a7, s5\n\t" + "add s1, s1, s2\n\t" + "add a5, a5, s3\n\t" + "add a6, a6, s4\n\t" + "xor t5, t5, a7\n\t" + "xor t6, t6, s1\n\t" + "xor a4, a4, a5\n\t" + "xor t4, t4, a6\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* roriw t5, t5, 25 */ + ".word 0x619f5f1b\n\t" + /* roriw t6, t6, 25 */ + ".word 0x619fdf9b\n\t" + /* roriw a4, a4, 25 */ + ".word 0x6197571b\n\t" + /* roriw t4, t4, 25 */ + ".word 0x619ede9b\n\t" +#else + "slli s6, t5, 7\n\t" + "slli s7, t6, 7\n\t" + "slli s8, a4, 7\n\t" + "slli s9, t4, 7\n\t" + "srliw t5, t5, 25\n\t" + "srliw t6, t6, 25\n\t" + "srliw a4, a4, 25\n\t" + "srliw t4, t4, 25\n\t" + "or t5, t5, s6\n\t" + "or t6, t6, s7\n\t" + "or a4, a4, s8\n\t" + "or t4, t4, s9\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "bnez s10, L_chacha20_riscv64_loop_%=\n\t" + "addi %[len], %[len], -64\n\t" + /* Add original state back in; increment block counter X[12] */ + "ld s6, 0(%[ctx])\n\t" + "ld s7, 8(%[ctx])\n\t" + "ld s8, 16(%[ctx])\n\t" + "ld s9, 24(%[ctx])\n\t" + "add t0, t0, s6\n\t" + "add t2, t2, s7\n\t" + "add t4, t4, s8\n\t" + "add t6, t6, s9\n\t" + "srli s6, s6, 32\n\t" + "srli s7, s7, 32\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s9, 32\n\t" + "add t1, t1, s6\n\t" + "add t3, t3, s7\n\t" + "add t5, t5, s8\n\t" + "add a4, a4, s9\n\t" + "ld s6, 32(%[ctx])\n\t" + "ld s7, 40(%[ctx])\n\t" + "ld s8, 48(%[ctx])\n\t" + "ld s9, 56(%[ctx])\n\t" + "add a5, a5, s6\n\t" + "add a7, a7, s7\n\t" + "add s2, s2, s8\n\t" + "add s4, s4, s9\n\t" + "srli s6, s6, 32\n\t" + "srli s7, s7, 32\n\t" + "srli s9, s9, 32\n\t" + "add a6, a6, s6\n\t" + "add s1, s1, s7\n\t" + "add s5, s5, s9\n\t" + "srli s9, s8, 32\n\t" + "add s3, s3, s9\n\t" + "addi s8, s8, 1\n\t" + "sw s8, 48(%[ctx])\n\t" + "bltz %[len], L_chacha20_riscv64_over_%=\n\t" + /* XOR full 64-byte block of message and store */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + /* pack t0, t0, t1 */ + ".word 0x0862c2b3\n\t" + /* pack t2, t2, t3 */ + ".word 0x09c3c3b3\n\t" + /* pack t4, t4, t5 */ + ".word 0x09eeceb3\n\t" + /* pack t6, t6, a4 */ + ".word 0x08efcfb3\n\t" + /* pack a5, a5, a6 */ + ".word 0x0907c7b3\n\t" + /* pack a7, a7, s1 */ + ".word 0x0898c8b3\n\t" + /* pack s2, s2, s3 */ + ".word 0x09394933\n\t" + /* pack s4, s4, s5 */ + ".word 0x095a4a33\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 0(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld16_w_%=\n\t" + "ld t1, 0(%[m])\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld16_h_%=\n\t" + "lwu t1, 0(%[m])\n\t" + "lwu s10, 4(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t1, t1, s10\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld16_b_%=\n\t" + "lhu t1, 0(%[m])\n\t" + "lhu s10, 2(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or t1, t1, s10\n\t" + "lhu s10, 4(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t1, t1, s10\n\t" + "lhu s10, 6(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or t1, t1, s10\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_b_%=:\n\t" + "lbu t1, 0(%[m])\n\t" + "lbu s10, 1(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or t1, t1, s10\n\t" + "lbu s10, 2(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or t1, t1, s10\n\t" + "lbu s10, 3(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or t1, t1, s10\n\t" + "lbu s10, 4(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t1, t1, s10\n\t" + "lbu s10, 5(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or t1, t1, s10\n\t" + "lbu s10, 6(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or t1, t1, s10\n\t" + "lbu s10, 7(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or t1, t1, s10\n\t" + "\n" + "L_ualn_ld16_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 8(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld17_w_%=\n\t" + "ld t3, 8(%[m])\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld17_h_%=\n\t" + "lwu t3, 8(%[m])\n\t" + "lwu s10, 12(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t3, t3, s10\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld17_b_%=\n\t" + "lhu t3, 8(%[m])\n\t" + "lhu s10, 10(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or t3, t3, s10\n\t" + "lhu s10, 12(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t3, t3, s10\n\t" + "lhu s10, 14(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or t3, t3, s10\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_b_%=:\n\t" + "lbu t3, 8(%[m])\n\t" + "lbu s10, 9(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or t3, t3, s10\n\t" + "lbu s10, 10(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or t3, t3, s10\n\t" + "lbu s10, 11(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or t3, t3, s10\n\t" + "lbu s10, 12(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t3, t3, s10\n\t" + "lbu s10, 13(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or t3, t3, s10\n\t" + "lbu s10, 14(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or t3, t3, s10\n\t" + "lbu s10, 15(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or t3, t3, s10\n\t" + "\n" + "L_ualn_ld17_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t5, 16(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld18_w_%=\n\t" + "ld t5, 16(%[m])\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld18_h_%=\n\t" + "lwu t5, 16(%[m])\n\t" + "lwu s10, 20(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t5, t5, s10\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld18_b_%=\n\t" + "lhu t5, 16(%[m])\n\t" + "lhu s10, 18(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or t5, t5, s10\n\t" + "lhu s10, 20(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t5, t5, s10\n\t" + "lhu s10, 22(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or t5, t5, s10\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_b_%=:\n\t" + "lbu t5, 16(%[m])\n\t" + "lbu s10, 17(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or t5, t5, s10\n\t" + "lbu s10, 18(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or t5, t5, s10\n\t" + "lbu s10, 19(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or t5, t5, s10\n\t" + "lbu s10, 20(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or t5, t5, s10\n\t" + "lbu s10, 21(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or t5, t5, s10\n\t" + "lbu s10, 22(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or t5, t5, s10\n\t" + "lbu s10, 23(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or t5, t5, s10\n\t" + "\n" + "L_ualn_ld18_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 24(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld19_w_%=\n\t" + "ld a4, 24(%[m])\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld19_h_%=\n\t" + "lwu a4, 24(%[m])\n\t" + "lwu s10, 28(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or a4, a4, s10\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld19_b_%=\n\t" + "lhu a4, 24(%[m])\n\t" + "lhu s10, 26(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or a4, a4, s10\n\t" + "lhu s10, 28(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or a4, a4, s10\n\t" + "lhu s10, 30(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or a4, a4, s10\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_b_%=:\n\t" + "lbu a4, 24(%[m])\n\t" + "lbu s10, 25(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or a4, a4, s10\n\t" + "lbu s10, 26(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or a4, a4, s10\n\t" + "lbu s10, 27(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or a4, a4, s10\n\t" + "lbu s10, 28(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or a4, a4, s10\n\t" + "lbu s10, 29(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or a4, a4, s10\n\t" + "lbu s10, 30(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or a4, a4, s10\n\t" + "lbu s10, 31(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or a4, a4, s10\n\t" + "\n" + "L_ualn_ld19_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 32(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld20_w_%=\n\t" + "ld a6, 32(%[m])\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld20_h_%=\n\t" + "lwu a6, 32(%[m])\n\t" + "lwu s10, 36(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or a6, a6, s10\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld20_b_%=\n\t" + "lhu a6, 32(%[m])\n\t" + "lhu s10, 34(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or a6, a6, s10\n\t" + "lhu s10, 36(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or a6, a6, s10\n\t" + "lhu s10, 38(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or a6, a6, s10\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_b_%=:\n\t" + "lbu a6, 32(%[m])\n\t" + "lbu s10, 33(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or a6, a6, s10\n\t" + "lbu s10, 34(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or a6, a6, s10\n\t" + "lbu s10, 35(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or a6, a6, s10\n\t" + "lbu s10, 36(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or a6, a6, s10\n\t" + "lbu s10, 37(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or a6, a6, s10\n\t" + "lbu s10, 38(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or a6, a6, s10\n\t" + "lbu s10, 39(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or a6, a6, s10\n\t" + "\n" + "L_ualn_ld20_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s1, 40(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld21_w_%=\n\t" + "ld s1, 40(%[m])\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld21_h_%=\n\t" + "lwu s1, 40(%[m])\n\t" + "lwu s10, 44(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s1, s1, s10\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld21_b_%=\n\t" + "lhu s1, 40(%[m])\n\t" + "lhu s10, 42(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s1, s1, s10\n\t" + "lhu s10, 44(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s1, s1, s10\n\t" + "lhu s10, 46(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s1, s1, s10\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_b_%=:\n\t" + "lbu s1, 40(%[m])\n\t" + "lbu s10, 41(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s1, s1, s10\n\t" + "lbu s10, 42(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s1, s1, s10\n\t" + "lbu s10, 43(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s1, s1, s10\n\t" + "lbu s10, 44(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s1, s1, s10\n\t" + "lbu s10, 45(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s1, s1, s10\n\t" + "lbu s10, 46(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s1, s1, s10\n\t" + "lbu s10, 47(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s1, s1, s10\n\t" + "\n" + "L_ualn_ld21_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s3, 48(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld22_w_%=\n\t" + "ld s3, 48(%[m])\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld22_h_%=\n\t" + "lwu s3, 48(%[m])\n\t" + "lwu s10, 52(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s3, s3, s10\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld22_b_%=\n\t" + "lhu s3, 48(%[m])\n\t" + "lhu s10, 50(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s3, s3, s10\n\t" + "lhu s10, 52(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s3, s3, s10\n\t" + "lhu s10, 54(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s3, s3, s10\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_b_%=:\n\t" + "lbu s3, 48(%[m])\n\t" + "lbu s10, 49(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s3, s3, s10\n\t" + "lbu s10, 50(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s3, s3, s10\n\t" + "lbu s10, 51(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s3, s3, s10\n\t" + "lbu s10, 52(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s3, s3, s10\n\t" + "lbu s10, 53(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s3, s3, s10\n\t" + "lbu s10, 54(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s3, s3, s10\n\t" + "lbu s10, 55(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s3, s3, s10\n\t" + "\n" + "L_ualn_ld22_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s5, 56(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld23_w_%=\n\t" + "ld s5, 56(%[m])\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld23_h_%=\n\t" + "lwu s5, 56(%[m])\n\t" + "lwu s10, 60(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s5, s5, s10\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld23_b_%=\n\t" + "lhu s5, 56(%[m])\n\t" + "lhu s10, 58(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s5, s5, s10\n\t" + "lhu s10, 60(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s5, s5, s10\n\t" + "lhu s10, 62(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s5, s5, s10\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_b_%=:\n\t" + "lbu s5, 56(%[m])\n\t" + "lbu s10, 57(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s5, s5, s10\n\t" + "lbu s10, 58(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s5, s5, s10\n\t" + "lbu s10, 59(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s5, s5, s10\n\t" + "lbu s10, 60(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s5, s5, s10\n\t" + "lbu s10, 61(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s5, s5, s10\n\t" + "lbu s10, 62(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s5, s5, s10\n\t" + "lbu s10, 63(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s5, s5, s10\n\t" + "\n" + "L_ualn_ld23_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t0, t0, t1\n\t" + "xor t2, t2, t3\n\t" + "xor t4, t4, t5\n\t" + "xor t6, t6, a4\n\t" + "xor a5, a5, a6\n\t" + "xor a7, a7, s1\n\t" + "xor s2, s2, s3\n\t" + "xor s4, s4, s5\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t0, 0(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd24_w_%=\n\t" + "sd t0, 0(%[c])\n\t" + "j L_ualn_sd24_e_%=\n\t" + "\n" + "L_ualn_sd24_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd24_h_%=\n\t" + "sw t0, 0(%[c])\n\t" + "srli s10, t0, 32\n\t" + "sw s10, 4(%[c])\n\t" + "j L_ualn_sd24_e_%=\n\t" + "\n" + "L_ualn_sd24_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd24_b_%=\n\t" + "sh t0, 0(%[c])\n\t" + "srli s10, t0, 16\n\t" + "sh s10, 2(%[c])\n\t" + "srli s10, t0, 32\n\t" + "sh s10, 4(%[c])\n\t" + "srli s10, t0, 48\n\t" + "sh s10, 6(%[c])\n\t" + "j L_ualn_sd24_e_%=\n\t" + "\n" + "L_ualn_sd24_b_%=:\n\t" + "sb t0, 0(%[c])\n\t" + "srli s10, t0, 8\n\t" + "sb s10, 1(%[c])\n\t" + "srli s10, t0, 16\n\t" + "sb s10, 2(%[c])\n\t" + "srli s10, t0, 24\n\t" + "sb s10, 3(%[c])\n\t" + "srli s10, t0, 32\n\t" + "sb s10, 4(%[c])\n\t" + "srli s10, t0, 40\n\t" + "sb s10, 5(%[c])\n\t" + "srli s10, t0, 48\n\t" + "sb s10, 6(%[c])\n\t" + "srli s10, t0, 56\n\t" + "sb s10, 7(%[c])\n\t" + "\n" + "L_ualn_sd24_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t2, 8(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd25_w_%=\n\t" + "sd t2, 8(%[c])\n\t" + "j L_ualn_sd25_e_%=\n\t" + "\n" + "L_ualn_sd25_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd25_h_%=\n\t" + "sw t2, 8(%[c])\n\t" + "srli s10, t2, 32\n\t" + "sw s10, 12(%[c])\n\t" + "j L_ualn_sd25_e_%=\n\t" + "\n" + "L_ualn_sd25_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd25_b_%=\n\t" + "sh t2, 8(%[c])\n\t" + "srli s10, t2, 16\n\t" + "sh s10, 10(%[c])\n\t" + "srli s10, t2, 32\n\t" + "sh s10, 12(%[c])\n\t" + "srli s10, t2, 48\n\t" + "sh s10, 14(%[c])\n\t" + "j L_ualn_sd25_e_%=\n\t" + "\n" + "L_ualn_sd25_b_%=:\n\t" + "sb t2, 8(%[c])\n\t" + "srli s10, t2, 8\n\t" + "sb s10, 9(%[c])\n\t" + "srli s10, t2, 16\n\t" + "sb s10, 10(%[c])\n\t" + "srli s10, t2, 24\n\t" + "sb s10, 11(%[c])\n\t" + "srli s10, t2, 32\n\t" + "sb s10, 12(%[c])\n\t" + "srli s10, t2, 40\n\t" + "sb s10, 13(%[c])\n\t" + "srli s10, t2, 48\n\t" + "sb s10, 14(%[c])\n\t" + "srli s10, t2, 56\n\t" + "sb s10, 15(%[c])\n\t" + "\n" + "L_ualn_sd25_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t4, 16(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd26_w_%=\n\t" + "sd t4, 16(%[c])\n\t" + "j L_ualn_sd26_e_%=\n\t" + "\n" + "L_ualn_sd26_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd26_h_%=\n\t" + "sw t4, 16(%[c])\n\t" + "srli s10, t4, 32\n\t" + "sw s10, 20(%[c])\n\t" + "j L_ualn_sd26_e_%=\n\t" + "\n" + "L_ualn_sd26_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd26_b_%=\n\t" + "sh t4, 16(%[c])\n\t" + "srli s10, t4, 16\n\t" + "sh s10, 18(%[c])\n\t" + "srli s10, t4, 32\n\t" + "sh s10, 20(%[c])\n\t" + "srli s10, t4, 48\n\t" + "sh s10, 22(%[c])\n\t" + "j L_ualn_sd26_e_%=\n\t" + "\n" + "L_ualn_sd26_b_%=:\n\t" + "sb t4, 16(%[c])\n\t" + "srli s10, t4, 8\n\t" + "sb s10, 17(%[c])\n\t" + "srli s10, t4, 16\n\t" + "sb s10, 18(%[c])\n\t" + "srli s10, t4, 24\n\t" + "sb s10, 19(%[c])\n\t" + "srli s10, t4, 32\n\t" + "sb s10, 20(%[c])\n\t" + "srli s10, t4, 40\n\t" + "sb s10, 21(%[c])\n\t" + "srli s10, t4, 48\n\t" + "sb s10, 22(%[c])\n\t" + "srli s10, t4, 56\n\t" + "sb s10, 23(%[c])\n\t" + "\n" + "L_ualn_sd26_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd t6, 24(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd27_w_%=\n\t" + "sd t6, 24(%[c])\n\t" + "j L_ualn_sd27_e_%=\n\t" + "\n" + "L_ualn_sd27_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd27_h_%=\n\t" + "sw t6, 24(%[c])\n\t" + "srli s10, t6, 32\n\t" + "sw s10, 28(%[c])\n\t" + "j L_ualn_sd27_e_%=\n\t" + "\n" + "L_ualn_sd27_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd27_b_%=\n\t" + "sh t6, 24(%[c])\n\t" + "srli s10, t6, 16\n\t" + "sh s10, 26(%[c])\n\t" + "srli s10, t6, 32\n\t" + "sh s10, 28(%[c])\n\t" + "srli s10, t6, 48\n\t" + "sh s10, 30(%[c])\n\t" + "j L_ualn_sd27_e_%=\n\t" + "\n" + "L_ualn_sd27_b_%=:\n\t" + "sb t6, 24(%[c])\n\t" + "srli s10, t6, 8\n\t" + "sb s10, 25(%[c])\n\t" + "srli s10, t6, 16\n\t" + "sb s10, 26(%[c])\n\t" + "srli s10, t6, 24\n\t" + "sb s10, 27(%[c])\n\t" + "srli s10, t6, 32\n\t" + "sb s10, 28(%[c])\n\t" + "srli s10, t6, 40\n\t" + "sb s10, 29(%[c])\n\t" + "srli s10, t6, 48\n\t" + "sb s10, 30(%[c])\n\t" + "srli s10, t6, 56\n\t" + "sb s10, 31(%[c])\n\t" + "\n" + "L_ualn_sd27_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd a5, 32(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd28_w_%=\n\t" + "sd a5, 32(%[c])\n\t" + "j L_ualn_sd28_e_%=\n\t" + "\n" + "L_ualn_sd28_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd28_h_%=\n\t" + "sw a5, 32(%[c])\n\t" + "srli s10, a5, 32\n\t" + "sw s10, 36(%[c])\n\t" + "j L_ualn_sd28_e_%=\n\t" + "\n" + "L_ualn_sd28_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd28_b_%=\n\t" + "sh a5, 32(%[c])\n\t" + "srli s10, a5, 16\n\t" + "sh s10, 34(%[c])\n\t" + "srli s10, a5, 32\n\t" + "sh s10, 36(%[c])\n\t" + "srli s10, a5, 48\n\t" + "sh s10, 38(%[c])\n\t" + "j L_ualn_sd28_e_%=\n\t" + "\n" + "L_ualn_sd28_b_%=:\n\t" + "sb a5, 32(%[c])\n\t" + "srli s10, a5, 8\n\t" + "sb s10, 33(%[c])\n\t" + "srli s10, a5, 16\n\t" + "sb s10, 34(%[c])\n\t" + "srli s10, a5, 24\n\t" + "sb s10, 35(%[c])\n\t" + "srli s10, a5, 32\n\t" + "sb s10, 36(%[c])\n\t" + "srli s10, a5, 40\n\t" + "sb s10, 37(%[c])\n\t" + "srli s10, a5, 48\n\t" + "sb s10, 38(%[c])\n\t" + "srli s10, a5, 56\n\t" + "sb s10, 39(%[c])\n\t" + "\n" + "L_ualn_sd28_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd a7, 40(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd29_w_%=\n\t" + "sd a7, 40(%[c])\n\t" + "j L_ualn_sd29_e_%=\n\t" + "\n" + "L_ualn_sd29_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd29_h_%=\n\t" + "sw a7, 40(%[c])\n\t" + "srli s10, a7, 32\n\t" + "sw s10, 44(%[c])\n\t" + "j L_ualn_sd29_e_%=\n\t" + "\n" + "L_ualn_sd29_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd29_b_%=\n\t" + "sh a7, 40(%[c])\n\t" + "srli s10, a7, 16\n\t" + "sh s10, 42(%[c])\n\t" + "srli s10, a7, 32\n\t" + "sh s10, 44(%[c])\n\t" + "srli s10, a7, 48\n\t" + "sh s10, 46(%[c])\n\t" + "j L_ualn_sd29_e_%=\n\t" + "\n" + "L_ualn_sd29_b_%=:\n\t" + "sb a7, 40(%[c])\n\t" + "srli s10, a7, 8\n\t" + "sb s10, 41(%[c])\n\t" + "srli s10, a7, 16\n\t" + "sb s10, 42(%[c])\n\t" + "srli s10, a7, 24\n\t" + "sb s10, 43(%[c])\n\t" + "srli s10, a7, 32\n\t" + "sb s10, 44(%[c])\n\t" + "srli s10, a7, 40\n\t" + "sb s10, 45(%[c])\n\t" + "srli s10, a7, 48\n\t" + "sb s10, 46(%[c])\n\t" + "srli s10, a7, 56\n\t" + "sb s10, 47(%[c])\n\t" + "\n" + "L_ualn_sd29_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd s2, 48(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd30_w_%=\n\t" + "sd s2, 48(%[c])\n\t" + "j L_ualn_sd30_e_%=\n\t" + "\n" + "L_ualn_sd30_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd30_h_%=\n\t" + "sw s2, 48(%[c])\n\t" + "srli s10, s2, 32\n\t" + "sw s10, 52(%[c])\n\t" + "j L_ualn_sd30_e_%=\n\t" + "\n" + "L_ualn_sd30_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd30_b_%=\n\t" + "sh s2, 48(%[c])\n\t" + "srli s10, s2, 16\n\t" + "sh s10, 50(%[c])\n\t" + "srli s10, s2, 32\n\t" + "sh s10, 52(%[c])\n\t" + "srli s10, s2, 48\n\t" + "sh s10, 54(%[c])\n\t" + "j L_ualn_sd30_e_%=\n\t" + "\n" + "L_ualn_sd30_b_%=:\n\t" + "sb s2, 48(%[c])\n\t" + "srli s10, s2, 8\n\t" + "sb s10, 49(%[c])\n\t" + "srli s10, s2, 16\n\t" + "sb s10, 50(%[c])\n\t" + "srli s10, s2, 24\n\t" + "sb s10, 51(%[c])\n\t" + "srli s10, s2, 32\n\t" + "sb s10, 52(%[c])\n\t" + "srli s10, s2, 40\n\t" + "sb s10, 53(%[c])\n\t" + "srli s10, s2, 48\n\t" + "sb s10, 54(%[c])\n\t" + "srli s10, s2, 56\n\t" + "sb s10, 55(%[c])\n\t" + "\n" + "L_ualn_sd30_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd s4, 56(%[c])\n\t" +#else + "andi s10, %[c], 7\n\t" + "bnez s10, L_ualn_sd31_w_%=\n\t" + "sd s4, 56(%[c])\n\t" + "j L_ualn_sd31_e_%=\n\t" + "\n" + "L_ualn_sd31_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_sd31_h_%=\n\t" + "sw s4, 56(%[c])\n\t" + "srli s10, s4, 32\n\t" + "sw s10, 60(%[c])\n\t" + "j L_ualn_sd31_e_%=\n\t" + "\n" + "L_ualn_sd31_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sd31_b_%=\n\t" + "sh s4, 56(%[c])\n\t" + "srli s10, s4, 16\n\t" + "sh s10, 58(%[c])\n\t" + "srli s10, s4, 32\n\t" + "sh s10, 60(%[c])\n\t" + "srli s10, s4, 48\n\t" + "sh s10, 62(%[c])\n\t" + "j L_ualn_sd31_e_%=\n\t" + "\n" + "L_ualn_sd31_b_%=:\n\t" + "sb s4, 56(%[c])\n\t" + "srli s10, s4, 8\n\t" + "sb s10, 57(%[c])\n\t" + "srli s10, s4, 16\n\t" + "sb s10, 58(%[c])\n\t" + "srli s10, s4, 24\n\t" + "sb s10, 59(%[c])\n\t" + "srli s10, s4, 32\n\t" + "sb s10, 60(%[c])\n\t" + "srli s10, s4, 40\n\t" + "sb s10, 61(%[c])\n\t" + "srli s10, s4, 48\n\t" + "sb s10, 62(%[c])\n\t" + "srli s10, s4, 56\n\t" + "sb s10, 63(%[c])\n\t" + "\n" + "L_ualn_sd31_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#else +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s6, 0(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld32_w_%=\n\t" + "ld s6, 0(%[m])\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld32_h_%=\n\t" + "lwu s6, 0(%[m])\n\t" + "lwu s10, 4(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s6, s6, s10\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld32_b_%=\n\t" + "lhu s6, 0(%[m])\n\t" + "lhu s10, 2(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s6, s6, s10\n\t" + "lhu s10, 4(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s6, s6, s10\n\t" + "lhu s10, 6(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s6, s6, s10\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_b_%=:\n\t" + "lbu s6, 0(%[m])\n\t" + "lbu s10, 1(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 2(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 3(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 4(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 5(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 6(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 7(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s6, s6, s10\n\t" + "\n" + "L_ualn_ld32_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s7, 8(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld33_w_%=\n\t" + "ld s7, 8(%[m])\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld33_h_%=\n\t" + "lwu s7, 8(%[m])\n\t" + "lwu s10, 12(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s7, s7, s10\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld33_b_%=\n\t" + "lhu s7, 8(%[m])\n\t" + "lhu s10, 10(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s7, s7, s10\n\t" + "lhu s10, 12(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s7, s7, s10\n\t" + "lhu s10, 14(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s7, s7, s10\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_b_%=:\n\t" + "lbu s7, 8(%[m])\n\t" + "lbu s10, 9(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 10(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 11(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 12(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 13(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 14(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 15(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s7, s7, s10\n\t" + "\n" + "L_ualn_ld33_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s8, 16(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld34_w_%=\n\t" + "ld s8, 16(%[m])\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld34_h_%=\n\t" + "lwu s8, 16(%[m])\n\t" + "lwu s10, 20(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s8, s8, s10\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld34_b_%=\n\t" + "lhu s8, 16(%[m])\n\t" + "lhu s10, 18(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s8, s8, s10\n\t" + "lhu s10, 20(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s8, s8, s10\n\t" + "lhu s10, 22(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s8, s8, s10\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_b_%=:\n\t" + "lbu s8, 16(%[m])\n\t" + "lbu s10, 17(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 18(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 19(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 20(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 21(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 22(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 23(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s8, s8, s10\n\t" + "\n" + "L_ualn_ld34_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s9, 24(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld35_w_%=\n\t" + "ld s9, 24(%[m])\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld35_h_%=\n\t" + "lwu s9, 24(%[m])\n\t" + "lwu s10, 28(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s9, s9, s10\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld35_b_%=\n\t" + "lhu s9, 24(%[m])\n\t" + "lhu s10, 26(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s9, s9, s10\n\t" + "lhu s10, 28(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s9, s9, s10\n\t" + "lhu s10, 30(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s9, s9, s10\n\t" + "j L_ualn_ld35_e_%=\n\t" + "\n" + "L_ualn_ld35_b_%=:\n\t" + "lbu s9, 24(%[m])\n\t" + "lbu s10, 25(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 26(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 27(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 28(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 29(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 30(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 31(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s9, s9, s10\n\t" + "\n" + "L_ualn_ld35_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor t0, t0, s6\n\t" + "xor t2, t2, s7\n\t" + "xor t4, t4, s8\n\t" + "xor t6, t6, s9\n\t" + "srli s6, s6, 32\n\t" + "srli s7, s7, 32\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s9, 32\n\t" + "xor t1, t1, s6\n\t" + "xor t3, t3, s7\n\t" + "xor t5, t5, s8\n\t" + "xor a4, a4, s9\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s6, 32(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld36_w_%=\n\t" + "ld s6, 32(%[m])\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld36_h_%=\n\t" + "lwu s6, 32(%[m])\n\t" + "lwu s10, 36(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s6, s6, s10\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld36_b_%=\n\t" + "lhu s6, 32(%[m])\n\t" + "lhu s10, 34(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s6, s6, s10\n\t" + "lhu s10, 36(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s6, s6, s10\n\t" + "lhu s10, 38(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s6, s6, s10\n\t" + "j L_ualn_ld36_e_%=\n\t" + "\n" + "L_ualn_ld36_b_%=:\n\t" + "lbu s6, 32(%[m])\n\t" + "lbu s10, 33(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 34(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 35(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 36(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 37(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 38(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s6, s6, s10\n\t" + "lbu s10, 39(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s6, s6, s10\n\t" + "\n" + "L_ualn_ld36_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s7, 40(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld37_w_%=\n\t" + "ld s7, 40(%[m])\n\t" + "j L_ualn_ld37_e_%=\n\t" + "\n" + "L_ualn_ld37_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld37_h_%=\n\t" + "lwu s7, 40(%[m])\n\t" + "lwu s10, 44(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s7, s7, s10\n\t" + "j L_ualn_ld37_e_%=\n\t" + "\n" + "L_ualn_ld37_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld37_b_%=\n\t" + "lhu s7, 40(%[m])\n\t" + "lhu s10, 42(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s7, s7, s10\n\t" + "lhu s10, 44(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s7, s7, s10\n\t" + "lhu s10, 46(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s7, s7, s10\n\t" + "j L_ualn_ld37_e_%=\n\t" + "\n" + "L_ualn_ld37_b_%=:\n\t" + "lbu s7, 40(%[m])\n\t" + "lbu s10, 41(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 42(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 43(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 44(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 45(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 46(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s7, s7, s10\n\t" + "lbu s10, 47(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s7, s7, s10\n\t" + "\n" + "L_ualn_ld37_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s8, 48(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld38_w_%=\n\t" + "ld s8, 48(%[m])\n\t" + "j L_ualn_ld38_e_%=\n\t" + "\n" + "L_ualn_ld38_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld38_h_%=\n\t" + "lwu s8, 48(%[m])\n\t" + "lwu s10, 52(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s8, s8, s10\n\t" + "j L_ualn_ld38_e_%=\n\t" + "\n" + "L_ualn_ld38_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld38_b_%=\n\t" + "lhu s8, 48(%[m])\n\t" + "lhu s10, 50(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s8, s8, s10\n\t" + "lhu s10, 52(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s8, s8, s10\n\t" + "lhu s10, 54(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s8, s8, s10\n\t" + "j L_ualn_ld38_e_%=\n\t" + "\n" + "L_ualn_ld38_b_%=:\n\t" + "lbu s8, 48(%[m])\n\t" + "lbu s10, 49(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 50(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 51(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 52(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 53(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 54(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s8, s8, s10\n\t" + "lbu s10, 55(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s8, s8, s10\n\t" + "\n" + "L_ualn_ld38_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s9, 56(%[m])\n\t" +#else + "andi s10, %[m], 7\n\t" + "bnez s10, L_ualn_ld39_w_%=\n\t" + "ld s9, 56(%[m])\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_w_%=:\n\t" + "andi s10, s10, 3\n\t" + "bnez s10, L_ualn_ld39_h_%=\n\t" + "lwu s9, 56(%[m])\n\t" + "lwu s10, 60(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s9, s9, s10\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_ld39_b_%=\n\t" + "lhu s9, 56(%[m])\n\t" + "lhu s10, 58(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s9, s9, s10\n\t" + "lhu s10, 60(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s9, s9, s10\n\t" + "lhu s10, 62(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s9, s9, s10\n\t" + "j L_ualn_ld39_e_%=\n\t" + "\n" + "L_ualn_ld39_b_%=:\n\t" + "lbu s9, 56(%[m])\n\t" + "lbu s10, 57(%[m])\n\t" + "slli s10, s10, 8\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 58(%[m])\n\t" + "slli s10, s10, 16\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 59(%[m])\n\t" + "slli s10, s10, 24\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 60(%[m])\n\t" + "slli s10, s10, 32\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 61(%[m])\n\t" + "slli s10, s10, 40\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 62(%[m])\n\t" + "slli s10, s10, 48\n\t" + "or s9, s9, s10\n\t" + "lbu s10, 63(%[m])\n\t" + "slli s10, s10, 56\n\t" + "or s9, s9, s10\n\t" + "\n" + "L_ualn_ld39_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "xor a5, a5, s6\n\t" + "xor a7, a7, s7\n\t" + "xor s2, s2, s8\n\t" + "xor s4, s4, s9\n\t" + "srli s6, s6, 32\n\t" + "srli s7, s7, 32\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s9, 32\n\t" + "xor a6, a6, s6\n\t" + "xor s1, s1, s7\n\t" + "xor s3, s3, s8\n\t" + "xor s5, s5, s9\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t0, 0(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw40_h_%=\n\t" + "sw t0, 0(%[c])\n\t" + "j L_ualn_sw40_e_%=\n\t" + "\n" + "L_ualn_sw40_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw40_b_%=\n\t" + "sh t0, 0(%[c])\n\t" + "srli s10, t0, 16\n\t" + "sh s10, 2(%[c])\n\t" + "j L_ualn_sw40_e_%=\n\t" + "\n" + "L_ualn_sw40_b_%=:\n\t" + "sb t0, 0(%[c])\n\t" + "srli s10, t0, 8\n\t" + "sb s10, 1(%[c])\n\t" + "srli s10, t0, 16\n\t" + "sb s10, 2(%[c])\n\t" + "srli s10, t0, 24\n\t" + "sb s10, 3(%[c])\n\t" + "\n" + "L_ualn_sw40_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t1, 4(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw41_h_%=\n\t" + "sw t1, 4(%[c])\n\t" + "j L_ualn_sw41_e_%=\n\t" + "\n" + "L_ualn_sw41_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw41_b_%=\n\t" + "sh t1, 4(%[c])\n\t" + "srli s10, t1, 16\n\t" + "sh s10, 6(%[c])\n\t" + "j L_ualn_sw41_e_%=\n\t" + "\n" + "L_ualn_sw41_b_%=:\n\t" + "sb t1, 4(%[c])\n\t" + "srli s10, t1, 8\n\t" + "sb s10, 5(%[c])\n\t" + "srli s10, t1, 16\n\t" + "sb s10, 6(%[c])\n\t" + "srli s10, t1, 24\n\t" + "sb s10, 7(%[c])\n\t" + "\n" + "L_ualn_sw41_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t2, 8(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw42_h_%=\n\t" + "sw t2, 8(%[c])\n\t" + "j L_ualn_sw42_e_%=\n\t" + "\n" + "L_ualn_sw42_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw42_b_%=\n\t" + "sh t2, 8(%[c])\n\t" + "srli s10, t2, 16\n\t" + "sh s10, 10(%[c])\n\t" + "j L_ualn_sw42_e_%=\n\t" + "\n" + "L_ualn_sw42_b_%=:\n\t" + "sb t2, 8(%[c])\n\t" + "srli s10, t2, 8\n\t" + "sb s10, 9(%[c])\n\t" + "srli s10, t2, 16\n\t" + "sb s10, 10(%[c])\n\t" + "srli s10, t2, 24\n\t" + "sb s10, 11(%[c])\n\t" + "\n" + "L_ualn_sw42_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t3, 12(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw43_h_%=\n\t" + "sw t3, 12(%[c])\n\t" + "j L_ualn_sw43_e_%=\n\t" + "\n" + "L_ualn_sw43_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw43_b_%=\n\t" + "sh t3, 12(%[c])\n\t" + "srli s10, t3, 16\n\t" + "sh s10, 14(%[c])\n\t" + "j L_ualn_sw43_e_%=\n\t" + "\n" + "L_ualn_sw43_b_%=:\n\t" + "sb t3, 12(%[c])\n\t" + "srli s10, t3, 8\n\t" + "sb s10, 13(%[c])\n\t" + "srli s10, t3, 16\n\t" + "sb s10, 14(%[c])\n\t" + "srli s10, t3, 24\n\t" + "sb s10, 15(%[c])\n\t" + "\n" + "L_ualn_sw43_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t4, 16(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw44_h_%=\n\t" + "sw t4, 16(%[c])\n\t" + "j L_ualn_sw44_e_%=\n\t" + "\n" + "L_ualn_sw44_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw44_b_%=\n\t" + "sh t4, 16(%[c])\n\t" + "srli s10, t4, 16\n\t" + "sh s10, 18(%[c])\n\t" + "j L_ualn_sw44_e_%=\n\t" + "\n" + "L_ualn_sw44_b_%=:\n\t" + "sb t4, 16(%[c])\n\t" + "srli s10, t4, 8\n\t" + "sb s10, 17(%[c])\n\t" + "srli s10, t4, 16\n\t" + "sb s10, 18(%[c])\n\t" + "srli s10, t4, 24\n\t" + "sb s10, 19(%[c])\n\t" + "\n" + "L_ualn_sw44_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t5, 20(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw45_h_%=\n\t" + "sw t5, 20(%[c])\n\t" + "j L_ualn_sw45_e_%=\n\t" + "\n" + "L_ualn_sw45_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw45_b_%=\n\t" + "sh t5, 20(%[c])\n\t" + "srli s10, t5, 16\n\t" + "sh s10, 22(%[c])\n\t" + "j L_ualn_sw45_e_%=\n\t" + "\n" + "L_ualn_sw45_b_%=:\n\t" + "sb t5, 20(%[c])\n\t" + "srli s10, t5, 8\n\t" + "sb s10, 21(%[c])\n\t" + "srli s10, t5, 16\n\t" + "sb s10, 22(%[c])\n\t" + "srli s10, t5, 24\n\t" + "sb s10, 23(%[c])\n\t" + "\n" + "L_ualn_sw45_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw t6, 24(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw46_h_%=\n\t" + "sw t6, 24(%[c])\n\t" + "j L_ualn_sw46_e_%=\n\t" + "\n" + "L_ualn_sw46_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw46_b_%=\n\t" + "sh t6, 24(%[c])\n\t" + "srli s10, t6, 16\n\t" + "sh s10, 26(%[c])\n\t" + "j L_ualn_sw46_e_%=\n\t" + "\n" + "L_ualn_sw46_b_%=:\n\t" + "sb t6, 24(%[c])\n\t" + "srli s10, t6, 8\n\t" + "sb s10, 25(%[c])\n\t" + "srli s10, t6, 16\n\t" + "sb s10, 26(%[c])\n\t" + "srli s10, t6, 24\n\t" + "sb s10, 27(%[c])\n\t" + "\n" + "L_ualn_sw46_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw a4, 28(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw47_h_%=\n\t" + "sw a4, 28(%[c])\n\t" + "j L_ualn_sw47_e_%=\n\t" + "\n" + "L_ualn_sw47_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw47_b_%=\n\t" + "sh a4, 28(%[c])\n\t" + "srli s10, a4, 16\n\t" + "sh s10, 30(%[c])\n\t" + "j L_ualn_sw47_e_%=\n\t" + "\n" + "L_ualn_sw47_b_%=:\n\t" + "sb a4, 28(%[c])\n\t" + "srli s10, a4, 8\n\t" + "sb s10, 29(%[c])\n\t" + "srli s10, a4, 16\n\t" + "sb s10, 30(%[c])\n\t" + "srli s10, a4, 24\n\t" + "sb s10, 31(%[c])\n\t" + "\n" + "L_ualn_sw47_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw a5, 32(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw48_h_%=\n\t" + "sw a5, 32(%[c])\n\t" + "j L_ualn_sw48_e_%=\n\t" + "\n" + "L_ualn_sw48_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw48_b_%=\n\t" + "sh a5, 32(%[c])\n\t" + "srli s10, a5, 16\n\t" + "sh s10, 34(%[c])\n\t" + "j L_ualn_sw48_e_%=\n\t" + "\n" + "L_ualn_sw48_b_%=:\n\t" + "sb a5, 32(%[c])\n\t" + "srli s10, a5, 8\n\t" + "sb s10, 33(%[c])\n\t" + "srli s10, a5, 16\n\t" + "sb s10, 34(%[c])\n\t" + "srli s10, a5, 24\n\t" + "sb s10, 35(%[c])\n\t" + "\n" + "L_ualn_sw48_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw a6, 36(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw49_h_%=\n\t" + "sw a6, 36(%[c])\n\t" + "j L_ualn_sw49_e_%=\n\t" + "\n" + "L_ualn_sw49_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw49_b_%=\n\t" + "sh a6, 36(%[c])\n\t" + "srli s10, a6, 16\n\t" + "sh s10, 38(%[c])\n\t" + "j L_ualn_sw49_e_%=\n\t" + "\n" + "L_ualn_sw49_b_%=:\n\t" + "sb a6, 36(%[c])\n\t" + "srli s10, a6, 8\n\t" + "sb s10, 37(%[c])\n\t" + "srli s10, a6, 16\n\t" + "sb s10, 38(%[c])\n\t" + "srli s10, a6, 24\n\t" + "sb s10, 39(%[c])\n\t" + "\n" + "L_ualn_sw49_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw a7, 40(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw50_h_%=\n\t" + "sw a7, 40(%[c])\n\t" + "j L_ualn_sw50_e_%=\n\t" + "\n" + "L_ualn_sw50_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw50_b_%=\n\t" + "sh a7, 40(%[c])\n\t" + "srli s10, a7, 16\n\t" + "sh s10, 42(%[c])\n\t" + "j L_ualn_sw50_e_%=\n\t" + "\n" + "L_ualn_sw50_b_%=:\n\t" + "sb a7, 40(%[c])\n\t" + "srli s10, a7, 8\n\t" + "sb s10, 41(%[c])\n\t" + "srli s10, a7, 16\n\t" + "sb s10, 42(%[c])\n\t" + "srli s10, a7, 24\n\t" + "sb s10, 43(%[c])\n\t" + "\n" + "L_ualn_sw50_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw s1, 44(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw51_h_%=\n\t" + "sw s1, 44(%[c])\n\t" + "j L_ualn_sw51_e_%=\n\t" + "\n" + "L_ualn_sw51_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw51_b_%=\n\t" + "sh s1, 44(%[c])\n\t" + "srli s10, s1, 16\n\t" + "sh s10, 46(%[c])\n\t" + "j L_ualn_sw51_e_%=\n\t" + "\n" + "L_ualn_sw51_b_%=:\n\t" + "sb s1, 44(%[c])\n\t" + "srli s10, s1, 8\n\t" + "sb s10, 45(%[c])\n\t" + "srli s10, s1, 16\n\t" + "sb s10, 46(%[c])\n\t" + "srli s10, s1, 24\n\t" + "sb s10, 47(%[c])\n\t" + "\n" + "L_ualn_sw51_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw s2, 48(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw52_h_%=\n\t" + "sw s2, 48(%[c])\n\t" + "j L_ualn_sw52_e_%=\n\t" + "\n" + "L_ualn_sw52_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw52_b_%=\n\t" + "sh s2, 48(%[c])\n\t" + "srli s10, s2, 16\n\t" + "sh s10, 50(%[c])\n\t" + "j L_ualn_sw52_e_%=\n\t" + "\n" + "L_ualn_sw52_b_%=:\n\t" + "sb s2, 48(%[c])\n\t" + "srli s10, s2, 8\n\t" + "sb s10, 49(%[c])\n\t" + "srli s10, s2, 16\n\t" + "sb s10, 50(%[c])\n\t" + "srli s10, s2, 24\n\t" + "sb s10, 51(%[c])\n\t" + "\n" + "L_ualn_sw52_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw s3, 52(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw53_h_%=\n\t" + "sw s3, 52(%[c])\n\t" + "j L_ualn_sw53_e_%=\n\t" + "\n" + "L_ualn_sw53_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw53_b_%=\n\t" + "sh s3, 52(%[c])\n\t" + "srli s10, s3, 16\n\t" + "sh s10, 54(%[c])\n\t" + "j L_ualn_sw53_e_%=\n\t" + "\n" + "L_ualn_sw53_b_%=:\n\t" + "sb s3, 52(%[c])\n\t" + "srli s10, s3, 8\n\t" + "sb s10, 53(%[c])\n\t" + "srli s10, s3, 16\n\t" + "sb s10, 54(%[c])\n\t" + "srli s10, s3, 24\n\t" + "sb s10, 55(%[c])\n\t" + "\n" + "L_ualn_sw53_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw s4, 56(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw54_h_%=\n\t" + "sw s4, 56(%[c])\n\t" + "j L_ualn_sw54_e_%=\n\t" + "\n" + "L_ualn_sw54_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw54_b_%=\n\t" + "sh s4, 56(%[c])\n\t" + "srli s10, s4, 16\n\t" + "sh s10, 58(%[c])\n\t" + "j L_ualn_sw54_e_%=\n\t" + "\n" + "L_ualn_sw54_b_%=:\n\t" + "sb s4, 56(%[c])\n\t" + "srli s10, s4, 8\n\t" + "sb s10, 57(%[c])\n\t" + "srli s10, s4, 16\n\t" + "sb s10, 58(%[c])\n\t" + "srli s10, s4, 24\n\t" + "sb s10, 59(%[c])\n\t" + "\n" + "L_ualn_sw54_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw s5, 60(%[c])\n\t" +#else + "andi s10, %[c], 3\n\t" + "bnez s10, L_ualn_sw55_h_%=\n\t" + "sw s5, 60(%[c])\n\t" + "j L_ualn_sw55_e_%=\n\t" + "\n" + "L_ualn_sw55_h_%=:\n\t" + "andi s10, s10, 1\n\t" + "bnez s10, L_ualn_sw55_b_%=\n\t" + "sh s5, 60(%[c])\n\t" + "srli s10, s5, 16\n\t" + "sh s10, 62(%[c])\n\t" + "j L_ualn_sw55_e_%=\n\t" + "\n" + "L_ualn_sw55_b_%=:\n\t" + "sb s5, 60(%[c])\n\t" + "srli s10, s5, 8\n\t" + "sb s10, 61(%[c])\n\t" + "srli s10, s5, 16\n\t" + "sb s10, 62(%[c])\n\t" + "srli s10, s5, 24\n\t" + "sb s10, 63(%[c])\n\t" + "\n" + "L_ualn_sw55_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + "addi %[m], %[m], 64\n\t" + "addi %[c], %[c], 64\n\t" + "bnez %[len], L_chacha20_riscv64_outer_%=\n\t" + "j L_chacha20_riscv64_done_%=\n\t" + "\n" + "L_chacha20_riscv64_over_%=:\n\t" + /* Partial last block: save keystream block, XOR remaining bytes */ + "addi s10, %[len], 64\n\t" + "sw t0, 0(s11)\n\t" + "sw t1, 4(s11)\n\t" + "sw t2, 8(s11)\n\t" + "sw t3, 12(s11)\n\t" + "sw t4, 16(s11)\n\t" + "sw t5, 20(s11)\n\t" + "sw t6, 24(s11)\n\t" + "sw a4, 28(s11)\n\t" + "sw a5, 32(s11)\n\t" + "sw a6, 36(s11)\n\t" + "sw a7, 40(s11)\n\t" + "sw s1, 44(s11)\n\t" + "sw s2, 48(s11)\n\t" + "sw s3, 52(s11)\n\t" + "sw s4, 56(s11)\n\t" + "sw s5, 60(s11)\n\t" + "\n" + "L_chacha20_riscv64_over_loop_8_%=:\n\t" + "li s8, 8\n\t" + "bltu s10, s8, L_chacha20_riscv64_over_lt_4_%=\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld s6, 0(%[m])\n\t" +#else + "andi s9, %[m], 7\n\t" + "bnez s9, L_ualn_ld56_w_%=\n\t" + "ld s6, 0(%[m])\n\t" + "j L_ualn_ld56_e_%=\n\t" + "\n" + "L_ualn_ld56_w_%=:\n\t" + "andi s9, s9, 3\n\t" + "bnez s9, L_ualn_ld56_h_%=\n\t" + "lwu s6, 0(%[m])\n\t" + "lwu s9, 4(%[m])\n\t" + "slli s9, s9, 32\n\t" + "or s6, s6, s9\n\t" + "j L_ualn_ld56_e_%=\n\t" + "\n" + "L_ualn_ld56_h_%=:\n\t" + "andi s9, s9, 1\n\t" + "bnez s9, L_ualn_ld56_b_%=\n\t" + "lhu s6, 0(%[m])\n\t" + "lhu s9, 2(%[m])\n\t" + "slli s9, s9, 16\n\t" + "or s6, s6, s9\n\t" + "lhu s9, 4(%[m])\n\t" + "slli s9, s9, 32\n\t" + "or s6, s6, s9\n\t" + "lhu s9, 6(%[m])\n\t" + "slli s9, s9, 48\n\t" + "or s6, s6, s9\n\t" + "j L_ualn_ld56_e_%=\n\t" + "\n" + "L_ualn_ld56_b_%=:\n\t" + "lbu s6, 0(%[m])\n\t" + "lbu s9, 1(%[m])\n\t" + "slli s9, s9, 8\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 2(%[m])\n\t" + "slli s9, s9, 16\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 3(%[m])\n\t" + "slli s9, s9, 24\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 4(%[m])\n\t" + "slli s9, s9, 32\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 5(%[m])\n\t" + "slli s9, s9, 40\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 6(%[m])\n\t" + "slli s9, s9, 48\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 7(%[m])\n\t" + "slli s9, s9, 56\n\t" + "or s6, s6, s9\n\t" + "\n" + "L_ualn_ld56_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "ld s7, 0(s11)\n\t" + "xor s6, s6, s7\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sd s6, 0(%[c])\n\t" +#else + "andi s9, %[c], 7\n\t" + "bnez s9, L_ualn_sd57_w_%=\n\t" + "sd s6, 0(%[c])\n\t" + "j L_ualn_sd57_e_%=\n\t" + "\n" + "L_ualn_sd57_w_%=:\n\t" + "andi s9, s9, 3\n\t" + "bnez s9, L_ualn_sd57_h_%=\n\t" + "sw s6, 0(%[c])\n\t" + "srli s9, s6, 32\n\t" + "sw s9, 4(%[c])\n\t" + "j L_ualn_sd57_e_%=\n\t" + "\n" + "L_ualn_sd57_h_%=:\n\t" + "andi s9, s9, 1\n\t" + "bnez s9, L_ualn_sd57_b_%=\n\t" + "sh s6, 0(%[c])\n\t" + "srli s9, s6, 16\n\t" + "sh s9, 2(%[c])\n\t" + "srli s9, s6, 32\n\t" + "sh s9, 4(%[c])\n\t" + "srli s9, s6, 48\n\t" + "sh s9, 6(%[c])\n\t" + "j L_ualn_sd57_e_%=\n\t" + "\n" + "L_ualn_sd57_b_%=:\n\t" + "sb s6, 0(%[c])\n\t" + "srli s9, s6, 8\n\t" + "sb s9, 1(%[c])\n\t" + "srli s9, s6, 16\n\t" + "sb s9, 2(%[c])\n\t" + "srli s9, s6, 24\n\t" + "sb s9, 3(%[c])\n\t" + "srli s9, s6, 32\n\t" + "sb s9, 4(%[c])\n\t" + "srli s9, s6, 40\n\t" + "sb s9, 5(%[c])\n\t" + "srli s9, s6, 48\n\t" + "sb s9, 6(%[c])\n\t" + "srli s9, s6, 56\n\t" + "sb s9, 7(%[c])\n\t" + "\n" + "L_ualn_sd57_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[m], %[m], 8\n\t" + "addi s11, s11, 8\n\t" + "addi %[c], %[c], 8\n\t" + "addi s10, s10, -8\n\t" + "j L_chacha20_riscv64_over_loop_8_%=\n\t" + "\n" + "L_chacha20_riscv64_over_lt_4_%=:\n\t" + "li s8, 4\n\t" + "bltu s10, s8, L_chacha20_riscv64_over_lt_2_%=\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lw s6, 0(%[m])\n\t" +#else + "andi s9, %[m], 3\n\t" + "bnez s9, L_ualn_lw58_h_%=\n\t" + "lw s6, 0(%[m])\n\t" + "j L_ualn_lw58_e_%=\n\t" + "\n" + "L_ualn_lw58_h_%=:\n\t" + "andi s9, s9, 1\n\t" + "bnez s9, L_ualn_lw58_b_%=\n\t" + "lhu s6, 0(%[m])\n\t" + "lhu s9, 2(%[m])\n\t" + "slli s9, s9, 16\n\t" + "or s6, s6, s9\n\t" + "addiw s6, s6, 0\n\t" + "j L_ualn_lw58_e_%=\n\t" + "\n" + "L_ualn_lw58_b_%=:\n\t" + "lbu s6, 0(%[m])\n\t" + "lbu s9, 1(%[m])\n\t" + "slli s9, s9, 8\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 2(%[m])\n\t" + "slli s9, s9, 16\n\t" + "or s6, s6, s9\n\t" + "lbu s9, 3(%[m])\n\t" + "slli s9, s9, 24\n\t" + "or s6, s6, s9\n\t" + "addiw s6, s6, 0\n\t" + "\n" + "L_ualn_lw58_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lw s7, 0(s11)\n\t" + "xor s6, s6, s7\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sw s6, 0(%[c])\n\t" +#else + "andi s9, %[c], 3\n\t" + "bnez s9, L_ualn_sw59_h_%=\n\t" + "sw s6, 0(%[c])\n\t" + "j L_ualn_sw59_e_%=\n\t" + "\n" + "L_ualn_sw59_h_%=:\n\t" + "andi s9, s9, 1\n\t" + "bnez s9, L_ualn_sw59_b_%=\n\t" + "sh s6, 0(%[c])\n\t" + "srli s9, s6, 16\n\t" + "sh s9, 2(%[c])\n\t" + "j L_ualn_sw59_e_%=\n\t" + "\n" + "L_ualn_sw59_b_%=:\n\t" + "sb s6, 0(%[c])\n\t" + "srli s9, s6, 8\n\t" + "sb s9, 1(%[c])\n\t" + "srli s9, s6, 16\n\t" + "sb s9, 2(%[c])\n\t" + "srli s9, s6, 24\n\t" + "sb s9, 3(%[c])\n\t" + "\n" + "L_ualn_sw59_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[m], %[m], 4\n\t" + "addi s11, s11, 4\n\t" + "addi %[c], %[c], 4\n\t" + "addi s10, s10, -4\n\t" + "\n" + "L_chacha20_riscv64_over_lt_2_%=:\n\t" + "li s8, 2\n\t" + "bltu s10, s8, L_chacha20_riscv64_over_lt_1_%=\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lh s6, 0(%[m])\n\t" +#else + "lbu s6, 0(%[m])\n\t" + "lb s9, 1(%[m])\n\t" + "slli s9, s9, 8\n\t" + "or s6, s6, s9\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "lh s7, 0(s11)\n\t" + "xor s6, s6, s7\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "sh s6, 0(%[c])\n\t" +#else + "sb s6, 0(%[c])\n\t" + "srli s9, s6, 8\n\t" + "sb s9, 1(%[c])\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[m], %[m], 2\n\t" + "addi s11, s11, 2\n\t" + "addi %[c], %[c], 2\n\t" + "addi s10, s10, -2\n\t" + "\n" + "L_chacha20_riscv64_over_lt_1_%=:\n\t" + "beqz s10, L_chacha20_riscv64_done_%=\n\t" + "lb s6, 0(%[m])\n\t" + "lb s7, 0(s11)\n\t" + "xor s6, s6, s7\n\t" + "sb s6, 0(%[c])\n\t" + "\n" + "L_chacha20_riscv64_done_%=:\n\t" + : [ctx] "+r" (ctx), [c] "+r" (c), [m] "+r" (m), [len] "+r" (len) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", "a6", + "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", + "s11" + ); +} + +#endif /* WOLFSSL_RISCV_VECTOR */ +#endif /* HAVE_CHACHA */ +#endif /* WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm.S b/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm.S new file mode 100644 index 00000000000..28fff9758c1 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm.S @@ -0,0 +1,4392 @@ +/* riscv-64-poly1305-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./poly1305/poly1305.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm.S + */ +#ifdef WOLFSSL_RISCV_ASM +#ifndef WOLFSSL_RISCV_ASM_INLINE +#ifdef HAVE_POLY1305 + .text + .globl poly1305_set_key_riscv64 + .type poly1305_set_key_riscv64,@function + .align 2 +poly1305_set_key_riscv64: + # r &= 0xffffffc0ffffffc0ffffffc0fffffff (split into 44-bit limbs) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 0(a1) +#else + andi t3, a1, 7 + bnez t3, L_ualn_ld1_w + ld t0, 0(a1) + j L_ualn_ld1_e +L_ualn_ld1_w: + andi t3, t3, 3 + bnez t3, L_ualn_ld1_h + lwu t0, 0(a1) + lwu t3, 4(a1) + slli t3, t3, 32 + or t0, t0, t3 + j L_ualn_ld1_e +L_ualn_ld1_h: + andi t3, t3, 1 + bnez t3, L_ualn_ld1_b + lhu t0, 0(a1) + lhu t3, 2(a1) + slli t3, t3, 16 + or t0, t0, t3 + lhu t3, 4(a1) + slli t3, t3, 32 + or t0, t0, t3 + lhu t3, 6(a1) + slli t3, t3, 48 + or t0, t0, t3 + j L_ualn_ld1_e +L_ualn_ld1_b: + lbu t0, 0(a1) + lbu t3, 1(a1) + slli t3, t3, 8 + or t0, t0, t3 + lbu t3, 2(a1) + slli t3, t3, 16 + or t0, t0, t3 + lbu t3, 3(a1) + slli t3, t3, 24 + or t0, t0, t3 + lbu t3, 4(a1) + slli t3, t3, 32 + or t0, t0, t3 + lbu t3, 5(a1) + slli t3, t3, 40 + or t0, t0, t3 + lbu t3, 6(a1) + slli t3, t3, 48 + or t0, t0, t3 + lbu t3, 7(a1) + slli t3, t3, 56 + or t0, t0, t3 +L_ualn_ld1_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 8(a1) +#else + andi t3, a1, 7 + bnez t3, L_ualn_ld2_w + ld t1, 8(a1) + j L_ualn_ld2_e +L_ualn_ld2_w: + andi t3, t3, 3 + bnez t3, L_ualn_ld2_h + lwu t1, 8(a1) + lwu t3, 12(a1) + slli t3, t3, 32 + or t1, t1, t3 + j L_ualn_ld2_e +L_ualn_ld2_h: + andi t3, t3, 1 + bnez t3, L_ualn_ld2_b + lhu t1, 8(a1) + lhu t3, 10(a1) + slli t3, t3, 16 + or t1, t1, t3 + lhu t3, 12(a1) + slli t3, t3, 32 + or t1, t1, t3 + lhu t3, 14(a1) + slli t3, t3, 48 + or t1, t1, t3 + j L_ualn_ld2_e +L_ualn_ld2_b: + lbu t1, 8(a1) + lbu t3, 9(a1) + slli t3, t3, 8 + or t1, t1, t3 + lbu t3, 10(a1) + slli t3, t3, 16 + or t1, t1, t3 + lbu t3, 11(a1) + slli t3, t3, 24 + or t1, t1, t3 + lbu t3, 12(a1) + slli t3, t3, 32 + or t1, t1, t3 + lbu t3, 13(a1) + slli t3, t3, 40 + or t1, t1, t3 + lbu t3, 14(a1) + slli t3, t3, 48 + or t1, t1, t3 + lbu t3, 15(a1) + slli t3, t3, 56 + or t1, t1, t3 +L_ualn_ld2_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + li t4, 17575274610687 + and t2, t0, t4 + sd t2, 0(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t2, t1, t0, 44 + .word 0x2ec353b3 +#else + srli t2, t0, 44 + slli t3, t1, 20 + or t2, t2, t3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + li t4, 17592181915647 + and t2, t2, t4 + sd t2, 8(a0) + srli t2, t1, 24 + li t4, 68719475727 + and t2, t2, t4 + sd t2, 16(a0) + # h = 0 + sd zero, 24(a0) + sd zero, 32(a0) + sd zero, 40(a0) + # save pad = key[16..31] +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t0, 16(a1) +#else + andi t3, a1, 7 + bnez t3, L_ualn_ld3_w + ld t0, 16(a1) + j L_ualn_ld3_e +L_ualn_ld3_w: + andi t3, t3, 3 + bnez t3, L_ualn_ld3_h + lwu t0, 16(a1) + lwu t3, 20(a1) + slli t3, t3, 32 + or t0, t0, t3 + j L_ualn_ld3_e +L_ualn_ld3_h: + andi t3, t3, 1 + bnez t3, L_ualn_ld3_b + lhu t0, 16(a1) + lhu t3, 18(a1) + slli t3, t3, 16 + or t0, t0, t3 + lhu t3, 20(a1) + slli t3, t3, 32 + or t0, t0, t3 + lhu t3, 22(a1) + slli t3, t3, 48 + or t0, t0, t3 + j L_ualn_ld3_e +L_ualn_ld3_b: + lbu t0, 16(a1) + lbu t3, 17(a1) + slli t3, t3, 8 + or t0, t0, t3 + lbu t3, 18(a1) + slli t3, t3, 16 + or t0, t0, t3 + lbu t3, 19(a1) + slli t3, t3, 24 + or t0, t0, t3 + lbu t3, 20(a1) + slli t3, t3, 32 + or t0, t0, t3 + lbu t3, 21(a1) + slli t3, t3, 40 + or t0, t0, t3 + lbu t3, 22(a1) + slli t3, t3, 48 + or t0, t0, t3 + lbu t3, 23(a1) + slli t3, t3, 56 + or t0, t0, t3 +L_ualn_ld3_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t1, 24(a1) +#else + andi t3, a1, 7 + bnez t3, L_ualn_ld4_w + ld t1, 24(a1) + j L_ualn_ld4_e +L_ualn_ld4_w: + andi t3, t3, 3 + bnez t3, L_ualn_ld4_h + lwu t1, 24(a1) + lwu t3, 28(a1) + slli t3, t3, 32 + or t1, t1, t3 + j L_ualn_ld4_e +L_ualn_ld4_h: + andi t3, t3, 1 + bnez t3, L_ualn_ld4_b + lhu t1, 24(a1) + lhu t3, 26(a1) + slli t3, t3, 16 + or t1, t1, t3 + lhu t3, 28(a1) + slli t3, t3, 32 + or t1, t1, t3 + lhu t3, 30(a1) + slli t3, t3, 48 + or t1, t1, t3 + j L_ualn_ld4_e +L_ualn_ld4_b: + lbu t1, 24(a1) + lbu t3, 25(a1) + slli t3, t3, 8 + or t1, t1, t3 + lbu t3, 26(a1) + slli t3, t3, 16 + or t1, t1, t3 + lbu t3, 27(a1) + slli t3, t3, 24 + or t1, t1, t3 + lbu t3, 28(a1) + slli t3, t3, 32 + or t1, t1, t3 + lbu t3, 29(a1) + slli t3, t3, 40 + or t1, t1, t3 + lbu t3, 30(a1) + slli t3, t3, 48 + or t1, t1, t3 + lbu t3, 31(a1) + slli t3, t3, 56 + or t1, t1, t3 +L_ualn_ld4_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + sd t0, 48(a0) + sd t1, 56(a0) + # leftover = 0; finished = 0 + sd zero, 64(a0) + sb zero, 88(a0) +#ifdef WOLFSSL_RISCV_VECTOR + # Powers of r are computed lazily by the blocks path (size-aware), so + # a small message never pays for the r^2/r^3/r^4 setup: level = 0. + sb zero, 288(a0) +#endif /* WOLFSSL_RISCV_VECTOR */ + ret + .size poly1305_set_key_riscv64,.-poly1305_set_key_riscv64 + .text + .globl poly1305_block_16_riscv64 + .type poly1305_block_16_riscv64,@function + .align 2 +poly1305_block_16_riscv64: + addi sp, sp, -80 + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + # Load r, h and compute s1=r1*20, s2=r2*20 + ld t0, 0(a0) + ld t1, 8(a0) + ld t2, 16(a0) + ld t5, 24(a0) + ld t6, 32(a0) + ld a2, 40(a0) + li a6, 20 + mul t3, t1, a6 + mul t4, t2, a6 + li a3, 17592186044415 + srli a4, a3, 2 + # hibit = finished ? 0 : (1 << 40) + lbu a6, 88(a0) + li a5, 1099511627776 + seqz a6, a6 + neg a6, a6 + and a5, a5, a6 + # Add message block into h (split 44,44,42) + ld s2, 0(a1) + ld s3, 8(a1) + and a6, s2, a3 + add t5, t5, a6 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri a6, s3, s2, 44 + .word 0x96c9d833 +#else + srli a6, s2, 44 + slli a7, s3, 20 + or a6, a6, a7 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and a6, a6, a3 + add t6, t6, a6 + srli a6, s3, 24 + and a6, a6, a4 + or a6, a6, a5 + add a2, a2, a6 + # d0 = h0*r0 + h1*s2 + h2*s1 + mul s4, t5, t0 + mulhu s5, t5, t0 + mul a6, t6, t4 + mulhu a7, t6, t4 + add s4, s4, a6 + sltu s1, s4, a6 + add s5, s5, a7 + add s5, s5, s1 + mul a6, a2, t3 + mulhu a7, a2, t3 + add s4, s4, a6 + sltu s1, s4, a6 + add s5, s5, a7 + add s5, s5, s1 + # d1 = h0*r1 + h1*r0 + h2*s2 + mul s6, t5, t1 + mulhu s7, t5, t1 + mul a6, t6, t0 + mulhu a7, t6, t0 + add s6, s6, a6 + sltu s1, s6, a6 + add s7, s7, a7 + add s7, s7, s1 + mul a6, a2, t4 + mulhu a7, a2, t4 + add s6, s6, a6 + sltu s1, s6, a6 + add s7, s7, a7 + add s7, s7, s1 + # d2 = h0*r2 + h1*r1 + h2*r0 + mul s8, t5, t2 + mulhu s9, t5, t2 + mul a6, t6, t1 + mulhu a7, t6, t1 + add s8, s8, a6 + sltu s1, s8, a6 + add s9, s9, a7 + add s9, s9, s1 + mul a6, a2, t0 + mulhu a7, a2, t0 + add s8, s8, a6 + sltu s1, s8, a6 + add s9, s9, a7 + add s9, s9, s1 + # Reduce: carry chain across 44/44/42-bit limbs +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri s1, s5, s4, 44 + .word 0xa6cad4b3 +#else + srli s1, s4, 44 + slli a6, s5, 20 + or s1, s1, a6 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t5, s4, a3 + add s6, s6, s1 + sltu a6, s6, s1 + add s7, s7, a6 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri s1, s7, s6, 44 + .word 0xb6cbd4b3 +#else + srli s1, s6, 44 + slli a6, s7, 20 + or s1, s1, a6 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t6, s6, a3 + add s8, s8, s1 + sltu a6, s8, s1 + add s9, s9, a6 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri s1, s9, s8, 42 + .word 0xc6acd4b3 +#else + srli s1, s8, 42 + slli a6, s9, 22 + or s1, s1, a6 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and a2, s8, a4 + slli a6, s1, 2 + add s1, s1, a6 + add t5, t5, s1 + srli s1, t5, 44 + and t5, t5, a3 + add t6, t6, s1 + # Store h back + sd t5, 24(a0) + sd t6, 32(a0) + sd a2, 40(a0) + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + addi sp, sp, 80 + ret + .size poly1305_block_16_riscv64,.-poly1305_block_16_riscv64 + .text + .globl poly1305_blocks_riscv64 + .type poly1305_blocks_riscv64,@function + .align 2 +poly1305_blocks_riscv64: + addi sp, sp, -96 + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + # Nothing to do when less than a block + li t0, 16 + bltu a2, t0, L_poly1305_riscv64_blocks_done + # Load r, h and compute s1=r1*5*4, s2=r2*5*4 + ld s1, 0(a0) + ld s2, 8(a0) + ld s3, 16(a0) + ld s6, 24(a0) + ld s7, 32(a0) + ld s8, 40(a0) + li t0, 20 + mul s4, s2, t0 + mul s5, s3, t0 + li s9, 17592186044415 + srli s10, s9, 2 + # hibit = finished ? 0 : (1 << 40) + lbu t0, 88(a0) + li s11, 1099511627776 + seqz t0, t0 + neg t0, t0 + and s11, s11, t0 +#ifdef WOLFSSL_RISCV_VECTOR + .option arch, +v + # Lane-staging scratch (96 bytes); gated in the vector path so the + # base/scalar prologue is unchanged. + addi sp, sp, -96 + # Vectorized 8-block path: h <- (h+m0)r^8 + m1*r^7 + ... + m7*r + li t0, 128 + bltu a2, t0, L_poly1305_riscv64_blocks_v8skip + lbu t0, 288(a0) + li t1, 3 + bge t0, t1, L_poly1305_riscv64_have_r58 + li t1, 2 + bge t0, t1, L_poly1305_riscv64_r58_have_r4 + li t1, 1 + bge t0, t1, L_poly1305_riscv64_r58_have_r2 + ld t0, 0(a0) + sd t0, 168(a0) + ld t0, 8(a0) + sd t0, 176(a0) + ld t0, 16(a0) + sd t0, 184(a0) + li t2, 20 + ld t0, 8(a0) + mul a6, t0, t2 + ld t0, 16(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 0(a0) + ld t1, 0(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 144(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 0(a0) + ld t1, 8(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 152(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 0(a0) + ld t1, 16(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + ld t1, 8(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 144(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 144(a0) + ld a4, 152(a0) + add a4, a4, a5 + sd a4, 152(a0) + sd a6, 160(a0) +L_poly1305_riscv64_r58_have_r2: + li t2, 20 + ld t0, 8(a0) + mul a6, t0, t2 + ld t0, 16(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 144(a0) + ld t1, 0(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 120(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 144(a0) + ld t1, 8(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 128(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 144(a0) + ld t1, 16(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 8(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 120(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 120(a0) + ld a4, 128(a0) + add a4, a4, a5 + sd a4, 128(a0) + sd a6, 136(a0) + li t2, 20 + ld t0, 152(a0) + mul a6, t0, t2 + ld t0, 160(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 144(a0) + ld t1, 144(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 96(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 144(a0) + ld t1, 152(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 144(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 104(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 144(a0) + ld t1, 160(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 152(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + ld t1, 144(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 96(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 96(a0) + ld a4, 104(a0) + add a4, a4, a5 + sd a4, 104(a0) + sd a6, 112(a0) +L_poly1305_riscv64_r58_have_r4: + li t2, 20 + ld t0, 176(a0) + mul a6, t0, t2 + ld t0, 184(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 96(a0) + ld t1, 168(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 264(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 96(a0) + ld t1, 176(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 168(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 272(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 96(a0) + ld t1, 184(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 176(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + ld t1, 168(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 264(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 264(a0) + ld a4, 272(a0) + add a4, a4, a5 + sd a4, 272(a0) + sd a6, 280(a0) + li t2, 20 + ld t0, 152(a0) + mul a6, t0, t2 + ld t0, 160(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 96(a0) + ld t1, 144(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 240(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 96(a0) + ld t1, 152(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 144(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 248(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 96(a0) + ld t1, 160(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 152(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + ld t1, 144(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 240(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 240(a0) + ld a4, 248(a0) + add a4, a4, a5 + sd a4, 248(a0) + sd a6, 256(a0) + li t2, 20 + ld t0, 128(a0) + mul a6, t0, t2 + ld t0, 136(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 96(a0) + ld t1, 120(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 216(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 96(a0) + ld t1, 128(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 120(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 224(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 96(a0) + ld t1, 136(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 128(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + ld t1, 120(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 216(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 216(a0) + ld a4, 224(a0) + add a4, a4, a5 + sd a4, 224(a0) + sd a6, 232(a0) + li t2, 20 + ld t0, 104(a0) + mul a6, t0, t2 + ld t0, 112(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 96(a0) + ld t1, 96(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 192(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 96(a0) + ld t1, 104(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 96(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 200(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 96(a0) + ld t1, 112(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 104(a0) + ld t1, 104(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 112(a0) + ld t1, 96(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 192(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 192(a0) + ld a4, 200(a0) + add a4, a4, a5 + sd a4, 200(a0) + sd a6, 208(a0) + li t0, 3 + sb t0, 288(a0) +L_poly1305_riscv64_have_r58: +L_poly1305_riscv64_blocks_v8loop: + li a7, 20 + vsetivli zero, 4, e64, m2, ta, ma + li a6, 24 + addi t0, a0, 192 + vlse64.v v20, (t0), a6 + addi t0, a0, 200 + vlse64.v v22, (t0), a6 + addi t0, a0, 208 + vlse64.v v24, (t0), a6 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 0(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld5_w + ld a5, 0(a1) + j L_ualn_ld5_e +L_ualn_ld5_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld5_h + lwu a5, 0(a1) + lwu t0, 4(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld5_e +L_ualn_ld5_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld5_b + lhu a5, 0(a1) + lhu t0, 2(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 4(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 6(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld5_e +L_ualn_ld5_b: + lbu a5, 0(a1) + lbu t0, 1(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 2(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 3(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 4(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 5(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 6(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 7(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld5_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 8(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld6_w + ld a6, 8(a1) + j L_ualn_ld6_e +L_ualn_ld6_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld6_h + lwu a6, 8(a1) + lwu t0, 12(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld6_e +L_ualn_ld6_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld6_b + lhu a6, 8(a1) + lhu t0, 10(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 12(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 14(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld6_e +L_ualn_ld6_b: + lbu a6, 8(a1) + lbu t0, 9(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 10(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 11(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 12(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 13(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 14(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 15(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld6_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + add t3, s6, t3 + add t4, s7, t4 + add t5, s8, t5 + sd t3, 0(sp) + sd t4, 32(sp) + sd t5, 64(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 16(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld7_w + ld a5, 16(a1) + j L_ualn_ld7_e +L_ualn_ld7_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld7_h + lwu a5, 16(a1) + lwu t0, 20(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld7_e +L_ualn_ld7_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld7_b + lhu a5, 16(a1) + lhu t0, 18(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 20(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 22(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld7_e +L_ualn_ld7_b: + lbu a5, 16(a1) + lbu t0, 17(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 18(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 19(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 20(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 21(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 22(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 23(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld7_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 24(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld8_w + ld a6, 24(a1) + j L_ualn_ld8_e +L_ualn_ld8_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld8_h + lwu a6, 24(a1) + lwu t0, 28(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld8_e +L_ualn_ld8_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld8_b + lhu a6, 24(a1) + lhu t0, 26(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 28(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 30(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld8_e +L_ualn_ld8_b: + lbu a6, 24(a1) + lbu t0, 25(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 26(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 27(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 28(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 29(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 30(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 31(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld8_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + sd t3, 8(sp) + sd t4, 40(sp) + sd t5, 72(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 32(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld9_w + ld a5, 32(a1) + j L_ualn_ld9_e +L_ualn_ld9_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld9_h + lwu a5, 32(a1) + lwu t0, 36(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld9_e +L_ualn_ld9_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld9_b + lhu a5, 32(a1) + lhu t0, 34(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 36(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 38(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld9_e +L_ualn_ld9_b: + lbu a5, 32(a1) + lbu t0, 33(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 34(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 35(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 36(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 37(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 38(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 39(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld9_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 40(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld10_w + ld a6, 40(a1) + j L_ualn_ld10_e +L_ualn_ld10_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld10_h + lwu a6, 40(a1) + lwu t0, 44(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld10_e +L_ualn_ld10_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld10_b + lhu a6, 40(a1) + lhu t0, 42(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 44(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 46(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld10_e +L_ualn_ld10_b: + lbu a6, 40(a1) + lbu t0, 41(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 42(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 43(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 44(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 45(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 46(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 47(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld10_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + sd t3, 16(sp) + sd t4, 48(sp) + sd t5, 80(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 48(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld11_w + ld a5, 48(a1) + j L_ualn_ld11_e +L_ualn_ld11_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld11_h + lwu a5, 48(a1) + lwu t0, 52(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld11_e +L_ualn_ld11_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld11_b + lhu a5, 48(a1) + lhu t0, 50(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 52(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 54(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld11_e +L_ualn_ld11_b: + lbu a5, 48(a1) + lbu t0, 49(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 50(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 51(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 52(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 53(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 54(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 55(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld11_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 56(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld12_w + ld a6, 56(a1) + j L_ualn_ld12_e +L_ualn_ld12_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld12_h + lwu a6, 56(a1) + lwu t0, 60(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld12_e +L_ualn_ld12_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld12_b + lhu a6, 56(a1) + lhu t0, 58(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 60(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 62(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld12_e +L_ualn_ld12_b: + lbu a6, 56(a1) + lbu t0, 57(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 58(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 59(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 60(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 61(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 62(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 63(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld12_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + sd t3, 24(sp) + sd t4, 56(sp) + sd t5, 88(sp) + addi t0, sp, 0 + vle64.v v14, (t0) + addi t0, sp, 32 + vle64.v v16, (t0) + addi t0, sp, 64 + vle64.v v18, (t0) + vmul.vv v2, v14, v20 + vmulhu.vv v4, v14, v20 + vmul.vx v30, v24, a7 + vmul.vv v26, v16, v30 + vmulhu.vv v28, v16, v30 + vmadc.vv v0, v2, v26 + vadd.vv v2, v2, v26 + vadd.vv v4, v4, v28 + vadc.vim v4, v4, 0, v0 + vmul.vx v30, v22, a7 + vmul.vv v26, v18, v30 + vmulhu.vv v28, v18, v30 + vmadc.vv v0, v2, v26 + vadd.vv v2, v2, v26 + vadd.vv v4, v4, v28 + vadc.vim v4, v4, 0, v0 + vmul.vv v6, v14, v22 + vmulhu.vv v8, v14, v22 + vmul.vv v26, v16, v20 + vmulhu.vv v28, v16, v20 + vmadc.vv v0, v6, v26 + vadd.vv v6, v6, v26 + vadd.vv v8, v8, v28 + vadc.vim v8, v8, 0, v0 + vmul.vx v30, v24, a7 + vmul.vv v26, v18, v30 + vmulhu.vv v28, v18, v30 + vmadc.vv v0, v6, v26 + vadd.vv v6, v6, v26 + vadd.vv v8, v8, v28 + vadc.vim v8, v8, 0, v0 + vmul.vv v10, v14, v24 + vmulhu.vv v12, v14, v24 + vmul.vv v26, v16, v22 + vmulhu.vv v28, v16, v22 + vmadc.vv v0, v10, v26 + vadd.vv v10, v10, v26 + vadd.vv v12, v12, v28 + vadc.vim v12, v12, 0, v0 + vmul.vv v26, v18, v20 + vmulhu.vv v28, v18, v20 + vmadc.vv v0, v10, v26 + vadd.vv v10, v10, v26 + vadd.vv v12, v12, v28 + vadc.vim v12, v12, 0, v0 + vsetivli zero, 4, e64, m2, ta, ma + li a6, 24 + addi t0, a0, 96 + vlse64.v v20, (t0), a6 + addi t0, a0, 104 + vlse64.v v22, (t0), a6 + addi t0, a0, 112 + vlse64.v v24, (t0), a6 +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 64(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld13_w + ld a5, 64(a1) + j L_ualn_ld13_e +L_ualn_ld13_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld13_h + lwu a5, 64(a1) + lwu t0, 68(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld13_e +L_ualn_ld13_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld13_b + lhu a5, 64(a1) + lhu t0, 66(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 68(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 70(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld13_e +L_ualn_ld13_b: + lbu a5, 64(a1) + lbu t0, 65(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 66(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 67(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 68(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 69(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 70(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 71(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld13_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 72(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld14_w + ld a6, 72(a1) + j L_ualn_ld14_e +L_ualn_ld14_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld14_h + lwu a6, 72(a1) + lwu t0, 76(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld14_e +L_ualn_ld14_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld14_b + lhu a6, 72(a1) + lhu t0, 74(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 76(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 78(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld14_e +L_ualn_ld14_b: + lbu a6, 72(a1) + lbu t0, 73(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 74(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 75(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 76(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 77(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 78(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 79(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld14_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + sd t3, 0(sp) + sd t4, 32(sp) + sd t5, 64(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 80(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld15_w + ld a5, 80(a1) + j L_ualn_ld15_e +L_ualn_ld15_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld15_h + lwu a5, 80(a1) + lwu t0, 84(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld15_e +L_ualn_ld15_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld15_b + lhu a5, 80(a1) + lhu t0, 82(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 84(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 86(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld15_e +L_ualn_ld15_b: + lbu a5, 80(a1) + lbu t0, 81(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 82(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 83(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 84(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 85(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 86(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 87(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld15_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 88(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld16_w + ld a6, 88(a1) + j L_ualn_ld16_e +L_ualn_ld16_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld16_h + lwu a6, 88(a1) + lwu t0, 92(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld16_e +L_ualn_ld16_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld16_b + lhu a6, 88(a1) + lhu t0, 90(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 92(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 94(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld16_e +L_ualn_ld16_b: + lbu a6, 88(a1) + lbu t0, 89(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 90(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 91(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 92(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 93(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 94(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 95(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld16_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + sd t3, 8(sp) + sd t4, 40(sp) + sd t5, 72(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 96(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld17_w + ld a5, 96(a1) + j L_ualn_ld17_e +L_ualn_ld17_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld17_h + lwu a5, 96(a1) + lwu t0, 100(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld17_e +L_ualn_ld17_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld17_b + lhu a5, 96(a1) + lhu t0, 98(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 100(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 102(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld17_e +L_ualn_ld17_b: + lbu a5, 96(a1) + lbu t0, 97(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 98(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 99(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 100(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 101(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 102(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 103(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld17_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 104(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld18_w + ld a6, 104(a1) + j L_ualn_ld18_e +L_ualn_ld18_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld18_h + lwu a6, 104(a1) + lwu t0, 108(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld18_e +L_ualn_ld18_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld18_b + lhu a6, 104(a1) + lhu t0, 106(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 108(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 110(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld18_e +L_ualn_ld18_b: + lbu a6, 104(a1) + lbu t0, 105(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 106(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 107(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 108(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 109(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 110(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 111(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld18_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + sd t3, 16(sp) + sd t4, 48(sp) + sd t5, 80(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 112(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld19_w + ld a5, 112(a1) + j L_ualn_ld19_e +L_ualn_ld19_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld19_h + lwu a5, 112(a1) + lwu t0, 116(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld19_e +L_ualn_ld19_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld19_b + lhu a5, 112(a1) + lhu t0, 114(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 116(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 118(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld19_e +L_ualn_ld19_b: + lbu a5, 112(a1) + lbu t0, 113(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 114(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 115(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 116(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 117(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 118(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 119(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld19_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a6, 120(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld20_w + ld a6, 120(a1) + j L_ualn_ld20_e +L_ualn_ld20_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld20_h + lwu a6, 120(a1) + lwu t0, 124(a1) + slli t0, t0, 32 + or a6, a6, t0 + j L_ualn_ld20_e +L_ualn_ld20_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld20_b + lhu a6, 120(a1) + lhu t0, 122(a1) + slli t0, t0, 16 + or a6, a6, t0 + lhu t0, 124(a1) + slli t0, t0, 32 + or a6, a6, t0 + lhu t0, 126(a1) + slli t0, t0, 48 + or a6, a6, t0 + j L_ualn_ld20_e +L_ualn_ld20_b: + lbu a6, 120(a1) + lbu t0, 121(a1) + slli t0, t0, 8 + or a6, a6, t0 + lbu t0, 122(a1) + slli t0, t0, 16 + or a6, a6, t0 + lbu t0, 123(a1) + slli t0, t0, 24 + or a6, a6, t0 + lbu t0, 124(a1) + slli t0, t0, 32 + or a6, a6, t0 + lbu t0, 125(a1) + slli t0, t0, 40 + or a6, a6, t0 + lbu t0, 126(a1) + slli t0, t0, 48 + or a6, a6, t0 + lbu t0, 127(a1) + slli t0, t0, 56 + or a6, a6, t0 +L_ualn_ld20_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t3, a5, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a6, a5, 44 + .word 0x7ec85eb3 +#else + srli t4, a5, 44 + slli t0, a6, 20 + or t4, t4, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t4, t4, s9 + srli t5, a6, 24 + and t5, t5, s10 + or t5, t5, s11 + sd t3, 24(sp) + sd t4, 56(sp) + sd t5, 88(sp) + addi t0, sp, 0 + vle64.v v14, (t0) + addi t0, sp, 32 + vle64.v v16, (t0) + addi t0, sp, 64 + vle64.v v18, (t0) + vmul.vv v26, v14, v20 + vmulhu.vv v28, v14, v20 + vmadc.vv v0, v2, v26 + vadd.vv v2, v2, v26 + vadd.vv v4, v4, v28 + vadc.vim v4, v4, 0, v0 + vmul.vx v30, v24, a7 + vmul.vv v26, v16, v30 + vmulhu.vv v28, v16, v30 + vmadc.vv v0, v2, v26 + vadd.vv v2, v2, v26 + vadd.vv v4, v4, v28 + vadc.vim v4, v4, 0, v0 + vmul.vx v30, v22, a7 + vmul.vv v26, v18, v30 + vmulhu.vv v28, v18, v30 + vmadc.vv v0, v2, v26 + vadd.vv v2, v2, v26 + vadd.vv v4, v4, v28 + vadc.vim v4, v4, 0, v0 + vmul.vv v26, v14, v22 + vmulhu.vv v28, v14, v22 + vmadc.vv v0, v6, v26 + vadd.vv v6, v6, v26 + vadd.vv v8, v8, v28 + vadc.vim v8, v8, 0, v0 + vmul.vv v26, v16, v20 + vmulhu.vv v28, v16, v20 + vmadc.vv v0, v6, v26 + vadd.vv v6, v6, v26 + vadd.vv v8, v8, v28 + vadc.vim v8, v8, 0, v0 + vmul.vx v30, v24, a7 + vmul.vv v26, v18, v30 + vmulhu.vv v28, v18, v30 + vmadc.vv v0, v6, v26 + vadd.vv v6, v6, v26 + vadd.vv v8, v8, v28 + vadc.vim v8, v8, 0, v0 + vmul.vv v26, v14, v24 + vmulhu.vv v28, v14, v24 + vmadc.vv v0, v10, v26 + vadd.vv v10, v10, v26 + vadd.vv v12, v12, v28 + vadc.vim v12, v12, 0, v0 + vmul.vv v26, v16, v22 + vmulhu.vv v28, v16, v22 + vmadc.vv v0, v10, v26 + vadd.vv v10, v10, v26 + vadd.vv v12, v12, v28 + vadc.vim v12, v12, 0, v0 + vmul.vv v26, v18, v20 + vmulhu.vv v28, v18, v20 + vmadc.vv v0, v10, v26 + vadd.vv v10, v10, v26 + vadd.vv v12, v12, v28 + vadc.vim v12, v12, 0, v0 + vslidedown.vi v26, v2, 2 + vslidedown.vi v28, v4, 2 + vmadc.vv v0, v2, v26 + vadd.vv v2, v2, v26 + vadd.vv v4, v4, v28 + vadc.vim v4, v4, 0, v0 + vslidedown.vi v26, v2, 1 + vslidedown.vi v28, v4, 1 + vmadc.vv v0, v2, v26 + vadd.vv v2, v2, v26 + vadd.vv v4, v4, v28 + vadc.vim v4, v4, 0, v0 + vmv.x.s t3, v2 + vmv.x.s t4, v4 + vslidedown.vi v26, v6, 2 + vslidedown.vi v28, v8, 2 + vmadc.vv v0, v6, v26 + vadd.vv v6, v6, v26 + vadd.vv v8, v8, v28 + vadc.vim v8, v8, 0, v0 + vslidedown.vi v26, v6, 1 + vslidedown.vi v28, v8, 1 + vmadc.vv v0, v6, v26 + vadd.vv v6, v6, v26 + vadd.vv v8, v8, v28 + vadc.vim v8, v8, 0, v0 + vmv.x.s t5, v6 + vmv.x.s t6, v8 + vslidedown.vi v26, v10, 2 + vslidedown.vi v28, v12, 2 + vmadc.vv v0, v10, v26 + vadd.vv v10, v10, v26 + vadd.vv v12, v12, v28 + vadc.vim v12, v12, 0, v0 + vslidedown.vi v26, v10, 1 + vslidedown.vi v28, v12, 1 + vmadc.vv v0, v10, v26 + vadd.vv v10, v10, v26 + vadd.vv v12, v12, v28 + vadc.vim v12, v12, 0, v0 + vmv.x.s a3, v10 + vmv.x.s a4, v12 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t2, t4, t3, 44 + .word 0xe6ced3b3 +#else + srli t2, t3, 44 + slli t0, t4, 20 + or t2, t2, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s6, t3, s9 + add t5, t5, t2 + sltu t0, t5, t2 + add t6, t6, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t2, t6, t5, 44 + .word 0xf6cfd3b3 +#else + srli t2, t5, 44 + slli t0, t6, 20 + or t2, t2, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s7, t5, s9 + add a3, a3, t2 + sltu t0, a3, t2 + add a4, a4, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t2, a4, a3, 42 + .word 0x6ea753b3 +#else + srli t2, a3, 42 + slli t0, a4, 22 + or t2, t2, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s8, a3, s10 + slli t0, t2, 2 + add t2, t2, t0 + add s6, s6, t2 + srli t2, s6, 44 + and s6, s6, s9 + add s7, s7, t2 + addi a1, a1, 128 + addi a2, a2, -128 + li t0, 128 + bgeu a2, t0, L_poly1305_riscv64_blocks_v8loop +L_poly1305_riscv64_blocks_v8skip: + # Vectorized 4-block path: h <- (h+m0)r^4 + m1*r^3 + m2*r^2 + m3*r + li t0, 64 + bltu a2, t0, L_poly1305_riscv64_blocks_v2tail + lbu t0, 288(a0) + li t1, 2 + bge t0, t1, L_poly1305_riscv64_have_r34 + li t1, 1 + bge t0, t1, L_poly1305_riscv64_r34_have_r2 + ld t0, 0(a0) + sd t0, 168(a0) + ld t0, 8(a0) + sd t0, 176(a0) + ld t0, 16(a0) + sd t0, 184(a0) + li t2, 20 + ld t0, 8(a0) + mul a6, t0, t2 + ld t0, 16(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 0(a0) + ld t1, 0(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 144(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 0(a0) + ld t1, 8(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 152(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 0(a0) + ld t1, 16(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + ld t1, 8(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 144(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 144(a0) + ld a4, 152(a0) + add a4, a4, a5 + sd a4, 152(a0) + sd a6, 160(a0) +L_poly1305_riscv64_r34_have_r2: + li t2, 20 + ld t0, 8(a0) + mul a6, t0, t2 + ld t0, 16(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 144(a0) + ld t1, 0(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 120(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 144(a0) + ld t1, 8(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 128(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 144(a0) + ld t1, 16(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 8(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 120(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 120(a0) + ld a4, 128(a0) + add a4, a4, a5 + sd a4, 128(a0) + sd a6, 136(a0) + li t2, 20 + ld t0, 152(a0) + mul a6, t0, t2 + ld t0, 160(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 144(a0) + ld t1, 144(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 96(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 144(a0) + ld t1, 152(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 144(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 104(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 144(a0) + ld t1, 160(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 152(a0) + ld t1, 152(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 160(a0) + ld t1, 144(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 96(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 96(a0) + ld a4, 104(a0) + add a4, a4, a5 + sd a4, 104(a0) + sd a6, 112(a0) + li t0, 2 + sb t0, 288(a0) +L_poly1305_riscv64_have_r34: + vsetivli zero, 4, e64, m2, ta, ma + li a6, 24 + addi t0, a0, 96 + vlse64.v v2, (t0), a6 + addi t0, a0, 104 + vlse64.v v4, (t0), a6 + addi t0, a0, 112 + vlse64.v v6, (t0), a6 + li a5, 20 + vmul.vx v8, v4, a5 + vmul.vx v10, v6, a5 + vmv.v.i v12, 0 +L_poly1305_riscv64_blocks_v4loop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 0(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld21_w + ld a4, 0(a1) + j L_ualn_ld21_e +L_ualn_ld21_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld21_h + lwu a4, 0(a1) + lwu t0, 4(a1) + slli t0, t0, 32 + or a4, a4, t0 + j L_ualn_ld21_e +L_ualn_ld21_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld21_b + lhu a4, 0(a1) + lhu t0, 2(a1) + slli t0, t0, 16 + or a4, a4, t0 + lhu t0, 4(a1) + slli t0, t0, 32 + or a4, a4, t0 + lhu t0, 6(a1) + slli t0, t0, 48 + or a4, a4, t0 + j L_ualn_ld21_e +L_ualn_ld21_b: + lbu a4, 0(a1) + lbu t0, 1(a1) + slli t0, t0, 8 + or a4, a4, t0 + lbu t0, 2(a1) + slli t0, t0, 16 + or a4, a4, t0 + lbu t0, 3(a1) + slli t0, t0, 24 + or a4, a4, t0 + lbu t0, 4(a1) + slli t0, t0, 32 + or a4, a4, t0 + lbu t0, 5(a1) + slli t0, t0, 40 + or a4, a4, t0 + lbu t0, 6(a1) + slli t0, t0, 48 + or a4, a4, t0 + lbu t0, 7(a1) + slli t0, t0, 56 + or a4, a4, t0 +L_ualn_ld21_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld22_w + ld a5, 8(a1) + j L_ualn_ld22_e +L_ualn_ld22_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld22_h + lwu a5, 8(a1) + lwu t0, 12(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld22_e +L_ualn_ld22_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld22_b + lhu a5, 8(a1) + lhu t0, 10(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 12(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 14(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld22_e +L_ualn_ld22_b: + lbu a5, 8(a1) + lbu t0, 9(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 10(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 11(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 12(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 13(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 14(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 15(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld22_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t2, a4, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t3, a5, a4, 44 + .word 0x76c7de33 +#else + srli t3, a4, 44 + slli t0, a5, 20 + or t3, t3, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t3, t3, s9 + srli t4, a5, 24 + and t4, t4, s10 + or t4, t4, s11 + add t2, s6, t2 + add t3, s7, t3 + add t4, s8, t4 + sd t2, 0(sp) + sd t3, 32(sp) + sd t4, 64(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 16(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld23_w + ld a4, 16(a1) + j L_ualn_ld23_e +L_ualn_ld23_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld23_h + lwu a4, 16(a1) + lwu t0, 20(a1) + slli t0, t0, 32 + or a4, a4, t0 + j L_ualn_ld23_e +L_ualn_ld23_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld23_b + lhu a4, 16(a1) + lhu t0, 18(a1) + slli t0, t0, 16 + or a4, a4, t0 + lhu t0, 20(a1) + slli t0, t0, 32 + or a4, a4, t0 + lhu t0, 22(a1) + slli t0, t0, 48 + or a4, a4, t0 + j L_ualn_ld23_e +L_ualn_ld23_b: + lbu a4, 16(a1) + lbu t0, 17(a1) + slli t0, t0, 8 + or a4, a4, t0 + lbu t0, 18(a1) + slli t0, t0, 16 + or a4, a4, t0 + lbu t0, 19(a1) + slli t0, t0, 24 + or a4, a4, t0 + lbu t0, 20(a1) + slli t0, t0, 32 + or a4, a4, t0 + lbu t0, 21(a1) + slli t0, t0, 40 + or a4, a4, t0 + lbu t0, 22(a1) + slli t0, t0, 48 + or a4, a4, t0 + lbu t0, 23(a1) + slli t0, t0, 56 + or a4, a4, t0 +L_ualn_ld23_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 24(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld24_w + ld a5, 24(a1) + j L_ualn_ld24_e +L_ualn_ld24_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld24_h + lwu a5, 24(a1) + lwu t0, 28(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld24_e +L_ualn_ld24_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld24_b + lhu a5, 24(a1) + lhu t0, 26(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 28(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 30(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld24_e +L_ualn_ld24_b: + lbu a5, 24(a1) + lbu t0, 25(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 26(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 27(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 28(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 29(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 30(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 31(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld24_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t2, a4, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t3, a5, a4, 44 + .word 0x76c7de33 +#else + srli t3, a4, 44 + slli t0, a5, 20 + or t3, t3, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t3, t3, s9 + srli t4, a5, 24 + and t4, t4, s10 + or t4, t4, s11 + sd t2, 8(sp) + sd t3, 40(sp) + sd t4, 72(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 32(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld25_w + ld a4, 32(a1) + j L_ualn_ld25_e +L_ualn_ld25_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld25_h + lwu a4, 32(a1) + lwu t0, 36(a1) + slli t0, t0, 32 + or a4, a4, t0 + j L_ualn_ld25_e +L_ualn_ld25_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld25_b + lhu a4, 32(a1) + lhu t0, 34(a1) + slli t0, t0, 16 + or a4, a4, t0 + lhu t0, 36(a1) + slli t0, t0, 32 + or a4, a4, t0 + lhu t0, 38(a1) + slli t0, t0, 48 + or a4, a4, t0 + j L_ualn_ld25_e +L_ualn_ld25_b: + lbu a4, 32(a1) + lbu t0, 33(a1) + slli t0, t0, 8 + or a4, a4, t0 + lbu t0, 34(a1) + slli t0, t0, 16 + or a4, a4, t0 + lbu t0, 35(a1) + slli t0, t0, 24 + or a4, a4, t0 + lbu t0, 36(a1) + slli t0, t0, 32 + or a4, a4, t0 + lbu t0, 37(a1) + slli t0, t0, 40 + or a4, a4, t0 + lbu t0, 38(a1) + slli t0, t0, 48 + or a4, a4, t0 + lbu t0, 39(a1) + slli t0, t0, 56 + or a4, a4, t0 +L_ualn_ld25_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 40(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld26_w + ld a5, 40(a1) + j L_ualn_ld26_e +L_ualn_ld26_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld26_h + lwu a5, 40(a1) + lwu t0, 44(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld26_e +L_ualn_ld26_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld26_b + lhu a5, 40(a1) + lhu t0, 42(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 44(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 46(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld26_e +L_ualn_ld26_b: + lbu a5, 40(a1) + lbu t0, 41(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 42(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 43(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 44(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 45(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 46(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 47(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld26_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t2, a4, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t3, a5, a4, 44 + .word 0x76c7de33 +#else + srli t3, a4, 44 + slli t0, a5, 20 + or t3, t3, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t3, t3, s9 + srli t4, a5, 24 + and t4, t4, s10 + or t4, t4, s11 + sd t2, 16(sp) + sd t3, 48(sp) + sd t4, 80(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 48(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld27_w + ld a4, 48(a1) + j L_ualn_ld27_e +L_ualn_ld27_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld27_h + lwu a4, 48(a1) + lwu t0, 52(a1) + slli t0, t0, 32 + or a4, a4, t0 + j L_ualn_ld27_e +L_ualn_ld27_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld27_b + lhu a4, 48(a1) + lhu t0, 50(a1) + slli t0, t0, 16 + or a4, a4, t0 + lhu t0, 52(a1) + slli t0, t0, 32 + or a4, a4, t0 + lhu t0, 54(a1) + slli t0, t0, 48 + or a4, a4, t0 + j L_ualn_ld27_e +L_ualn_ld27_b: + lbu a4, 48(a1) + lbu t0, 49(a1) + slli t0, t0, 8 + or a4, a4, t0 + lbu t0, 50(a1) + slli t0, t0, 16 + or a4, a4, t0 + lbu t0, 51(a1) + slli t0, t0, 24 + or a4, a4, t0 + lbu t0, 52(a1) + slli t0, t0, 32 + or a4, a4, t0 + lbu t0, 53(a1) + slli t0, t0, 40 + or a4, a4, t0 + lbu t0, 54(a1) + slli t0, t0, 48 + or a4, a4, t0 + lbu t0, 55(a1) + slli t0, t0, 56 + or a4, a4, t0 +L_ualn_ld27_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 56(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld28_w + ld a5, 56(a1) + j L_ualn_ld28_e +L_ualn_ld28_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld28_h + lwu a5, 56(a1) + lwu t0, 60(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld28_e +L_ualn_ld28_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld28_b + lhu a5, 56(a1) + lhu t0, 58(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 60(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 62(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld28_e +L_ualn_ld28_b: + lbu a5, 56(a1) + lbu t0, 57(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 58(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 59(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 60(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 61(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 62(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 63(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld28_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t2, a4, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t3, a5, a4, 44 + .word 0x76c7de33 +#else + srli t3, a4, 44 + slli t0, a5, 20 + or t3, t3, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t3, t3, s9 + srli t4, a5, 24 + and t4, t4, s10 + or t4, t4, s11 + sd t2, 24(sp) + sd t3, 56(sp) + sd t4, 88(sp) + addi t0, sp, 0 + vle64.v v14, (t0) + addi t0, sp, 32 + vle64.v v16, (t0) + addi t0, sp, 64 + vle64.v v18, (t0) + vmul.vv v20, v14, v2 + vmulhu.vv v22, v14, v2 + vmul.vv v24, v16, v10 + vmulhu.vv v26, v16, v10 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vmul.vv v24, v18, v8 + vmulhu.vv v26, v18, v8 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 2 + vslidedown.vi v30, v22, 2 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 1 + vslidedown.vi v30, v22, 1 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vmv.x.s t2, v20 + vmv.x.s t3, v22 + vmul.vv v20, v14, v4 + vmulhu.vv v22, v14, v4 + vmul.vv v24, v16, v2 + vmulhu.vv v26, v16, v2 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vmul.vv v24, v18, v10 + vmulhu.vv v26, v18, v10 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 2 + vslidedown.vi v30, v22, 2 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 1 + vslidedown.vi v30, v22, 1 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vmv.x.s t4, v20 + vmv.x.s t5, v22 + vmul.vv v20, v14, v6 + vmulhu.vv v22, v14, v6 + vmul.vv v24, v16, v4 + vmulhu.vv v26, v16, v4 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vmul.vv v24, v18, v2 + vmulhu.vv v26, v18, v2 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 2 + vslidedown.vi v30, v22, 2 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 1 + vslidedown.vi v30, v22, 1 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vmv.x.s t6, v20 + vmv.x.s a3, v22 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t1, t3, t2, 44 + .word 0x3ece5333 +#else + srli t1, t2, 44 + slli t0, t3, 20 + or t1, t1, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s6, t2, s9 + add t4, t4, t1 + sltu t0, t4, t1 + add t5, t5, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t1, t5, t4, 44 + .word 0xeecf5333 +#else + srli t1, t4, 44 + slli t0, t5, 20 + or t1, t1, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s7, t4, s9 + add t6, t6, t1 + sltu t0, t6, t1 + add a3, a3, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t1, a3, t6, 42 + .word 0xfea6d333 +#else + srli t1, t6, 42 + slli t0, a3, 22 + or t1, t1, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s8, t6, s10 + slli t0, t1, 2 + add t1, t1, t0 + add s6, s6, t1 + srli t1, s6, 44 + and s6, s6, s9 + add s7, s7, t1 + addi a1, a1, 64 + addi a2, a2, -64 + li t0, 64 + bgeu a2, t0, L_poly1305_riscv64_blocks_v4loop +L_poly1305_riscv64_blocks_v2tail: + # Vectorized 2-block tail: h <- (h+A)*r^2 + B*r + li t0, 32 + bltu a2, t0, L_poly1305_riscv64_blocks_vskip + lbu t0, 288(a0) + li t1, 1 + bge t0, t1, L_poly1305_riscv64_have_r2 + ld t0, 0(a0) + sd t0, 168(a0) + ld t0, 8(a0) + sd t0, 176(a0) + ld t0, 16(a0) + sd t0, 184(a0) + li t2, 20 + ld t0, 8(a0) + mul a6, t0, t2 + ld t0, 16(a0) + mul a7, t0, t2 + li t5, 17592186044415 + # d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 + ld t0, 0(a0) + ld t1, 0(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + mul a4, t0, a6 + mulhu a5, t0, a6 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + and t2, t6, t5 + sd t2, 144(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 + ld t0, 0(a0) + ld t1, 8(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + mul a4, t0, a7 + mulhu a5, t0, a7 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + and t2, t6, t5 + sd t2, 152(a0) +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 44 + .word 0xfec6deb3 +#else + srli t4, t6, 44 + slli a4, a3, 20 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 + ld t0, 0(a0) + ld t1, 16(a0) + mul t6, t0, t1 + mulhu a3, t0, t1 + ld t0, 8(a0) + ld t1, 8(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + ld t0, 16(a0) + ld t1, 0(a0) + mul a4, t0, t1 + mulhu a5, t0, t1 + add t6, t6, a4 + sltu t3, t6, a4 + add a3, a3, a5 + add a3, a3, t3 + add t6, t6, t4 + sltu a4, t6, t4 + add a3, a3, a4 + srli t5, t5, 2 + and a6, t6, t5 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t4, a3, t6, 42 + .word 0xfea6deb3 +#else + srli t4, t6, 42 + slli a4, a3, 22 + or t4, t4, a4 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + # fold top carry: o0 += cc*5 ; propagate into o1 + slli a4, t4, 2 + add t4, t4, a4 + li t5, 17592186044415 + ld a4, 144(a0) + add a4, a4, t4 + srli a5, a4, 44 + and a4, a4, t5 + sd a4, 144(a0) + ld a4, 152(a0) + add a4, a4, a5 + sd a4, 152(a0) + sd a6, 160(a0) + li t0, 1 + sb t0, 288(a0) +L_poly1305_riscv64_have_r2: + vsetivli zero, 2, e64, m1, ta, ma + li a6, 24 + addi t0, a0, 144 + vlse64.v v2, (t0), a6 + addi t0, a0, 152 + vlse64.v v4, (t0), a6 + addi t0, a0, 160 + vlse64.v v6, (t0), a6 + li a5, 20 + vmul.vx v8, v4, a5 + vmul.vx v10, v6, a5 + vmv.v.i v12, 0 +L_poly1305_riscv64_blocks_vloop: +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 0(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld29_w + ld a4, 0(a1) + j L_ualn_ld29_e +L_ualn_ld29_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld29_h + lwu a4, 0(a1) + lwu t0, 4(a1) + slli t0, t0, 32 + or a4, a4, t0 + j L_ualn_ld29_e +L_ualn_ld29_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld29_b + lhu a4, 0(a1) + lhu t0, 2(a1) + slli t0, t0, 16 + or a4, a4, t0 + lhu t0, 4(a1) + slli t0, t0, 32 + or a4, a4, t0 + lhu t0, 6(a1) + slli t0, t0, 48 + or a4, a4, t0 + j L_ualn_ld29_e +L_ualn_ld29_b: + lbu a4, 0(a1) + lbu t0, 1(a1) + slli t0, t0, 8 + or a4, a4, t0 + lbu t0, 2(a1) + slli t0, t0, 16 + or a4, a4, t0 + lbu t0, 3(a1) + slli t0, t0, 24 + or a4, a4, t0 + lbu t0, 4(a1) + slli t0, t0, 32 + or a4, a4, t0 + lbu t0, 5(a1) + slli t0, t0, 40 + or a4, a4, t0 + lbu t0, 6(a1) + slli t0, t0, 48 + or a4, a4, t0 + lbu t0, 7(a1) + slli t0, t0, 56 + or a4, a4, t0 +L_ualn_ld29_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 8(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld30_w + ld a5, 8(a1) + j L_ualn_ld30_e +L_ualn_ld30_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld30_h + lwu a5, 8(a1) + lwu t0, 12(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld30_e +L_ualn_ld30_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld30_b + lhu a5, 8(a1) + lhu t0, 10(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 12(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 14(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld30_e +L_ualn_ld30_b: + lbu a5, 8(a1) + lbu t0, 9(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 10(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 11(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 12(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 13(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 14(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 15(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld30_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t2, a4, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t3, a5, a4, 44 + .word 0x76c7de33 +#else + srli t3, a4, 44 + slli t0, a5, 20 + or t3, t3, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t3, t3, s9 + srli t4, a5, 24 + and t4, t4, s10 + or t4, t4, s11 + add t2, s6, t2 + add t3, s7, t3 + add t4, s8, t4 + sd t2, 0(sp) + sd t3, 32(sp) + sd t4, 64(sp) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a4, 16(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld31_w + ld a4, 16(a1) + j L_ualn_ld31_e +L_ualn_ld31_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld31_h + lwu a4, 16(a1) + lwu t0, 20(a1) + slli t0, t0, 32 + or a4, a4, t0 + j L_ualn_ld31_e +L_ualn_ld31_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld31_b + lhu a4, 16(a1) + lhu t0, 18(a1) + slli t0, t0, 16 + or a4, a4, t0 + lhu t0, 20(a1) + slli t0, t0, 32 + or a4, a4, t0 + lhu t0, 22(a1) + slli t0, t0, 48 + or a4, a4, t0 + j L_ualn_ld31_e +L_ualn_ld31_b: + lbu a4, 16(a1) + lbu t0, 17(a1) + slli t0, t0, 8 + or a4, a4, t0 + lbu t0, 18(a1) + slli t0, t0, 16 + or a4, a4, t0 + lbu t0, 19(a1) + slli t0, t0, 24 + or a4, a4, t0 + lbu t0, 20(a1) + slli t0, t0, 32 + or a4, a4, t0 + lbu t0, 21(a1) + slli t0, t0, 40 + or a4, a4, t0 + lbu t0, 22(a1) + slli t0, t0, 48 + or a4, a4, t0 + lbu t0, 23(a1) + slli t0, t0, 56 + or a4, a4, t0 +L_ualn_ld31_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld a5, 24(a1) +#else + andi t0, a1, 7 + bnez t0, L_ualn_ld32_w + ld a5, 24(a1) + j L_ualn_ld32_e +L_ualn_ld32_w: + andi t0, t0, 3 + bnez t0, L_ualn_ld32_h + lwu a5, 24(a1) + lwu t0, 28(a1) + slli t0, t0, 32 + or a5, a5, t0 + j L_ualn_ld32_e +L_ualn_ld32_h: + andi t0, t0, 1 + bnez t0, L_ualn_ld32_b + lhu a5, 24(a1) + lhu t0, 26(a1) + slli t0, t0, 16 + or a5, a5, t0 + lhu t0, 28(a1) + slli t0, t0, 32 + or a5, a5, t0 + lhu t0, 30(a1) + slli t0, t0, 48 + or a5, a5, t0 + j L_ualn_ld32_e +L_ualn_ld32_b: + lbu a5, 24(a1) + lbu t0, 25(a1) + slli t0, t0, 8 + or a5, a5, t0 + lbu t0, 26(a1) + slli t0, t0, 16 + or a5, a5, t0 + lbu t0, 27(a1) + slli t0, t0, 24 + or a5, a5, t0 + lbu t0, 28(a1) + slli t0, t0, 32 + or a5, a5, t0 + lbu t0, 29(a1) + slli t0, t0, 40 + or a5, a5, t0 + lbu t0, 30(a1) + slli t0, t0, 48 + or a5, a5, t0 + lbu t0, 31(a1) + slli t0, t0, 56 + or a5, a5, t0 +L_ualn_ld32_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t2, a4, s9 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t3, a5, a4, 44 + .word 0x76c7de33 +#else + srli t3, a4, 44 + slli t0, a5, 20 + or t3, t3, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t3, t3, s9 + srli t4, a5, 24 + and t4, t4, s10 + or t4, t4, s11 + sd t2, 8(sp) + sd t3, 40(sp) + sd t4, 72(sp) + addi t0, sp, 0 + vle64.v v14, (t0) + addi t0, sp, 32 + vle64.v v16, (t0) + addi t0, sp, 64 + vle64.v v18, (t0) + vmul.vv v20, v14, v2 + vmulhu.vv v22, v14, v2 + vmul.vv v24, v16, v10 + vmulhu.vv v26, v16, v10 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vmul.vv v24, v18, v8 + vmulhu.vv v26, v18, v8 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 1 + vslidedown.vi v30, v22, 1 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vmv.x.s t2, v20 + vmv.x.s t3, v22 + vmul.vv v20, v14, v4 + vmulhu.vv v22, v14, v4 + vmul.vv v24, v16, v2 + vmulhu.vv v26, v16, v2 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vmul.vv v24, v18, v10 + vmulhu.vv v26, v18, v10 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 1 + vslidedown.vi v30, v22, 1 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vmv.x.s t4, v20 + vmv.x.s t5, v22 + vmul.vv v20, v14, v6 + vmulhu.vv v22, v14, v6 + vmul.vv v24, v16, v4 + vmulhu.vv v26, v16, v4 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vmul.vv v24, v18, v2 + vmulhu.vv v26, v18, v2 + vmadc.vv v0, v20, v24 + vadd.vv v20, v20, v24 + vadd.vv v22, v22, v26 + vadc.vvm v22, v22, v12, v0 + vslidedown.vi v28, v20, 1 + vslidedown.vi v30, v22, 1 + vmadc.vv v0, v20, v28 + vadd.vv v20, v20, v28 + vadd.vv v22, v22, v30 + vadc.vvm v22, v22, v12, v0 + vmv.x.s t6, v20 + vmv.x.s a3, v22 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t1, t3, t2, 44 + .word 0x3ece5333 +#else + srli t1, t2, 44 + slli t0, t3, 20 + or t1, t1, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s6, t2, s9 + add t4, t4, t1 + sltu t0, t4, t1 + add t5, t5, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t1, t5, t4, 44 + .word 0xeecf5333 +#else + srli t1, t4, 44 + slli t0, t5, 20 + or t1, t1, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s7, t4, s9 + add t6, t6, t1 + sltu t0, t6, t1 + add a3, a3, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t1, a3, t6, 42 + .word 0xfea6d333 +#else + srli t1, t6, 42 + slli t0, a3, 22 + or t1, t1, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s8, t6, s10 + slli t0, t1, 2 + add t1, t1, t0 + add s6, s6, t1 + srli t1, s6, 44 + and s6, s6, s9 + add s7, s7, t1 + addi a1, a1, 32 + addi a2, a2, -32 + li t0, 32 + bgeu a2, t0, L_poly1305_riscv64_blocks_vloop +L_poly1305_riscv64_blocks_vskip: + addi sp, sp, 96 + # Remaining < 32: one block via scalar loop, else store h and finish + li t0, 16 + bgeu a2, t0, L_poly1305_riscv64_blocks_loop + sd s6, 24(a0) + sd s7, 32(a0) + sd s8, 40(a0) + j L_poly1305_riscv64_blocks_done +#endif /* WOLFSSL_RISCV_VECTOR */ +L_poly1305_riscv64_blocks_loop: + # Add message block into h (split 44,44,42) +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t3, 0(a1) +#else + andi t1, a1, 7 + bnez t1, L_ualn_ld33_w + ld t3, 0(a1) + j L_ualn_ld33_e +L_ualn_ld33_w: + andi t1, t1, 3 + bnez t1, L_ualn_ld33_h + lwu t3, 0(a1) + lwu t1, 4(a1) + slli t1, t1, 32 + or t3, t3, t1 + j L_ualn_ld33_e +L_ualn_ld33_h: + andi t1, t1, 1 + bnez t1, L_ualn_ld33_b + lhu t3, 0(a1) + lhu t1, 2(a1) + slli t1, t1, 16 + or t3, t3, t1 + lhu t1, 4(a1) + slli t1, t1, 32 + or t3, t3, t1 + lhu t1, 6(a1) + slli t1, t1, 48 + or t3, t3, t1 + j L_ualn_ld33_e +L_ualn_ld33_b: + lbu t3, 0(a1) + lbu t1, 1(a1) + slli t1, t1, 8 + or t3, t3, t1 + lbu t1, 2(a1) + slli t1, t1, 16 + or t3, t3, t1 + lbu t1, 3(a1) + slli t1, t1, 24 + or t3, t3, t1 + lbu t1, 4(a1) + slli t1, t1, 32 + or t3, t3, t1 + lbu t1, 5(a1) + slli t1, t1, 40 + or t3, t3, t1 + lbu t1, 6(a1) + slli t1, t1, 48 + or t3, t3, t1 + lbu t1, 7(a1) + slli t1, t1, 56 + or t3, t3, t1 +L_ualn_ld33_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + ld t4, 8(a1) +#else + andi t1, a1, 7 + bnez t1, L_ualn_ld34_w + ld t4, 8(a1) + j L_ualn_ld34_e +L_ualn_ld34_w: + andi t1, t1, 3 + bnez t1, L_ualn_ld34_h + lwu t4, 8(a1) + lwu t1, 12(a1) + slli t1, t1, 32 + or t4, t4, t1 + j L_ualn_ld34_e +L_ualn_ld34_h: + andi t1, t1, 1 + bnez t1, L_ualn_ld34_b + lhu t4, 8(a1) + lhu t1, 10(a1) + slli t1, t1, 16 + or t4, t4, t1 + lhu t1, 12(a1) + slli t1, t1, 32 + or t4, t4, t1 + lhu t1, 14(a1) + slli t1, t1, 48 + or t4, t4, t1 + j L_ualn_ld34_e +L_ualn_ld34_b: + lbu t4, 8(a1) + lbu t1, 9(a1) + slli t1, t1, 8 + or t4, t4, t1 + lbu t1, 10(a1) + slli t1, t1, 16 + or t4, t4, t1 + lbu t1, 11(a1) + slli t1, t1, 24 + or t4, t4, t1 + lbu t1, 12(a1) + slli t1, t1, 32 + or t4, t4, t1 + lbu t1, 13(a1) + slli t1, t1, 40 + or t4, t4, t1 + lbu t1, 14(a1) + slli t1, t1, 48 + or t4, t4, t1 + lbu t1, 15(a1) + slli t1, t1, 56 + or t4, t4, t1 +L_ualn_ld34_e: +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + and t0, t3, s9 + add s6, s6, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t0, t4, t3, 44 + .word 0xe6ced2b3 +#else + srli t0, t3, 44 + slli t1, t4, 20 + or t0, t0, t1 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and t0, t0, s9 + add s7, s7, t0 + srli t0, t4, 24 + and t0, t0, s10 + or t0, t0, s11 + add s8, s8, t0 + # d0 = h0*r0 + h1*s2 + h2*s1 + mul t5, s6, s1 + mulhu t6, s6, s1 + mul t0, s7, s5 + mulhu t1, s7, s5 + add t5, t5, t0 + sltu t2, t5, t0 + add t6, t6, t1 + add t6, t6, t2 + mul t0, s8, s4 + mulhu t1, s8, s4 + add t5, t5, t0 + sltu t2, t5, t0 + add t6, t6, t1 + add t6, t6, t2 + # d1 = h0*r1 + h1*r0 + h2*s2 + mul a3, s6, s2 + mulhu a4, s6, s2 + mul t0, s7, s1 + mulhu t1, s7, s1 + add a3, a3, t0 + sltu t2, a3, t0 + add a4, a4, t1 + add a4, a4, t2 + mul t0, s8, s5 + mulhu t1, s8, s5 + add a3, a3, t0 + sltu t2, a3, t0 + add a4, a4, t1 + add a4, a4, t2 + # d2 = h0*r2 + h1*r1 + h2*r0 + mul a5, s6, s3 + mulhu a6, s6, s3 + mul t0, s7, s2 + mulhu t1, s7, s2 + add a5, a5, t0 + sltu t2, a5, t0 + add a6, a6, t1 + add a6, a6, t2 + mul t0, s8, s1 + mulhu t1, s8, s1 + add a5, a5, t0 + sltu t2, a5, t0 + add a6, a6, t1 + add a6, a6, t2 + # Reduce: carry chain across 44/44/42-bit limbs +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t2, t6, t5, 44 + .word 0xf6cfd3b3 +#else + srli t2, t5, 44 + slli t0, t6, 20 + or t2, t2, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s6, t5, s9 + add a3, a3, t2 + sltu t0, a3, t2 + add a4, a4, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t2, a4, a3, 44 + .word 0x6ec753b3 +#else + srli t2, a3, 44 + slli t0, a4, 20 + or t2, t2, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s7, a3, s9 + add a5, a5, t2 + sltu t0, a5, t2 + add a6, a6, t0 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri t2, a6, a5, 42 + .word 0x7ea853b3 +#else + srli t2, a5, 42 + slli t0, a6, 22 + or t2, t2, t0 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and s8, a5, s10 + slli t0, t2, 2 + add t2, t2, t0 + add s6, s6, t2 + srli t2, s6, 44 + and s6, s6, s9 + add s7, s7, t2 + addi a1, a1, 16 + addi a2, a2, -16 + li t0, 16 + bgeu a2, t0, L_poly1305_riscv64_blocks_loop + # Store h back + sd s6, 24(a0) + sd s7, 32(a0) + sd s8, 40(a0) +L_poly1305_riscv64_blocks_done: + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + ret + .size poly1305_blocks_riscv64,.-poly1305_blocks_riscv64 + .text + .globl poly1305_final_riscv64 + .type poly1305_final_riscv64,@function + .align 2 +poly1305_final_riscv64: + ld t0, 24(a0) + ld t1, 32(a0) + ld t2, 40(a0) + li t6, 17592186044415 + li a2, 4398046511103 + # Fully carry h + srli a3, t1, 44 + and t1, t1, t6 + add t2, t2, a3 + srli a3, t2, 42 + and t2, t2, a2 + slli a4, a3, 2 + add a3, a3, a4 + add t0, t0, a3 + srli a3, t0, 44 + and t0, t0, t6 + add t1, t1, a3 + srli a3, t1, 44 + and t1, t1, t6 + add t2, t2, a3 + srli a3, t2, 42 + and t2, t2, a2 + slli a4, a3, 2 + add a3, a3, a4 + add t0, t0, a3 + srli a3, t0, 44 + and t0, t0, t6 + add t1, t1, a3 + # g = h + -p + addi t3, t0, 5 + srli a3, t3, 44 + and t3, t3, t6 + add t4, t1, a3 + srli a3, t4, 44 + and t4, t4, t6 + li a4, 4398046511104 + add t5, t2, a3 + sub t5, t5, a4 + # Select h if h < p else g (constant time) + srli a3, t5, 63 + addi a3, a3, -1 + and t3, t3, a3 + and t4, t4, a3 + and t5, t5, a3 + not a6, a3 + and t0, t0, a6 + or t0, t0, t3 + and t1, t1, a6 + or t1, t1, t4 + and t2, t2, a6 + or t2, t2, t5 + # h += pad + ld a4, 48(a0) + ld a7, 56(a0) + and a5, a4, t6 + add t0, t0, a5 + srli a3, t0, 44 + and t0, t0, t6 +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + # fsri a5, a7, a4, 44 + .word 0x76c8d7b3 +#else + srli a5, a4, 44 + slli t3, a7, 20 + or a5, a5, t3 +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + and a5, a5, t6 + add t1, t1, a5 + add t1, t1, a3 + srli a3, t1, 44 + and t1, t1, t6 + srli a5, a7, 24 + and a5, a5, a2 + add t2, t2, a5 + add t2, t2, a3 + and t2, t2, a2 + # mac = (h mod 2^128) packed little-endian + slli a4, t1, 44 + or t0, t0, a4 + srli a5, t1, 20 + slli a7, t2, 24 + or t1, a5, a7 + sd t0, 0(a1) + sd t1, 8(a1) + # Zero out the state + sd zero, 24(a0) + sd zero, 32(a0) + sd zero, 40(a0) + sd zero, 0(a0) + sd zero, 8(a0) + sd zero, 16(a0) + sd zero, 48(a0) + sd zero, 56(a0) + ret + .size poly1305_final_riscv64,.-poly1305_final_riscv64 +#endif /* HAVE_POLY1305 */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm_c.c b/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm_c.c new file mode 100644 index 00000000000..c9190891a2e --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm_c.c @@ -0,0 +1,4535 @@ +/* riscv-64-poly1305-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./poly1305/poly1305.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-poly1305-asm.c + */ +#ifdef WOLFSSL_RISCV_ASM +#ifdef WOLFSSL_RISCV_ASM_INLINE +#include + +#ifdef HAVE_POLY1305 +void poly1305_set_key_riscv64(Poly1305* ctx, const byte* key) +{ + __asm__ __volatile__ ( + /* r &= 0xffffffc0ffffffc0ffffffc0fffffff (split into 44-bit limbs) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 0(%[key])\n\t" +#else + "andi t3, %[key], 7\n\t" + "bnez t3, L_ualn_ld1_w_%=\n\t" + "ld t0, 0(%[key])\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_w_%=:\n\t" + "andi t3, t3, 3\n\t" + "bnez t3, L_ualn_ld1_h_%=\n\t" + "lwu t0, 0(%[key])\n\t" + "lwu t3, 4(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_ld1_b_%=\n\t" + "lhu t0, 0(%[key])\n\t" + "lhu t3, 2(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lhu t3, 4(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "lhu t3, 6(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t0, t0, t3\n\t" + "j L_ualn_ld1_e_%=\n\t" + "\n" + "L_ualn_ld1_b_%=:\n\t" + "lbu t0, 0(%[key])\n\t" + "lbu t3, 1(%[key])\n\t" + "slli t3, t3, 8\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 2(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 3(%[key])\n\t" + "slli t3, t3, 24\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 4(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 5(%[key])\n\t" + "slli t3, t3, 40\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 6(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 7(%[key])\n\t" + "slli t3, t3, 56\n\t" + "or t0, t0, t3\n\t" + "\n" + "L_ualn_ld1_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 8(%[key])\n\t" +#else + "andi t3, %[key], 7\n\t" + "bnez t3, L_ualn_ld2_w_%=\n\t" + "ld t1, 8(%[key])\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_w_%=:\n\t" + "andi t3, t3, 3\n\t" + "bnez t3, L_ualn_ld2_h_%=\n\t" + "lwu t1, 8(%[key])\n\t" + "lwu t3, 12(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t1, t1, t3\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_ld2_b_%=\n\t" + "lhu t1, 8(%[key])\n\t" + "lhu t3, 10(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t1, t1, t3\n\t" + "lhu t3, 12(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t1, t1, t3\n\t" + "lhu t3, 14(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t1, t1, t3\n\t" + "j L_ualn_ld2_e_%=\n\t" + "\n" + "L_ualn_ld2_b_%=:\n\t" + "lbu t1, 8(%[key])\n\t" + "lbu t3, 9(%[key])\n\t" + "slli t3, t3, 8\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 10(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 11(%[key])\n\t" + "slli t3, t3, 24\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 12(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 13(%[key])\n\t" + "slli t3, t3, 40\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 14(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 15(%[key])\n\t" + "slli t3, t3, 56\n\t" + "or t1, t1, t3\n\t" + "\n" + "L_ualn_ld2_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "li t4, 17575274610687\n\t" + "and t2, t0, t4\n\t" + "sd t2, 0(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t2, t1, t0, 44 */ + ".word 0x2ec353b3\n\t" +#else + "srli t2, t0, 44\n\t" + "slli t3, t1, 20\n\t" + "or t2, t2, t3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "li t4, 17592181915647\n\t" + "and t2, t2, t4\n\t" + "sd t2, 8(%[ctx])\n\t" + "srli t2, t1, 24\n\t" + "li t4, 68719475727\n\t" + "and t2, t2, t4\n\t" + "sd t2, 16(%[ctx])\n\t" + /* h = 0 */ + "sd zero, 24(%[ctx])\n\t" + "sd zero, 32(%[ctx])\n\t" + "sd zero, 40(%[ctx])\n\t" + /* save pad = key[16..31] */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t0, 16(%[key])\n\t" +#else + "andi t3, %[key], 7\n\t" + "bnez t3, L_ualn_ld3_w_%=\n\t" + "ld t0, 16(%[key])\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_w_%=:\n\t" + "andi t3, t3, 3\n\t" + "bnez t3, L_ualn_ld3_h_%=\n\t" + "lwu t0, 16(%[key])\n\t" + "lwu t3, 20(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_ld3_b_%=\n\t" + "lhu t0, 16(%[key])\n\t" + "lhu t3, 18(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lhu t3, 20(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "lhu t3, 22(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t0, t0, t3\n\t" + "j L_ualn_ld3_e_%=\n\t" + "\n" + "L_ualn_ld3_b_%=:\n\t" + "lbu t0, 16(%[key])\n\t" + "lbu t3, 17(%[key])\n\t" + "slli t3, t3, 8\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 18(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 19(%[key])\n\t" + "slli t3, t3, 24\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 20(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 21(%[key])\n\t" + "slli t3, t3, 40\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 22(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t0, t0, t3\n\t" + "lbu t3, 23(%[key])\n\t" + "slli t3, t3, 56\n\t" + "or t0, t0, t3\n\t" + "\n" + "L_ualn_ld3_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t1, 24(%[key])\n\t" +#else + "andi t3, %[key], 7\n\t" + "bnez t3, L_ualn_ld4_w_%=\n\t" + "ld t1, 24(%[key])\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_w_%=:\n\t" + "andi t3, t3, 3\n\t" + "bnez t3, L_ualn_ld4_h_%=\n\t" + "lwu t1, 24(%[key])\n\t" + "lwu t3, 28(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t1, t1, t3\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_h_%=:\n\t" + "andi t3, t3, 1\n\t" + "bnez t3, L_ualn_ld4_b_%=\n\t" + "lhu t1, 24(%[key])\n\t" + "lhu t3, 26(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t1, t1, t3\n\t" + "lhu t3, 28(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t1, t1, t3\n\t" + "lhu t3, 30(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t1, t1, t3\n\t" + "j L_ualn_ld4_e_%=\n\t" + "\n" + "L_ualn_ld4_b_%=:\n\t" + "lbu t1, 24(%[key])\n\t" + "lbu t3, 25(%[key])\n\t" + "slli t3, t3, 8\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 26(%[key])\n\t" + "slli t3, t3, 16\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 27(%[key])\n\t" + "slli t3, t3, 24\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 28(%[key])\n\t" + "slli t3, t3, 32\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 29(%[key])\n\t" + "slli t3, t3, 40\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 30(%[key])\n\t" + "slli t3, t3, 48\n\t" + "or t1, t1, t3\n\t" + "lbu t3, 31(%[key])\n\t" + "slli t3, t3, 56\n\t" + "or t1, t1, t3\n\t" + "\n" + "L_ualn_ld4_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "sd t0, 48(%[ctx])\n\t" + "sd t1, 56(%[ctx])\n\t" + /* leftover = 0; finished = 0 */ + "sd zero, 64(%[ctx])\n\t" + "sb zero, 88(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_VECTOR + /* Powers of r are computed lazily by the blocks path (size-aware), so */ + /* a small message never pays for the r^2/r^3/r^4 setup: level = 0. */ + "sb zero, 288(%[ctx])\n\t" +#endif /* WOLFSSL_RISCV_VECTOR */ + : [ctx] "+r" (ctx), [key] "+r" (key) + : + : "memory", "t0", "t1", "t2", "t3", "t4" +#ifdef WOLFSSL_RISCV_VECTOR + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR */ + ); +} + +void poly1305_block_16_riscv64(Poly1305* ctx, const unsigned char* m) +{ + __asm__ __volatile__ ( + /* Load r, h and compute s1=r1*20, s2=r2*20 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "ld t2, 16(%[ctx])\n\t" + "ld t5, 24(%[ctx])\n\t" + "ld t6, 32(%[ctx])\n\t" + "ld a2, 40(%[ctx])\n\t" + "li a6, 20\n\t" + "mul t3, t1, a6\n\t" + "mul t4, t2, a6\n\t" + "li a3, 17592186044415\n\t" + "srli a4, a3, 2\n\t" + /* hibit = finished ? 0 : (1 << 40) */ + "lbu a6, 88(%[ctx])\n\t" + "li a5, 1099511627776\n\t" + "seqz a6, a6\n\t" + "neg a6, a6\n\t" + "and a5, a5, a6\n\t" + /* Add message block into h (split 44,44,42) */ + "ld s2, 0(%[m])\n\t" + "ld s3, 8(%[m])\n\t" + "and a6, s2, a3\n\t" + "add t5, t5, a6\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri a6, s3, s2, 44 */ + ".word 0x96c9d833\n\t" +#else + "srli a6, s2, 44\n\t" + "slli a7, s3, 20\n\t" + "or a6, a6, a7\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and a6, a6, a3\n\t" + "add t6, t6, a6\n\t" + "srli a6, s3, 24\n\t" + "and a6, a6, a4\n\t" + "or a6, a6, a5\n\t" + "add a2, a2, a6\n\t" + /* d0 = h0*r0 + h1*s2 + h2*s1 */ + "mul s4, t5, t0\n\t" + "mulhu s5, t5, t0\n\t" + "mul a6, t6, t4\n\t" + "mulhu a7, t6, t4\n\t" + "add s4, s4, a6\n\t" + "sltu s1, s4, a6\n\t" + "add s5, s5, a7\n\t" + "add s5, s5, s1\n\t" + "mul a6, a2, t3\n\t" + "mulhu a7, a2, t3\n\t" + "add s4, s4, a6\n\t" + "sltu s1, s4, a6\n\t" + "add s5, s5, a7\n\t" + "add s5, s5, s1\n\t" + /* d1 = h0*r1 + h1*r0 + h2*s2 */ + "mul s6, t5, t1\n\t" + "mulhu s7, t5, t1\n\t" + "mul a6, t6, t0\n\t" + "mulhu a7, t6, t0\n\t" + "add s6, s6, a6\n\t" + "sltu s1, s6, a6\n\t" + "add s7, s7, a7\n\t" + "add s7, s7, s1\n\t" + "mul a6, a2, t4\n\t" + "mulhu a7, a2, t4\n\t" + "add s6, s6, a6\n\t" + "sltu s1, s6, a6\n\t" + "add s7, s7, a7\n\t" + "add s7, s7, s1\n\t" + /* d2 = h0*r2 + h1*r1 + h2*r0 */ + "mul s8, t5, t2\n\t" + "mulhu s9, t5, t2\n\t" + "mul a6, t6, t1\n\t" + "mulhu a7, t6, t1\n\t" + "add s8, s8, a6\n\t" + "sltu s1, s8, a6\n\t" + "add s9, s9, a7\n\t" + "add s9, s9, s1\n\t" + "mul a6, a2, t0\n\t" + "mulhu a7, a2, t0\n\t" + "add s8, s8, a6\n\t" + "sltu s1, s8, a6\n\t" + "add s9, s9, a7\n\t" + "add s9, s9, s1\n\t" + /* Reduce: carry chain across 44/44/42-bit limbs */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri s1, s5, s4, 44 */ + ".word 0xa6cad4b3\n\t" +#else + "srli s1, s4, 44\n\t" + "slli a6, s5, 20\n\t" + "or s1, s1, a6\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t5, s4, a3\n\t" + "add s6, s6, s1\n\t" + "sltu a6, s6, s1\n\t" + "add s7, s7, a6\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri s1, s7, s6, 44 */ + ".word 0xb6cbd4b3\n\t" +#else + "srli s1, s6, 44\n\t" + "slli a6, s7, 20\n\t" + "or s1, s1, a6\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t6, s6, a3\n\t" + "add s8, s8, s1\n\t" + "sltu a6, s8, s1\n\t" + "add s9, s9, a6\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri s1, s9, s8, 42 */ + ".word 0xc6acd4b3\n\t" +#else + "srli s1, s8, 42\n\t" + "slli a6, s9, 22\n\t" + "or s1, s1, a6\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and a2, s8, a4\n\t" + "slli a6, s1, 2\n\t" + "add s1, s1, a6\n\t" + "add t5, t5, s1\n\t" + "srli s1, t5, 44\n\t" + "and t5, t5, a3\n\t" + "add t6, t6, s1\n\t" + /* Store h back */ + "sd t5, 24(%[ctx])\n\t" + "sd t6, 32(%[ctx])\n\t" + "sd a2, 40(%[ctx])\n\t" + : [ctx] "+r" (ctx), [m] "+r" (m) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a2", "a3", "a4", + "a5", "a6", "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", + "s9" +#ifdef WOLFSSL_RISCV_VECTOR + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR */ + ); +} + +void poly1305_blocks_riscv64(Poly1305* ctx, const unsigned char* m, + size_t bytes) +{ + __asm__ __volatile__ ( + /* Nothing to do when less than a block */ + "li t0, 16\n\t" + "bltu %[bytes], t0, L_poly1305_riscv64_blocks_done_%=\n\t" + /* Load r, h and compute s1=r1*5*4, s2=r2*5*4 */ + "ld s1, 0(%[ctx])\n\t" + "ld s2, 8(%[ctx])\n\t" + "ld s3, 16(%[ctx])\n\t" + "ld s6, 24(%[ctx])\n\t" + "ld s7, 32(%[ctx])\n\t" + "ld s8, 40(%[ctx])\n\t" + "li t0, 20\n\t" + "mul s4, s2, t0\n\t" + "mul s5, s3, t0\n\t" + "li s9, 17592186044415\n\t" + "srli s10, s9, 2\n\t" + /* hibit = finished ? 0 : (1 << 40) */ + "lbu t0, 88(%[ctx])\n\t" + "li s11, 1099511627776\n\t" + "seqz t0, t0\n\t" + "neg t0, t0\n\t" + "and s11, s11, t0\n\t" +#ifdef WOLFSSL_RISCV_VECTOR + " .option arch, +v\n\t" + /* Lane-staging scratch (96 bytes); gated in the vector path so the */ + /* base/scalar prologue is unchanged. */ + "addi sp, sp, -96\n\t" + /* Vectorized 8-block path: h <- (h+m0)r^8 + m1*r^7 + ... + m7*r */ + "li t0, 128\n\t" + "bltu %[bytes], t0, L_poly1305_riscv64_blocks_v8skip_%=\n\t" + "lbu t0, 288(%[ctx])\n\t" + "li t1, 3\n\t" + "bge t0, t1, L_poly1305_riscv64_have_r58_%=\n\t" + "li t1, 2\n\t" + "bge t0, t1, L_poly1305_riscv64_r58_have_r4_%=\n\t" + "li t1, 1\n\t" + "bge t0, t1, L_poly1305_riscv64_r58_have_r2_%=\n\t" + "ld t0, 0(%[ctx])\n\t" + "sd t0, 168(%[ctx])\n\t" + "ld t0, 8(%[ctx])\n\t" + "sd t0, 176(%[ctx])\n\t" + "ld t0, 16(%[ctx])\n\t" + "sd t0, 184(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 144(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 152(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 16(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 144(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 144(%[ctx])\n\t" + "ld a4, 152(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 152(%[ctx])\n\t" + "sd a6, 160(%[ctx])\n\t" + "\n" + "L_poly1305_riscv64_r58_have_r2_%=:\n\t" + "li t2, 20\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 120(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 128(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 16(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 120(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 120(%[ctx])\n\t" + "ld a4, 128(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 128(%[ctx])\n\t" + "sd a6, 136(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 152(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 96(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 152(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 104(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 160(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 152(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 96(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 96(%[ctx])\n\t" + "ld a4, 104(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 104(%[ctx])\n\t" + "sd a6, 112(%[ctx])\n\t" + "\n" + "L_poly1305_riscv64_r58_have_r4_%=:\n\t" + "li t2, 20\n\t" + "ld t0, 176(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 184(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 168(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 264(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 176(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 168(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 272(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 184(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 176(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "ld t1, 168(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 264(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 264(%[ctx])\n\t" + "ld a4, 272(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 272(%[ctx])\n\t" + "sd a6, 280(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 152(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 240(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 152(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 248(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 160(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 152(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 240(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 240(%[ctx])\n\t" + "ld a4, 248(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 248(%[ctx])\n\t" + "sd a6, 256(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 128(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 136(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 120(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 216(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 128(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 120(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 224(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 136(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 128(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "ld t1, 120(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 216(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 216(%[ctx])\n\t" + "ld a4, 224(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 224(%[ctx])\n\t" + "sd a6, 232(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 104(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 96(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 192(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 104(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 96(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 200(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 96(%[ctx])\n\t" + "ld t1, 112(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 104(%[ctx])\n\t" + "ld t1, 104(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 112(%[ctx])\n\t" + "ld t1, 96(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 192(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 192(%[ctx])\n\t" + "ld a4, 200(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 200(%[ctx])\n\t" + "sd a6, 208(%[ctx])\n\t" + "li t0, 3\n\t" + "sb t0, 288(%[ctx])\n\t" + "\n" + "L_poly1305_riscv64_have_r58_%=:\n\t" + "\n" + "L_poly1305_riscv64_blocks_v8loop_%=:\n\t" + "li a7, 20\n\t" + "vsetivli zero, 4, e64, m2, ta, ma\n\t" + "li a6, 24\n\t" + "addi t0, %[ctx], 192\n\t" + " vlse64.v v20, (t0), a6\n\t" + "addi t0, %[ctx], 200\n\t" + " vlse64.v v22, (t0), a6\n\t" + "addi t0, %[ctx], 208\n\t" + " vlse64.v v24, (t0), a6\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 0(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld5_w_%=\n\t" + "ld a5, 0(%[m])\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld5_h_%=\n\t" + "lwu a5, 0(%[m])\n\t" + "lwu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld5_b_%=\n\t" + "lhu a5, 0(%[m])\n\t" + "lhu t0, 2(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 6(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld5_e_%=\n\t" + "\n" + "L_ualn_ld5_b_%=:\n\t" + "lbu a5, 0(%[m])\n\t" + "lbu t0, 1(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 2(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 3(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 5(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 6(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 7(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld5_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 8(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld6_w_%=\n\t" + "ld a6, 8(%[m])\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld6_h_%=\n\t" + "lwu a6, 8(%[m])\n\t" + "lwu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld6_b_%=\n\t" + "lhu a6, 8(%[m])\n\t" + "lhu t0, 10(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 14(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld6_e_%=\n\t" + "\n" + "L_ualn_ld6_b_%=:\n\t" + "lbu a6, 8(%[m])\n\t" + "lbu t0, 9(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 10(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 11(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 13(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 14(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 15(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld6_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "add t3, s6, t3\n\t" + "add t4, s7, t4\n\t" + "add t5, s8, t5\n\t" + "sd t3, 0(sp)\n\t" + "sd t4, 32(sp)\n\t" + "sd t5, 64(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 16(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld7_w_%=\n\t" + "ld a5, 16(%[m])\n\t" + "j L_ualn_ld7_e_%=\n\t" + "\n" + "L_ualn_ld7_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld7_h_%=\n\t" + "lwu a5, 16(%[m])\n\t" + "lwu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld7_e_%=\n\t" + "\n" + "L_ualn_ld7_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld7_b_%=\n\t" + "lhu a5, 16(%[m])\n\t" + "lhu t0, 18(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 22(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld7_e_%=\n\t" + "\n" + "L_ualn_ld7_b_%=:\n\t" + "lbu a5, 16(%[m])\n\t" + "lbu t0, 17(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 18(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 19(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 21(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 22(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 23(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld7_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 24(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld8_w_%=\n\t" + "ld a6, 24(%[m])\n\t" + "j L_ualn_ld8_e_%=\n\t" + "\n" + "L_ualn_ld8_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld8_h_%=\n\t" + "lwu a6, 24(%[m])\n\t" + "lwu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld8_e_%=\n\t" + "\n" + "L_ualn_ld8_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld8_b_%=\n\t" + "lhu a6, 24(%[m])\n\t" + "lhu t0, 26(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 30(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld8_e_%=\n\t" + "\n" + "L_ualn_ld8_b_%=:\n\t" + "lbu a6, 24(%[m])\n\t" + "lbu t0, 25(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 26(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 27(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 29(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 30(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 31(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld8_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "sd t3, 8(sp)\n\t" + "sd t4, 40(sp)\n\t" + "sd t5, 72(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 32(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld9_w_%=\n\t" + "ld a5, 32(%[m])\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld9_h_%=\n\t" + "lwu a5, 32(%[m])\n\t" + "lwu t0, 36(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld9_b_%=\n\t" + "lhu a5, 32(%[m])\n\t" + "lhu t0, 34(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 36(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 38(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld9_e_%=\n\t" + "\n" + "L_ualn_ld9_b_%=:\n\t" + "lbu a5, 32(%[m])\n\t" + "lbu t0, 33(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 34(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 35(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 36(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 37(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 38(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 39(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld9_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 40(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld10_w_%=\n\t" + "ld a6, 40(%[m])\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld10_h_%=\n\t" + "lwu a6, 40(%[m])\n\t" + "lwu t0, 44(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld10_b_%=\n\t" + "lhu a6, 40(%[m])\n\t" + "lhu t0, 42(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 44(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 46(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld10_e_%=\n\t" + "\n" + "L_ualn_ld10_b_%=:\n\t" + "lbu a6, 40(%[m])\n\t" + "lbu t0, 41(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 42(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 43(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 44(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 45(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 46(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 47(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld10_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "sd t3, 16(sp)\n\t" + "sd t4, 48(sp)\n\t" + "sd t5, 80(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 48(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld11_w_%=\n\t" + "ld a5, 48(%[m])\n\t" + "j L_ualn_ld11_e_%=\n\t" + "\n" + "L_ualn_ld11_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld11_h_%=\n\t" + "lwu a5, 48(%[m])\n\t" + "lwu t0, 52(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld11_e_%=\n\t" + "\n" + "L_ualn_ld11_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld11_b_%=\n\t" + "lhu a5, 48(%[m])\n\t" + "lhu t0, 50(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 52(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 54(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld11_e_%=\n\t" + "\n" + "L_ualn_ld11_b_%=:\n\t" + "lbu a5, 48(%[m])\n\t" + "lbu t0, 49(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 50(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 51(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 52(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 53(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 54(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 55(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld11_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 56(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld12_w_%=\n\t" + "ld a6, 56(%[m])\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld12_h_%=\n\t" + "lwu a6, 56(%[m])\n\t" + "lwu t0, 60(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld12_b_%=\n\t" + "lhu a6, 56(%[m])\n\t" + "lhu t0, 58(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 60(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 62(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld12_e_%=\n\t" + "\n" + "L_ualn_ld12_b_%=:\n\t" + "lbu a6, 56(%[m])\n\t" + "lbu t0, 57(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 58(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 59(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 60(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 61(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 62(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 63(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld12_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "sd t3, 24(sp)\n\t" + "sd t4, 56(sp)\n\t" + "sd t5, 88(sp)\n\t" + "addi t0, sp, 0\n\t" + " vle64.v v14, (t0)\n\t" + "addi t0, sp, 32\n\t" + " vle64.v v16, (t0)\n\t" + "addi t0, sp, 64\n\t" + " vle64.v v18, (t0)\n\t" + "vmul.vv v2, v14, v20\n\t" + "vmulhu.vv v4, v14, v20\n\t" + "vmul.vx v30, v24, a7\n\t" + "vmul.vv v26, v16, v30\n\t" + "vmulhu.vv v28, v16, v30\n\t" + "vmadc.vv v0, v2, v26\n\t" + "vadd.vv v2, v2, v26\n\t" + "vadd.vv v4, v4, v28\n\t" + " vadc.vim v4, v4, 0, v0\n\t" + "vmul.vx v30, v22, a7\n\t" + "vmul.vv v26, v18, v30\n\t" + "vmulhu.vv v28, v18, v30\n\t" + "vmadc.vv v0, v2, v26\n\t" + "vadd.vv v2, v2, v26\n\t" + "vadd.vv v4, v4, v28\n\t" + " vadc.vim v4, v4, 0, v0\n\t" + "vmul.vv v6, v14, v22\n\t" + "vmulhu.vv v8, v14, v22\n\t" + "vmul.vv v26, v16, v20\n\t" + "vmulhu.vv v28, v16, v20\n\t" + "vmadc.vv v0, v6, v26\n\t" + "vadd.vv v6, v6, v26\n\t" + "vadd.vv v8, v8, v28\n\t" + " vadc.vim v8, v8, 0, v0\n\t" + "vmul.vx v30, v24, a7\n\t" + "vmul.vv v26, v18, v30\n\t" + "vmulhu.vv v28, v18, v30\n\t" + "vmadc.vv v0, v6, v26\n\t" + "vadd.vv v6, v6, v26\n\t" + "vadd.vv v8, v8, v28\n\t" + " vadc.vim v8, v8, 0, v0\n\t" + "vmul.vv v10, v14, v24\n\t" + "vmulhu.vv v12, v14, v24\n\t" + "vmul.vv v26, v16, v22\n\t" + "vmulhu.vv v28, v16, v22\n\t" + "vmadc.vv v0, v10, v26\n\t" + "vadd.vv v10, v10, v26\n\t" + "vadd.vv v12, v12, v28\n\t" + " vadc.vim v12, v12, 0, v0\n\t" + "vmul.vv v26, v18, v20\n\t" + "vmulhu.vv v28, v18, v20\n\t" + "vmadc.vv v0, v10, v26\n\t" + "vadd.vv v10, v10, v26\n\t" + "vadd.vv v12, v12, v28\n\t" + " vadc.vim v12, v12, 0, v0\n\t" + "vsetivli zero, 4, e64, m2, ta, ma\n\t" + "li a6, 24\n\t" + "addi t0, %[ctx], 96\n\t" + " vlse64.v v20, (t0), a6\n\t" + "addi t0, %[ctx], 104\n\t" + " vlse64.v v22, (t0), a6\n\t" + "addi t0, %[ctx], 112\n\t" + " vlse64.v v24, (t0), a6\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 64(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld13_w_%=\n\t" + "ld a5, 64(%[m])\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld13_h_%=\n\t" + "lwu a5, 64(%[m])\n\t" + "lwu t0, 68(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld13_b_%=\n\t" + "lhu a5, 64(%[m])\n\t" + "lhu t0, 66(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 68(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 70(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld13_e_%=\n\t" + "\n" + "L_ualn_ld13_b_%=:\n\t" + "lbu a5, 64(%[m])\n\t" + "lbu t0, 65(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 66(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 67(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 68(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 69(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 70(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 71(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld13_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 72(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld14_w_%=\n\t" + "ld a6, 72(%[m])\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld14_h_%=\n\t" + "lwu a6, 72(%[m])\n\t" + "lwu t0, 76(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld14_b_%=\n\t" + "lhu a6, 72(%[m])\n\t" + "lhu t0, 74(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 76(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 78(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld14_e_%=\n\t" + "\n" + "L_ualn_ld14_b_%=:\n\t" + "lbu a6, 72(%[m])\n\t" + "lbu t0, 73(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 74(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 75(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 76(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 77(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 78(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 79(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld14_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "sd t3, 0(sp)\n\t" + "sd t4, 32(sp)\n\t" + "sd t5, 64(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 80(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld15_w_%=\n\t" + "ld a5, 80(%[m])\n\t" + "j L_ualn_ld15_e_%=\n\t" + "\n" + "L_ualn_ld15_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld15_h_%=\n\t" + "lwu a5, 80(%[m])\n\t" + "lwu t0, 84(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld15_e_%=\n\t" + "\n" + "L_ualn_ld15_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld15_b_%=\n\t" + "lhu a5, 80(%[m])\n\t" + "lhu t0, 82(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 84(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 86(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld15_e_%=\n\t" + "\n" + "L_ualn_ld15_b_%=:\n\t" + "lbu a5, 80(%[m])\n\t" + "lbu t0, 81(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 82(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 83(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 84(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 85(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 86(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 87(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld15_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 88(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld16_w_%=\n\t" + "ld a6, 88(%[m])\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld16_h_%=\n\t" + "lwu a6, 88(%[m])\n\t" + "lwu t0, 92(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld16_b_%=\n\t" + "lhu a6, 88(%[m])\n\t" + "lhu t0, 90(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 92(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 94(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld16_e_%=\n\t" + "\n" + "L_ualn_ld16_b_%=:\n\t" + "lbu a6, 88(%[m])\n\t" + "lbu t0, 89(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 90(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 91(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 92(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 93(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 94(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 95(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld16_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "sd t3, 8(sp)\n\t" + "sd t4, 40(sp)\n\t" + "sd t5, 72(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 96(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld17_w_%=\n\t" + "ld a5, 96(%[m])\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld17_h_%=\n\t" + "lwu a5, 96(%[m])\n\t" + "lwu t0, 100(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld17_b_%=\n\t" + "lhu a5, 96(%[m])\n\t" + "lhu t0, 98(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 100(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 102(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld17_e_%=\n\t" + "\n" + "L_ualn_ld17_b_%=:\n\t" + "lbu a5, 96(%[m])\n\t" + "lbu t0, 97(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 98(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 99(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 100(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 101(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 102(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 103(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld17_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 104(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld18_w_%=\n\t" + "ld a6, 104(%[m])\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld18_h_%=\n\t" + "lwu a6, 104(%[m])\n\t" + "lwu t0, 108(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld18_b_%=\n\t" + "lhu a6, 104(%[m])\n\t" + "lhu t0, 106(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 108(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 110(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld18_e_%=\n\t" + "\n" + "L_ualn_ld18_b_%=:\n\t" + "lbu a6, 104(%[m])\n\t" + "lbu t0, 105(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 106(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 107(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 108(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 109(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 110(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 111(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld18_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "sd t3, 16(sp)\n\t" + "sd t4, 48(sp)\n\t" + "sd t5, 80(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 112(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld19_w_%=\n\t" + "ld a5, 112(%[m])\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld19_h_%=\n\t" + "lwu a5, 112(%[m])\n\t" + "lwu t0, 116(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld19_b_%=\n\t" + "lhu a5, 112(%[m])\n\t" + "lhu t0, 114(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 116(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 118(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld19_e_%=\n\t" + "\n" + "L_ualn_ld19_b_%=:\n\t" + "lbu a5, 112(%[m])\n\t" + "lbu t0, 113(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 114(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 115(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 116(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 117(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 118(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 119(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld19_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a6, 120(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld20_w_%=\n\t" + "ld a6, 120(%[m])\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld20_h_%=\n\t" + "lwu a6, 120(%[m])\n\t" + "lwu t0, 124(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld20_b_%=\n\t" + "lhu a6, 120(%[m])\n\t" + "lhu t0, 122(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 124(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lhu t0, 126(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "j L_ualn_ld20_e_%=\n\t" + "\n" + "L_ualn_ld20_b_%=:\n\t" + "lbu a6, 120(%[m])\n\t" + "lbu t0, 121(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 122(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 123(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 124(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 125(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 126(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a6, a6, t0\n\t" + "lbu t0, 127(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a6, a6, t0\n\t" + "\n" + "L_ualn_ld20_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t3, a5, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a6, a5, 44 */ + ".word 0x7ec85eb3\n\t" +#else + "srli t4, a5, 44\n\t" + "slli t0, a6, 20\n\t" + "or t4, t4, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t4, t4, s9\n\t" + "srli t5, a6, 24\n\t" + "and t5, t5, s10\n\t" + "or t5, t5, s11\n\t" + "sd t3, 24(sp)\n\t" + "sd t4, 56(sp)\n\t" + "sd t5, 88(sp)\n\t" + "addi t0, sp, 0\n\t" + " vle64.v v14, (t0)\n\t" + "addi t0, sp, 32\n\t" + " vle64.v v16, (t0)\n\t" + "addi t0, sp, 64\n\t" + " vle64.v v18, (t0)\n\t" + "vmul.vv v26, v14, v20\n\t" + "vmulhu.vv v28, v14, v20\n\t" + "vmadc.vv v0, v2, v26\n\t" + "vadd.vv v2, v2, v26\n\t" + "vadd.vv v4, v4, v28\n\t" + " vadc.vim v4, v4, 0, v0\n\t" + "vmul.vx v30, v24, a7\n\t" + "vmul.vv v26, v16, v30\n\t" + "vmulhu.vv v28, v16, v30\n\t" + "vmadc.vv v0, v2, v26\n\t" + "vadd.vv v2, v2, v26\n\t" + "vadd.vv v4, v4, v28\n\t" + " vadc.vim v4, v4, 0, v0\n\t" + "vmul.vx v30, v22, a7\n\t" + "vmul.vv v26, v18, v30\n\t" + "vmulhu.vv v28, v18, v30\n\t" + "vmadc.vv v0, v2, v26\n\t" + "vadd.vv v2, v2, v26\n\t" + "vadd.vv v4, v4, v28\n\t" + " vadc.vim v4, v4, 0, v0\n\t" + "vmul.vv v26, v14, v22\n\t" + "vmulhu.vv v28, v14, v22\n\t" + "vmadc.vv v0, v6, v26\n\t" + "vadd.vv v6, v6, v26\n\t" + "vadd.vv v8, v8, v28\n\t" + " vadc.vim v8, v8, 0, v0\n\t" + "vmul.vv v26, v16, v20\n\t" + "vmulhu.vv v28, v16, v20\n\t" + "vmadc.vv v0, v6, v26\n\t" + "vadd.vv v6, v6, v26\n\t" + "vadd.vv v8, v8, v28\n\t" + " vadc.vim v8, v8, 0, v0\n\t" + "vmul.vx v30, v24, a7\n\t" + "vmul.vv v26, v18, v30\n\t" + "vmulhu.vv v28, v18, v30\n\t" + "vmadc.vv v0, v6, v26\n\t" + "vadd.vv v6, v6, v26\n\t" + "vadd.vv v8, v8, v28\n\t" + " vadc.vim v8, v8, 0, v0\n\t" + "vmul.vv v26, v14, v24\n\t" + "vmulhu.vv v28, v14, v24\n\t" + "vmadc.vv v0, v10, v26\n\t" + "vadd.vv v10, v10, v26\n\t" + "vadd.vv v12, v12, v28\n\t" + " vadc.vim v12, v12, 0, v0\n\t" + "vmul.vv v26, v16, v22\n\t" + "vmulhu.vv v28, v16, v22\n\t" + "vmadc.vv v0, v10, v26\n\t" + "vadd.vv v10, v10, v26\n\t" + "vadd.vv v12, v12, v28\n\t" + " vadc.vim v12, v12, 0, v0\n\t" + "vmul.vv v26, v18, v20\n\t" + "vmulhu.vv v28, v18, v20\n\t" + "vmadc.vv v0, v10, v26\n\t" + "vadd.vv v10, v10, v26\n\t" + "vadd.vv v12, v12, v28\n\t" + " vadc.vim v12, v12, 0, v0\n\t" + "vslidedown.vi v26, v2, 2\n\t" + "vslidedown.vi v28, v4, 2\n\t" + "vmadc.vv v0, v2, v26\n\t" + "vadd.vv v2, v2, v26\n\t" + "vadd.vv v4, v4, v28\n\t" + " vadc.vim v4, v4, 0, v0\n\t" + "vslidedown.vi v26, v2, 1\n\t" + "vslidedown.vi v28, v4, 1\n\t" + "vmadc.vv v0, v2, v26\n\t" + "vadd.vv v2, v2, v26\n\t" + "vadd.vv v4, v4, v28\n\t" + " vadc.vim v4, v4, 0, v0\n\t" + "vmv.x.s t3, v2\n\t" + "vmv.x.s t4, v4\n\t" + "vslidedown.vi v26, v6, 2\n\t" + "vslidedown.vi v28, v8, 2\n\t" + "vmadc.vv v0, v6, v26\n\t" + "vadd.vv v6, v6, v26\n\t" + "vadd.vv v8, v8, v28\n\t" + " vadc.vim v8, v8, 0, v0\n\t" + "vslidedown.vi v26, v6, 1\n\t" + "vslidedown.vi v28, v8, 1\n\t" + "vmadc.vv v0, v6, v26\n\t" + "vadd.vv v6, v6, v26\n\t" + "vadd.vv v8, v8, v28\n\t" + " vadc.vim v8, v8, 0, v0\n\t" + "vmv.x.s t5, v6\n\t" + "vmv.x.s t6, v8\n\t" + "vslidedown.vi v26, v10, 2\n\t" + "vslidedown.vi v28, v12, 2\n\t" + "vmadc.vv v0, v10, v26\n\t" + "vadd.vv v10, v10, v26\n\t" + "vadd.vv v12, v12, v28\n\t" + " vadc.vim v12, v12, 0, v0\n\t" + "vslidedown.vi v26, v10, 1\n\t" + "vslidedown.vi v28, v12, 1\n\t" + "vmadc.vv v0, v10, v26\n\t" + "vadd.vv v10, v10, v26\n\t" + "vadd.vv v12, v12, v28\n\t" + " vadc.vim v12, v12, 0, v0\n\t" + "vmv.x.s a3, v10\n\t" + "vmv.x.s a4, v12\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t2, t4, t3, 44 */ + ".word 0xe6ced3b3\n\t" +#else + "srli t2, t3, 44\n\t" + "slli t0, t4, 20\n\t" + "or t2, t2, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s6, t3, s9\n\t" + "add t5, t5, t2\n\t" + "sltu t0, t5, t2\n\t" + "add t6, t6, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t2, t6, t5, 44 */ + ".word 0xf6cfd3b3\n\t" +#else + "srli t2, t5, 44\n\t" + "slli t0, t6, 20\n\t" + "or t2, t2, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s7, t5, s9\n\t" + "add a3, a3, t2\n\t" + "sltu t0, a3, t2\n\t" + "add a4, a4, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t2, a4, a3, 42 */ + ".word 0x6ea753b3\n\t" +#else + "srli t2, a3, 42\n\t" + "slli t0, a4, 22\n\t" + "or t2, t2, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s8, a3, s10\n\t" + "slli t0, t2, 2\n\t" + "add t2, t2, t0\n\t" + "add s6, s6, t2\n\t" + "srli t2, s6, 44\n\t" + "and s6, s6, s9\n\t" + "add s7, s7, t2\n\t" + "addi %[m], %[m], 128\n\t" + "addi %[bytes], %[bytes], -128\n\t" + "li t0, 128\n\t" + "bgeu %[bytes], t0, L_poly1305_riscv64_blocks_v8loop_%=\n\t" + "\n" + "L_poly1305_riscv64_blocks_v8skip_%=:\n\t" + /* Vectorized 4-block path: h <- (h+m0)r^4 + m1*r^3 + m2*r^2 + m3*r */ + "li t0, 64\n\t" + "bltu %[bytes], t0, L_poly1305_riscv64_blocks_v2tail_%=\n\t" + "lbu t0, 288(%[ctx])\n\t" + "li t1, 2\n\t" + "bge t0, t1, L_poly1305_riscv64_have_r34_%=\n\t" + "li t1, 1\n\t" + "bge t0, t1, L_poly1305_riscv64_r34_have_r2_%=\n\t" + "ld t0, 0(%[ctx])\n\t" + "sd t0, 168(%[ctx])\n\t" + "ld t0, 8(%[ctx])\n\t" + "sd t0, 176(%[ctx])\n\t" + "ld t0, 16(%[ctx])\n\t" + "sd t0, 184(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 144(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 152(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 16(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 144(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 144(%[ctx])\n\t" + "ld a4, 152(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 152(%[ctx])\n\t" + "sd a6, 160(%[ctx])\n\t" + "\n" + "L_poly1305_riscv64_r34_have_r2_%=:\n\t" + "li t2, 20\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 120(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 128(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 16(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 120(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 120(%[ctx])\n\t" + "ld a4, 128(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 128(%[ctx])\n\t" + "sd a6, 136(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 152(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 96(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 152(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 104(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 144(%[ctx])\n\t" + "ld t1, 160(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 152(%[ctx])\n\t" + "ld t1, 152(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 160(%[ctx])\n\t" + "ld t1, 144(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 96(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 96(%[ctx])\n\t" + "ld a4, 104(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 104(%[ctx])\n\t" + "sd a6, 112(%[ctx])\n\t" + "li t0, 2\n\t" + "sb t0, 288(%[ctx])\n\t" + "\n" + "L_poly1305_riscv64_have_r34_%=:\n\t" + "vsetivli zero, 4, e64, m2, ta, ma\n\t" + "li a6, 24\n\t" + "addi t0, %[ctx], 96\n\t" + " vlse64.v v2, (t0), a6\n\t" + "addi t0, %[ctx], 104\n\t" + " vlse64.v v4, (t0), a6\n\t" + "addi t0, %[ctx], 112\n\t" + " vlse64.v v6, (t0), a6\n\t" + "li a5, 20\n\t" + "vmul.vx v8, v4, a5\n\t" + "vmul.vx v10, v6, a5\n\t" + "vmv.v.i v12, 0\n\t" + "\n" + "L_poly1305_riscv64_blocks_v4loop_%=:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 0(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld21_w_%=\n\t" + "ld a4, 0(%[m])\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld21_h_%=\n\t" + "lwu a4, 0(%[m])\n\t" + "lwu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld21_b_%=\n\t" + "lhu a4, 0(%[m])\n\t" + "lhu t0, 2(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 6(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld21_e_%=\n\t" + "\n" + "L_ualn_ld21_b_%=:\n\t" + "lbu a4, 0(%[m])\n\t" + "lbu t0, 1(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 2(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 3(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 5(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 6(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 7(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a4, a4, t0\n\t" + "\n" + "L_ualn_ld21_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld22_w_%=\n\t" + "ld a5, 8(%[m])\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld22_h_%=\n\t" + "lwu a5, 8(%[m])\n\t" + "lwu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld22_b_%=\n\t" + "lhu a5, 8(%[m])\n\t" + "lhu t0, 10(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 14(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld22_e_%=\n\t" + "\n" + "L_ualn_ld22_b_%=:\n\t" + "lbu a5, 8(%[m])\n\t" + "lbu t0, 9(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 10(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 11(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 13(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 14(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 15(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld22_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t2, a4, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t3, a5, a4, 44 */ + ".word 0x76c7de33\n\t" +#else + "srli t3, a4, 44\n\t" + "slli t0, a5, 20\n\t" + "or t3, t3, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t3, t3, s9\n\t" + "srli t4, a5, 24\n\t" + "and t4, t4, s10\n\t" + "or t4, t4, s11\n\t" + "add t2, s6, t2\n\t" + "add t3, s7, t3\n\t" + "add t4, s8, t4\n\t" + "sd t2, 0(sp)\n\t" + "sd t3, 32(sp)\n\t" + "sd t4, 64(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 16(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld23_w_%=\n\t" + "ld a4, 16(%[m])\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld23_h_%=\n\t" + "lwu a4, 16(%[m])\n\t" + "lwu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld23_b_%=\n\t" + "lhu a4, 16(%[m])\n\t" + "lhu t0, 18(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 22(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld23_e_%=\n\t" + "\n" + "L_ualn_ld23_b_%=:\n\t" + "lbu a4, 16(%[m])\n\t" + "lbu t0, 17(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 18(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 19(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 21(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 22(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 23(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a4, a4, t0\n\t" + "\n" + "L_ualn_ld23_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 24(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld24_w_%=\n\t" + "ld a5, 24(%[m])\n\t" + "j L_ualn_ld24_e_%=\n\t" + "\n" + "L_ualn_ld24_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld24_h_%=\n\t" + "lwu a5, 24(%[m])\n\t" + "lwu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld24_e_%=\n\t" + "\n" + "L_ualn_ld24_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld24_b_%=\n\t" + "lhu a5, 24(%[m])\n\t" + "lhu t0, 26(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 30(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld24_e_%=\n\t" + "\n" + "L_ualn_ld24_b_%=:\n\t" + "lbu a5, 24(%[m])\n\t" + "lbu t0, 25(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 26(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 27(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 29(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 30(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 31(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld24_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t2, a4, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t3, a5, a4, 44 */ + ".word 0x76c7de33\n\t" +#else + "srli t3, a4, 44\n\t" + "slli t0, a5, 20\n\t" + "or t3, t3, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t3, t3, s9\n\t" + "srli t4, a5, 24\n\t" + "and t4, t4, s10\n\t" + "or t4, t4, s11\n\t" + "sd t2, 8(sp)\n\t" + "sd t3, 40(sp)\n\t" + "sd t4, 72(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 32(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld25_w_%=\n\t" + "ld a4, 32(%[m])\n\t" + "j L_ualn_ld25_e_%=\n\t" + "\n" + "L_ualn_ld25_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld25_h_%=\n\t" + "lwu a4, 32(%[m])\n\t" + "lwu t0, 36(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld25_e_%=\n\t" + "\n" + "L_ualn_ld25_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld25_b_%=\n\t" + "lhu a4, 32(%[m])\n\t" + "lhu t0, 34(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 36(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 38(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld25_e_%=\n\t" + "\n" + "L_ualn_ld25_b_%=:\n\t" + "lbu a4, 32(%[m])\n\t" + "lbu t0, 33(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 34(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 35(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 36(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 37(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 38(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 39(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a4, a4, t0\n\t" + "\n" + "L_ualn_ld25_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 40(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld26_w_%=\n\t" + "ld a5, 40(%[m])\n\t" + "j L_ualn_ld26_e_%=\n\t" + "\n" + "L_ualn_ld26_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld26_h_%=\n\t" + "lwu a5, 40(%[m])\n\t" + "lwu t0, 44(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld26_e_%=\n\t" + "\n" + "L_ualn_ld26_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld26_b_%=\n\t" + "lhu a5, 40(%[m])\n\t" + "lhu t0, 42(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 44(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 46(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld26_e_%=\n\t" + "\n" + "L_ualn_ld26_b_%=:\n\t" + "lbu a5, 40(%[m])\n\t" + "lbu t0, 41(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 42(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 43(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 44(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 45(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 46(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 47(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld26_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t2, a4, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t3, a5, a4, 44 */ + ".word 0x76c7de33\n\t" +#else + "srli t3, a4, 44\n\t" + "slli t0, a5, 20\n\t" + "or t3, t3, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t3, t3, s9\n\t" + "srli t4, a5, 24\n\t" + "and t4, t4, s10\n\t" + "or t4, t4, s11\n\t" + "sd t2, 16(sp)\n\t" + "sd t3, 48(sp)\n\t" + "sd t4, 80(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 48(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld27_w_%=\n\t" + "ld a4, 48(%[m])\n\t" + "j L_ualn_ld27_e_%=\n\t" + "\n" + "L_ualn_ld27_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld27_h_%=\n\t" + "lwu a4, 48(%[m])\n\t" + "lwu t0, 52(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld27_e_%=\n\t" + "\n" + "L_ualn_ld27_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld27_b_%=\n\t" + "lhu a4, 48(%[m])\n\t" + "lhu t0, 50(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 52(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 54(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld27_e_%=\n\t" + "\n" + "L_ualn_ld27_b_%=:\n\t" + "lbu a4, 48(%[m])\n\t" + "lbu t0, 49(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 50(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 51(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 52(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 53(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 54(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 55(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a4, a4, t0\n\t" + "\n" + "L_ualn_ld27_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 56(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld28_w_%=\n\t" + "ld a5, 56(%[m])\n\t" + "j L_ualn_ld28_e_%=\n\t" + "\n" + "L_ualn_ld28_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld28_h_%=\n\t" + "lwu a5, 56(%[m])\n\t" + "lwu t0, 60(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld28_e_%=\n\t" + "\n" + "L_ualn_ld28_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld28_b_%=\n\t" + "lhu a5, 56(%[m])\n\t" + "lhu t0, 58(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 60(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 62(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld28_e_%=\n\t" + "\n" + "L_ualn_ld28_b_%=:\n\t" + "lbu a5, 56(%[m])\n\t" + "lbu t0, 57(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 58(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 59(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 60(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 61(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 62(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 63(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld28_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t2, a4, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t3, a5, a4, 44 */ + ".word 0x76c7de33\n\t" +#else + "srli t3, a4, 44\n\t" + "slli t0, a5, 20\n\t" + "or t3, t3, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t3, t3, s9\n\t" + "srli t4, a5, 24\n\t" + "and t4, t4, s10\n\t" + "or t4, t4, s11\n\t" + "sd t2, 24(sp)\n\t" + "sd t3, 56(sp)\n\t" + "sd t4, 88(sp)\n\t" + "addi t0, sp, 0\n\t" + " vle64.v v14, (t0)\n\t" + "addi t0, sp, 32\n\t" + " vle64.v v16, (t0)\n\t" + "addi t0, sp, 64\n\t" + " vle64.v v18, (t0)\n\t" + "vmul.vv v20, v14, v2\n\t" + "vmulhu.vv v22, v14, v2\n\t" + "vmul.vv v24, v16, v10\n\t" + "vmulhu.vv v26, v16, v10\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmul.vv v24, v18, v8\n\t" + "vmulhu.vv v26, v18, v8\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 2\n\t" + "vslidedown.vi v30, v22, 2\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 1\n\t" + "vslidedown.vi v30, v22, 1\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmv.x.s t2, v20\n\t" + "vmv.x.s t3, v22\n\t" + "vmul.vv v20, v14, v4\n\t" + "vmulhu.vv v22, v14, v4\n\t" + "vmul.vv v24, v16, v2\n\t" + "vmulhu.vv v26, v16, v2\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmul.vv v24, v18, v10\n\t" + "vmulhu.vv v26, v18, v10\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 2\n\t" + "vslidedown.vi v30, v22, 2\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 1\n\t" + "vslidedown.vi v30, v22, 1\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmv.x.s t4, v20\n\t" + "vmv.x.s t5, v22\n\t" + "vmul.vv v20, v14, v6\n\t" + "vmulhu.vv v22, v14, v6\n\t" + "vmul.vv v24, v16, v4\n\t" + "vmulhu.vv v26, v16, v4\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmul.vv v24, v18, v2\n\t" + "vmulhu.vv v26, v18, v2\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 2\n\t" + "vslidedown.vi v30, v22, 2\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 1\n\t" + "vslidedown.vi v30, v22, 1\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmv.x.s t6, v20\n\t" + "vmv.x.s a3, v22\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t1, t3, t2, 44 */ + ".word 0x3ece5333\n\t" +#else + "srli t1, t2, 44\n\t" + "slli t0, t3, 20\n\t" + "or t1, t1, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s6, t2, s9\n\t" + "add t4, t4, t1\n\t" + "sltu t0, t4, t1\n\t" + "add t5, t5, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t1, t5, t4, 44 */ + ".word 0xeecf5333\n\t" +#else + "srli t1, t4, 44\n\t" + "slli t0, t5, 20\n\t" + "or t1, t1, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s7, t4, s9\n\t" + "add t6, t6, t1\n\t" + "sltu t0, t6, t1\n\t" + "add a3, a3, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t1, a3, t6, 42 */ + ".word 0xfea6d333\n\t" +#else + "srli t1, t6, 42\n\t" + "slli t0, a3, 22\n\t" + "or t1, t1, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s8, t6, s10\n\t" + "slli t0, t1, 2\n\t" + "add t1, t1, t0\n\t" + "add s6, s6, t1\n\t" + "srli t1, s6, 44\n\t" + "and s6, s6, s9\n\t" + "add s7, s7, t1\n\t" + "addi %[m], %[m], 64\n\t" + "addi %[bytes], %[bytes], -64\n\t" + "li t0, 64\n\t" + "bgeu %[bytes], t0, L_poly1305_riscv64_blocks_v4loop_%=\n\t" + "\n" + "L_poly1305_riscv64_blocks_v2tail_%=:\n\t" + /* Vectorized 2-block tail: h <- (h+A)*r^2 + B*r */ + "li t0, 32\n\t" + "bltu %[bytes], t0, L_poly1305_riscv64_blocks_vskip_%=\n\t" + "lbu t0, 288(%[ctx])\n\t" + "li t1, 1\n\t" + "bge t0, t1, L_poly1305_riscv64_have_r2_%=\n\t" + "ld t0, 0(%[ctx])\n\t" + "sd t0, 168(%[ctx])\n\t" + "ld t0, 8(%[ctx])\n\t" + "sd t0, 176(%[ctx])\n\t" + "ld t0, 16(%[ctx])\n\t" + "sd t0, 184(%[ctx])\n\t" + "li t2, 20\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a6, t0, t2\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a7, t0, t2\n\t" + "li t5, 17592186044415\n\t" + /* d0 = a0*b0 + a1*s2 + a2*s1 ; o0 = d0 & m44 ; cc = d0 >> 44 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a4, t0, a6\n\t" + "mulhu a5, t0, a6\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "and t2, t6, t5\n\t" + "sd t2, 144(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d1 = a0*b1 + a1*b0 + a2*s2 (+cc) ; o1 = d1 & m44 ; cc = d1 >> 44 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "mul a4, t0, a7\n\t" + "mulhu a5, t0, a7\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "and t2, t6, t5\n\t" + "sd t2, 152(%[ctx])\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 44 */ + ".word 0xfec6deb3\n\t" +#else + "srli t4, t6, 44\n\t" + "slli a4, a3, 20\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* d2 = a0*b2 + a1*b1 + a2*b0 (+cc) ; o2 = d2 & m42 ; cc = d2 >> 42 */ + "ld t0, 0(%[ctx])\n\t" + "ld t1, 16(%[ctx])\n\t" + "mul t6, t0, t1\n\t" + "mulhu a3, t0, t1\n\t" + "ld t0, 8(%[ctx])\n\t" + "ld t1, 8(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "ld t0, 16(%[ctx])\n\t" + "ld t1, 0(%[ctx])\n\t" + "mul a4, t0, t1\n\t" + "mulhu a5, t0, t1\n\t" + "add t6, t6, a4\n\t" + "sltu t3, t6, a4\n\t" + "add a3, a3, a5\n\t" + "add a3, a3, t3\n\t" + "add t6, t6, t4\n\t" + "sltu a4, t6, t4\n\t" + "add a3, a3, a4\n\t" + "srli t5, t5, 2\n\t" + "and a6, t6, t5\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t4, a3, t6, 42 */ + ".word 0xfea6deb3\n\t" +#else + "srli t4, t6, 42\n\t" + "slli a4, a3, 22\n\t" + "or t4, t4, a4\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + /* fold top carry: o0 += cc*5 ; propagate into o1 */ + "slli a4, t4, 2\n\t" + "add t4, t4, a4\n\t" + "li t5, 17592186044415\n\t" + "ld a4, 144(%[ctx])\n\t" + "add a4, a4, t4\n\t" + "srli a5, a4, 44\n\t" + "and a4, a4, t5\n\t" + "sd a4, 144(%[ctx])\n\t" + "ld a4, 152(%[ctx])\n\t" + "add a4, a4, a5\n\t" + "sd a4, 152(%[ctx])\n\t" + "sd a6, 160(%[ctx])\n\t" + "li t0, 1\n\t" + "sb t0, 288(%[ctx])\n\t" + "\n" + "L_poly1305_riscv64_have_r2_%=:\n\t" + "vsetivli zero, 2, e64, m1, ta, ma\n\t" + "li a6, 24\n\t" + "addi t0, %[ctx], 144\n\t" + " vlse64.v v2, (t0), a6\n\t" + "addi t0, %[ctx], 152\n\t" + " vlse64.v v4, (t0), a6\n\t" + "addi t0, %[ctx], 160\n\t" + " vlse64.v v6, (t0), a6\n\t" + "li a5, 20\n\t" + "vmul.vx v8, v4, a5\n\t" + "vmul.vx v10, v6, a5\n\t" + "vmv.v.i v12, 0\n\t" + "\n" + "L_poly1305_riscv64_blocks_vloop_%=:\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 0(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld29_w_%=\n\t" + "ld a4, 0(%[m])\n\t" + "j L_ualn_ld29_e_%=\n\t" + "\n" + "L_ualn_ld29_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld29_h_%=\n\t" + "lwu a4, 0(%[m])\n\t" + "lwu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld29_e_%=\n\t" + "\n" + "L_ualn_ld29_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld29_b_%=\n\t" + "lhu a4, 0(%[m])\n\t" + "lhu t0, 2(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 6(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld29_e_%=\n\t" + "\n" + "L_ualn_ld29_b_%=:\n\t" + "lbu a4, 0(%[m])\n\t" + "lbu t0, 1(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 2(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 3(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 4(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 5(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 6(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 7(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a4, a4, t0\n\t" + "\n" + "L_ualn_ld29_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 8(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld30_w_%=\n\t" + "ld a5, 8(%[m])\n\t" + "j L_ualn_ld30_e_%=\n\t" + "\n" + "L_ualn_ld30_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld30_h_%=\n\t" + "lwu a5, 8(%[m])\n\t" + "lwu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld30_e_%=\n\t" + "\n" + "L_ualn_ld30_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld30_b_%=\n\t" + "lhu a5, 8(%[m])\n\t" + "lhu t0, 10(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 14(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld30_e_%=\n\t" + "\n" + "L_ualn_ld30_b_%=:\n\t" + "lbu a5, 8(%[m])\n\t" + "lbu t0, 9(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 10(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 11(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 12(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 13(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 14(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 15(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld30_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t2, a4, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t3, a5, a4, 44 */ + ".word 0x76c7de33\n\t" +#else + "srli t3, a4, 44\n\t" + "slli t0, a5, 20\n\t" + "or t3, t3, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t3, t3, s9\n\t" + "srli t4, a5, 24\n\t" + "and t4, t4, s10\n\t" + "or t4, t4, s11\n\t" + "add t2, s6, t2\n\t" + "add t3, s7, t3\n\t" + "add t4, s8, t4\n\t" + "sd t2, 0(sp)\n\t" + "sd t3, 32(sp)\n\t" + "sd t4, 64(sp)\n\t" +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a4, 16(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld31_w_%=\n\t" + "ld a4, 16(%[m])\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld31_h_%=\n\t" + "lwu a4, 16(%[m])\n\t" + "lwu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld31_b_%=\n\t" + "lhu a4, 16(%[m])\n\t" + "lhu t0, 18(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lhu t0, 22(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "j L_ualn_ld31_e_%=\n\t" + "\n" + "L_ualn_ld31_b_%=:\n\t" + "lbu a4, 16(%[m])\n\t" + "lbu t0, 17(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 18(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 19(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 20(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 21(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 22(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a4, a4, t0\n\t" + "lbu t0, 23(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a4, a4, t0\n\t" + "\n" + "L_ualn_ld31_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld a5, 24(%[m])\n\t" +#else + "andi t0, %[m], 7\n\t" + "bnez t0, L_ualn_ld32_w_%=\n\t" + "ld a5, 24(%[m])\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_w_%=:\n\t" + "andi t0, t0, 3\n\t" + "bnez t0, L_ualn_ld32_h_%=\n\t" + "lwu a5, 24(%[m])\n\t" + "lwu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_h_%=:\n\t" + "andi t0, t0, 1\n\t" + "bnez t0, L_ualn_ld32_b_%=\n\t" + "lhu a5, 24(%[m])\n\t" + "lhu t0, 26(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lhu t0, 30(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "j L_ualn_ld32_e_%=\n\t" + "\n" + "L_ualn_ld32_b_%=:\n\t" + "lbu a5, 24(%[m])\n\t" + "lbu t0, 25(%[m])\n\t" + "slli t0, t0, 8\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 26(%[m])\n\t" + "slli t0, t0, 16\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 27(%[m])\n\t" + "slli t0, t0, 24\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 28(%[m])\n\t" + "slli t0, t0, 32\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 29(%[m])\n\t" + "slli t0, t0, 40\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 30(%[m])\n\t" + "slli t0, t0, 48\n\t" + "or a5, a5, t0\n\t" + "lbu t0, 31(%[m])\n\t" + "slli t0, t0, 56\n\t" + "or a5, a5, t0\n\t" + "\n" + "L_ualn_ld32_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t2, a4, s9\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t3, a5, a4, 44 */ + ".word 0x76c7de33\n\t" +#else + "srli t3, a4, 44\n\t" + "slli t0, a5, 20\n\t" + "or t3, t3, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t3, t3, s9\n\t" + "srli t4, a5, 24\n\t" + "and t4, t4, s10\n\t" + "or t4, t4, s11\n\t" + "sd t2, 8(sp)\n\t" + "sd t3, 40(sp)\n\t" + "sd t4, 72(sp)\n\t" + "addi t0, sp, 0\n\t" + " vle64.v v14, (t0)\n\t" + "addi t0, sp, 32\n\t" + " vle64.v v16, (t0)\n\t" + "addi t0, sp, 64\n\t" + " vle64.v v18, (t0)\n\t" + "vmul.vv v20, v14, v2\n\t" + "vmulhu.vv v22, v14, v2\n\t" + "vmul.vv v24, v16, v10\n\t" + "vmulhu.vv v26, v16, v10\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmul.vv v24, v18, v8\n\t" + "vmulhu.vv v26, v18, v8\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 1\n\t" + "vslidedown.vi v30, v22, 1\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmv.x.s t2, v20\n\t" + "vmv.x.s t3, v22\n\t" + "vmul.vv v20, v14, v4\n\t" + "vmulhu.vv v22, v14, v4\n\t" + "vmul.vv v24, v16, v2\n\t" + "vmulhu.vv v26, v16, v2\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmul.vv v24, v18, v10\n\t" + "vmulhu.vv v26, v18, v10\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 1\n\t" + "vslidedown.vi v30, v22, 1\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmv.x.s t4, v20\n\t" + "vmv.x.s t5, v22\n\t" + "vmul.vv v20, v14, v6\n\t" + "vmulhu.vv v22, v14, v6\n\t" + "vmul.vv v24, v16, v4\n\t" + "vmulhu.vv v26, v16, v4\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmul.vv v24, v18, v2\n\t" + "vmulhu.vv v26, v18, v2\n\t" + "vmadc.vv v0, v20, v24\n\t" + "vadd.vv v20, v20, v24\n\t" + "vadd.vv v22, v22, v26\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vslidedown.vi v28, v20, 1\n\t" + "vslidedown.vi v30, v22, 1\n\t" + "vmadc.vv v0, v20, v28\n\t" + "vadd.vv v20, v20, v28\n\t" + "vadd.vv v22, v22, v30\n\t" + "vadc.vvm v22, v22, v12, v0\n\t" + "vmv.x.s t6, v20\n\t" + "vmv.x.s a3, v22\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t1, t3, t2, 44 */ + ".word 0x3ece5333\n\t" +#else + "srli t1, t2, 44\n\t" + "slli t0, t3, 20\n\t" + "or t1, t1, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s6, t2, s9\n\t" + "add t4, t4, t1\n\t" + "sltu t0, t4, t1\n\t" + "add t5, t5, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t1, t5, t4, 44 */ + ".word 0xeecf5333\n\t" +#else + "srli t1, t4, 44\n\t" + "slli t0, t5, 20\n\t" + "or t1, t1, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s7, t4, s9\n\t" + "add t6, t6, t1\n\t" + "sltu t0, t6, t1\n\t" + "add a3, a3, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t1, a3, t6, 42 */ + ".word 0xfea6d333\n\t" +#else + "srli t1, t6, 42\n\t" + "slli t0, a3, 22\n\t" + "or t1, t1, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s8, t6, s10\n\t" + "slli t0, t1, 2\n\t" + "add t1, t1, t0\n\t" + "add s6, s6, t1\n\t" + "srli t1, s6, 44\n\t" + "and s6, s6, s9\n\t" + "add s7, s7, t1\n\t" + "addi %[m], %[m], 32\n\t" + "addi %[bytes], %[bytes], -32\n\t" + "li t0, 32\n\t" + "bgeu %[bytes], t0, L_poly1305_riscv64_blocks_vloop_%=\n\t" + "\n" + "L_poly1305_riscv64_blocks_vskip_%=:\n\t" + "addi sp, sp, 96\n\t" + /* Remaining < 32: one block via scalar loop, else store h and finish */ + "li t0, 16\n\t" + "bgeu %[bytes], t0, L_poly1305_riscv64_blocks_loop_%=\n\t" + "sd s6, 24(%[ctx])\n\t" + "sd s7, 32(%[ctx])\n\t" + "sd s8, 40(%[ctx])\n\t" + "j L_poly1305_riscv64_blocks_done_%=\n\t" +#endif /* WOLFSSL_RISCV_VECTOR */ + "\n" + "L_poly1305_riscv64_blocks_loop_%=:\n\t" + /* Add message block into h (split 44,44,42) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t3, 0(%[m])\n\t" +#else + "andi t1, %[m], 7\n\t" + "bnez t1, L_ualn_ld33_w_%=\n\t" + "ld t3, 0(%[m])\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_w_%=:\n\t" + "andi t1, t1, 3\n\t" + "bnez t1, L_ualn_ld33_h_%=\n\t" + "lwu t3, 0(%[m])\n\t" + "lwu t1, 4(%[m])\n\t" + "slli t1, t1, 32\n\t" + "or t3, t3, t1\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_h_%=:\n\t" + "andi t1, t1, 1\n\t" + "bnez t1, L_ualn_ld33_b_%=\n\t" + "lhu t3, 0(%[m])\n\t" + "lhu t1, 2(%[m])\n\t" + "slli t1, t1, 16\n\t" + "or t3, t3, t1\n\t" + "lhu t1, 4(%[m])\n\t" + "slli t1, t1, 32\n\t" + "or t3, t3, t1\n\t" + "lhu t1, 6(%[m])\n\t" + "slli t1, t1, 48\n\t" + "or t3, t3, t1\n\t" + "j L_ualn_ld33_e_%=\n\t" + "\n" + "L_ualn_ld33_b_%=:\n\t" + "lbu t3, 0(%[m])\n\t" + "lbu t1, 1(%[m])\n\t" + "slli t1, t1, 8\n\t" + "or t3, t3, t1\n\t" + "lbu t1, 2(%[m])\n\t" + "slli t1, t1, 16\n\t" + "or t3, t3, t1\n\t" + "lbu t1, 3(%[m])\n\t" + "slli t1, t1, 24\n\t" + "or t3, t3, t1\n\t" + "lbu t1, 4(%[m])\n\t" + "slli t1, t1, 32\n\t" + "or t3, t3, t1\n\t" + "lbu t1, 5(%[m])\n\t" + "slli t1, t1, 40\n\t" + "or t3, t3, t1\n\t" + "lbu t1, 6(%[m])\n\t" + "slli t1, t1, 48\n\t" + "or t3, t3, t1\n\t" + "lbu t1, 7(%[m])\n\t" + "slli t1, t1, 56\n\t" + "or t3, t3, t1\n\t" + "\n" + "L_ualn_ld33_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +#if !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "ld t4, 8(%[m])\n\t" +#else + "andi t1, %[m], 7\n\t" + "bnez t1, L_ualn_ld34_w_%=\n\t" + "ld t4, 8(%[m])\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_w_%=:\n\t" + "andi t1, t1, 3\n\t" + "bnez t1, L_ualn_ld34_h_%=\n\t" + "lwu t4, 8(%[m])\n\t" + "lwu t1, 12(%[m])\n\t" + "slli t1, t1, 32\n\t" + "or t4, t4, t1\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_h_%=:\n\t" + "andi t1, t1, 1\n\t" + "bnez t1, L_ualn_ld34_b_%=\n\t" + "lhu t4, 8(%[m])\n\t" + "lhu t1, 10(%[m])\n\t" + "slli t1, t1, 16\n\t" + "or t4, t4, t1\n\t" + "lhu t1, 12(%[m])\n\t" + "slli t1, t1, 32\n\t" + "or t4, t4, t1\n\t" + "lhu t1, 14(%[m])\n\t" + "slli t1, t1, 48\n\t" + "or t4, t4, t1\n\t" + "j L_ualn_ld34_e_%=\n\t" + "\n" + "L_ualn_ld34_b_%=:\n\t" + "lbu t4, 8(%[m])\n\t" + "lbu t1, 9(%[m])\n\t" + "slli t1, t1, 8\n\t" + "or t4, t4, t1\n\t" + "lbu t1, 10(%[m])\n\t" + "slli t1, t1, 16\n\t" + "or t4, t4, t1\n\t" + "lbu t1, 11(%[m])\n\t" + "slli t1, t1, 24\n\t" + "or t4, t4, t1\n\t" + "lbu t1, 12(%[m])\n\t" + "slli t1, t1, 32\n\t" + "or t4, t4, t1\n\t" + "lbu t1, 13(%[m])\n\t" + "slli t1, t1, 40\n\t" + "or t4, t4, t1\n\t" + "lbu t1, 14(%[m])\n\t" + "slli t1, t1, 48\n\t" + "or t4, t4, t1\n\t" + "lbu t1, 15(%[m])\n\t" + "slli t1, t1, 56\n\t" + "or t4, t4, t1\n\t" + "\n" + "L_ualn_ld34_e_%=:\n\t" +#endif /* !defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "and t0, t3, s9\n\t" + "add s6, s6, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t0, t4, t3, 44 */ + ".word 0xe6ced2b3\n\t" +#else + "srli t0, t3, 44\n\t" + "slli t1, t4, 20\n\t" + "or t0, t0, t1\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and t0, t0, s9\n\t" + "add s7, s7, t0\n\t" + "srli t0, t4, 24\n\t" + "and t0, t0, s10\n\t" + "or t0, t0, s11\n\t" + "add s8, s8, t0\n\t" + /* d0 = h0*r0 + h1*s2 + h2*s1 */ + "mul t5, s6, s1\n\t" + "mulhu t6, s6, s1\n\t" + "mul t0, s7, s5\n\t" + "mulhu t1, s7, s5\n\t" + "add t5, t5, t0\n\t" + "sltu t2, t5, t0\n\t" + "add t6, t6, t1\n\t" + "add t6, t6, t2\n\t" + "mul t0, s8, s4\n\t" + "mulhu t1, s8, s4\n\t" + "add t5, t5, t0\n\t" + "sltu t2, t5, t0\n\t" + "add t6, t6, t1\n\t" + "add t6, t6, t2\n\t" + /* d1 = h0*r1 + h1*r0 + h2*s2 */ + "mul a3, s6, s2\n\t" + "mulhu a4, s6, s2\n\t" + "mul t0, s7, s1\n\t" + "mulhu t1, s7, s1\n\t" + "add a3, a3, t0\n\t" + "sltu t2, a3, t0\n\t" + "add a4, a4, t1\n\t" + "add a4, a4, t2\n\t" + "mul t0, s8, s5\n\t" + "mulhu t1, s8, s5\n\t" + "add a3, a3, t0\n\t" + "sltu t2, a3, t0\n\t" + "add a4, a4, t1\n\t" + "add a4, a4, t2\n\t" + /* d2 = h0*r2 + h1*r1 + h2*r0 */ + "mul a5, s6, s3\n\t" + "mulhu a6, s6, s3\n\t" + "mul t0, s7, s2\n\t" + "mulhu t1, s7, s2\n\t" + "add a5, a5, t0\n\t" + "sltu t2, a5, t0\n\t" + "add a6, a6, t1\n\t" + "add a6, a6, t2\n\t" + "mul t0, s8, s1\n\t" + "mulhu t1, s8, s1\n\t" + "add a5, a5, t0\n\t" + "sltu t2, a5, t0\n\t" + "add a6, a6, t1\n\t" + "add a6, a6, t2\n\t" + /* Reduce: carry chain across 44/44/42-bit limbs */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t2, t6, t5, 44 */ + ".word 0xf6cfd3b3\n\t" +#else + "srli t2, t5, 44\n\t" + "slli t0, t6, 20\n\t" + "or t2, t2, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s6, t5, s9\n\t" + "add a3, a3, t2\n\t" + "sltu t0, a3, t2\n\t" + "add a4, a4, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t2, a4, a3, 44 */ + ".word 0x6ec753b3\n\t" +#else + "srli t2, a3, 44\n\t" + "slli t0, a4, 20\n\t" + "or t2, t2, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s7, a3, s9\n\t" + "add a5, a5, t2\n\t" + "sltu t0, a5, t2\n\t" + "add a6, a6, t0\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri t2, a6, a5, 42 */ + ".word 0x7ea853b3\n\t" +#else + "srli t2, a5, 42\n\t" + "slli t0, a6, 22\n\t" + "or t2, t2, t0\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and s8, a5, s10\n\t" + "slli t0, t2, 2\n\t" + "add t2, t2, t0\n\t" + "add s6, s6, t2\n\t" + "srli t2, s6, 44\n\t" + "and s6, s6, s9\n\t" + "add s7, s7, t2\n\t" + "addi %[m], %[m], 16\n\t" + "addi %[bytes], %[bytes], -16\n\t" + "li t0, 16\n\t" + "bgeu %[bytes], t0, L_poly1305_riscv64_blocks_loop_%=\n\t" + /* Store h back */ + "sd s6, 24(%[ctx])\n\t" + "sd s7, 32(%[ctx])\n\t" + "sd s8, 40(%[ctx])\n\t" + "\n" + "L_poly1305_riscv64_blocks_done_%=:\n\t" + : [ctx] "+r" (ctx), [m] "+r" (m), [bytes] "+r" (bytes) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a3", "a4", "a5", + "a6", "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", + "s10", "s11" +#ifdef WOLFSSL_RISCV_VECTOR + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR */ + ); +} + +void poly1305_final_riscv64(Poly1305* ctx, byte* mac) +{ + __asm__ __volatile__ ( + "ld t0, 24(%[ctx])\n\t" + "ld t1, 32(%[ctx])\n\t" + "ld t2, 40(%[ctx])\n\t" + "li t6, 17592186044415\n\t" + "li a2, 4398046511103\n\t" + /* Fully carry h */ + "srli a3, t1, 44\n\t" + "and t1, t1, t6\n\t" + "add t2, t2, a3\n\t" + "srli a3, t2, 42\n\t" + "and t2, t2, a2\n\t" + "slli a4, a3, 2\n\t" + "add a3, a3, a4\n\t" + "add t0, t0, a3\n\t" + "srli a3, t0, 44\n\t" + "and t0, t0, t6\n\t" + "add t1, t1, a3\n\t" + "srli a3, t1, 44\n\t" + "and t1, t1, t6\n\t" + "add t2, t2, a3\n\t" + "srli a3, t2, 42\n\t" + "and t2, t2, a2\n\t" + "slli a4, a3, 2\n\t" + "add a3, a3, a4\n\t" + "add t0, t0, a3\n\t" + "srli a3, t0, 44\n\t" + "and t0, t0, t6\n\t" + "add t1, t1, a3\n\t" + /* g = h + -p */ + "addi t3, t0, 5\n\t" + "srli a3, t3, 44\n\t" + "and t3, t3, t6\n\t" + "add t4, t1, a3\n\t" + "srli a3, t4, 44\n\t" + "and t4, t4, t6\n\t" + "li a4, 4398046511104\n\t" + "add t5, t2, a3\n\t" + "sub t5, t5, a4\n\t" + /* Select h if h < p else g (constant time) */ + "srli a3, t5, 63\n\t" + "addi a3, a3, -1\n\t" + "and t3, t3, a3\n\t" + "and t4, t4, a3\n\t" + "and t5, t5, a3\n\t" + "not a6, a3\n\t" + "and t0, t0, a6\n\t" + "or t0, t0, t3\n\t" + "and t1, t1, a6\n\t" + "or t1, t1, t4\n\t" + "and t2, t2, a6\n\t" + "or t2, t2, t5\n\t" + /* h += pad */ + "ld a4, 48(%[ctx])\n\t" + "ld a7, 56(%[ctx])\n\t" + "and a5, a4, t6\n\t" + "add t0, t0, a5\n\t" + "srli a3, t0, 44\n\t" + "and t0, t0, t6\n\t" +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY + /* fsri a5, a7, a4, 44 */ + ".word 0x76c8d7b3\n\t" +#else + "srli a5, a4, 44\n\t" + "slli t3, a7, 20\n\t" + "or a5, a5, t3\n\t" +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION_TERNARY */ + "and a5, a5, t6\n\t" + "add t1, t1, a5\n\t" + "add t1, t1, a3\n\t" + "srli a3, t1, 44\n\t" + "and t1, t1, t6\n\t" + "srli a5, a7, 24\n\t" + "and a5, a5, a2\n\t" + "add t2, t2, a5\n\t" + "add t2, t2, a3\n\t" + "and t2, t2, a2\n\t" + /* mac = (h mod 2^128) packed little-endian */ + "slli a4, t1, 44\n\t" + "or t0, t0, a4\n\t" + "srli a5, t1, 20\n\t" + "slli a7, t2, 24\n\t" + "or t1, a5, a7\n\t" + "sd t0, 0(%[mac])\n\t" + "sd t1, 8(%[mac])\n\t" + /* Zero out the state */ + "sd zero, 24(%[ctx])\n\t" + "sd zero, 32(%[ctx])\n\t" + "sd zero, 40(%[ctx])\n\t" + "sd zero, 0(%[ctx])\n\t" + "sd zero, 8(%[ctx])\n\t" + "sd zero, 16(%[ctx])\n\t" + "sd zero, 48(%[ctx])\n\t" + "sd zero, 56(%[ctx])\n\t" + : [ctx] "+r" (ctx), [mac] "+r" (mac) + : + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a2", "a3", "a4", + "a5", "a6", "a7" +#ifdef WOLFSSL_RISCV_VECTOR + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR */ + ); +} + +#endif /* HAVE_POLY1305 */ +#endif /* WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S b/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S new file mode 100644 index 00000000000..2d57317c990 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S @@ -0,0 +1,4639 @@ +/* riscv-64-sha256-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha256.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.S + */ +#ifdef WOLFSSL_RISCV_ASM +#ifndef WOLFSSL_RISCV_ASM_INLINE +#if !defined(NO_SHA256) || defined(WOLFSSL_SHA224) +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + .section .rodata + .type L_SHA256_transform_riscv_vector_len_k, %object + .size L_SHA256_transform_riscv_vector_len_k, 256 + # 4-byte aligned, 32-bit aligned + .align 2 +L_SHA256_transform_riscv_vector_len_k: + .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 + .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 + .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 + .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 + .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc + .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da + .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 + .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 + .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 + .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 + .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 + .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 + .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 + .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 + .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 + .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 + .text + .globl Transform_Sha256_Len_riscv_vector + .type Transform_Sha256_Len_riscv_vector,@function + .align 2 +Transform_Sha256_Len_riscv_vector: + addi sp, sp, -32 + la t0, L_SHA256_transform_riscv_vector_len_k + .option arch, +v, +zvkb, +zvknha + # VLEN == 128: 4 x 32-bit elements per vector register + vsetivli zero, 4, e32, m1, ta, ma + # Permute standard digest a..h into {f,e,b,a},{h,g,d,c} order + lw t2, 20(a0) + sw t2, 0(sp) + lw t2, 16(a0) + sw t2, 4(sp) + lw t2, 4(a0) + sw t2, 8(sp) + lw t2, 0(a0) + sw t2, 12(sp) + lw t2, 28(a0) + sw t2, 16(sp) + lw t2, 24(a0) + sw t2, 20(sp) + lw t2, 12(a0) + sw t2, 24(sp) + lw t2, 8(a0) + sw t2, 28(sp) + vl2re32.v v4, (sp) + # Load K into vector registers + mv t1, t0 + vl8re32.v v8, (t1) + addi t1, t0, 128 + vl8re32.v v16, (t1) + srli a2, a2, 6 + # Start of loop processing a block +L_SHA256_transform_riscv_vector_len_begin: + # Save state to add back after compression + vmv.v.v v30, v4 + vmv.v.v v31, v5 + # Load 16 W into 4 vectors of 4 32-bit words + mv t1, a1 + vl4re32.v v0, (t1) + vrev8.v v0, v0 + vrev8.v v1, v1 + vrev8.v v2, v2 + vrev8.v v3, v3 + vadd.vv v7, v0, v8 + vmv.x.s t2, v1 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v2 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v0, v6, v3 + vadd.vv v7, v1, v9 + vmv.x.s t2, v2 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v3 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v1, v6, v0 + vadd.vv v7, v2, v10 + vmv.x.s t2, v3 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v0 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v2, v6, v1 + vadd.vv v7, v3, v11 + vmv.x.s t2, v0 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v1 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v3, v6, v2 + vadd.vv v7, v0, v12 + vmv.x.s t2, v1 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v2 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v0, v6, v3 + vadd.vv v7, v1, v13 + vmv.x.s t2, v2 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v3 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v1, v6, v0 + vadd.vv v7, v2, v14 + vmv.x.s t2, v3 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v0 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v2, v6, v1 + vadd.vv v7, v3, v15 + vmv.x.s t2, v0 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v1 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v3, v6, v2 + vadd.vv v7, v0, v16 + vmv.x.s t2, v1 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v2 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v0, v6, v3 + vadd.vv v7, v1, v17 + vmv.x.s t2, v2 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v3 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v1, v6, v0 + vadd.vv v7, v2, v18 + vmv.x.s t2, v3 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v0 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v2, v6, v1 + vadd.vv v7, v3, v19 + vmv.x.s t2, v0 + vsha2cl.vv v5, v4, v7 + vmv.v.v v6, v1 + vsha2ch.vv v4, v5, v7 + vmv.s.x v6, t2 + vsha2ms.vv v3, v6, v2 + vadd.vv v7, v0, v20 + vsha2cl.vv v5, v4, v7 + vsha2ch.vv v4, v5, v7 + vadd.vv v7, v1, v21 + vsha2cl.vv v5, v4, v7 + vsha2ch.vv v4, v5, v7 + vadd.vv v7, v2, v22 + vsha2cl.vv v5, v4, v7 + vsha2ch.vv v4, v5, v7 + vadd.vv v7, v3, v23 + vsha2cl.vv v5, v4, v7 + vsha2ch.vv v4, v5, v7 + vadd.vv v4, v4, v30 + vadd.vv v5, v5, v31 + addi a2, a2, -1 + addi a1, a1, 64 + bnez a2, L_SHA256_transform_riscv_vector_len_begin + # Store state back in standard digest order a..h + vs2r.v v4, (sp) + lw t2, 12(sp) + sw t2, 0(a0) + lw t2, 8(sp) + sw t2, 4(a0) + lw t2, 28(sp) + sw t2, 8(a0) + lw t2, 24(sp) + sw t2, 12(a0) + lw t2, 4(sp) + sw t2, 16(a0) + lw t2, 0(sp) + sw t2, 20(a0) + lw t2, 20(sp) + sw t2, 24(a0) + lw t2, 16(sp) + sw t2, 28(a0) + addi sp, sp, 32 + ret + .size Transform_Sha256_Len_riscv_vector,.-Transform_Sha256_Len_riscv_vector +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + .section .rodata + .type L_SHA256_transform_riscv_crypto_len_k, %object + .size L_SHA256_transform_riscv_crypto_len_k, 256 + # 4-byte aligned, 32-bit aligned + .align 2 +L_SHA256_transform_riscv_crypto_len_k: + .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 + .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 + .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 + .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 + .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc + .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da + .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 + .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 + .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 + .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 + .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 + .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 + .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 + .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 + .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 + .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 + .text + .globl Transform_Sha256_Len_riscv_crypto + .type Transform_Sha256_Len_riscv_crypto,@function + .align 2 +Transform_Sha256_Len_riscv_crypto: + addi sp, sp, -96 + sd s0, 0(sp) + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + la t0, L_SHA256_transform_riscv_crypto_len_k + .option arch, +zknh + # Load digest into working variables + ld t1, 0(a0) + ld t3, 8(a0) + ld t5, 16(a0) + ld a3, 24(a0) + srli t2, t1, 32 + srli t4, t3, 32 + srli t6, t5, 32 + srli a4, a3, 32 + srli a2, a2, 4 + # Start of loop processing a block +L_SHA256_transform_riscv_crypto_len_begin: + # Load W - big endian into two-words-per-register +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu s6, 0(a1) + lbu s7, 1(a1) + lbu s8, 2(a1) + lbu a5, 3(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or a5, a5, s6 + or a5, a5, s7 + or a5, a5, s8 + lbu s6, 4(a1) + lbu s7, 5(a1) + lbu s8, 6(a1) + lbu s9, 7(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or a5, a5, s6 + or a5, a5, s7 + or a5, a5, s8 + or a5, a5, s9 + lbu s6, 8(a1) + lbu s7, 9(a1) + lbu s8, 10(a1) + lbu a6, 11(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or a6, a6, s6 + or a6, a6, s7 + or a6, a6, s8 + lbu s6, 12(a1) + lbu s7, 13(a1) + lbu s8, 14(a1) + lbu s9, 15(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or a6, a6, s6 + or a6, a6, s7 + or a6, a6, s8 + or a6, a6, s9 + lbu s6, 16(a1) + lbu s7, 17(a1) + lbu s8, 18(a1) + lbu a7, 19(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or a7, a7, s6 + or a7, a7, s7 + or a7, a7, s8 + lbu s6, 20(a1) + lbu s7, 21(a1) + lbu s8, 22(a1) + lbu s9, 23(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or a7, a7, s6 + or a7, a7, s7 + or a7, a7, s8 + or a7, a7, s9 + lbu s6, 24(a1) + lbu s7, 25(a1) + lbu s8, 26(a1) + lbu s1, 27(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s1, s1, s6 + or s1, s1, s7 + or s1, s1, s8 + lbu s6, 28(a1) + lbu s7, 29(a1) + lbu s8, 30(a1) + lbu s9, 31(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s1, s1, s6 + or s1, s1, s7 + or s1, s1, s8 + or s1, s1, s9 + lbu s6, 32(a1) + lbu s7, 33(a1) + lbu s8, 34(a1) + lbu s2, 35(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s2, s2, s6 + or s2, s2, s7 + or s2, s2, s8 + lbu s6, 36(a1) + lbu s7, 37(a1) + lbu s8, 38(a1) + lbu s9, 39(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s2, s2, s6 + or s2, s2, s7 + or s2, s2, s8 + or s2, s2, s9 + lbu s6, 40(a1) + lbu s7, 41(a1) + lbu s8, 42(a1) + lbu s3, 43(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s3, s3, s6 + or s3, s3, s7 + or s3, s3, s8 + lbu s6, 44(a1) + lbu s7, 45(a1) + lbu s8, 46(a1) + lbu s9, 47(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s3, s3, s6 + or s3, s3, s7 + or s3, s3, s8 + or s3, s3, s9 + lbu s6, 48(a1) + lbu s7, 49(a1) + lbu s8, 50(a1) + lbu s4, 51(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s4, s4, s6 + or s4, s4, s7 + or s4, s4, s8 + lbu s6, 52(a1) + lbu s7, 53(a1) + lbu s8, 54(a1) + lbu s9, 55(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s4, s4, s6 + or s4, s4, s7 + or s4, s4, s8 + or s4, s4, s9 + lbu s6, 56(a1) + lbu s7, 57(a1) + lbu s8, 58(a1) + lbu s5, 59(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s5, s5, s6 + or s5, s5, s7 + or s5, s5, s8 + lbu s6, 60(a1) + lbu s7, 61(a1) + lbu s8, 62(a1) + lbu s9, 63(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s5, s5, s6 + or s5, s5, s7 + or s5, s5, s8 + or s5, s5, s9 +#else + ld a5, 0(a1) + # rev8 a5, a5 + .word 0x6b87d793 + # rori a5, a5, 32 + .word 0x6207d793 + ld a6, 8(a1) + # rev8 a6, a6 + .word 0x6b885813 + # rori a6, a6, 32 + .word 0x62085813 + ld a7, 16(a1) + # rev8 a7, a7 + .word 0x6b88d893 + # rori a7, a7, 32 + .word 0x6208d893 + ld s1, 24(a1) + # rev8 s1, s1 + .word 0x6b84d493 + # rori s1, s1, 32 + .word 0x6204d493 + ld s2, 32(a1) + # rev8 s2, s2 + .word 0x6b895913 + # rori s2, s2, 32 + .word 0x62095913 + ld s3, 40(a1) + # rev8 s3, s3 + .word 0x6b89d993 + # rori s3, s3, 32 + .word 0x6209d993 + ld s4, 48(a1) + # rev8 s4, s4 + .word 0x6b8a5a13 + # rori s4, s4, 32 + .word 0x620a5a13 + ld s5, 56(a1) + # rev8 s5, s5 + .word 0x6b8ada93 + # rori s5, s5, 32 + .word 0x620ada93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, -1 +L_SHA256_transform_riscv_crypto_len_inner: + ld s8, 0(t0) + mv s6, t5 + mv s7, t1 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t6, a3 + xor s10, t1, t2 + xor s11, t2, t3 + and s0, s0, t5 + addw a4, a4, s6 + and s11, s11, s10 + xor s0, s0, a3 + addw s10, s8, a5 + xor s11, s11, t2 + addw a4, a4, s0 + addw a4, a4, s10 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 + srli s8, s8, 32 + srli s9, a5, 32 + mv s6, t4 + mv s7, a4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t5, t6 + xor s10, a4, t1 + xor s11, t1, t2 + and s0, s0, t4 + addw a3, a3, s6 + and s11, s11, s10 + xor s0, s0, t6 + addw s10, s8, s9 + xor s11, s11, t1 + addw a3, a3, s0 + addw a3, a3, s10 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 + srli s10, a5, 32 + srli s0, s2, 32 + sha256sig0 s6, s10 + sha256sig1 s7, s5 + addw s7, s7, s0 + addw a5, a5, s6 + srli s11, s5, 32 + addw a5, s7, a5 + sha256sig0 s8, a6 + sha256sig1 s9, s11 + addw s9, s9, s3 + addw s11, s8, s10 + addw s9, s9, s11 + slli a5, a5, 32 + slli s9, s9, 32 + srli a5, a5, 32 + or a5, a5, s9 + ld s8, 8(t0) + mv s6, t3 + mv s7, a3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t4, t5 + xor s10, a3, a4 + xor s11, a4, t1 + and s0, s0, t3 + addw t6, t6, s6 + and s11, s11, s10 + xor s0, s0, t5 + addw s10, s8, a6 + xor s11, s11, a4 + addw t6, t6, s0 + addw t6, t6, s10 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 + srli s8, s8, 32 + srli s9, a6, 32 + mv s6, t2 + mv s7, t6 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t3, t4 + xor s10, t6, a3 + xor s11, a3, a4 + and s0, s0, t2 + addw t5, t5, s6 + and s11, s11, s10 + xor s0, s0, t4 + addw s10, s8, s9 + xor s11, s11, a3 + addw t5, t5, s0 + addw t5, t5, s10 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 + srli s10, a6, 32 + srli s0, s3, 32 + sha256sig0 s6, s10 + sha256sig1 s7, a5 + addw s7, s7, s0 + addw a6, a6, s6 + srli s11, a5, 32 + addw a6, s7, a6 + sha256sig0 s8, a7 + sha256sig1 s9, s11 + addw s9, s9, s4 + addw s11, s8, s10 + addw s9, s9, s11 + slli a6, a6, 32 + slli s9, s9, 32 + srli a6, a6, 32 + or a6, a6, s9 + ld s8, 16(t0) + mv s6, t1 + mv s7, t5 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t2, t3 + xor s10, t5, t6 + xor s11, t6, a3 + and s0, s0, t1 + addw t4, t4, s6 + and s11, s11, s10 + xor s0, s0, t3 + addw s10, s8, a7 + xor s11, s11, t6 + addw t4, t4, s0 + addw t4, t4, s10 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 + srli s8, s8, 32 + srli s9, a7, 32 + mv s6, a4 + mv s7, t4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t1, t2 + xor s10, t4, t5 + xor s11, t5, t6 + and s0, s0, a4 + addw t3, t3, s6 + and s11, s11, s10 + xor s0, s0, t2 + addw s10, s8, s9 + xor s11, s11, t5 + addw t3, t3, s0 + addw t3, t3, s10 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 + srli s10, a7, 32 + srli s0, s4, 32 + sha256sig0 s6, s10 + sha256sig1 s7, a6 + addw s7, s7, s0 + addw a7, a7, s6 + srli s11, a6, 32 + addw a7, s7, a7 + sha256sig0 s8, s1 + sha256sig1 s9, s11 + addw s9, s9, s5 + addw s11, s8, s10 + addw s9, s9, s11 + slli a7, a7, 32 + slli s9, s9, 32 + srli a7, a7, 32 + or a7, a7, s9 + ld s8, 24(t0) + mv s6, a3 + mv s7, t3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a4, t1 + xor s10, t3, t4 + xor s11, t4, t5 + and s0, s0, a3 + addw t2, t2, s6 + and s11, s11, s10 + xor s0, s0, t1 + addw s10, s8, s1 + xor s11, s11, t4 + addw t2, t2, s0 + addw t2, t2, s10 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 + srli s8, s8, 32 + srli s9, s1, 32 + mv s6, t6 + mv s7, t2 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a3, a4 + xor s10, t2, t3 + xor s11, t3, t4 + and s0, s0, t6 + addw t1, t1, s6 + and s11, s11, s10 + xor s0, s0, a4 + addw s10, s8, s9 + xor s11, s11, t3 + addw t1, t1, s0 + addw t1, t1, s10 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 + srli s10, s1, 32 + srli s0, s5, 32 + sha256sig0 s6, s10 + sha256sig1 s7, a7 + addw s7, s7, s0 + addw s1, s1, s6 + srli s11, a7, 32 + addw s1, s7, s1 + sha256sig0 s8, s2 + sha256sig1 s9, s11 + addw s9, s9, a5 + addw s11, s8, s10 + addw s9, s9, s11 + slli s1, s1, 32 + slli s9, s9, 32 + srli s1, s1, 32 + or s1, s1, s9 + ld s8, 32(t0) + mv s6, t5 + mv s7, t1 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t6, a3 + xor s10, t1, t2 + xor s11, t2, t3 + and s0, s0, t5 + addw a4, a4, s6 + and s11, s11, s10 + xor s0, s0, a3 + addw s10, s8, s2 + xor s11, s11, t2 + addw a4, a4, s0 + addw a4, a4, s10 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 + srli s8, s8, 32 + srli s9, s2, 32 + mv s6, t4 + mv s7, a4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t5, t6 + xor s10, a4, t1 + xor s11, t1, t2 + and s0, s0, t4 + addw a3, a3, s6 + and s11, s11, s10 + xor s0, s0, t6 + addw s10, s8, s9 + xor s11, s11, t1 + addw a3, a3, s0 + addw a3, a3, s10 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 + srli s10, s2, 32 + srli s0, a5, 32 + sha256sig0 s6, s10 + sha256sig1 s7, s1 + addw s7, s7, s0 + addw s2, s2, s6 + srli s11, s1, 32 + addw s2, s7, s2 + sha256sig0 s8, s3 + sha256sig1 s9, s11 + addw s9, s9, a6 + addw s11, s8, s10 + addw s9, s9, s11 + slli s2, s2, 32 + slli s9, s9, 32 + srli s2, s2, 32 + or s2, s2, s9 + ld s8, 40(t0) + mv s6, t3 + mv s7, a3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t4, t5 + xor s10, a3, a4 + xor s11, a4, t1 + and s0, s0, t3 + addw t6, t6, s6 + and s11, s11, s10 + xor s0, s0, t5 + addw s10, s8, s3 + xor s11, s11, a4 + addw t6, t6, s0 + addw t6, t6, s10 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 + srli s8, s8, 32 + srli s9, s3, 32 + mv s6, t2 + mv s7, t6 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t3, t4 + xor s10, t6, a3 + xor s11, a3, a4 + and s0, s0, t2 + addw t5, t5, s6 + and s11, s11, s10 + xor s0, s0, t4 + addw s10, s8, s9 + xor s11, s11, a3 + addw t5, t5, s0 + addw t5, t5, s10 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 + srli s10, s3, 32 + srli s0, a6, 32 + sha256sig0 s6, s10 + sha256sig1 s7, s2 + addw s7, s7, s0 + addw s3, s3, s6 + srli s11, s2, 32 + addw s3, s7, s3 + sha256sig0 s8, s4 + sha256sig1 s9, s11 + addw s9, s9, a7 + addw s11, s8, s10 + addw s9, s9, s11 + slli s3, s3, 32 + slli s9, s9, 32 + srli s3, s3, 32 + or s3, s3, s9 + ld s8, 48(t0) + mv s6, t1 + mv s7, t5 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t2, t3 + xor s10, t5, t6 + xor s11, t6, a3 + and s0, s0, t1 + addw t4, t4, s6 + and s11, s11, s10 + xor s0, s0, t3 + addw s10, s8, s4 + xor s11, s11, t6 + addw t4, t4, s0 + addw t4, t4, s10 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 + srli s8, s8, 32 + srli s9, s4, 32 + mv s6, a4 + mv s7, t4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t1, t2 + xor s10, t4, t5 + xor s11, t5, t6 + and s0, s0, a4 + addw t3, t3, s6 + and s11, s11, s10 + xor s0, s0, t2 + addw s10, s8, s9 + xor s11, s11, t5 + addw t3, t3, s0 + addw t3, t3, s10 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 + srli s10, s4, 32 + srli s0, a7, 32 + sha256sig0 s6, s10 + sha256sig1 s7, s3 + addw s7, s7, s0 + addw s4, s4, s6 + srli s11, s3, 32 + addw s4, s7, s4 + sha256sig0 s8, s5 + sha256sig1 s9, s11 + addw s9, s9, s1 + addw s11, s8, s10 + addw s9, s9, s11 + slli s4, s4, 32 + slli s9, s9, 32 + srli s4, s4, 32 + or s4, s4, s9 + ld s8, 56(t0) + mv s6, a3 + mv s7, t3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a4, t1 + xor s10, t3, t4 + xor s11, t4, t5 + and s0, s0, a3 + addw t2, t2, s6 + and s11, s11, s10 + xor s0, s0, t1 + addw s10, s8, s5 + xor s11, s11, t4 + addw t2, t2, s0 + addw t2, t2, s10 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 + srli s8, s8, 32 + srli s9, s5, 32 + mv s6, t6 + mv s7, t2 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a3, a4 + xor s10, t2, t3 + xor s11, t3, t4 + and s0, s0, t6 + addw t1, t1, s6 + and s11, s11, s10 + xor s0, s0, a4 + addw s10, s8, s9 + xor s11, s11, t3 + addw t1, t1, s0 + addw t1, t1, s10 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 + srli s10, s5, 32 + srli s0, s1, 32 + sha256sig0 s6, s10 + sha256sig1 s7, s4 + addw s7, s7, s0 + addw s5, s5, s6 + srli s11, s4, 32 + addw s5, s7, s5 + sha256sig0 s8, a5 + sha256sig1 s9, s11 + addw s9, s9, s2 + addw s11, s8, s10 + addw s9, s9, s11 + slli s5, s5, 32 + slli s9, s9, 32 + srli s5, s5, 32 + or s5, s5, s9 + addi a2, a2, -1 + addi t0, t0, 64 + andi s6, a2, 3 + bnez s6, L_SHA256_transform_riscv_crypto_len_inner + ld s8, 0(t0) + mv s6, t5 + mv s7, t1 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t6, a3 + xor s10, t1, t2 + xor s11, t2, t3 + and s0, s0, t5 + addw a4, a4, s6 + and s11, s11, s10 + xor s0, s0, a3 + addw s10, s8, a5 + xor s11, s11, t2 + addw a4, a4, s0 + addw a4, a4, s10 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 + srli s8, s8, 32 + srli s9, a5, 32 + mv s6, t4 + mv s7, a4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t5, t6 + xor s10, a4, t1 + xor s11, t1, t2 + and s0, s0, t4 + addw a3, a3, s6 + and s11, s11, s10 + xor s0, s0, t6 + addw s10, s8, s9 + xor s11, s11, t1 + addw a3, a3, s0 + addw a3, a3, s10 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 + ld s8, 8(t0) + mv s6, t3 + mv s7, a3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t4, t5 + xor s10, a3, a4 + xor s11, a4, t1 + and s0, s0, t3 + addw t6, t6, s6 + and s11, s11, s10 + xor s0, s0, t5 + addw s10, s8, a6 + xor s11, s11, a4 + addw t6, t6, s0 + addw t6, t6, s10 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 + srli s8, s8, 32 + srli s9, a6, 32 + mv s6, t2 + mv s7, t6 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t3, t4 + xor s10, t6, a3 + xor s11, a3, a4 + and s0, s0, t2 + addw t5, t5, s6 + and s11, s11, s10 + xor s0, s0, t4 + addw s10, s8, s9 + xor s11, s11, a3 + addw t5, t5, s0 + addw t5, t5, s10 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 + ld s8, 16(t0) + mv s6, t1 + mv s7, t5 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t2, t3 + xor s10, t5, t6 + xor s11, t6, a3 + and s0, s0, t1 + addw t4, t4, s6 + and s11, s11, s10 + xor s0, s0, t3 + addw s10, s8, a7 + xor s11, s11, t6 + addw t4, t4, s0 + addw t4, t4, s10 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 + srli s8, s8, 32 + srli s9, a7, 32 + mv s6, a4 + mv s7, t4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t1, t2 + xor s10, t4, t5 + xor s11, t5, t6 + and s0, s0, a4 + addw t3, t3, s6 + and s11, s11, s10 + xor s0, s0, t2 + addw s10, s8, s9 + xor s11, s11, t5 + addw t3, t3, s0 + addw t3, t3, s10 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 + ld s8, 24(t0) + mv s6, a3 + mv s7, t3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a4, t1 + xor s10, t3, t4 + xor s11, t4, t5 + and s0, s0, a3 + addw t2, t2, s6 + and s11, s11, s10 + xor s0, s0, t1 + addw s10, s8, s1 + xor s11, s11, t4 + addw t2, t2, s0 + addw t2, t2, s10 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 + srli s8, s8, 32 + srli s9, s1, 32 + mv s6, t6 + mv s7, t2 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a3, a4 + xor s10, t2, t3 + xor s11, t3, t4 + and s0, s0, t6 + addw t1, t1, s6 + and s11, s11, s10 + xor s0, s0, a4 + addw s10, s8, s9 + xor s11, s11, t3 + addw t1, t1, s0 + addw t1, t1, s10 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 + ld s8, 32(t0) + mv s6, t5 + mv s7, t1 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t6, a3 + xor s10, t1, t2 + xor s11, t2, t3 + and s0, s0, t5 + addw a4, a4, s6 + and s11, s11, s10 + xor s0, s0, a3 + addw s10, s8, s2 + xor s11, s11, t2 + addw a4, a4, s0 + addw a4, a4, s10 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 + srli s8, s8, 32 + srli s9, s2, 32 + mv s6, t4 + mv s7, a4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t5, t6 + xor s10, a4, t1 + xor s11, t1, t2 + and s0, s0, t4 + addw a3, a3, s6 + and s11, s11, s10 + xor s0, s0, t6 + addw s10, s8, s9 + xor s11, s11, t1 + addw a3, a3, s0 + addw a3, a3, s10 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 + ld s8, 40(t0) + mv s6, t3 + mv s7, a3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t4, t5 + xor s10, a3, a4 + xor s11, a4, t1 + and s0, s0, t3 + addw t6, t6, s6 + and s11, s11, s10 + xor s0, s0, t5 + addw s10, s8, s3 + xor s11, s11, a4 + addw t6, t6, s0 + addw t6, t6, s10 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 + srli s8, s8, 32 + srli s9, s3, 32 + mv s6, t2 + mv s7, t6 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t3, t4 + xor s10, t6, a3 + xor s11, a3, a4 + and s0, s0, t2 + addw t5, t5, s6 + and s11, s11, s10 + xor s0, s0, t4 + addw s10, s8, s9 + xor s11, s11, a3 + addw t5, t5, s0 + addw t5, t5, s10 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 + ld s8, 48(t0) + mv s6, t1 + mv s7, t5 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t2, t3 + xor s10, t5, t6 + xor s11, t6, a3 + and s0, s0, t1 + addw t4, t4, s6 + and s11, s11, s10 + xor s0, s0, t3 + addw s10, s8, s4 + xor s11, s11, t6 + addw t4, t4, s0 + addw t4, t4, s10 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 + srli s8, s8, 32 + srli s9, s4, 32 + mv s6, a4 + mv s7, t4 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, t1, t2 + xor s10, t4, t5 + xor s11, t5, t6 + and s0, s0, a4 + addw t3, t3, s6 + and s11, s11, s10 + xor s0, s0, t2 + addw s10, s8, s9 + xor s11, s11, t5 + addw t3, t3, s0 + addw t3, t3, s10 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 + ld s8, 56(t0) + mv s6, a3 + mv s7, t3 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a4, t1 + xor s10, t3, t4 + xor s11, t4, t5 + and s0, s0, a3 + addw t2, t2, s6 + and s11, s11, s10 + xor s0, s0, t1 + addw s10, s8, s5 + xor s11, s11, t4 + addw t2, t2, s0 + addw t2, t2, s10 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 + srli s8, s8, 32 + srli s9, s5, 32 + mv s6, t6 + mv s7, t2 + sha256sum1 s6, s6 + sha256sum0 s7, s7 + xor s0, a3, a4 + xor s10, t2, t3 + xor s11, t3, t4 + and s0, s0, t6 + addw t1, t1, s6 + and s11, s11, s10 + xor s0, s0, a4 + addw s10, s8, s9 + xor s11, s11, t3 + addw t1, t1, s0 + addw t1, t1, s10 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 + addi t0, t0, -192 + # Add working variables back into digest state + ld s6, 0(a0) + ld s7, 8(a0) + ld s8, 16(a0) + ld s9, 24(a0) + addw t1, t1, s6 + addw t3, t3, s7 + addw t5, t5, s8 + addw a3, a3, s9 + srli s6, s6, 32 + srli s7, s7, 32 + srli s8, s8, 32 + srli s9, s9, 32 + addw t2, t2, s6 + addw t4, t4, s7 + addw t6, t6, s8 + addw a4, a4, s9 + # Store digest + sw t1, 0(a0) + sw t2, 4(a0) + sw t3, 8(a0) + sw t4, 12(a0) + sw t5, 16(a0) + sw t6, 20(a0) + sw a3, 24(a0) + sw a4, 28(a0) + addi a1, a1, 64 + bnez a2, L_SHA256_transform_riscv_crypto_len_begin + ld s0, 0(sp) + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + ret + .size Transform_Sha256_Len_riscv_crypto,.-Transform_Sha256_Len_riscv_crypto +#else + .section .rodata + .type L_SHA256_transform_riscv_len_k, %object + .size L_SHA256_transform_riscv_len_k, 256 + # 4-byte aligned, 32-bit aligned + .align 2 +L_SHA256_transform_riscv_len_k: + .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 + .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 + .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 + .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 + .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc + .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da + .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 + .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 + .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 + .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 + .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 + .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 + .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 + .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 + .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 + .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 + .text + .globl Transform_Sha256_Len_riscv + .type Transform_Sha256_Len_riscv,@function + .align 2 +Transform_Sha256_Len_riscv: + addi sp, sp, -96 + sd s0, 0(sp) + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + la t0, L_SHA256_transform_riscv_len_k + # Load digest into working variables + ld t1, 0(a0) + ld t3, 8(a0) + ld t5, 16(a0) + ld a3, 24(a0) + srli t2, t1, 32 + srli t4, t3, 32 + srli t6, t5, 32 + srli a4, a3, 32 + srli a2, a2, 4 + # Start of loop processing a block +L_SHA256_transform_riscv_len_begin: + # Load W - big endian into two-words-per-register +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu s6, 0(a1) + lbu s7, 1(a1) + lbu s8, 2(a1) + lbu a5, 3(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or a5, a5, s6 + or a5, a5, s7 + or a5, a5, s8 + lbu s6, 4(a1) + lbu s7, 5(a1) + lbu s8, 6(a1) + lbu s9, 7(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or a5, a5, s6 + or a5, a5, s7 + or a5, a5, s8 + or a5, a5, s9 + lbu s6, 8(a1) + lbu s7, 9(a1) + lbu s8, 10(a1) + lbu a6, 11(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or a6, a6, s6 + or a6, a6, s7 + or a6, a6, s8 + lbu s6, 12(a1) + lbu s7, 13(a1) + lbu s8, 14(a1) + lbu s9, 15(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or a6, a6, s6 + or a6, a6, s7 + or a6, a6, s8 + or a6, a6, s9 + lbu s6, 16(a1) + lbu s7, 17(a1) + lbu s8, 18(a1) + lbu a7, 19(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or a7, a7, s6 + or a7, a7, s7 + or a7, a7, s8 + lbu s6, 20(a1) + lbu s7, 21(a1) + lbu s8, 22(a1) + lbu s9, 23(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or a7, a7, s6 + or a7, a7, s7 + or a7, a7, s8 + or a7, a7, s9 + lbu s6, 24(a1) + lbu s7, 25(a1) + lbu s8, 26(a1) + lbu s1, 27(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s1, s1, s6 + or s1, s1, s7 + or s1, s1, s8 + lbu s6, 28(a1) + lbu s7, 29(a1) + lbu s8, 30(a1) + lbu s9, 31(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s1, s1, s6 + or s1, s1, s7 + or s1, s1, s8 + or s1, s1, s9 + lbu s6, 32(a1) + lbu s7, 33(a1) + lbu s8, 34(a1) + lbu s2, 35(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s2, s2, s6 + or s2, s2, s7 + or s2, s2, s8 + lbu s6, 36(a1) + lbu s7, 37(a1) + lbu s8, 38(a1) + lbu s9, 39(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s2, s2, s6 + or s2, s2, s7 + or s2, s2, s8 + or s2, s2, s9 + lbu s6, 40(a1) + lbu s7, 41(a1) + lbu s8, 42(a1) + lbu s3, 43(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s3, s3, s6 + or s3, s3, s7 + or s3, s3, s8 + lbu s6, 44(a1) + lbu s7, 45(a1) + lbu s8, 46(a1) + lbu s9, 47(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s3, s3, s6 + or s3, s3, s7 + or s3, s3, s8 + or s3, s3, s9 + lbu s6, 48(a1) + lbu s7, 49(a1) + lbu s8, 50(a1) + lbu s4, 51(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s4, s4, s6 + or s4, s4, s7 + or s4, s4, s8 + lbu s6, 52(a1) + lbu s7, 53(a1) + lbu s8, 54(a1) + lbu s9, 55(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s4, s4, s6 + or s4, s4, s7 + or s4, s4, s8 + or s4, s4, s9 + lbu s6, 56(a1) + lbu s7, 57(a1) + lbu s8, 58(a1) + lbu s5, 59(a1) + slli s6, s6, 24 + slli s7, s7, 16 + slli s8, s8, 8 + or s5, s5, s6 + or s5, s5, s7 + or s5, s5, s8 + lbu s6, 60(a1) + lbu s7, 61(a1) + lbu s8, 62(a1) + lbu s9, 63(a1) + slli s6, s6, 56 + slli s7, s7, 48 + slli s8, s8, 40 + slli s9, s9, 32 + or s5, s5, s6 + or s5, s5, s7 + or s5, s5, s8 + or s5, s5, s9 +#else + ld a5, 0(a1) + # rev8 a5, a5 + .word 0x6b87d793 + # rori a5, a5, 32 + .word 0x6207d793 + ld a6, 8(a1) + # rev8 a6, a6 + .word 0x6b885813 + # rori a6, a6, 32 + .word 0x62085813 + ld a7, 16(a1) + # rev8 a7, a7 + .word 0x6b88d893 + # rori a7, a7, 32 + .word 0x6208d893 + ld s1, 24(a1) + # rev8 s1, s1 + .word 0x6b84d493 + # rori s1, s1, 32 + .word 0x6204d493 + ld s2, 32(a1) + # rev8 s2, s2 + .word 0x6b895913 + # rori s2, s2, 32 + .word 0x62095913 + ld s3, 40(a1) + # rev8 s3, s3 + .word 0x6b89d993 + # rori s3, s3, 32 + .word 0x6209d993 + ld s4, 48(a1) + # rev8 s4, s4 + .word 0x6b8a5a13 + # rori s4, s4, 32 + .word 0x620a5a13 + ld s5, 56(a1) + # rev8 s5, s5 + .word 0x6b8ada93 + # rori s5, s5, 32 + .word 0x620ada93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + addi a2, a2, -1 +L_SHA256_transform_riscv_len_inner: + ld s8, 0(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t5, 6 + .word 0x606f5d1b + # roriw s11, t5, 11 + .word 0x60bf5d9b + # roriw s6, t5, 25 + .word 0x619f5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t6, a3 + and s0, s0, t5 + xor s0, s0, a3 + addw a4, a4, s6 + addw a4, a4, s0 + addw s6, s8, a5 + addw a4, a4, s6 + # roriw s10, t1, 2 + .word 0x60235d1b + # roriw s11, t1, 13 + .word 0x60d35d9b + # roriw s7, t1, 22 + .word 0x61635b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t1, t2 + xor s6, t2, t3 + and s11, s11, s6 + xor s11, s11, t2 + addw t4, t4, a4 + addw s11, s7, s11 + addw a4, a4, s11 +#else + slliw s11, t5, 26 + srliw s10, t5, 6 + slliw s0, t5, 21 + srliw s6, t5, 11 + slliw s7, t5, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t5, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t1, 30 + xor s6, s6, s10 + srliw s10, t1, 2 + slliw s0, t1, 19 + addw a4, a4, s6 + srliw s7, t1, 13 + slliw s6, t1, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t1, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t6, a3 + xor s11, t1, t2 + xor s6, t2, t3 + xor s7, s7, s10 + and s0, s0, t5 + and s11, s11, s6 + xor s0, s0, a3 + addw s6, s8, a5 + addw a4, a4, s0 + xor s11, s11, t2 + addw a4, a4, s6 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, a5, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t4, 6 + .word 0x606edd1b + # roriw s11, t4, 11 + .word 0x60bedd9b + # roriw s6, t4, 25 + .word 0x619edb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t5, t6 + and s0, s0, t4 + xor s0, s0, t6 + addw a3, a3, s6 + addw a3, a3, s0 + addw s6, s8, s9 + addw a3, a3, s6 + # roriw s10, a4, 2 + .word 0x60275d1b + # roriw s11, a4, 13 + .word 0x60d75d9b + # roriw s7, a4, 22 + .word 0x61675b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a4, t1 + xor s6, t1, t2 + and s11, s11, s6 + xor s11, s11, t1 + addw t3, t3, a3 + addw s11, s7, s11 + addw a3, a3, s11 +#else + slliw s11, t4, 26 + srliw s10, t4, 6 + slliw s0, t4, 21 + srliw s6, t4, 11 + slliw s7, t4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a4, 30 + xor s6, s6, s10 + srliw s10, a4, 2 + slliw s0, a4, 19 + addw a3, a3, s6 + srliw s7, a4, 13 + slliw s6, a4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t5, t6 + xor s11, a4, t1 + xor s6, t1, t2 + xor s7, s7, s10 + and s0, s0, t4 + and s11, s11, s6 + xor s0, s0, t6 + addw s6, s8, s9 + addw a3, a3, s0 + xor s11, s11, t1 + addw a3, a3, s6 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, a5, 32 + srli s8, s2, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, s5, 17 + .word 0x611add1b + # roriw s11, s5, 19 + .word 0x613add9b + srliw s7, s5, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw a5, a5, s6 + addw s7, s7, s8 + addw a5, s7, a5 + srli s6, s5, 32 + # roriw s10, a6, 7 + .word 0x60785d1b + # roriw s11, a6, 18 + .word 0x61285d9b + srliw s8, a6, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, s3 + addw s7, s7, s11 + slli a5, a5, 32 + slli s7, s7, 32 + srli a5, a5, 32 + or a5, a5, s7 +#else + srli s9, a5, 32 + srli s8, s2, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, s5, 15 + srliw s11, s5, 17 + xor s6, s6, s10 + slliw s10, s5, 13 + srliw s7, s5, 19 + or s0, s0, s11 + srliw s11, s5, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw a5, a5, s6 + addw s7, s7, s8 + addw a5, s7, a5 + srli s6, s5, 32 + slliw s10, a6, 25 + srliw s11, a6, 7 + slliw s0, a6, 14 + srliw s8, a6, 18 + or s10, s10, s11 + srliw s11, a6, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, s3 + addw s7, s7, s11 + slli a5, a5, 32 + slli s7, s7, 32 + srli a5, a5, 32 + or a5, a5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 8(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t3, 6 + .word 0x606e5d1b + # roriw s11, t3, 11 + .word 0x60be5d9b + # roriw s6, t3, 25 + .word 0x619e5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t4, t5 + and s0, s0, t3 + xor s0, s0, t5 + addw t6, t6, s6 + addw t6, t6, s0 + addw s6, s8, a6 + addw t6, t6, s6 + # roriw s10, a3, 2 + .word 0x6026dd1b + # roriw s11, a3, 13 + .word 0x60d6dd9b + # roriw s7, a3, 22 + .word 0x6166db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a3, a4 + xor s6, a4, t1 + and s11, s11, s6 + xor s11, s11, a4 + addw t2, t2, t6 + addw s11, s7, s11 + addw t6, t6, s11 +#else + slliw s11, t3, 26 + srliw s10, t3, 6 + slliw s0, t3, 21 + srliw s6, t3, 11 + slliw s7, t3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a3, 30 + xor s6, s6, s10 + srliw s10, a3, 2 + slliw s0, a3, 19 + addw t6, t6, s6 + srliw s7, a3, 13 + slliw s6, a3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t4, t5 + xor s11, a3, a4 + xor s6, a4, t1 + xor s7, s7, s10 + and s0, s0, t3 + and s11, s11, s6 + xor s0, s0, t5 + addw s6, s8, a6 + addw t6, t6, s0 + xor s11, s11, a4 + addw t6, t6, s6 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, a6, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t2, 6 + .word 0x6063dd1b + # roriw s11, t2, 11 + .word 0x60b3dd9b + # roriw s6, t2, 25 + .word 0x6193db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t3, t4 + and s0, s0, t2 + xor s0, s0, t4 + addw t5, t5, s6 + addw t5, t5, s0 + addw s6, s8, s9 + addw t5, t5, s6 + # roriw s10, t6, 2 + .word 0x602fdd1b + # roriw s11, t6, 13 + .word 0x60dfdd9b + # roriw s7, t6, 22 + .word 0x616fdb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t6, a3 + xor s6, a3, a4 + and s11, s11, s6 + xor s11, s11, a3 + addw t1, t1, t5 + addw s11, s7, s11 + addw t5, t5, s11 +#else + slliw s11, t2, 26 + srliw s10, t2, 6 + slliw s0, t2, 21 + srliw s6, t2, 11 + slliw s7, t2, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t2, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t6, 30 + xor s6, s6, s10 + srliw s10, t6, 2 + slliw s0, t6, 19 + addw t5, t5, s6 + srliw s7, t6, 13 + slliw s6, t6, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t6, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t3, t4 + xor s11, t6, a3 + xor s6, a3, a4 + xor s7, s7, s10 + and s0, s0, t2 + and s11, s11, s6 + xor s0, s0, t4 + addw s6, s8, s9 + addw t5, t5, s0 + xor s11, s11, a3 + addw t5, t5, s6 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, a6, 32 + srli s8, s3, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, a5, 17 + .word 0x6117dd1b + # roriw s11, a5, 19 + .word 0x6137dd9b + srliw s7, a5, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw a6, a6, s6 + addw s7, s7, s8 + addw a6, s7, a6 + srli s6, a5, 32 + # roriw s10, a7, 7 + .word 0x6078dd1b + # roriw s11, a7, 18 + .word 0x6128dd9b + srliw s8, a7, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, s4 + addw s7, s7, s11 + slli a6, a6, 32 + slli s7, s7, 32 + srli a6, a6, 32 + or a6, a6, s7 +#else + srli s9, a6, 32 + srli s8, s3, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, a5, 15 + srliw s11, a5, 17 + xor s6, s6, s10 + slliw s10, a5, 13 + srliw s7, a5, 19 + or s0, s0, s11 + srliw s11, a5, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw a6, a6, s6 + addw s7, s7, s8 + addw a6, s7, a6 + srli s6, a5, 32 + slliw s10, a7, 25 + srliw s11, a7, 7 + slliw s0, a7, 14 + srliw s8, a7, 18 + or s10, s10, s11 + srliw s11, a7, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, s4 + addw s7, s7, s11 + slli a6, a6, 32 + slli s7, s7, 32 + srli a6, a6, 32 + or a6, a6, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 16(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t1, 6 + .word 0x60635d1b + # roriw s11, t1, 11 + .word 0x60b35d9b + # roriw s6, t1, 25 + .word 0x61935b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t2, t3 + and s0, s0, t1 + xor s0, s0, t3 + addw t4, t4, s6 + addw t4, t4, s0 + addw s6, s8, a7 + addw t4, t4, s6 + # roriw s10, t5, 2 + .word 0x602f5d1b + # roriw s11, t5, 13 + .word 0x60df5d9b + # roriw s7, t5, 22 + .word 0x616f5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t5, t6 + xor s6, t6, a3 + and s11, s11, s6 + xor s11, s11, t6 + addw a4, a4, t4 + addw s11, s7, s11 + addw t4, t4, s11 +#else + slliw s11, t1, 26 + srliw s10, t1, 6 + slliw s0, t1, 21 + srliw s6, t1, 11 + slliw s7, t1, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t1, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t5, 30 + xor s6, s6, s10 + srliw s10, t5, 2 + slliw s0, t5, 19 + addw t4, t4, s6 + srliw s7, t5, 13 + slliw s6, t5, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t5, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t2, t3 + xor s11, t5, t6 + xor s6, t6, a3 + xor s7, s7, s10 + and s0, s0, t1 + and s11, s11, s6 + xor s0, s0, t3 + addw s6, s8, a7 + addw t4, t4, s0 + xor s11, s11, t6 + addw t4, t4, s6 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, a7, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a4, 6 + .word 0x60675d1b + # roriw s11, a4, 11 + .word 0x60b75d9b + # roriw s6, a4, 25 + .word 0x61975b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t1, t2 + and s0, s0, a4 + xor s0, s0, t2 + addw t3, t3, s6 + addw t3, t3, s0 + addw s6, s8, s9 + addw t3, t3, s6 + # roriw s10, t4, 2 + .word 0x602edd1b + # roriw s11, t4, 13 + .word 0x60dedd9b + # roriw s7, t4, 22 + .word 0x616edb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t4, t5 + xor s6, t5, t6 + and s11, s11, s6 + xor s11, s11, t5 + addw a3, a3, t3 + addw s11, s7, s11 + addw t3, t3, s11 +#else + slliw s11, a4, 26 + srliw s10, a4, 6 + slliw s0, a4, 21 + srliw s6, a4, 11 + slliw s7, a4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t4, 30 + xor s6, s6, s10 + srliw s10, t4, 2 + slliw s0, t4, 19 + addw t3, t3, s6 + srliw s7, t4, 13 + slliw s6, t4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t1, t2 + xor s11, t4, t5 + xor s6, t5, t6 + xor s7, s7, s10 + and s0, s0, a4 + and s11, s11, s6 + xor s0, s0, t2 + addw s6, s8, s9 + addw t3, t3, s0 + xor s11, s11, t5 + addw t3, t3, s6 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, a7, 32 + srli s8, s4, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, a6, 17 + .word 0x61185d1b + # roriw s11, a6, 19 + .word 0x61385d9b + srliw s7, a6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw a7, a7, s6 + addw s7, s7, s8 + addw a7, s7, a7 + srli s6, a6, 32 + # roriw s10, s1, 7 + .word 0x6074dd1b + # roriw s11, s1, 18 + .word 0x6124dd9b + srliw s8, s1, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, s5 + addw s7, s7, s11 + slli a7, a7, 32 + slli s7, s7, 32 + srli a7, a7, 32 + or a7, a7, s7 +#else + srli s9, a7, 32 + srli s8, s4, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, a6, 15 + srliw s11, a6, 17 + xor s6, s6, s10 + slliw s10, a6, 13 + srliw s7, a6, 19 + or s0, s0, s11 + srliw s11, a6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw a7, a7, s6 + addw s7, s7, s8 + addw a7, s7, a7 + srli s6, a6, 32 + slliw s10, s1, 25 + srliw s11, s1, 7 + slliw s0, s1, 14 + srliw s8, s1, 18 + or s10, s10, s11 + srliw s11, s1, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, s5 + addw s7, s7, s11 + slli a7, a7, 32 + slli s7, s7, 32 + srli a7, a7, 32 + or a7, a7, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 24(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a3, 6 + .word 0x6066dd1b + # roriw s11, a3, 11 + .word 0x60b6dd9b + # roriw s6, a3, 25 + .word 0x6196db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a4, t1 + and s0, s0, a3 + xor s0, s0, t1 + addw t2, t2, s6 + addw t2, t2, s0 + addw s6, s8, s1 + addw t2, t2, s6 + # roriw s10, t3, 2 + .word 0x602e5d1b + # roriw s11, t3, 13 + .word 0x60de5d9b + # roriw s7, t3, 22 + .word 0x616e5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t3, t4 + xor s6, t4, t5 + and s11, s11, s6 + xor s11, s11, t4 + addw t6, t6, t2 + addw s11, s7, s11 + addw t2, t2, s11 +#else + slliw s11, a3, 26 + srliw s10, a3, 6 + slliw s0, a3, 21 + srliw s6, a3, 11 + slliw s7, a3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t3, 30 + xor s6, s6, s10 + srliw s10, t3, 2 + slliw s0, t3, 19 + addw t2, t2, s6 + srliw s7, t3, 13 + slliw s6, t3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a4, t1 + xor s11, t3, t4 + xor s6, t4, t5 + xor s7, s7, s10 + and s0, s0, a3 + and s11, s11, s6 + xor s0, s0, t1 + addw s6, s8, s1 + addw t2, t2, s0 + xor s11, s11, t4 + addw t2, t2, s6 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s1, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t6, 6 + .word 0x606fdd1b + # roriw s11, t6, 11 + .word 0x60bfdd9b + # roriw s6, t6, 25 + .word 0x619fdb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a3, a4 + and s0, s0, t6 + xor s0, s0, a4 + addw t1, t1, s6 + addw t1, t1, s0 + addw s6, s8, s9 + addw t1, t1, s6 + # roriw s10, t2, 2 + .word 0x6023dd1b + # roriw s11, t2, 13 + .word 0x60d3dd9b + # roriw s7, t2, 22 + .word 0x6163db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t2, t3 + xor s6, t3, t4 + and s11, s11, s6 + xor s11, s11, t3 + addw t5, t5, t1 + addw s11, s7, s11 + addw t1, t1, s11 +#else + slliw s11, t6, 26 + srliw s10, t6, 6 + slliw s0, t6, 21 + srliw s6, t6, 11 + slliw s7, t6, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t6, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t2, 30 + xor s6, s6, s10 + srliw s10, t2, 2 + slliw s0, t2, 19 + addw t1, t1, s6 + srliw s7, t2, 13 + slliw s6, t2, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t2, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a3, a4 + xor s11, t2, t3 + xor s6, t3, t4 + xor s7, s7, s10 + and s0, s0, t6 + and s11, s11, s6 + xor s0, s0, a4 + addw s6, s8, s9 + addw t1, t1, s0 + xor s11, s11, t3 + addw t1, t1, s6 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, s1, 32 + srli s8, s5, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, a7, 17 + .word 0x6118dd1b + # roriw s11, a7, 19 + .word 0x6138dd9b + srliw s7, a7, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s1, s1, s6 + addw s7, s7, s8 + addw s1, s7, s1 + srli s6, a7, 32 + # roriw s10, s2, 7 + .word 0x60795d1b + # roriw s11, s2, 18 + .word 0x61295d9b + srliw s8, s2, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, a5 + addw s7, s7, s11 + slli s1, s1, 32 + slli s7, s7, 32 + srli s1, s1, 32 + or s1, s1, s7 +#else + srli s9, s1, 32 + srli s8, s5, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, a7, 15 + srliw s11, a7, 17 + xor s6, s6, s10 + slliw s10, a7, 13 + srliw s7, a7, 19 + or s0, s0, s11 + srliw s11, a7, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s1, s1, s6 + addw s7, s7, s8 + addw s1, s7, s1 + srli s6, a7, 32 + slliw s10, s2, 25 + srliw s11, s2, 7 + slliw s0, s2, 14 + srliw s8, s2, 18 + or s10, s10, s11 + srliw s11, s2, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, a5 + addw s7, s7, s11 + slli s1, s1, 32 + slli s7, s7, 32 + srli s1, s1, 32 + or s1, s1, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 32(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t5, 6 + .word 0x606f5d1b + # roriw s11, t5, 11 + .word 0x60bf5d9b + # roriw s6, t5, 25 + .word 0x619f5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t6, a3 + and s0, s0, t5 + xor s0, s0, a3 + addw a4, a4, s6 + addw a4, a4, s0 + addw s6, s8, s2 + addw a4, a4, s6 + # roriw s10, t1, 2 + .word 0x60235d1b + # roriw s11, t1, 13 + .word 0x60d35d9b + # roriw s7, t1, 22 + .word 0x61635b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t1, t2 + xor s6, t2, t3 + and s11, s11, s6 + xor s11, s11, t2 + addw t4, t4, a4 + addw s11, s7, s11 + addw a4, a4, s11 +#else + slliw s11, t5, 26 + srliw s10, t5, 6 + slliw s0, t5, 21 + srliw s6, t5, 11 + slliw s7, t5, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t5, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t1, 30 + xor s6, s6, s10 + srliw s10, t1, 2 + slliw s0, t1, 19 + addw a4, a4, s6 + srliw s7, t1, 13 + slliw s6, t1, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t1, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t6, a3 + xor s11, t1, t2 + xor s6, t2, t3 + xor s7, s7, s10 + and s0, s0, t5 + and s11, s11, s6 + xor s0, s0, a3 + addw s6, s8, s2 + addw a4, a4, s0 + xor s11, s11, t2 + addw a4, a4, s6 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s2, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t4, 6 + .word 0x606edd1b + # roriw s11, t4, 11 + .word 0x60bedd9b + # roriw s6, t4, 25 + .word 0x619edb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t5, t6 + and s0, s0, t4 + xor s0, s0, t6 + addw a3, a3, s6 + addw a3, a3, s0 + addw s6, s8, s9 + addw a3, a3, s6 + # roriw s10, a4, 2 + .word 0x60275d1b + # roriw s11, a4, 13 + .word 0x60d75d9b + # roriw s7, a4, 22 + .word 0x61675b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a4, t1 + xor s6, t1, t2 + and s11, s11, s6 + xor s11, s11, t1 + addw t3, t3, a3 + addw s11, s7, s11 + addw a3, a3, s11 +#else + slliw s11, t4, 26 + srliw s10, t4, 6 + slliw s0, t4, 21 + srliw s6, t4, 11 + slliw s7, t4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a4, 30 + xor s6, s6, s10 + srliw s10, a4, 2 + slliw s0, a4, 19 + addw a3, a3, s6 + srliw s7, a4, 13 + slliw s6, a4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t5, t6 + xor s11, a4, t1 + xor s6, t1, t2 + xor s7, s7, s10 + and s0, s0, t4 + and s11, s11, s6 + xor s0, s0, t6 + addw s6, s8, s9 + addw a3, a3, s0 + xor s11, s11, t1 + addw a3, a3, s6 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, s2, 32 + srli s8, a5, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, s1, 17 + .word 0x6114dd1b + # roriw s11, s1, 19 + .word 0x6134dd9b + srliw s7, s1, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s2, s2, s6 + addw s7, s7, s8 + addw s2, s7, s2 + srli s6, s1, 32 + # roriw s10, s3, 7 + .word 0x6079dd1b + # roriw s11, s3, 18 + .word 0x6129dd9b + srliw s8, s3, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, a6 + addw s7, s7, s11 + slli s2, s2, 32 + slli s7, s7, 32 + srli s2, s2, 32 + or s2, s2, s7 +#else + srli s9, s2, 32 + srli s8, a5, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, s1, 15 + srliw s11, s1, 17 + xor s6, s6, s10 + slliw s10, s1, 13 + srliw s7, s1, 19 + or s0, s0, s11 + srliw s11, s1, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s2, s2, s6 + addw s7, s7, s8 + addw s2, s7, s2 + srli s6, s1, 32 + slliw s10, s3, 25 + srliw s11, s3, 7 + slliw s0, s3, 14 + srliw s8, s3, 18 + or s10, s10, s11 + srliw s11, s3, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, a6 + addw s7, s7, s11 + slli s2, s2, 32 + slli s7, s7, 32 + srli s2, s2, 32 + or s2, s2, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 40(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t3, 6 + .word 0x606e5d1b + # roriw s11, t3, 11 + .word 0x60be5d9b + # roriw s6, t3, 25 + .word 0x619e5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t4, t5 + and s0, s0, t3 + xor s0, s0, t5 + addw t6, t6, s6 + addw t6, t6, s0 + addw s6, s8, s3 + addw t6, t6, s6 + # roriw s10, a3, 2 + .word 0x6026dd1b + # roriw s11, a3, 13 + .word 0x60d6dd9b + # roriw s7, a3, 22 + .word 0x6166db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a3, a4 + xor s6, a4, t1 + and s11, s11, s6 + xor s11, s11, a4 + addw t2, t2, t6 + addw s11, s7, s11 + addw t6, t6, s11 +#else + slliw s11, t3, 26 + srliw s10, t3, 6 + slliw s0, t3, 21 + srliw s6, t3, 11 + slliw s7, t3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a3, 30 + xor s6, s6, s10 + srliw s10, a3, 2 + slliw s0, a3, 19 + addw t6, t6, s6 + srliw s7, a3, 13 + slliw s6, a3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t4, t5 + xor s11, a3, a4 + xor s6, a4, t1 + xor s7, s7, s10 + and s0, s0, t3 + and s11, s11, s6 + xor s0, s0, t5 + addw s6, s8, s3 + addw t6, t6, s0 + xor s11, s11, a4 + addw t6, t6, s6 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s3, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t2, 6 + .word 0x6063dd1b + # roriw s11, t2, 11 + .word 0x60b3dd9b + # roriw s6, t2, 25 + .word 0x6193db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t3, t4 + and s0, s0, t2 + xor s0, s0, t4 + addw t5, t5, s6 + addw t5, t5, s0 + addw s6, s8, s9 + addw t5, t5, s6 + # roriw s10, t6, 2 + .word 0x602fdd1b + # roriw s11, t6, 13 + .word 0x60dfdd9b + # roriw s7, t6, 22 + .word 0x616fdb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t6, a3 + xor s6, a3, a4 + and s11, s11, s6 + xor s11, s11, a3 + addw t1, t1, t5 + addw s11, s7, s11 + addw t5, t5, s11 +#else + slliw s11, t2, 26 + srliw s10, t2, 6 + slliw s0, t2, 21 + srliw s6, t2, 11 + slliw s7, t2, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t2, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t6, 30 + xor s6, s6, s10 + srliw s10, t6, 2 + slliw s0, t6, 19 + addw t5, t5, s6 + srliw s7, t6, 13 + slliw s6, t6, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t6, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t3, t4 + xor s11, t6, a3 + xor s6, a3, a4 + xor s7, s7, s10 + and s0, s0, t2 + and s11, s11, s6 + xor s0, s0, t4 + addw s6, s8, s9 + addw t5, t5, s0 + xor s11, s11, a3 + addw t5, t5, s6 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, s3, 32 + srli s8, a6, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, s2, 17 + .word 0x61195d1b + # roriw s11, s2, 19 + .word 0x61395d9b + srliw s7, s2, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s3, s3, s6 + addw s7, s7, s8 + addw s3, s7, s3 + srli s6, s2, 32 + # roriw s10, s4, 7 + .word 0x607a5d1b + # roriw s11, s4, 18 + .word 0x612a5d9b + srliw s8, s4, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, a7 + addw s7, s7, s11 + slli s3, s3, 32 + slli s7, s7, 32 + srli s3, s3, 32 + or s3, s3, s7 +#else + srli s9, s3, 32 + srli s8, a6, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, s2, 15 + srliw s11, s2, 17 + xor s6, s6, s10 + slliw s10, s2, 13 + srliw s7, s2, 19 + or s0, s0, s11 + srliw s11, s2, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s3, s3, s6 + addw s7, s7, s8 + addw s3, s7, s3 + srli s6, s2, 32 + slliw s10, s4, 25 + srliw s11, s4, 7 + slliw s0, s4, 14 + srliw s8, s4, 18 + or s10, s10, s11 + srliw s11, s4, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, a7 + addw s7, s7, s11 + slli s3, s3, 32 + slli s7, s7, 32 + srli s3, s3, 32 + or s3, s3, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 48(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t1, 6 + .word 0x60635d1b + # roriw s11, t1, 11 + .word 0x60b35d9b + # roriw s6, t1, 25 + .word 0x61935b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t2, t3 + and s0, s0, t1 + xor s0, s0, t3 + addw t4, t4, s6 + addw t4, t4, s0 + addw s6, s8, s4 + addw t4, t4, s6 + # roriw s10, t5, 2 + .word 0x602f5d1b + # roriw s11, t5, 13 + .word 0x60df5d9b + # roriw s7, t5, 22 + .word 0x616f5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t5, t6 + xor s6, t6, a3 + and s11, s11, s6 + xor s11, s11, t6 + addw a4, a4, t4 + addw s11, s7, s11 + addw t4, t4, s11 +#else + slliw s11, t1, 26 + srliw s10, t1, 6 + slliw s0, t1, 21 + srliw s6, t1, 11 + slliw s7, t1, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t1, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t5, 30 + xor s6, s6, s10 + srliw s10, t5, 2 + slliw s0, t5, 19 + addw t4, t4, s6 + srliw s7, t5, 13 + slliw s6, t5, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t5, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t2, t3 + xor s11, t5, t6 + xor s6, t6, a3 + xor s7, s7, s10 + and s0, s0, t1 + and s11, s11, s6 + xor s0, s0, t3 + addw s6, s8, s4 + addw t4, t4, s0 + xor s11, s11, t6 + addw t4, t4, s6 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s4, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a4, 6 + .word 0x60675d1b + # roriw s11, a4, 11 + .word 0x60b75d9b + # roriw s6, a4, 25 + .word 0x61975b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t1, t2 + and s0, s0, a4 + xor s0, s0, t2 + addw t3, t3, s6 + addw t3, t3, s0 + addw s6, s8, s9 + addw t3, t3, s6 + # roriw s10, t4, 2 + .word 0x602edd1b + # roriw s11, t4, 13 + .word 0x60dedd9b + # roriw s7, t4, 22 + .word 0x616edb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t4, t5 + xor s6, t5, t6 + and s11, s11, s6 + xor s11, s11, t5 + addw a3, a3, t3 + addw s11, s7, s11 + addw t3, t3, s11 +#else + slliw s11, a4, 26 + srliw s10, a4, 6 + slliw s0, a4, 21 + srliw s6, a4, 11 + slliw s7, a4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t4, 30 + xor s6, s6, s10 + srliw s10, t4, 2 + slliw s0, t4, 19 + addw t3, t3, s6 + srliw s7, t4, 13 + slliw s6, t4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t1, t2 + xor s11, t4, t5 + xor s6, t5, t6 + xor s7, s7, s10 + and s0, s0, a4 + and s11, s11, s6 + xor s0, s0, t2 + addw s6, s8, s9 + addw t3, t3, s0 + xor s11, s11, t5 + addw t3, t3, s6 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, s4, 32 + srli s8, a7, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, s3, 17 + .word 0x6119dd1b + # roriw s11, s3, 19 + .word 0x6139dd9b + srliw s7, s3, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s4, s4, s6 + addw s7, s7, s8 + addw s4, s7, s4 + srli s6, s3, 32 + # roriw s10, s5, 7 + .word 0x607add1b + # roriw s11, s5, 18 + .word 0x612add9b + srliw s8, s5, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, s1 + addw s7, s7, s11 + slli s4, s4, 32 + slli s7, s7, 32 + srli s4, s4, 32 + or s4, s4, s7 +#else + srli s9, s4, 32 + srli s8, a7, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, s3, 15 + srliw s11, s3, 17 + xor s6, s6, s10 + slliw s10, s3, 13 + srliw s7, s3, 19 + or s0, s0, s11 + srliw s11, s3, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s4, s4, s6 + addw s7, s7, s8 + addw s4, s7, s4 + srli s6, s3, 32 + slliw s10, s5, 25 + srliw s11, s5, 7 + slliw s0, s5, 14 + srliw s8, s5, 18 + or s10, s10, s11 + srliw s11, s5, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, s1 + addw s7, s7, s11 + slli s4, s4, 32 + slli s7, s7, 32 + srli s4, s4, 32 + or s4, s4, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 56(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a3, 6 + .word 0x6066dd1b + # roriw s11, a3, 11 + .word 0x60b6dd9b + # roriw s6, a3, 25 + .word 0x6196db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a4, t1 + and s0, s0, a3 + xor s0, s0, t1 + addw t2, t2, s6 + addw t2, t2, s0 + addw s6, s8, s5 + addw t2, t2, s6 + # roriw s10, t3, 2 + .word 0x602e5d1b + # roriw s11, t3, 13 + .word 0x60de5d9b + # roriw s7, t3, 22 + .word 0x616e5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t3, t4 + xor s6, t4, t5 + and s11, s11, s6 + xor s11, s11, t4 + addw t6, t6, t2 + addw s11, s7, s11 + addw t2, t2, s11 +#else + slliw s11, a3, 26 + srliw s10, a3, 6 + slliw s0, a3, 21 + srliw s6, a3, 11 + slliw s7, a3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t3, 30 + xor s6, s6, s10 + srliw s10, t3, 2 + slliw s0, t3, 19 + addw t2, t2, s6 + srliw s7, t3, 13 + slliw s6, t3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a4, t1 + xor s11, t3, t4 + xor s6, t4, t5 + xor s7, s7, s10 + and s0, s0, a3 + and s11, s11, s6 + xor s0, s0, t1 + addw s6, s8, s5 + addw t2, t2, s0 + xor s11, s11, t4 + addw t2, t2, s6 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s5, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t6, 6 + .word 0x606fdd1b + # roriw s11, t6, 11 + .word 0x60bfdd9b + # roriw s6, t6, 25 + .word 0x619fdb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a3, a4 + and s0, s0, t6 + xor s0, s0, a4 + addw t1, t1, s6 + addw t1, t1, s0 + addw s6, s8, s9 + addw t1, t1, s6 + # roriw s10, t2, 2 + .word 0x6023dd1b + # roriw s11, t2, 13 + .word 0x60d3dd9b + # roriw s7, t2, 22 + .word 0x6163db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t2, t3 + xor s6, t3, t4 + and s11, s11, s6 + xor s11, s11, t3 + addw t5, t5, t1 + addw s11, s7, s11 + addw t1, t1, s11 +#else + slliw s11, t6, 26 + srliw s10, t6, 6 + slliw s0, t6, 21 + srliw s6, t6, 11 + slliw s7, t6, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t6, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t2, 30 + xor s6, s6, s10 + srliw s10, t2, 2 + slliw s0, t2, 19 + addw t1, t1, s6 + srliw s7, t2, 13 + slliw s6, t2, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t2, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a3, a4 + xor s11, t2, t3 + xor s6, t3, t4 + xor s7, s7, s10 + and s0, s0, t6 + and s11, s11, s6 + xor s0, s0, a4 + addw s6, s8, s9 + addw t1, t1, s0 + xor s11, s11, t3 + addw t1, t1, s6 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, s5, 32 + srli s8, s1, 32 + # roriw s10, s9, 7 + .word 0x607cdd1b + # roriw s11, s9, 18 + .word 0x612cdd9b + srliw s6, s9, 3 + xor s6, s6, s10 + xor s6, s6, s11 + # roriw s10, s4, 17 + .word 0x611a5d1b + # roriw s11, s4, 19 + .word 0x613a5d9b + srliw s7, s4, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s5, s5, s6 + addw s7, s7, s8 + addw s5, s7, s5 + srli s6, s4, 32 + # roriw s10, a5, 7 + .word 0x6077dd1b + # roriw s11, a5, 18 + .word 0x6127dd9b + srliw s8, a5, 3 + xor s8, s8, s10 + xor s8, s8, s11 + # roriw s10, s6, 17 + .word 0x611b5d1b + # roriw s11, s6, 19 + .word 0x613b5d9b + srliw s7, s6, 10 + xor s7, s7, s10 + xor s7, s7, s11 + addw s11, s8, s9 + addw s7, s7, s2 + addw s7, s7, s11 + slli s5, s5, 32 + slli s7, s7, 32 + srli s5, s5, 32 + or s5, s5, s7 +#else + srli s9, s5, 32 + srli s8, s1, 32 + slliw s10, s9, 25 + srliw s11, s9, 7 + slliw s0, s9, 14 + srliw s6, s9, 18 + or s10, s10, s11 + srliw s11, s9, 3 + xor s6, s6, s0 + xor s10, s10, s11 + slliw s0, s4, 15 + srliw s11, s4, 17 + xor s6, s6, s10 + slliw s10, s4, 13 + srliw s7, s4, 19 + or s0, s0, s11 + srliw s11, s4, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s5, s5, s6 + addw s7, s7, s8 + addw s5, s7, s5 + srli s6, s4, 32 + slliw s10, a5, 25 + srliw s11, a5, 7 + slliw s0, a5, 14 + srliw s8, a5, 18 + or s10, s10, s11 + srliw s11, a5, 3 + xor s8, s8, s0 + xor s10, s10, s11 + slliw s0, s6, 15 + srliw s11, s6, 17 + xor s8, s8, s10 + slliw s10, s6, 13 + srliw s7, s6, 19 + or s0, s0, s11 + srliw s11, s6, 10 + xor s7, s7, s10 + xor s0, s0, s11 + xor s7, s7, s0 + addw s11, s8, s9 + addw s7, s7, s2 + addw s7, s7, s11 + slli s5, s5, 32 + slli s7, s7, 32 + srli s5, s5, 32 + or s5, s5, s7 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + addi a2, a2, -1 + addi t0, t0, 64 + andi s6, a2, 3 + bnez s6, L_SHA256_transform_riscv_len_inner + ld s8, 0(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t5, 6 + .word 0x606f5d1b + # roriw s11, t5, 11 + .word 0x60bf5d9b + # roriw s6, t5, 25 + .word 0x619f5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t6, a3 + and s0, s0, t5 + xor s0, s0, a3 + addw a4, a4, s6 + addw a4, a4, s0 + addw s6, s8, a5 + addw a4, a4, s6 + # roriw s10, t1, 2 + .word 0x60235d1b + # roriw s11, t1, 13 + .word 0x60d35d9b + # roriw s7, t1, 22 + .word 0x61635b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t1, t2 + xor s6, t2, t3 + and s11, s11, s6 + xor s11, s11, t2 + addw t4, t4, a4 + addw s11, s7, s11 + addw a4, a4, s11 +#else + slliw s11, t5, 26 + srliw s10, t5, 6 + slliw s0, t5, 21 + srliw s6, t5, 11 + slliw s7, t5, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t5, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t1, 30 + xor s6, s6, s10 + srliw s10, t1, 2 + slliw s0, t1, 19 + addw a4, a4, s6 + srliw s7, t1, 13 + slliw s6, t1, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t1, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t6, a3 + xor s11, t1, t2 + xor s6, t2, t3 + xor s7, s7, s10 + and s0, s0, t5 + and s11, s11, s6 + xor s0, s0, a3 + addw s6, s8, a5 + addw a4, a4, s0 + xor s11, s11, t2 + addw a4, a4, s6 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, a5, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t4, 6 + .word 0x606edd1b + # roriw s11, t4, 11 + .word 0x60bedd9b + # roriw s6, t4, 25 + .word 0x619edb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t5, t6 + and s0, s0, t4 + xor s0, s0, t6 + addw a3, a3, s6 + addw a3, a3, s0 + addw s6, s8, s9 + addw a3, a3, s6 + # roriw s10, a4, 2 + .word 0x60275d1b + # roriw s11, a4, 13 + .word 0x60d75d9b + # roriw s7, a4, 22 + .word 0x61675b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a4, t1 + xor s6, t1, t2 + and s11, s11, s6 + xor s11, s11, t1 + addw t3, t3, a3 + addw s11, s7, s11 + addw a3, a3, s11 +#else + slliw s11, t4, 26 + srliw s10, t4, 6 + slliw s0, t4, 21 + srliw s6, t4, 11 + slliw s7, t4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a4, 30 + xor s6, s6, s10 + srliw s10, a4, 2 + slliw s0, a4, 19 + addw a3, a3, s6 + srliw s7, a4, 13 + slliw s6, a4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t5, t6 + xor s11, a4, t1 + xor s6, t1, t2 + xor s7, s7, s10 + and s0, s0, t4 + and s11, s11, s6 + xor s0, s0, t6 + addw s6, s8, s9 + addw a3, a3, s0 + xor s11, s11, t1 + addw a3, a3, s6 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 8(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t3, 6 + .word 0x606e5d1b + # roriw s11, t3, 11 + .word 0x60be5d9b + # roriw s6, t3, 25 + .word 0x619e5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t4, t5 + and s0, s0, t3 + xor s0, s0, t5 + addw t6, t6, s6 + addw t6, t6, s0 + addw s6, s8, a6 + addw t6, t6, s6 + # roriw s10, a3, 2 + .word 0x6026dd1b + # roriw s11, a3, 13 + .word 0x60d6dd9b + # roriw s7, a3, 22 + .word 0x6166db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a3, a4 + xor s6, a4, t1 + and s11, s11, s6 + xor s11, s11, a4 + addw t2, t2, t6 + addw s11, s7, s11 + addw t6, t6, s11 +#else + slliw s11, t3, 26 + srliw s10, t3, 6 + slliw s0, t3, 21 + srliw s6, t3, 11 + slliw s7, t3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a3, 30 + xor s6, s6, s10 + srliw s10, a3, 2 + slliw s0, a3, 19 + addw t6, t6, s6 + srliw s7, a3, 13 + slliw s6, a3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t4, t5 + xor s11, a3, a4 + xor s6, a4, t1 + xor s7, s7, s10 + and s0, s0, t3 + and s11, s11, s6 + xor s0, s0, t5 + addw s6, s8, a6 + addw t6, t6, s0 + xor s11, s11, a4 + addw t6, t6, s6 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, a6, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t2, 6 + .word 0x6063dd1b + # roriw s11, t2, 11 + .word 0x60b3dd9b + # roriw s6, t2, 25 + .word 0x6193db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t3, t4 + and s0, s0, t2 + xor s0, s0, t4 + addw t5, t5, s6 + addw t5, t5, s0 + addw s6, s8, s9 + addw t5, t5, s6 + # roriw s10, t6, 2 + .word 0x602fdd1b + # roriw s11, t6, 13 + .word 0x60dfdd9b + # roriw s7, t6, 22 + .word 0x616fdb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t6, a3 + xor s6, a3, a4 + and s11, s11, s6 + xor s11, s11, a3 + addw t1, t1, t5 + addw s11, s7, s11 + addw t5, t5, s11 +#else + slliw s11, t2, 26 + srliw s10, t2, 6 + slliw s0, t2, 21 + srliw s6, t2, 11 + slliw s7, t2, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t2, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t6, 30 + xor s6, s6, s10 + srliw s10, t6, 2 + slliw s0, t6, 19 + addw t5, t5, s6 + srliw s7, t6, 13 + slliw s6, t6, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t6, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t3, t4 + xor s11, t6, a3 + xor s6, a3, a4 + xor s7, s7, s10 + and s0, s0, t2 + and s11, s11, s6 + xor s0, s0, t4 + addw s6, s8, s9 + addw t5, t5, s0 + xor s11, s11, a3 + addw t5, t5, s6 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 16(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t1, 6 + .word 0x60635d1b + # roriw s11, t1, 11 + .word 0x60b35d9b + # roriw s6, t1, 25 + .word 0x61935b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t2, t3 + and s0, s0, t1 + xor s0, s0, t3 + addw t4, t4, s6 + addw t4, t4, s0 + addw s6, s8, a7 + addw t4, t4, s6 + # roriw s10, t5, 2 + .word 0x602f5d1b + # roriw s11, t5, 13 + .word 0x60df5d9b + # roriw s7, t5, 22 + .word 0x616f5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t5, t6 + xor s6, t6, a3 + and s11, s11, s6 + xor s11, s11, t6 + addw a4, a4, t4 + addw s11, s7, s11 + addw t4, t4, s11 +#else + slliw s11, t1, 26 + srliw s10, t1, 6 + slliw s0, t1, 21 + srliw s6, t1, 11 + slliw s7, t1, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t1, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t5, 30 + xor s6, s6, s10 + srliw s10, t5, 2 + slliw s0, t5, 19 + addw t4, t4, s6 + srliw s7, t5, 13 + slliw s6, t5, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t5, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t2, t3 + xor s11, t5, t6 + xor s6, t6, a3 + xor s7, s7, s10 + and s0, s0, t1 + and s11, s11, s6 + xor s0, s0, t3 + addw s6, s8, a7 + addw t4, t4, s0 + xor s11, s11, t6 + addw t4, t4, s6 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, a7, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a4, 6 + .word 0x60675d1b + # roriw s11, a4, 11 + .word 0x60b75d9b + # roriw s6, a4, 25 + .word 0x61975b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t1, t2 + and s0, s0, a4 + xor s0, s0, t2 + addw t3, t3, s6 + addw t3, t3, s0 + addw s6, s8, s9 + addw t3, t3, s6 + # roriw s10, t4, 2 + .word 0x602edd1b + # roriw s11, t4, 13 + .word 0x60dedd9b + # roriw s7, t4, 22 + .word 0x616edb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t4, t5 + xor s6, t5, t6 + and s11, s11, s6 + xor s11, s11, t5 + addw a3, a3, t3 + addw s11, s7, s11 + addw t3, t3, s11 +#else + slliw s11, a4, 26 + srliw s10, a4, 6 + slliw s0, a4, 21 + srliw s6, a4, 11 + slliw s7, a4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t4, 30 + xor s6, s6, s10 + srliw s10, t4, 2 + slliw s0, t4, 19 + addw t3, t3, s6 + srliw s7, t4, 13 + slliw s6, t4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t1, t2 + xor s11, t4, t5 + xor s6, t5, t6 + xor s7, s7, s10 + and s0, s0, a4 + and s11, s11, s6 + xor s0, s0, t2 + addw s6, s8, s9 + addw t3, t3, s0 + xor s11, s11, t5 + addw t3, t3, s6 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 24(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a3, 6 + .word 0x6066dd1b + # roriw s11, a3, 11 + .word 0x60b6dd9b + # roriw s6, a3, 25 + .word 0x6196db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a4, t1 + and s0, s0, a3 + xor s0, s0, t1 + addw t2, t2, s6 + addw t2, t2, s0 + addw s6, s8, s1 + addw t2, t2, s6 + # roriw s10, t3, 2 + .word 0x602e5d1b + # roriw s11, t3, 13 + .word 0x60de5d9b + # roriw s7, t3, 22 + .word 0x616e5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t3, t4 + xor s6, t4, t5 + and s11, s11, s6 + xor s11, s11, t4 + addw t6, t6, t2 + addw s11, s7, s11 + addw t2, t2, s11 +#else + slliw s11, a3, 26 + srliw s10, a3, 6 + slliw s0, a3, 21 + srliw s6, a3, 11 + slliw s7, a3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t3, 30 + xor s6, s6, s10 + srliw s10, t3, 2 + slliw s0, t3, 19 + addw t2, t2, s6 + srliw s7, t3, 13 + slliw s6, t3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a4, t1 + xor s11, t3, t4 + xor s6, t4, t5 + xor s7, s7, s10 + and s0, s0, a3 + and s11, s11, s6 + xor s0, s0, t1 + addw s6, s8, s1 + addw t2, t2, s0 + xor s11, s11, t4 + addw t2, t2, s6 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s1, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t6, 6 + .word 0x606fdd1b + # roriw s11, t6, 11 + .word 0x60bfdd9b + # roriw s6, t6, 25 + .word 0x619fdb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a3, a4 + and s0, s0, t6 + xor s0, s0, a4 + addw t1, t1, s6 + addw t1, t1, s0 + addw s6, s8, s9 + addw t1, t1, s6 + # roriw s10, t2, 2 + .word 0x6023dd1b + # roriw s11, t2, 13 + .word 0x60d3dd9b + # roriw s7, t2, 22 + .word 0x6163db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t2, t3 + xor s6, t3, t4 + and s11, s11, s6 + xor s11, s11, t3 + addw t5, t5, t1 + addw s11, s7, s11 + addw t1, t1, s11 +#else + slliw s11, t6, 26 + srliw s10, t6, 6 + slliw s0, t6, 21 + srliw s6, t6, 11 + slliw s7, t6, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t6, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t2, 30 + xor s6, s6, s10 + srliw s10, t2, 2 + slliw s0, t2, 19 + addw t1, t1, s6 + srliw s7, t2, 13 + slliw s6, t2, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t2, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a3, a4 + xor s11, t2, t3 + xor s6, t3, t4 + xor s7, s7, s10 + and s0, s0, t6 + and s11, s11, s6 + xor s0, s0, a4 + addw s6, s8, s9 + addw t1, t1, s0 + xor s11, s11, t3 + addw t1, t1, s6 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 32(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t5, 6 + .word 0x606f5d1b + # roriw s11, t5, 11 + .word 0x60bf5d9b + # roriw s6, t5, 25 + .word 0x619f5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t6, a3 + and s0, s0, t5 + xor s0, s0, a3 + addw a4, a4, s6 + addw a4, a4, s0 + addw s6, s8, s2 + addw a4, a4, s6 + # roriw s10, t1, 2 + .word 0x60235d1b + # roriw s11, t1, 13 + .word 0x60d35d9b + # roriw s7, t1, 22 + .word 0x61635b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t1, t2 + xor s6, t2, t3 + and s11, s11, s6 + xor s11, s11, t2 + addw t4, t4, a4 + addw s11, s7, s11 + addw a4, a4, s11 +#else + slliw s11, t5, 26 + srliw s10, t5, 6 + slliw s0, t5, 21 + srliw s6, t5, 11 + slliw s7, t5, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t5, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t1, 30 + xor s6, s6, s10 + srliw s10, t1, 2 + slliw s0, t1, 19 + addw a4, a4, s6 + srliw s7, t1, 13 + slliw s6, t1, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t1, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t6, a3 + xor s11, t1, t2 + xor s6, t2, t3 + xor s7, s7, s10 + and s0, s0, t5 + and s11, s11, s6 + xor s0, s0, a3 + addw s6, s8, s2 + addw a4, a4, s0 + xor s11, s11, t2 + addw a4, a4, s6 + addw s11, s7, s11 + addw t4, t4, a4 + addw a4, a4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s2, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t4, 6 + .word 0x606edd1b + # roriw s11, t4, 11 + .word 0x60bedd9b + # roriw s6, t4, 25 + .word 0x619edb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t5, t6 + and s0, s0, t4 + xor s0, s0, t6 + addw a3, a3, s6 + addw a3, a3, s0 + addw s6, s8, s9 + addw a3, a3, s6 + # roriw s10, a4, 2 + .word 0x60275d1b + # roriw s11, a4, 13 + .word 0x60d75d9b + # roriw s7, a4, 22 + .word 0x61675b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a4, t1 + xor s6, t1, t2 + and s11, s11, s6 + xor s11, s11, t1 + addw t3, t3, a3 + addw s11, s7, s11 + addw a3, a3, s11 +#else + slliw s11, t4, 26 + srliw s10, t4, 6 + slliw s0, t4, 21 + srliw s6, t4, 11 + slliw s7, t4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a4, 30 + xor s6, s6, s10 + srliw s10, a4, 2 + slliw s0, a4, 19 + addw a3, a3, s6 + srliw s7, a4, 13 + slliw s6, a4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t5, t6 + xor s11, a4, t1 + xor s6, t1, t2 + xor s7, s7, s10 + and s0, s0, t4 + and s11, s11, s6 + xor s0, s0, t6 + addw s6, s8, s9 + addw a3, a3, s0 + xor s11, s11, t1 + addw a3, a3, s6 + addw s11, s7, s11 + addw t3, t3, a3 + addw a3, a3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 40(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t3, 6 + .word 0x606e5d1b + # roriw s11, t3, 11 + .word 0x60be5d9b + # roriw s6, t3, 25 + .word 0x619e5b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t4, t5 + and s0, s0, t3 + xor s0, s0, t5 + addw t6, t6, s6 + addw t6, t6, s0 + addw s6, s8, s3 + addw t6, t6, s6 + # roriw s10, a3, 2 + .word 0x6026dd1b + # roriw s11, a3, 13 + .word 0x60d6dd9b + # roriw s7, a3, 22 + .word 0x6166db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, a3, a4 + xor s6, a4, t1 + and s11, s11, s6 + xor s11, s11, a4 + addw t2, t2, t6 + addw s11, s7, s11 + addw t6, t6, s11 +#else + slliw s11, t3, 26 + srliw s10, t3, 6 + slliw s0, t3, 21 + srliw s6, t3, 11 + slliw s7, t3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, a3, 30 + xor s6, s6, s10 + srliw s10, a3, 2 + slliw s0, a3, 19 + addw t6, t6, s6 + srliw s7, a3, 13 + slliw s6, a3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, a3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t4, t5 + xor s11, a3, a4 + xor s6, a4, t1 + xor s7, s7, s10 + and s0, s0, t3 + and s11, s11, s6 + xor s0, s0, t5 + addw s6, s8, s3 + addw t6, t6, s0 + xor s11, s11, a4 + addw t6, t6, s6 + addw s11, s7, s11 + addw t2, t2, t6 + addw t6, t6, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s3, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t2, 6 + .word 0x6063dd1b + # roriw s11, t2, 11 + .word 0x60b3dd9b + # roriw s6, t2, 25 + .word 0x6193db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t3, t4 + and s0, s0, t2 + xor s0, s0, t4 + addw t5, t5, s6 + addw t5, t5, s0 + addw s6, s8, s9 + addw t5, t5, s6 + # roriw s10, t6, 2 + .word 0x602fdd1b + # roriw s11, t6, 13 + .word 0x60dfdd9b + # roriw s7, t6, 22 + .word 0x616fdb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t6, a3 + xor s6, a3, a4 + and s11, s11, s6 + xor s11, s11, a3 + addw t1, t1, t5 + addw s11, s7, s11 + addw t5, t5, s11 +#else + slliw s11, t2, 26 + srliw s10, t2, 6 + slliw s0, t2, 21 + srliw s6, t2, 11 + slliw s7, t2, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t2, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t6, 30 + xor s6, s6, s10 + srliw s10, t6, 2 + slliw s0, t6, 19 + addw t5, t5, s6 + srliw s7, t6, 13 + slliw s6, t6, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t6, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t3, t4 + xor s11, t6, a3 + xor s6, a3, a4 + xor s7, s7, s10 + and s0, s0, t2 + and s11, s11, s6 + xor s0, s0, t4 + addw s6, s8, s9 + addw t5, t5, s0 + xor s11, s11, a3 + addw t5, t5, s6 + addw s11, s7, s11 + addw t1, t1, t5 + addw t5, t5, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 48(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t1, 6 + .word 0x60635d1b + # roriw s11, t1, 11 + .word 0x60b35d9b + # roriw s6, t1, 25 + .word 0x61935b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t2, t3 + and s0, s0, t1 + xor s0, s0, t3 + addw t4, t4, s6 + addw t4, t4, s0 + addw s6, s8, s4 + addw t4, t4, s6 + # roriw s10, t5, 2 + .word 0x602f5d1b + # roriw s11, t5, 13 + .word 0x60df5d9b + # roriw s7, t5, 22 + .word 0x616f5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t5, t6 + xor s6, t6, a3 + and s11, s11, s6 + xor s11, s11, t6 + addw a4, a4, t4 + addw s11, s7, s11 + addw t4, t4, s11 +#else + slliw s11, t1, 26 + srliw s10, t1, 6 + slliw s0, t1, 21 + srliw s6, t1, 11 + slliw s7, t1, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t1, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t5, 30 + xor s6, s6, s10 + srliw s10, t5, 2 + slliw s0, t5, 19 + addw t4, t4, s6 + srliw s7, t5, 13 + slliw s6, t5, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t5, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t2, t3 + xor s11, t5, t6 + xor s6, t6, a3 + xor s7, s7, s10 + and s0, s0, t1 + and s11, s11, s6 + xor s0, s0, t3 + addw s6, s8, s4 + addw t4, t4, s0 + xor s11, s11, t6 + addw t4, t4, s6 + addw s11, s7, s11 + addw a4, a4, t4 + addw t4, t4, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s4, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a4, 6 + .word 0x60675d1b + # roriw s11, a4, 11 + .word 0x60b75d9b + # roriw s6, a4, 25 + .word 0x61975b1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, t1, t2 + and s0, s0, a4 + xor s0, s0, t2 + addw t3, t3, s6 + addw t3, t3, s0 + addw s6, s8, s9 + addw t3, t3, s6 + # roriw s10, t4, 2 + .word 0x602edd1b + # roriw s11, t4, 13 + .word 0x60dedd9b + # roriw s7, t4, 22 + .word 0x616edb9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t4, t5 + xor s6, t5, t6 + and s11, s11, s6 + xor s11, s11, t5 + addw a3, a3, t3 + addw s11, s7, s11 + addw t3, t3, s11 +#else + slliw s11, a4, 26 + srliw s10, a4, 6 + slliw s0, a4, 21 + srliw s6, a4, 11 + slliw s7, a4, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a4, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t4, 30 + xor s6, s6, s10 + srliw s10, t4, 2 + slliw s0, t4, 19 + addw t3, t3, s6 + srliw s7, t4, 13 + slliw s6, t4, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t4, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, t1, t2 + xor s11, t4, t5 + xor s6, t5, t6 + xor s7, s7, s10 + and s0, s0, a4 + and s11, s11, s6 + xor s0, s0, t2 + addw s6, s8, s9 + addw t3, t3, s0 + xor s11, s11, t5 + addw t3, t3, s6 + addw s11, s7, s11 + addw a3, a3, t3 + addw t3, t3, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 56(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, a3, 6 + .word 0x6066dd1b + # roriw s11, a3, 11 + .word 0x60b6dd9b + # roriw s6, a3, 25 + .word 0x6196db1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a4, t1 + and s0, s0, a3 + xor s0, s0, t1 + addw t2, t2, s6 + addw t2, t2, s0 + addw s6, s8, s5 + addw t2, t2, s6 + # roriw s10, t3, 2 + .word 0x602e5d1b + # roriw s11, t3, 13 + .word 0x60de5d9b + # roriw s7, t3, 22 + .word 0x616e5b9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t3, t4 + xor s6, t4, t5 + and s11, s11, s6 + xor s11, s11, t4 + addw t6, t6, t2 + addw s11, s7, s11 + addw t2, t2, s11 +#else + slliw s11, a3, 26 + srliw s10, a3, 6 + slliw s0, a3, 21 + srliw s6, a3, 11 + slliw s7, a3, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, a3, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t3, 30 + xor s6, s6, s10 + srliw s10, t3, 2 + slliw s0, t3, 19 + addw t2, t2, s6 + srliw s7, t3, 13 + slliw s6, t3, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t3, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a4, t1 + xor s11, t3, t4 + xor s6, t4, t5 + xor s7, s7, s10 + and s0, s0, a3 + and s11, s11, s6 + xor s0, s0, t1 + addw s6, s8, s5 + addw t2, t2, s0 + xor s11, s11, t4 + addw t2, t2, s6 + addw s11, s7, s11 + addw t6, t6, t2 + addw t2, t2, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + srli s8, s8, 32 + srli s9, s5, 32 +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # roriw s10, t6, 6 + .word 0x606fdd1b + # roriw s11, t6, 11 + .word 0x60bfdd9b + # roriw s6, t6, 25 + .word 0x619fdb1b + xor s6, s6, s10 + xor s6, s6, s11 + xor s0, a3, a4 + and s0, s0, t6 + xor s0, s0, a4 + addw t1, t1, s6 + addw t1, t1, s0 + addw s6, s8, s9 + addw t1, t1, s6 + # roriw s10, t2, 2 + .word 0x6023dd1b + # roriw s11, t2, 13 + .word 0x60d3dd9b + # roriw s7, t2, 22 + .word 0x6163db9b + xor s7, s7, s10 + xor s7, s7, s11 + xor s11, t2, t3 + xor s6, t3, t4 + and s11, s11, s6 + xor s11, s11, t3 + addw t5, t5, t1 + addw s11, s7, s11 + addw t1, t1, s11 +#else + slliw s11, t6, 26 + srliw s10, t6, 6 + slliw s0, t6, 21 + srliw s6, t6, 11 + slliw s7, t6, 7 + or s10, s10, s11 + xor s6, s6, s0 + srliw s11, t6, 25 + xor s10, s10, s7 + xor s6, s6, s11 + slliw s11, t2, 30 + xor s6, s6, s10 + srliw s10, t2, 2 + slliw s0, t2, 19 + addw t1, t1, s6 + srliw s7, t2, 13 + slliw s6, t2, 10 + or s10, s10, s11 + xor s7, s7, s0 + srliw s0, t2, 22 + xor s10, s10, s6 + xor s7, s7, s0 + xor s0, a3, a4 + xor s11, t2, t3 + xor s6, t3, t4 + xor s7, s7, s10 + and s0, s0, t6 + and s11, s11, s6 + xor s0, s0, a4 + addw s6, s8, s9 + addw t1, t1, s0 + xor s11, s11, t3 + addw t1, t1, s6 + addw s11, s7, s11 + addw t5, t5, t1 + addw t1, t1, s11 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + addi t0, t0, -192 + # Add working variables back into digest state + ld s6, 0(a0) + ld s7, 8(a0) + ld s8, 16(a0) + ld s9, 24(a0) + addw t1, t1, s6 + addw t3, t3, s7 + addw t5, t5, s8 + addw a3, a3, s9 + srli s6, s6, 32 + srli s7, s7, 32 + srli s8, s8, 32 + srli s9, s9, 32 + addw t2, t2, s6 + addw t4, t4, s7 + addw t6, t6, s8 + addw a4, a4, s9 + # Store digest + sw t1, 0(a0) + sw t2, 4(a0) + sw t3, 8(a0) + sw t4, 12(a0) + sw t5, 16(a0) + sw t6, 20(a0) + sw a3, 24(a0) + sw a4, 28(a0) + addi a1, a1, 64 + bnez a2, L_SHA256_transform_riscv_len_begin + ld s0, 0(sp) + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + ret + .size Transform_Sha256_Len_riscv,.-Transform_Sha256_Len_riscv +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ +#endif /* !NO_SHA256 || WOLFSSL_SHA224 */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm_c.c b/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm_c.c new file mode 100644 index 00000000000..38caf646363 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm_c.c @@ -0,0 +1,4607 @@ +/* riscv-64-sha256-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha256.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-sha256-asm.c + */ +#ifdef WOLFSSL_RISCV_ASM +#ifdef WOLFSSL_RISCV_ASM_INLINE +#include + +#if !defined(NO_SHA256) || defined(WOLFSSL_SHA224) +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM +XALIGNED(8) static const word32 L_SHA256_transform_riscv_vector_len_k[] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +void Transform_Sha256_Len_riscv_vector(wc_Sha256* sha256, const byte* data, + word32 len) +{ + const word32* k = L_SHA256_transform_riscv_vector_len_k; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" + " .option arch, +v, +zvkb, +zvknha\n\t" + /* VLEN == 128: 4 x 32-bit elements per vector register */ + "vsetivli zero, 4, e32, m1, ta, ma\n\t" + /* Permute standard digest a..h into {f,e,b,a},{h,g,d,c} order */ + "lw t2, 20(%[sha256])\n\t" + "sw t2, 0(sp)\n\t" + "lw t2, 16(%[sha256])\n\t" + "sw t2, 4(sp)\n\t" + "lw t2, 4(%[sha256])\n\t" + "sw t2, 8(sp)\n\t" + "lw t2, 0(%[sha256])\n\t" + "sw t2, 12(sp)\n\t" + "lw t2, 28(%[sha256])\n\t" + "sw t2, 16(sp)\n\t" + "lw t2, 24(%[sha256])\n\t" + "sw t2, 20(sp)\n\t" + "lw t2, 12(%[sha256])\n\t" + "sw t2, 24(sp)\n\t" + "lw t2, 8(%[sha256])\n\t" + "sw t2, 28(sp)\n\t" + "vl2re32.v v4, (sp)\n\t" + /* Load K into vector registers */ + "mv t1, %[k]\n\t" + "vl8re32.v v8, (t1)\n\t" + "addi t1, %[k], 128\n\t" + "vl8re32.v v16, (t1)\n\t" + "srli %[len], %[len], 6\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA256_transform_riscv_vector_len_begin_%=:\n\t" + /* Save state to add back after compression */ + "vmv.v.v v30, v4\n\t" + "vmv.v.v v31, v5\n\t" + /* Load 16 W into 4 vectors of 4 32-bit words */ + "mv t1, %[data]\n\t" + "vl4re32.v v0, (t1)\n\t" + "vrev8.v v0, v0\n\t" + "vrev8.v v1, v1\n\t" + "vrev8.v v2, v2\n\t" + "vrev8.v v3, v3\n\t" + "vadd.vv v7, v0, v8\n\t" + "vmv.x.s t2, v1\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v2\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v0, v6, v3\n\t" + "vadd.vv v7, v1, v9\n\t" + "vmv.x.s t2, v2\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v3\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v1, v6, v0\n\t" + "vadd.vv v7, v2, v10\n\t" + "vmv.x.s t2, v3\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v0\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v2, v6, v1\n\t" + "vadd.vv v7, v3, v11\n\t" + "vmv.x.s t2, v0\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v1\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v3, v6, v2\n\t" + "vadd.vv v7, v0, v12\n\t" + "vmv.x.s t2, v1\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v2\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v0, v6, v3\n\t" + "vadd.vv v7, v1, v13\n\t" + "vmv.x.s t2, v2\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v3\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v1, v6, v0\n\t" + "vadd.vv v7, v2, v14\n\t" + "vmv.x.s t2, v3\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v0\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v2, v6, v1\n\t" + "vadd.vv v7, v3, v15\n\t" + "vmv.x.s t2, v0\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v1\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v3, v6, v2\n\t" + "vadd.vv v7, v0, v16\n\t" + "vmv.x.s t2, v1\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v2\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v0, v6, v3\n\t" + "vadd.vv v7, v1, v17\n\t" + "vmv.x.s t2, v2\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v3\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v1, v6, v0\n\t" + "vadd.vv v7, v2, v18\n\t" + "vmv.x.s t2, v3\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v0\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v2, v6, v1\n\t" + "vadd.vv v7, v3, v19\n\t" + "vmv.x.s t2, v0\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vmv.v.v v6, v1\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vmv.s.x v6, t2\n\t" + "vsha2ms.vv v3, v6, v2\n\t" + "vadd.vv v7, v0, v20\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vadd.vv v7, v1, v21\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vadd.vv v7, v2, v22\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vadd.vv v7, v3, v23\n\t" + "vsha2cl.vv v5, v4, v7\n\t" + "vsha2ch.vv v4, v5, v7\n\t" + "vadd.vv v4, v4, v30\n\t" + "vadd.vv v5, v5, v31\n\t" + "addi %[len], %[len], -1\n\t" + "addi %[data], %[data], 64\n\t" + "bnez %[len], L_SHA256_transform_riscv_vector_len_begin_%=\n\t" + /* Store state back in standard digest order a..h */ + "vs2r.v v4, (sp)\n\t" + "lw t2, 12(sp)\n\t" + "sw t2, 0(%[sha256])\n\t" + "lw t2, 8(sp)\n\t" + "sw t2, 4(%[sha256])\n\t" + "lw t2, 28(sp)\n\t" + "sw t2, 8(%[sha256])\n\t" + "lw t2, 24(sp)\n\t" + "sw t2, 12(%[sha256])\n\t" + "lw t2, 4(sp)\n\t" + "sw t2, 16(%[sha256])\n\t" + "lw t2, 0(sp)\n\t" + "sw t2, 20(%[sha256])\n\t" + "lw t2, 20(sp)\n\t" + "sw t2, 24(%[sha256])\n\t" + "lw t2, 16(sp)\n\t" + "sw t2, 28(%[sha256])\n\t" + "addi sp, sp, 32\n\t" + : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len) + : [k] "r" (k) + : "memory", "t1", "t2" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) +XALIGNED(8) static const word32 L_SHA256_transform_riscv_crypto_len_k[] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +void Transform_Sha256_Len_riscv_crypto(wc_Sha256* sha256, const byte* data, + word32 len) +{ + const word32* k = L_SHA256_transform_riscv_crypto_len_k; + + __asm__ __volatile__ ( + " .option arch, +zknh\n\t" + /* Load digest into working variables */ + "ld t1, 0(%[sha256])\n\t" + "ld t3, 8(%[sha256])\n\t" + "ld t5, 16(%[sha256])\n\t" + "ld a3, 24(%[sha256])\n\t" + "srli t2, t1, 32\n\t" + "srli t4, t3, 32\n\t" + "srli t6, t5, 32\n\t" + "srli a4, a3, 32\n\t" + "srli %[len], %[len], 4\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA256_transform_riscv_crypto_len_begin_%=:\n\t" + /* Load W - big endian into two-words-per-register */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu s6, 0(%[data])\n\t" + "lbu s7, 1(%[data])\n\t" + "lbu s8, 2(%[data])\n\t" + "lbu a5, 3(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or a5, a5, s6\n\t" + "or a5, a5, s7\n\t" + "or a5, a5, s8\n\t" + "lbu s6, 4(%[data])\n\t" + "lbu s7, 5(%[data])\n\t" + "lbu s8, 6(%[data])\n\t" + "lbu s9, 7(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or a5, a5, s6\n\t" + "or a5, a5, s7\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "lbu s6, 8(%[data])\n\t" + "lbu s7, 9(%[data])\n\t" + "lbu s8, 10(%[data])\n\t" + "lbu a6, 11(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or a6, a6, s6\n\t" + "or a6, a6, s7\n\t" + "or a6, a6, s8\n\t" + "lbu s6, 12(%[data])\n\t" + "lbu s7, 13(%[data])\n\t" + "lbu s8, 14(%[data])\n\t" + "lbu s9, 15(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or a6, a6, s6\n\t" + "or a6, a6, s7\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "lbu s6, 16(%[data])\n\t" + "lbu s7, 17(%[data])\n\t" + "lbu s8, 18(%[data])\n\t" + "lbu a7, 19(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or a7, a7, s6\n\t" + "or a7, a7, s7\n\t" + "or a7, a7, s8\n\t" + "lbu s6, 20(%[data])\n\t" + "lbu s7, 21(%[data])\n\t" + "lbu s8, 22(%[data])\n\t" + "lbu s9, 23(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or a7, a7, s6\n\t" + "or a7, a7, s7\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "lbu s6, 24(%[data])\n\t" + "lbu s7, 25(%[data])\n\t" + "lbu s8, 26(%[data])\n\t" + "lbu s1, 27(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s1, s1, s6\n\t" + "or s1, s1, s7\n\t" + "or s1, s1, s8\n\t" + "lbu s6, 28(%[data])\n\t" + "lbu s7, 29(%[data])\n\t" + "lbu s8, 30(%[data])\n\t" + "lbu s9, 31(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s1, s1, s6\n\t" + "or s1, s1, s7\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "lbu s6, 32(%[data])\n\t" + "lbu s7, 33(%[data])\n\t" + "lbu s8, 34(%[data])\n\t" + "lbu s2, 35(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s2, s2, s6\n\t" + "or s2, s2, s7\n\t" + "or s2, s2, s8\n\t" + "lbu s6, 36(%[data])\n\t" + "lbu s7, 37(%[data])\n\t" + "lbu s8, 38(%[data])\n\t" + "lbu s9, 39(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s2, s2, s6\n\t" + "or s2, s2, s7\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "lbu s6, 40(%[data])\n\t" + "lbu s7, 41(%[data])\n\t" + "lbu s8, 42(%[data])\n\t" + "lbu s3, 43(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s3, s3, s6\n\t" + "or s3, s3, s7\n\t" + "or s3, s3, s8\n\t" + "lbu s6, 44(%[data])\n\t" + "lbu s7, 45(%[data])\n\t" + "lbu s8, 46(%[data])\n\t" + "lbu s9, 47(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s3, s3, s6\n\t" + "or s3, s3, s7\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "lbu s6, 48(%[data])\n\t" + "lbu s7, 49(%[data])\n\t" + "lbu s8, 50(%[data])\n\t" + "lbu s4, 51(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s4, s4, s6\n\t" + "or s4, s4, s7\n\t" + "or s4, s4, s8\n\t" + "lbu s6, 52(%[data])\n\t" + "lbu s7, 53(%[data])\n\t" + "lbu s8, 54(%[data])\n\t" + "lbu s9, 55(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s4, s4, s6\n\t" + "or s4, s4, s7\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "lbu s6, 56(%[data])\n\t" + "lbu s7, 57(%[data])\n\t" + "lbu s8, 58(%[data])\n\t" + "lbu s5, 59(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s5, s5, s6\n\t" + "or s5, s5, s7\n\t" + "or s5, s5, s8\n\t" + "lbu s6, 60(%[data])\n\t" + "lbu s7, 61(%[data])\n\t" + "lbu s8, 62(%[data])\n\t" + "lbu s9, 63(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s5, s5, s6\n\t" + "or s5, s5, s7\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" +#else + "ld a5, 0(%[data])\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + /* rori a5, a5, 32 */ + ".word 0x6207d793\n\t" + "ld a6, 8(%[data])\n\t" + /* rev8 a6, a6 */ + ".word 0x6b885813\n\t" + /* rori a6, a6, 32 */ + ".word 0x62085813\n\t" + "ld a7, 16(%[data])\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + /* rori a7, a7, 32 */ + ".word 0x6208d893\n\t" + "ld s1, 24(%[data])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + /* rori s1, s1, 32 */ + ".word 0x6204d493\n\t" + "ld s2, 32(%[data])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + /* rori s2, s2, 32 */ + ".word 0x62095913\n\t" + "ld s3, 40(%[data])\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + /* rori s3, s3, 32 */ + ".word 0x6209d993\n\t" + "ld s4, 48(%[data])\n\t" + /* rev8 s4, s4 */ + ".word 0x6b8a5a13\n\t" + /* rori s4, s4, 32 */ + ".word 0x620a5a13\n\t" + "ld s5, 56(%[data])\n\t" + /* rev8 s5, s5 */ + ".word 0x6b8ada93\n\t" + /* rori s5, s5, 32 */ + ".word 0x620ada93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[len], %[len], -1\n\t" + "\n" + "L_SHA256_transform_riscv_crypto_len_inner_%=:\n\t" + "ld s8, 0(%[k])\n\t" + "mv s6, t5\n\t" + "mv s7, t1\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t6, a3\n\t" + "xor s10, t1, t2\n\t" + "xor s11, t2, t3\n\t" + "and s0, s0, t5\n\t" + "addw a4, a4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a3\n\t" + "addw s10, s8, a5\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s0\n\t" + "addw a4, a4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, a5, 32\n\t" + "mv s6, t4\n\t" + "mv s7, a4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t5, t6\n\t" + "xor s10, a4, t1\n\t" + "xor s11, t1, t2\n\t" + "and s0, s0, t4\n\t" + "addw a3, a3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t6\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s0\n\t" + "addw a3, a3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" + "srli s10, a5, 32\n\t" + "srli s0, s2, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, s5\n\t" + "addw s7, s7, s0\n\t" + "addw a5, a5, s6\n\t" + "srli s11, s5, 32\n\t" + "addw a5, s7, a5\n\t" + "sha256sig0 s8, a6\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, s3\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli a5, a5, 32\n\t" + "slli s9, s9, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, s9\n\t" + "ld s8, 8(%[k])\n\t" + "mv s6, t3\n\t" + "mv s7, a3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t4, t5\n\t" + "xor s10, a3, a4\n\t" + "xor s11, a4, t1\n\t" + "and s0, s0, t3\n\t" + "addw t6, t6, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t5\n\t" + "addw s10, s8, a6\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s0\n\t" + "addw t6, t6, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, a6, 32\n\t" + "mv s6, t2\n\t" + "mv s7, t6\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t3, t4\n\t" + "xor s10, t6, a3\n\t" + "xor s11, a3, a4\n\t" + "and s0, s0, t2\n\t" + "addw t5, t5, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s0\n\t" + "addw t5, t5, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" + "srli s10, a6, 32\n\t" + "srli s0, s3, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, a5\n\t" + "addw s7, s7, s0\n\t" + "addw a6, a6, s6\n\t" + "srli s11, a5, 32\n\t" + "addw a6, s7, a6\n\t" + "sha256sig0 s8, a7\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, s4\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli a6, a6, 32\n\t" + "slli s9, s9, 32\n\t" + "srli a6, a6, 32\n\t" + "or a6, a6, s9\n\t" + "ld s8, 16(%[k])\n\t" + "mv s6, t1\n\t" + "mv s7, t5\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t2, t3\n\t" + "xor s10, t5, t6\n\t" + "xor s11, t6, a3\n\t" + "and s0, s0, t1\n\t" + "addw t4, t4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t3\n\t" + "addw s10, s8, a7\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s0\n\t" + "addw t4, t4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, a7, 32\n\t" + "mv s6, a4\n\t" + "mv s7, t4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t1, t2\n\t" + "xor s10, t4, t5\n\t" + "xor s11, t5, t6\n\t" + "and s0, s0, a4\n\t" + "addw t3, t3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t2\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s0\n\t" + "addw t3, t3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" + "srli s10, a7, 32\n\t" + "srli s0, s4, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, a6\n\t" + "addw s7, s7, s0\n\t" + "addw a7, a7, s6\n\t" + "srli s11, a6, 32\n\t" + "addw a7, s7, a7\n\t" + "sha256sig0 s8, s1\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, s5\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli a7, a7, 32\n\t" + "slli s9, s9, 32\n\t" + "srli a7, a7, 32\n\t" + "or a7, a7, s9\n\t" + "ld s8, 24(%[k])\n\t" + "mv s6, a3\n\t" + "mv s7, t3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a4, t1\n\t" + "xor s10, t3, t4\n\t" + "xor s11, t4, t5\n\t" + "and s0, s0, a3\n\t" + "addw t2, t2, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t1\n\t" + "addw s10, s8, s1\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s0\n\t" + "addw t2, t2, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s1, 32\n\t" + "mv s6, t6\n\t" + "mv s7, t2\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a3, a4\n\t" + "xor s10, t2, t3\n\t" + "xor s11, t3, t4\n\t" + "and s0, s0, t6\n\t" + "addw t1, t1, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s0\n\t" + "addw t1, t1, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" + "srli s10, s1, 32\n\t" + "srli s0, s5, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, a7\n\t" + "addw s7, s7, s0\n\t" + "addw s1, s1, s6\n\t" + "srli s11, a7, 32\n\t" + "addw s1, s7, s1\n\t" + "sha256sig0 s8, s2\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, a5\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli s1, s1, 32\n\t" + "slli s9, s9, 32\n\t" + "srli s1, s1, 32\n\t" + "or s1, s1, s9\n\t" + "ld s8, 32(%[k])\n\t" + "mv s6, t5\n\t" + "mv s7, t1\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t6, a3\n\t" + "xor s10, t1, t2\n\t" + "xor s11, t2, t3\n\t" + "and s0, s0, t5\n\t" + "addw a4, a4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a3\n\t" + "addw s10, s8, s2\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s0\n\t" + "addw a4, a4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s2, 32\n\t" + "mv s6, t4\n\t" + "mv s7, a4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t5, t6\n\t" + "xor s10, a4, t1\n\t" + "xor s11, t1, t2\n\t" + "and s0, s0, t4\n\t" + "addw a3, a3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t6\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s0\n\t" + "addw a3, a3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" + "srli s10, s2, 32\n\t" + "srli s0, a5, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, s1\n\t" + "addw s7, s7, s0\n\t" + "addw s2, s2, s6\n\t" + "srli s11, s1, 32\n\t" + "addw s2, s7, s2\n\t" + "sha256sig0 s8, s3\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, a6\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli s2, s2, 32\n\t" + "slli s9, s9, 32\n\t" + "srli s2, s2, 32\n\t" + "or s2, s2, s9\n\t" + "ld s8, 40(%[k])\n\t" + "mv s6, t3\n\t" + "mv s7, a3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t4, t5\n\t" + "xor s10, a3, a4\n\t" + "xor s11, a4, t1\n\t" + "and s0, s0, t3\n\t" + "addw t6, t6, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t5\n\t" + "addw s10, s8, s3\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s0\n\t" + "addw t6, t6, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s3, 32\n\t" + "mv s6, t2\n\t" + "mv s7, t6\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t3, t4\n\t" + "xor s10, t6, a3\n\t" + "xor s11, a3, a4\n\t" + "and s0, s0, t2\n\t" + "addw t5, t5, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s0\n\t" + "addw t5, t5, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" + "srli s10, s3, 32\n\t" + "srli s0, a6, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, s2\n\t" + "addw s7, s7, s0\n\t" + "addw s3, s3, s6\n\t" + "srli s11, s2, 32\n\t" + "addw s3, s7, s3\n\t" + "sha256sig0 s8, s4\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, a7\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli s3, s3, 32\n\t" + "slli s9, s9, 32\n\t" + "srli s3, s3, 32\n\t" + "or s3, s3, s9\n\t" + "ld s8, 48(%[k])\n\t" + "mv s6, t1\n\t" + "mv s7, t5\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t2, t3\n\t" + "xor s10, t5, t6\n\t" + "xor s11, t6, a3\n\t" + "and s0, s0, t1\n\t" + "addw t4, t4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t3\n\t" + "addw s10, s8, s4\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s0\n\t" + "addw t4, t4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s4, 32\n\t" + "mv s6, a4\n\t" + "mv s7, t4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t1, t2\n\t" + "xor s10, t4, t5\n\t" + "xor s11, t5, t6\n\t" + "and s0, s0, a4\n\t" + "addw t3, t3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t2\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s0\n\t" + "addw t3, t3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" + "srli s10, s4, 32\n\t" + "srli s0, a7, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, s3\n\t" + "addw s7, s7, s0\n\t" + "addw s4, s4, s6\n\t" + "srli s11, s3, 32\n\t" + "addw s4, s7, s4\n\t" + "sha256sig0 s8, s5\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, s1\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli s4, s4, 32\n\t" + "slli s9, s9, 32\n\t" + "srli s4, s4, 32\n\t" + "or s4, s4, s9\n\t" + "ld s8, 56(%[k])\n\t" + "mv s6, a3\n\t" + "mv s7, t3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a4, t1\n\t" + "xor s10, t3, t4\n\t" + "xor s11, t4, t5\n\t" + "and s0, s0, a3\n\t" + "addw t2, t2, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t1\n\t" + "addw s10, s8, s5\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s0\n\t" + "addw t2, t2, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s5, 32\n\t" + "mv s6, t6\n\t" + "mv s7, t2\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a3, a4\n\t" + "xor s10, t2, t3\n\t" + "xor s11, t3, t4\n\t" + "and s0, s0, t6\n\t" + "addw t1, t1, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s0\n\t" + "addw t1, t1, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" + "srli s10, s5, 32\n\t" + "srli s0, s1, 32\n\t" + "sha256sig0 s6, s10\n\t" + "sha256sig1 s7, s4\n\t" + "addw s7, s7, s0\n\t" + "addw s5, s5, s6\n\t" + "srli s11, s4, 32\n\t" + "addw s5, s7, s5\n\t" + "sha256sig0 s8, a5\n\t" + "sha256sig1 s9, s11\n\t" + "addw s9, s9, s2\n\t" + "addw s11, s8, s10\n\t" + "addw s9, s9, s11\n\t" + "slli s5, s5, 32\n\t" + "slli s9, s9, 32\n\t" + "srli s5, s5, 32\n\t" + "or s5, s5, s9\n\t" + "addi %[len], %[len], -1\n\t" + "addi %[k], %[k], 64\n\t" + "andi s6, %[len], 3\n\t" + "bnez s6, L_SHA256_transform_riscv_crypto_len_inner_%=\n\t" + "ld s8, 0(%[k])\n\t" + "mv s6, t5\n\t" + "mv s7, t1\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t6, a3\n\t" + "xor s10, t1, t2\n\t" + "xor s11, t2, t3\n\t" + "and s0, s0, t5\n\t" + "addw a4, a4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a3\n\t" + "addw s10, s8, a5\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s0\n\t" + "addw a4, a4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, a5, 32\n\t" + "mv s6, t4\n\t" + "mv s7, a4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t5, t6\n\t" + "xor s10, a4, t1\n\t" + "xor s11, t1, t2\n\t" + "and s0, s0, t4\n\t" + "addw a3, a3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t6\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s0\n\t" + "addw a3, a3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" + "ld s8, 8(%[k])\n\t" + "mv s6, t3\n\t" + "mv s7, a3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t4, t5\n\t" + "xor s10, a3, a4\n\t" + "xor s11, a4, t1\n\t" + "and s0, s0, t3\n\t" + "addw t6, t6, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t5\n\t" + "addw s10, s8, a6\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s0\n\t" + "addw t6, t6, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, a6, 32\n\t" + "mv s6, t2\n\t" + "mv s7, t6\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t3, t4\n\t" + "xor s10, t6, a3\n\t" + "xor s11, a3, a4\n\t" + "and s0, s0, t2\n\t" + "addw t5, t5, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s0\n\t" + "addw t5, t5, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" + "ld s8, 16(%[k])\n\t" + "mv s6, t1\n\t" + "mv s7, t5\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t2, t3\n\t" + "xor s10, t5, t6\n\t" + "xor s11, t6, a3\n\t" + "and s0, s0, t1\n\t" + "addw t4, t4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t3\n\t" + "addw s10, s8, a7\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s0\n\t" + "addw t4, t4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, a7, 32\n\t" + "mv s6, a4\n\t" + "mv s7, t4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t1, t2\n\t" + "xor s10, t4, t5\n\t" + "xor s11, t5, t6\n\t" + "and s0, s0, a4\n\t" + "addw t3, t3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t2\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s0\n\t" + "addw t3, t3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" + "ld s8, 24(%[k])\n\t" + "mv s6, a3\n\t" + "mv s7, t3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a4, t1\n\t" + "xor s10, t3, t4\n\t" + "xor s11, t4, t5\n\t" + "and s0, s0, a3\n\t" + "addw t2, t2, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t1\n\t" + "addw s10, s8, s1\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s0\n\t" + "addw t2, t2, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s1, 32\n\t" + "mv s6, t6\n\t" + "mv s7, t2\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a3, a4\n\t" + "xor s10, t2, t3\n\t" + "xor s11, t3, t4\n\t" + "and s0, s0, t6\n\t" + "addw t1, t1, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s0\n\t" + "addw t1, t1, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" + "ld s8, 32(%[k])\n\t" + "mv s6, t5\n\t" + "mv s7, t1\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t6, a3\n\t" + "xor s10, t1, t2\n\t" + "xor s11, t2, t3\n\t" + "and s0, s0, t5\n\t" + "addw a4, a4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a3\n\t" + "addw s10, s8, s2\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s0\n\t" + "addw a4, a4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s2, 32\n\t" + "mv s6, t4\n\t" + "mv s7, a4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t5, t6\n\t" + "xor s10, a4, t1\n\t" + "xor s11, t1, t2\n\t" + "and s0, s0, t4\n\t" + "addw a3, a3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t6\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s0\n\t" + "addw a3, a3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" + "ld s8, 40(%[k])\n\t" + "mv s6, t3\n\t" + "mv s7, a3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t4, t5\n\t" + "xor s10, a3, a4\n\t" + "xor s11, a4, t1\n\t" + "and s0, s0, t3\n\t" + "addw t6, t6, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t5\n\t" + "addw s10, s8, s3\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s0\n\t" + "addw t6, t6, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s3, 32\n\t" + "mv s6, t2\n\t" + "mv s7, t6\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t3, t4\n\t" + "xor s10, t6, a3\n\t" + "xor s11, a3, a4\n\t" + "and s0, s0, t2\n\t" + "addw t5, t5, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s0\n\t" + "addw t5, t5, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" + "ld s8, 48(%[k])\n\t" + "mv s6, t1\n\t" + "mv s7, t5\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t2, t3\n\t" + "xor s10, t5, t6\n\t" + "xor s11, t6, a3\n\t" + "and s0, s0, t1\n\t" + "addw t4, t4, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t3\n\t" + "addw s10, s8, s4\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s0\n\t" + "addw t4, t4, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s4, 32\n\t" + "mv s6, a4\n\t" + "mv s7, t4\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, t1, t2\n\t" + "xor s10, t4, t5\n\t" + "xor s11, t5, t6\n\t" + "and s0, s0, a4\n\t" + "addw t3, t3, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t2\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s0\n\t" + "addw t3, t3, s10\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" + "ld s8, 56(%[k])\n\t" + "mv s6, a3\n\t" + "mv s7, t3\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a4, t1\n\t" + "xor s10, t3, t4\n\t" + "xor s11, t4, t5\n\t" + "and s0, s0, a3\n\t" + "addw t2, t2, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, t1\n\t" + "addw s10, s8, s5\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s0\n\t" + "addw t2, t2, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s5, 32\n\t" + "mv s6, t6\n\t" + "mv s7, t2\n\t" + "sha256sum1 s6, s6\n\t" + "sha256sum0 s7, s7\n\t" + "xor s0, a3, a4\n\t" + "xor s10, t2, t3\n\t" + "xor s11, t3, t4\n\t" + "and s0, s0, t6\n\t" + "addw t1, t1, s6\n\t" + "and s11, s11, s10\n\t" + "xor s0, s0, a4\n\t" + "addw s10, s8, s9\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s0\n\t" + "addw t1, t1, s10\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" + "addi %[k], %[k], -192\n\t" + /* Add working variables back into digest state */ + "ld s6, 0(%[sha256])\n\t" + "ld s7, 8(%[sha256])\n\t" + "ld s8, 16(%[sha256])\n\t" + "ld s9, 24(%[sha256])\n\t" + "addw t1, t1, s6\n\t" + "addw t3, t3, s7\n\t" + "addw t5, t5, s8\n\t" + "addw a3, a3, s9\n\t" + "srli s6, s6, 32\n\t" + "srli s7, s7, 32\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s9, 32\n\t" + "addw t2, t2, s6\n\t" + "addw t4, t4, s7\n\t" + "addw t6, t6, s8\n\t" + "addw a4, a4, s9\n\t" + /* Store digest */ + "sw t1, 0(%[sha256])\n\t" + "sw t2, 4(%[sha256])\n\t" + "sw t3, 8(%[sha256])\n\t" + "sw t4, 12(%[sha256])\n\t" + "sw t5, 16(%[sha256])\n\t" + "sw t6, 20(%[sha256])\n\t" + "sw a3, 24(%[sha256])\n\t" + "sw a4, 28(%[sha256])\n\t" + "addi %[data], %[data], 64\n\t" + "bnez %[len], L_SHA256_transform_riscv_crypto_len_begin_%=\n\t" + : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len) + : [k] "r" (k) + : "memory", "t1", "t2", "t3", "t4", "t5", "t6", "a3", "a4", "a5", "a6", + "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", + "s11", "s0" + ); +} + +#else +XALIGNED(8) static const word32 L_SHA256_transform_riscv_len_k[] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +void Transform_Sha256_Len_riscv(wc_Sha256* sha256, const byte* data, word32 len) +{ + const word32* k = L_SHA256_transform_riscv_len_k; + + __asm__ __volatile__ ( + /* Load digest into working variables */ + "ld t1, 0(%[sha256])\n\t" + "ld t3, 8(%[sha256])\n\t" + "ld t5, 16(%[sha256])\n\t" + "ld a3, 24(%[sha256])\n\t" + "srli t2, t1, 32\n\t" + "srli t4, t3, 32\n\t" + "srli t6, t5, 32\n\t" + "srli a4, a3, 32\n\t" + "srli %[len], %[len], 4\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA256_transform_riscv_len_begin_%=:\n\t" + /* Load W - big endian into two-words-per-register */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu s6, 0(%[data])\n\t" + "lbu s7, 1(%[data])\n\t" + "lbu s8, 2(%[data])\n\t" + "lbu a5, 3(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or a5, a5, s6\n\t" + "or a5, a5, s7\n\t" + "or a5, a5, s8\n\t" + "lbu s6, 4(%[data])\n\t" + "lbu s7, 5(%[data])\n\t" + "lbu s8, 6(%[data])\n\t" + "lbu s9, 7(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or a5, a5, s6\n\t" + "or a5, a5, s7\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "lbu s6, 8(%[data])\n\t" + "lbu s7, 9(%[data])\n\t" + "lbu s8, 10(%[data])\n\t" + "lbu a6, 11(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or a6, a6, s6\n\t" + "or a6, a6, s7\n\t" + "or a6, a6, s8\n\t" + "lbu s6, 12(%[data])\n\t" + "lbu s7, 13(%[data])\n\t" + "lbu s8, 14(%[data])\n\t" + "lbu s9, 15(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or a6, a6, s6\n\t" + "or a6, a6, s7\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "lbu s6, 16(%[data])\n\t" + "lbu s7, 17(%[data])\n\t" + "lbu s8, 18(%[data])\n\t" + "lbu a7, 19(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or a7, a7, s6\n\t" + "or a7, a7, s7\n\t" + "or a7, a7, s8\n\t" + "lbu s6, 20(%[data])\n\t" + "lbu s7, 21(%[data])\n\t" + "lbu s8, 22(%[data])\n\t" + "lbu s9, 23(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or a7, a7, s6\n\t" + "or a7, a7, s7\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "lbu s6, 24(%[data])\n\t" + "lbu s7, 25(%[data])\n\t" + "lbu s8, 26(%[data])\n\t" + "lbu s1, 27(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s1, s1, s6\n\t" + "or s1, s1, s7\n\t" + "or s1, s1, s8\n\t" + "lbu s6, 28(%[data])\n\t" + "lbu s7, 29(%[data])\n\t" + "lbu s8, 30(%[data])\n\t" + "lbu s9, 31(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s1, s1, s6\n\t" + "or s1, s1, s7\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "lbu s6, 32(%[data])\n\t" + "lbu s7, 33(%[data])\n\t" + "lbu s8, 34(%[data])\n\t" + "lbu s2, 35(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s2, s2, s6\n\t" + "or s2, s2, s7\n\t" + "or s2, s2, s8\n\t" + "lbu s6, 36(%[data])\n\t" + "lbu s7, 37(%[data])\n\t" + "lbu s8, 38(%[data])\n\t" + "lbu s9, 39(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s2, s2, s6\n\t" + "or s2, s2, s7\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "lbu s6, 40(%[data])\n\t" + "lbu s7, 41(%[data])\n\t" + "lbu s8, 42(%[data])\n\t" + "lbu s3, 43(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s3, s3, s6\n\t" + "or s3, s3, s7\n\t" + "or s3, s3, s8\n\t" + "lbu s6, 44(%[data])\n\t" + "lbu s7, 45(%[data])\n\t" + "lbu s8, 46(%[data])\n\t" + "lbu s9, 47(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s3, s3, s6\n\t" + "or s3, s3, s7\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "lbu s6, 48(%[data])\n\t" + "lbu s7, 49(%[data])\n\t" + "lbu s8, 50(%[data])\n\t" + "lbu s4, 51(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s4, s4, s6\n\t" + "or s4, s4, s7\n\t" + "or s4, s4, s8\n\t" + "lbu s6, 52(%[data])\n\t" + "lbu s7, 53(%[data])\n\t" + "lbu s8, 54(%[data])\n\t" + "lbu s9, 55(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s4, s4, s6\n\t" + "or s4, s4, s7\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "lbu s6, 56(%[data])\n\t" + "lbu s7, 57(%[data])\n\t" + "lbu s8, 58(%[data])\n\t" + "lbu s5, 59(%[data])\n\t" + "slli s6, s6, 24\n\t" + "slli s7, s7, 16\n\t" + "slli s8, s8, 8\n\t" + "or s5, s5, s6\n\t" + "or s5, s5, s7\n\t" + "or s5, s5, s8\n\t" + "lbu s6, 60(%[data])\n\t" + "lbu s7, 61(%[data])\n\t" + "lbu s8, 62(%[data])\n\t" + "lbu s9, 63(%[data])\n\t" + "slli s6, s6, 56\n\t" + "slli s7, s7, 48\n\t" + "slli s8, s8, 40\n\t" + "slli s9, s9, 32\n\t" + "or s5, s5, s6\n\t" + "or s5, s5, s7\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" +#else + "ld a5, 0(%[data])\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + /* rori a5, a5, 32 */ + ".word 0x6207d793\n\t" + "ld a6, 8(%[data])\n\t" + /* rev8 a6, a6 */ + ".word 0x6b885813\n\t" + /* rori a6, a6, 32 */ + ".word 0x62085813\n\t" + "ld a7, 16(%[data])\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + /* rori a7, a7, 32 */ + ".word 0x6208d893\n\t" + "ld s1, 24(%[data])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + /* rori s1, s1, 32 */ + ".word 0x6204d493\n\t" + "ld s2, 32(%[data])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + /* rori s2, s2, 32 */ + ".word 0x62095913\n\t" + "ld s3, 40(%[data])\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + /* rori s3, s3, 32 */ + ".word 0x6209d993\n\t" + "ld s4, 48(%[data])\n\t" + /* rev8 s4, s4 */ + ".word 0x6b8a5a13\n\t" + /* rori s4, s4, 32 */ + ".word 0x620a5a13\n\t" + "ld s5, 56(%[data])\n\t" + /* rev8 s5, s5 */ + ".word 0x6b8ada93\n\t" + /* rori s5, s5, 32 */ + ".word 0x620ada93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "addi %[len], %[len], -1\n\t" + "\n" + "L_SHA256_transform_riscv_len_inner_%=:\n\t" + "ld s8, 0(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t5, 6 */ + ".word 0x606f5d1b\n\t" + /* roriw s11, t5, 11 */ + ".word 0x60bf5d9b\n\t" + /* roriw s6, t5, 25 */ + ".word 0x619f5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t6, a3\n\t" + "and s0, s0, t5\n\t" + "xor s0, s0, a3\n\t" + "addw a4, a4, s6\n\t" + "addw a4, a4, s0\n\t" + "addw s6, s8, a5\n\t" + "addw a4, a4, s6\n\t" + /* roriw s10, t1, 2 */ + ".word 0x60235d1b\n\t" + /* roriw s11, t1, 13 */ + ".word 0x60d35d9b\n\t" + /* roriw s7, t1, 22 */ + ".word 0x61635b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t2\n\t" + "addw t4, t4, a4\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, s11\n\t" +#else + "slliw s11, t5, 26\n\t" + "srliw s10, t5, 6\n\t" + "slliw s0, t5, 21\n\t" + "srliw s6, t5, 11\n\t" + "slliw s7, t5, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t5, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t1, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t1, 2\n\t" + "slliw s0, t1, 19\n\t" + "addw a4, a4, s6\n\t" + "srliw s7, t1, 13\n\t" + "slliw s6, t1, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t1, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t6, a3\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t5\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a3\n\t" + "addw s6, s8, a5\n\t" + "addw a4, a4, s0\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, a5, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t4, 6 */ + ".word 0x606edd1b\n\t" + /* roriw s11, t4, 11 */ + ".word 0x60bedd9b\n\t" + /* roriw s6, t4, 25 */ + ".word 0x619edb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t5, t6\n\t" + "and s0, s0, t4\n\t" + "xor s0, s0, t6\n\t" + "addw a3, a3, s6\n\t" + "addw a3, a3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s6\n\t" + /* roriw s10, a4, 2 */ + ".word 0x60275d1b\n\t" + /* roriw s11, a4, 13 */ + ".word 0x60d75d9b\n\t" + /* roriw s7, a4, 22 */ + ".word 0x61675b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t1\n\t" + "addw t3, t3, a3\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, s11\n\t" +#else + "slliw s11, t4, 26\n\t" + "srliw s10, t4, 6\n\t" + "slliw s0, t4, 21\n\t" + "srliw s6, t4, 11\n\t" + "slliw s7, t4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a4, 2\n\t" + "slliw s0, a4, 19\n\t" + "addw a3, a3, s6\n\t" + "srliw s7, a4, 13\n\t" + "slliw s6, a4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t5, t6\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t6\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s0\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, a5, 32\n\t" + "srli s8, s2, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, s5, 17 */ + ".word 0x611add1b\n\t" + /* roriw s11, s5, 19 */ + ".word 0x613add9b\n\t" + "srliw s7, s5, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw a5, a5, s6\n\t" + "addw s7, s7, s8\n\t" + "addw a5, s7, a5\n\t" + "srli s6, s5, 32\n\t" + /* roriw s10, a6, 7 */ + ".word 0x60785d1b\n\t" + /* roriw s11, a6, 18 */ + ".word 0x61285d9b\n\t" + "srliw s8, a6, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s3\n\t" + "addw s7, s7, s11\n\t" + "slli a5, a5, 32\n\t" + "slli s7, s7, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, s7\n\t" +#else + "srli s9, a5, 32\n\t" + "srli s8, s2, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s5, 15\n\t" + "srliw s11, s5, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, s5, 13\n\t" + "srliw s7, s5, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s5, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw a5, a5, s6\n\t" + "addw s7, s7, s8\n\t" + "addw a5, s7, a5\n\t" + "srli s6, s5, 32\n\t" + "slliw s10, a6, 25\n\t" + "srliw s11, a6, 7\n\t" + "slliw s0, a6, 14\n\t" + "srliw s8, a6, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, a6, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s3\n\t" + "addw s7, s7, s11\n\t" + "slli a5, a5, 32\n\t" + "slli s7, s7, 32\n\t" + "srli a5, a5, 32\n\t" + "or a5, a5, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 8(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t3, 6 */ + ".word 0x606e5d1b\n\t" + /* roriw s11, t3, 11 */ + ".word 0x60be5d9b\n\t" + /* roriw s6, t3, 25 */ + ".word 0x619e5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t4, t5\n\t" + "and s0, s0, t3\n\t" + "xor s0, s0, t5\n\t" + "addw t6, t6, s6\n\t" + "addw t6, t6, s0\n\t" + "addw s6, s8, a6\n\t" + "addw t6, t6, s6\n\t" + /* roriw s10, a3, 2 */ + ".word 0x6026dd1b\n\t" + /* roriw s11, a3, 13 */ + ".word 0x60d6dd9b\n\t" + /* roriw s7, a3, 22 */ + ".word 0x6166db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a4\n\t" + "addw t2, t2, t6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, s11\n\t" +#else + "slliw s11, t3, 26\n\t" + "srliw s10, t3, 6\n\t" + "slliw s0, t3, 21\n\t" + "srliw s6, t3, 11\n\t" + "slliw s7, t3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a3, 2\n\t" + "slliw s0, a3, 19\n\t" + "addw t6, t6, s6\n\t" + "srliw s7, a3, 13\n\t" + "slliw s6, a3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t4, t5\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t5\n\t" + "addw s6, s8, a6\n\t" + "addw t6, t6, s0\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, a6, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t2, 6 */ + ".word 0x6063dd1b\n\t" + /* roriw s11, t2, 11 */ + ".word 0x60b3dd9b\n\t" + /* roriw s6, t2, 25 */ + ".word 0x6193db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t3, t4\n\t" + "and s0, s0, t2\n\t" + "xor s0, s0, t4\n\t" + "addw t5, t5, s6\n\t" + "addw t5, t5, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s6\n\t" + /* roriw s10, t6, 2 */ + ".word 0x602fdd1b\n\t" + /* roriw s11, t6, 13 */ + ".word 0x60dfdd9b\n\t" + /* roriw s7, t6, 22 */ + ".word 0x616fdb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a3\n\t" + "addw t1, t1, t5\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, s11\n\t" +#else + "slliw s11, t2, 26\n\t" + "srliw s10, t2, 6\n\t" + "slliw s0, t2, 21\n\t" + "srliw s6, t2, 11\n\t" + "slliw s7, t2, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t2, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t6, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t6, 2\n\t" + "slliw s0, t6, 19\n\t" + "addw t5, t5, s6\n\t" + "srliw s7, t6, 13\n\t" + "slliw s6, t6, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t6, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t3, t4\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t2\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t4\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s0\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, a6, 32\n\t" + "srli s8, s3, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, a5, 17 */ + ".word 0x6117dd1b\n\t" + /* roriw s11, a5, 19 */ + ".word 0x6137dd9b\n\t" + "srliw s7, a5, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw a6, a6, s6\n\t" + "addw s7, s7, s8\n\t" + "addw a6, s7, a6\n\t" + "srli s6, a5, 32\n\t" + /* roriw s10, a7, 7 */ + ".word 0x6078dd1b\n\t" + /* roriw s11, a7, 18 */ + ".word 0x6128dd9b\n\t" + "srliw s8, a7, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s4\n\t" + "addw s7, s7, s11\n\t" + "slli a6, a6, 32\n\t" + "slli s7, s7, 32\n\t" + "srli a6, a6, 32\n\t" + "or a6, a6, s7\n\t" +#else + "srli s9, a6, 32\n\t" + "srli s8, s3, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, a5, 15\n\t" + "srliw s11, a5, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, a5, 13\n\t" + "srliw s7, a5, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, a5, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw a6, a6, s6\n\t" + "addw s7, s7, s8\n\t" + "addw a6, s7, a6\n\t" + "srli s6, a5, 32\n\t" + "slliw s10, a7, 25\n\t" + "srliw s11, a7, 7\n\t" + "slliw s0, a7, 14\n\t" + "srliw s8, a7, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, a7, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s4\n\t" + "addw s7, s7, s11\n\t" + "slli a6, a6, 32\n\t" + "slli s7, s7, 32\n\t" + "srli a6, a6, 32\n\t" + "or a6, a6, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 16(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t1, 6 */ + ".word 0x60635d1b\n\t" + /* roriw s11, t1, 11 */ + ".word 0x60b35d9b\n\t" + /* roriw s6, t1, 25 */ + ".word 0x61935b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t2, t3\n\t" + "and s0, s0, t1\n\t" + "xor s0, s0, t3\n\t" + "addw t4, t4, s6\n\t" + "addw t4, t4, s0\n\t" + "addw s6, s8, a7\n\t" + "addw t4, t4, s6\n\t" + /* roriw s10, t5, 2 */ + ".word 0x602f5d1b\n\t" + /* roriw s11, t5, 13 */ + ".word 0x60df5d9b\n\t" + /* roriw s7, t5, 22 */ + ".word 0x616f5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t6\n\t" + "addw a4, a4, t4\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, s11\n\t" +#else + "slliw s11, t1, 26\n\t" + "srliw s10, t1, 6\n\t" + "slliw s0, t1, 21\n\t" + "srliw s6, t1, 11\n\t" + "slliw s7, t1, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t1, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t5, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t5, 2\n\t" + "slliw s0, t5, 19\n\t" + "addw t4, t4, s6\n\t" + "srliw s7, t5, 13\n\t" + "slliw s6, t5, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t5, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t2, t3\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t1\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t3\n\t" + "addw s6, s8, a7\n\t" + "addw t4, t4, s0\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, a7, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a4, 6 */ + ".word 0x60675d1b\n\t" + /* roriw s11, a4, 11 */ + ".word 0x60b75d9b\n\t" + /* roriw s6, a4, 25 */ + ".word 0x61975b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t1, t2\n\t" + "and s0, s0, a4\n\t" + "xor s0, s0, t2\n\t" + "addw t3, t3, s6\n\t" + "addw t3, t3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s6\n\t" + /* roriw s10, t4, 2 */ + ".word 0x602edd1b\n\t" + /* roriw s11, t4, 13 */ + ".word 0x60dedd9b\n\t" + /* roriw s7, t4, 22 */ + ".word 0x616edb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t5\n\t" + "addw a3, a3, t3\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, s11\n\t" +#else + "slliw s11, a4, 26\n\t" + "srliw s10, a4, 6\n\t" + "slliw s0, a4, 21\n\t" + "srliw s6, a4, 11\n\t" + "slliw s7, a4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t4, 2\n\t" + "slliw s0, t4, 19\n\t" + "addw t3, t3, s6\n\t" + "srliw s7, t4, 13\n\t" + "slliw s6, t4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t1, t2\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t2\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s0\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, a7, 32\n\t" + "srli s8, s4, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, a6, 17 */ + ".word 0x61185d1b\n\t" + /* roriw s11, a6, 19 */ + ".word 0x61385d9b\n\t" + "srliw s7, a6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw a7, a7, s6\n\t" + "addw s7, s7, s8\n\t" + "addw a7, s7, a7\n\t" + "srli s6, a6, 32\n\t" + /* roriw s10, s1, 7 */ + ".word 0x6074dd1b\n\t" + /* roriw s11, s1, 18 */ + ".word 0x6124dd9b\n\t" + "srliw s8, s1, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s5\n\t" + "addw s7, s7, s11\n\t" + "slli a7, a7, 32\n\t" + "slli s7, s7, 32\n\t" + "srli a7, a7, 32\n\t" + "or a7, a7, s7\n\t" +#else + "srli s9, a7, 32\n\t" + "srli s8, s4, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, a6, 15\n\t" + "srliw s11, a6, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, a6, 13\n\t" + "srliw s7, a6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, a6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw a7, a7, s6\n\t" + "addw s7, s7, s8\n\t" + "addw a7, s7, a7\n\t" + "srli s6, a6, 32\n\t" + "slliw s10, s1, 25\n\t" + "srliw s11, s1, 7\n\t" + "slliw s0, s1, 14\n\t" + "srliw s8, s1, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s1, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s5\n\t" + "addw s7, s7, s11\n\t" + "slli a7, a7, 32\n\t" + "slli s7, s7, 32\n\t" + "srli a7, a7, 32\n\t" + "or a7, a7, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 24(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a3, 6 */ + ".word 0x6066dd1b\n\t" + /* roriw s11, a3, 11 */ + ".word 0x60b6dd9b\n\t" + /* roriw s6, a3, 25 */ + ".word 0x6196db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a4, t1\n\t" + "and s0, s0, a3\n\t" + "xor s0, s0, t1\n\t" + "addw t2, t2, s6\n\t" + "addw t2, t2, s0\n\t" + "addw s6, s8, s1\n\t" + "addw t2, t2, s6\n\t" + /* roriw s10, t3, 2 */ + ".word 0x602e5d1b\n\t" + /* roriw s11, t3, 13 */ + ".word 0x60de5d9b\n\t" + /* roriw s7, t3, 22 */ + ".word 0x616e5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t4\n\t" + "addw t6, t6, t2\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, s11\n\t" +#else + "slliw s11, a3, 26\n\t" + "srliw s10, a3, 6\n\t" + "slliw s0, a3, 21\n\t" + "srliw s6, a3, 11\n\t" + "slliw s7, a3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t3, 2\n\t" + "slliw s0, t3, 19\n\t" + "addw t2, t2, s6\n\t" + "srliw s7, t3, 13\n\t" + "slliw s6, t3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a4, t1\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t1\n\t" + "addw s6, s8, s1\n\t" + "addw t2, t2, s0\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s1, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t6, 6 */ + ".word 0x606fdd1b\n\t" + /* roriw s11, t6, 11 */ + ".word 0x60bfdd9b\n\t" + /* roriw s6, t6, 25 */ + ".word 0x619fdb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a3, a4\n\t" + "and s0, s0, t6\n\t" + "xor s0, s0, a4\n\t" + "addw t1, t1, s6\n\t" + "addw t1, t1, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s6\n\t" + /* roriw s10, t2, 2 */ + ".word 0x6023dd1b\n\t" + /* roriw s11, t2, 13 */ + ".word 0x60d3dd9b\n\t" + /* roriw s7, t2, 22 */ + ".word 0x6163db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t3\n\t" + "addw t5, t5, t1\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, s11\n\t" +#else + "slliw s11, t6, 26\n\t" + "srliw s10, t6, 6\n\t" + "slliw s0, t6, 21\n\t" + "srliw s6, t6, 11\n\t" + "slliw s7, t6, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t6, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t2, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t2, 2\n\t" + "slliw s0, t2, 19\n\t" + "addw t1, t1, s6\n\t" + "srliw s7, t2, 13\n\t" + "slliw s6, t2, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t2, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a3, a4\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t6\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a4\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s0\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, s1, 32\n\t" + "srli s8, s5, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, a7, 17 */ + ".word 0x6118dd1b\n\t" + /* roriw s11, a7, 19 */ + ".word 0x6138dd9b\n\t" + "srliw s7, a7, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s1, s1, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s1, s7, s1\n\t" + "srli s6, a7, 32\n\t" + /* roriw s10, s2, 7 */ + ".word 0x60795d1b\n\t" + /* roriw s11, s2, 18 */ + ".word 0x61295d9b\n\t" + "srliw s8, s2, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, a5\n\t" + "addw s7, s7, s11\n\t" + "slli s1, s1, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s1, s1, 32\n\t" + "or s1, s1, s7\n\t" +#else + "srli s9, s1, 32\n\t" + "srli s8, s5, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, a7, 15\n\t" + "srliw s11, a7, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, a7, 13\n\t" + "srliw s7, a7, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, a7, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s1, s1, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s1, s7, s1\n\t" + "srli s6, a7, 32\n\t" + "slliw s10, s2, 25\n\t" + "srliw s11, s2, 7\n\t" + "slliw s0, s2, 14\n\t" + "srliw s8, s2, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s2, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, a5\n\t" + "addw s7, s7, s11\n\t" + "slli s1, s1, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s1, s1, 32\n\t" + "or s1, s1, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 32(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t5, 6 */ + ".word 0x606f5d1b\n\t" + /* roriw s11, t5, 11 */ + ".word 0x60bf5d9b\n\t" + /* roriw s6, t5, 25 */ + ".word 0x619f5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t6, a3\n\t" + "and s0, s0, t5\n\t" + "xor s0, s0, a3\n\t" + "addw a4, a4, s6\n\t" + "addw a4, a4, s0\n\t" + "addw s6, s8, s2\n\t" + "addw a4, a4, s6\n\t" + /* roriw s10, t1, 2 */ + ".word 0x60235d1b\n\t" + /* roriw s11, t1, 13 */ + ".word 0x60d35d9b\n\t" + /* roriw s7, t1, 22 */ + ".word 0x61635b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t2\n\t" + "addw t4, t4, a4\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, s11\n\t" +#else + "slliw s11, t5, 26\n\t" + "srliw s10, t5, 6\n\t" + "slliw s0, t5, 21\n\t" + "srliw s6, t5, 11\n\t" + "slliw s7, t5, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t5, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t1, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t1, 2\n\t" + "slliw s0, t1, 19\n\t" + "addw a4, a4, s6\n\t" + "srliw s7, t1, 13\n\t" + "slliw s6, t1, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t1, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t6, a3\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t5\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a3\n\t" + "addw s6, s8, s2\n\t" + "addw a4, a4, s0\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s2, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t4, 6 */ + ".word 0x606edd1b\n\t" + /* roriw s11, t4, 11 */ + ".word 0x60bedd9b\n\t" + /* roriw s6, t4, 25 */ + ".word 0x619edb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t5, t6\n\t" + "and s0, s0, t4\n\t" + "xor s0, s0, t6\n\t" + "addw a3, a3, s6\n\t" + "addw a3, a3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s6\n\t" + /* roriw s10, a4, 2 */ + ".word 0x60275d1b\n\t" + /* roriw s11, a4, 13 */ + ".word 0x60d75d9b\n\t" + /* roriw s7, a4, 22 */ + ".word 0x61675b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t1\n\t" + "addw t3, t3, a3\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, s11\n\t" +#else + "slliw s11, t4, 26\n\t" + "srliw s10, t4, 6\n\t" + "slliw s0, t4, 21\n\t" + "srliw s6, t4, 11\n\t" + "slliw s7, t4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a4, 2\n\t" + "slliw s0, a4, 19\n\t" + "addw a3, a3, s6\n\t" + "srliw s7, a4, 13\n\t" + "slliw s6, a4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t5, t6\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t6\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s0\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, s2, 32\n\t" + "srli s8, a5, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, s1, 17 */ + ".word 0x6114dd1b\n\t" + /* roriw s11, s1, 19 */ + ".word 0x6134dd9b\n\t" + "srliw s7, s1, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s2, s2, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s2, s7, s2\n\t" + "srli s6, s1, 32\n\t" + /* roriw s10, s3, 7 */ + ".word 0x6079dd1b\n\t" + /* roriw s11, s3, 18 */ + ".word 0x6129dd9b\n\t" + "srliw s8, s3, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, a6\n\t" + "addw s7, s7, s11\n\t" + "slli s2, s2, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s2, s2, 32\n\t" + "or s2, s2, s7\n\t" +#else + "srli s9, s2, 32\n\t" + "srli s8, a5, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s1, 15\n\t" + "srliw s11, s1, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, s1, 13\n\t" + "srliw s7, s1, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s1, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s2, s2, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s2, s7, s2\n\t" + "srli s6, s1, 32\n\t" + "slliw s10, s3, 25\n\t" + "srliw s11, s3, 7\n\t" + "slliw s0, s3, 14\n\t" + "srliw s8, s3, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s3, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, a6\n\t" + "addw s7, s7, s11\n\t" + "slli s2, s2, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s2, s2, 32\n\t" + "or s2, s2, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 40(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t3, 6 */ + ".word 0x606e5d1b\n\t" + /* roriw s11, t3, 11 */ + ".word 0x60be5d9b\n\t" + /* roriw s6, t3, 25 */ + ".word 0x619e5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t4, t5\n\t" + "and s0, s0, t3\n\t" + "xor s0, s0, t5\n\t" + "addw t6, t6, s6\n\t" + "addw t6, t6, s0\n\t" + "addw s6, s8, s3\n\t" + "addw t6, t6, s6\n\t" + /* roriw s10, a3, 2 */ + ".word 0x6026dd1b\n\t" + /* roriw s11, a3, 13 */ + ".word 0x60d6dd9b\n\t" + /* roriw s7, a3, 22 */ + ".word 0x6166db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a4\n\t" + "addw t2, t2, t6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, s11\n\t" +#else + "slliw s11, t3, 26\n\t" + "srliw s10, t3, 6\n\t" + "slliw s0, t3, 21\n\t" + "srliw s6, t3, 11\n\t" + "slliw s7, t3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a3, 2\n\t" + "slliw s0, a3, 19\n\t" + "addw t6, t6, s6\n\t" + "srliw s7, a3, 13\n\t" + "slliw s6, a3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t4, t5\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t5\n\t" + "addw s6, s8, s3\n\t" + "addw t6, t6, s0\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s3, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t2, 6 */ + ".word 0x6063dd1b\n\t" + /* roriw s11, t2, 11 */ + ".word 0x60b3dd9b\n\t" + /* roriw s6, t2, 25 */ + ".word 0x6193db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t3, t4\n\t" + "and s0, s0, t2\n\t" + "xor s0, s0, t4\n\t" + "addw t5, t5, s6\n\t" + "addw t5, t5, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s6\n\t" + /* roriw s10, t6, 2 */ + ".word 0x602fdd1b\n\t" + /* roriw s11, t6, 13 */ + ".word 0x60dfdd9b\n\t" + /* roriw s7, t6, 22 */ + ".word 0x616fdb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a3\n\t" + "addw t1, t1, t5\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, s11\n\t" +#else + "slliw s11, t2, 26\n\t" + "srliw s10, t2, 6\n\t" + "slliw s0, t2, 21\n\t" + "srliw s6, t2, 11\n\t" + "slliw s7, t2, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t2, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t6, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t6, 2\n\t" + "slliw s0, t6, 19\n\t" + "addw t5, t5, s6\n\t" + "srliw s7, t6, 13\n\t" + "slliw s6, t6, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t6, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t3, t4\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t2\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t4\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s0\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, s3, 32\n\t" + "srli s8, a6, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, s2, 17 */ + ".word 0x61195d1b\n\t" + /* roriw s11, s2, 19 */ + ".word 0x61395d9b\n\t" + "srliw s7, s2, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s3, s3, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s3, s7, s3\n\t" + "srli s6, s2, 32\n\t" + /* roriw s10, s4, 7 */ + ".word 0x607a5d1b\n\t" + /* roriw s11, s4, 18 */ + ".word 0x612a5d9b\n\t" + "srliw s8, s4, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, a7\n\t" + "addw s7, s7, s11\n\t" + "slli s3, s3, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s3, s3, 32\n\t" + "or s3, s3, s7\n\t" +#else + "srli s9, s3, 32\n\t" + "srli s8, a6, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s2, 15\n\t" + "srliw s11, s2, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, s2, 13\n\t" + "srliw s7, s2, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s2, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s3, s3, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s3, s7, s3\n\t" + "srli s6, s2, 32\n\t" + "slliw s10, s4, 25\n\t" + "srliw s11, s4, 7\n\t" + "slliw s0, s4, 14\n\t" + "srliw s8, s4, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s4, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, a7\n\t" + "addw s7, s7, s11\n\t" + "slli s3, s3, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s3, s3, 32\n\t" + "or s3, s3, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 48(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t1, 6 */ + ".word 0x60635d1b\n\t" + /* roriw s11, t1, 11 */ + ".word 0x60b35d9b\n\t" + /* roriw s6, t1, 25 */ + ".word 0x61935b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t2, t3\n\t" + "and s0, s0, t1\n\t" + "xor s0, s0, t3\n\t" + "addw t4, t4, s6\n\t" + "addw t4, t4, s0\n\t" + "addw s6, s8, s4\n\t" + "addw t4, t4, s6\n\t" + /* roriw s10, t5, 2 */ + ".word 0x602f5d1b\n\t" + /* roriw s11, t5, 13 */ + ".word 0x60df5d9b\n\t" + /* roriw s7, t5, 22 */ + ".word 0x616f5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t6\n\t" + "addw a4, a4, t4\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, s11\n\t" +#else + "slliw s11, t1, 26\n\t" + "srliw s10, t1, 6\n\t" + "slliw s0, t1, 21\n\t" + "srliw s6, t1, 11\n\t" + "slliw s7, t1, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t1, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t5, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t5, 2\n\t" + "slliw s0, t5, 19\n\t" + "addw t4, t4, s6\n\t" + "srliw s7, t5, 13\n\t" + "slliw s6, t5, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t5, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t2, t3\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t1\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t3\n\t" + "addw s6, s8, s4\n\t" + "addw t4, t4, s0\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s4, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a4, 6 */ + ".word 0x60675d1b\n\t" + /* roriw s11, a4, 11 */ + ".word 0x60b75d9b\n\t" + /* roriw s6, a4, 25 */ + ".word 0x61975b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t1, t2\n\t" + "and s0, s0, a4\n\t" + "xor s0, s0, t2\n\t" + "addw t3, t3, s6\n\t" + "addw t3, t3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s6\n\t" + /* roriw s10, t4, 2 */ + ".word 0x602edd1b\n\t" + /* roriw s11, t4, 13 */ + ".word 0x60dedd9b\n\t" + /* roriw s7, t4, 22 */ + ".word 0x616edb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t5\n\t" + "addw a3, a3, t3\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, s11\n\t" +#else + "slliw s11, a4, 26\n\t" + "srliw s10, a4, 6\n\t" + "slliw s0, a4, 21\n\t" + "srliw s6, a4, 11\n\t" + "slliw s7, a4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t4, 2\n\t" + "slliw s0, t4, 19\n\t" + "addw t3, t3, s6\n\t" + "srliw s7, t4, 13\n\t" + "slliw s6, t4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t1, t2\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t2\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s0\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, s4, 32\n\t" + "srli s8, a7, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, s3, 17 */ + ".word 0x6119dd1b\n\t" + /* roriw s11, s3, 19 */ + ".word 0x6139dd9b\n\t" + "srliw s7, s3, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s4, s4, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s4, s7, s4\n\t" + "srli s6, s3, 32\n\t" + /* roriw s10, s5, 7 */ + ".word 0x607add1b\n\t" + /* roriw s11, s5, 18 */ + ".word 0x612add9b\n\t" + "srliw s8, s5, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s1\n\t" + "addw s7, s7, s11\n\t" + "slli s4, s4, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s4, s4, 32\n\t" + "or s4, s4, s7\n\t" +#else + "srli s9, s4, 32\n\t" + "srli s8, a7, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s3, 15\n\t" + "srliw s11, s3, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, s3, 13\n\t" + "srliw s7, s3, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s3, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s4, s4, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s4, s7, s4\n\t" + "srli s6, s3, 32\n\t" + "slliw s10, s5, 25\n\t" + "srliw s11, s5, 7\n\t" + "slliw s0, s5, 14\n\t" + "srliw s8, s5, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s5, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s1\n\t" + "addw s7, s7, s11\n\t" + "slli s4, s4, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s4, s4, 32\n\t" + "or s4, s4, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 56(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a3, 6 */ + ".word 0x6066dd1b\n\t" + /* roriw s11, a3, 11 */ + ".word 0x60b6dd9b\n\t" + /* roriw s6, a3, 25 */ + ".word 0x6196db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a4, t1\n\t" + "and s0, s0, a3\n\t" + "xor s0, s0, t1\n\t" + "addw t2, t2, s6\n\t" + "addw t2, t2, s0\n\t" + "addw s6, s8, s5\n\t" + "addw t2, t2, s6\n\t" + /* roriw s10, t3, 2 */ + ".word 0x602e5d1b\n\t" + /* roriw s11, t3, 13 */ + ".word 0x60de5d9b\n\t" + /* roriw s7, t3, 22 */ + ".word 0x616e5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t4\n\t" + "addw t6, t6, t2\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, s11\n\t" +#else + "slliw s11, a3, 26\n\t" + "srliw s10, a3, 6\n\t" + "slliw s0, a3, 21\n\t" + "srliw s6, a3, 11\n\t" + "slliw s7, a3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t3, 2\n\t" + "slliw s0, t3, 19\n\t" + "addw t2, t2, s6\n\t" + "srliw s7, t3, 13\n\t" + "slliw s6, t3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a4, t1\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t1\n\t" + "addw s6, s8, s5\n\t" + "addw t2, t2, s0\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s5, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t6, 6 */ + ".word 0x606fdd1b\n\t" + /* roriw s11, t6, 11 */ + ".word 0x60bfdd9b\n\t" + /* roriw s6, t6, 25 */ + ".word 0x619fdb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a3, a4\n\t" + "and s0, s0, t6\n\t" + "xor s0, s0, a4\n\t" + "addw t1, t1, s6\n\t" + "addw t1, t1, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s6\n\t" + /* roriw s10, t2, 2 */ + ".word 0x6023dd1b\n\t" + /* roriw s11, t2, 13 */ + ".word 0x60d3dd9b\n\t" + /* roriw s7, t2, 22 */ + ".word 0x6163db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t3\n\t" + "addw t5, t5, t1\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, s11\n\t" +#else + "slliw s11, t6, 26\n\t" + "srliw s10, t6, 6\n\t" + "slliw s0, t6, 21\n\t" + "srliw s6, t6, 11\n\t" + "slliw s7, t6, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t6, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t2, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t2, 2\n\t" + "slliw s0, t2, 19\n\t" + "addw t1, t1, s6\n\t" + "srliw s7, t2, 13\n\t" + "slliw s6, t2, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t2, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a3, a4\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t6\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a4\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s0\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, s5, 32\n\t" + "srli s8, s1, 32\n\t" + /* roriw s10, s9, 7 */ + ".word 0x607cdd1b\n\t" + /* roriw s11, s9, 18 */ + ".word 0x612cdd9b\n\t" + "srliw s6, s9, 3\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + /* roriw s10, s4, 17 */ + ".word 0x611a5d1b\n\t" + /* roriw s11, s4, 19 */ + ".word 0x613a5d9b\n\t" + "srliw s7, s4, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s5, s5, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s5, s7, s5\n\t" + "srli s6, s4, 32\n\t" + /* roriw s10, a5, 7 */ + ".word 0x6077dd1b\n\t" + /* roriw s11, a5, 18 */ + ".word 0x6127dd9b\n\t" + "srliw s8, a5, 3\n\t" + "xor s8, s8, s10\n\t" + "xor s8, s8, s11\n\t" + /* roriw s10, s6, 17 */ + ".word 0x611b5d1b\n\t" + /* roriw s11, s6, 19 */ + ".word 0x613b5d9b\n\t" + "srliw s7, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s2\n\t" + "addw s7, s7, s11\n\t" + "slli s5, s5, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s5, s5, 32\n\t" + "or s5, s5, s7\n\t" +#else + "srli s9, s5, 32\n\t" + "srli s8, s1, 32\n\t" + "slliw s10, s9, 25\n\t" + "srliw s11, s9, 7\n\t" + "slliw s0, s9, 14\n\t" + "srliw s6, s9, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, s9, 3\n\t" + "xor s6, s6, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s4, 15\n\t" + "srliw s11, s4, 17\n\t" + "xor s6, s6, s10\n\t" + "slliw s10, s4, 13\n\t" + "srliw s7, s4, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s4, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s5, s5, s6\n\t" + "addw s7, s7, s8\n\t" + "addw s5, s7, s5\n\t" + "srli s6, s4, 32\n\t" + "slliw s10, a5, 25\n\t" + "srliw s11, a5, 7\n\t" + "slliw s0, a5, 14\n\t" + "srliw s8, a5, 18\n\t" + "or s10, s10, s11\n\t" + "srliw s11, a5, 3\n\t" + "xor s8, s8, s0\n\t" + "xor s10, s10, s11\n\t" + "slliw s0, s6, 15\n\t" + "srliw s11, s6, 17\n\t" + "xor s8, s8, s10\n\t" + "slliw s10, s6, 13\n\t" + "srliw s7, s6, 19\n\t" + "or s0, s0, s11\n\t" + "srliw s11, s6, 10\n\t" + "xor s7, s7, s10\n\t" + "xor s0, s0, s11\n\t" + "xor s7, s7, s0\n\t" + "addw s11, s8, s9\n\t" + "addw s7, s7, s2\n\t" + "addw s7, s7, s11\n\t" + "slli s5, s5, 32\n\t" + "slli s7, s7, 32\n\t" + "srli s5, s5, 32\n\t" + "or s5, s5, s7\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "addi %[len], %[len], -1\n\t" + "addi %[k], %[k], 64\n\t" + "andi s6, %[len], 3\n\t" + "bnez s6, L_SHA256_transform_riscv_len_inner_%=\n\t" + "ld s8, 0(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t5, 6 */ + ".word 0x606f5d1b\n\t" + /* roriw s11, t5, 11 */ + ".word 0x60bf5d9b\n\t" + /* roriw s6, t5, 25 */ + ".word 0x619f5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t6, a3\n\t" + "and s0, s0, t5\n\t" + "xor s0, s0, a3\n\t" + "addw a4, a4, s6\n\t" + "addw a4, a4, s0\n\t" + "addw s6, s8, a5\n\t" + "addw a4, a4, s6\n\t" + /* roriw s10, t1, 2 */ + ".word 0x60235d1b\n\t" + /* roriw s11, t1, 13 */ + ".word 0x60d35d9b\n\t" + /* roriw s7, t1, 22 */ + ".word 0x61635b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t2\n\t" + "addw t4, t4, a4\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, s11\n\t" +#else + "slliw s11, t5, 26\n\t" + "srliw s10, t5, 6\n\t" + "slliw s0, t5, 21\n\t" + "srliw s6, t5, 11\n\t" + "slliw s7, t5, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t5, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t1, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t1, 2\n\t" + "slliw s0, t1, 19\n\t" + "addw a4, a4, s6\n\t" + "srliw s7, t1, 13\n\t" + "slliw s6, t1, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t1, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t6, a3\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t5\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a3\n\t" + "addw s6, s8, a5\n\t" + "addw a4, a4, s0\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, a5, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t4, 6 */ + ".word 0x606edd1b\n\t" + /* roriw s11, t4, 11 */ + ".word 0x60bedd9b\n\t" + /* roriw s6, t4, 25 */ + ".word 0x619edb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t5, t6\n\t" + "and s0, s0, t4\n\t" + "xor s0, s0, t6\n\t" + "addw a3, a3, s6\n\t" + "addw a3, a3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s6\n\t" + /* roriw s10, a4, 2 */ + ".word 0x60275d1b\n\t" + /* roriw s11, a4, 13 */ + ".word 0x60d75d9b\n\t" + /* roriw s7, a4, 22 */ + ".word 0x61675b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t1\n\t" + "addw t3, t3, a3\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, s11\n\t" +#else + "slliw s11, t4, 26\n\t" + "srliw s10, t4, 6\n\t" + "slliw s0, t4, 21\n\t" + "srliw s6, t4, 11\n\t" + "slliw s7, t4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a4, 2\n\t" + "slliw s0, a4, 19\n\t" + "addw a3, a3, s6\n\t" + "srliw s7, a4, 13\n\t" + "slliw s6, a4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t5, t6\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t6\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s0\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 8(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t3, 6 */ + ".word 0x606e5d1b\n\t" + /* roriw s11, t3, 11 */ + ".word 0x60be5d9b\n\t" + /* roriw s6, t3, 25 */ + ".word 0x619e5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t4, t5\n\t" + "and s0, s0, t3\n\t" + "xor s0, s0, t5\n\t" + "addw t6, t6, s6\n\t" + "addw t6, t6, s0\n\t" + "addw s6, s8, a6\n\t" + "addw t6, t6, s6\n\t" + /* roriw s10, a3, 2 */ + ".word 0x6026dd1b\n\t" + /* roriw s11, a3, 13 */ + ".word 0x60d6dd9b\n\t" + /* roriw s7, a3, 22 */ + ".word 0x6166db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a4\n\t" + "addw t2, t2, t6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, s11\n\t" +#else + "slliw s11, t3, 26\n\t" + "srliw s10, t3, 6\n\t" + "slliw s0, t3, 21\n\t" + "srliw s6, t3, 11\n\t" + "slliw s7, t3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a3, 2\n\t" + "slliw s0, a3, 19\n\t" + "addw t6, t6, s6\n\t" + "srliw s7, a3, 13\n\t" + "slliw s6, a3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t4, t5\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t5\n\t" + "addw s6, s8, a6\n\t" + "addw t6, t6, s0\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, a6, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t2, 6 */ + ".word 0x6063dd1b\n\t" + /* roriw s11, t2, 11 */ + ".word 0x60b3dd9b\n\t" + /* roriw s6, t2, 25 */ + ".word 0x6193db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t3, t4\n\t" + "and s0, s0, t2\n\t" + "xor s0, s0, t4\n\t" + "addw t5, t5, s6\n\t" + "addw t5, t5, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s6\n\t" + /* roriw s10, t6, 2 */ + ".word 0x602fdd1b\n\t" + /* roriw s11, t6, 13 */ + ".word 0x60dfdd9b\n\t" + /* roriw s7, t6, 22 */ + ".word 0x616fdb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a3\n\t" + "addw t1, t1, t5\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, s11\n\t" +#else + "slliw s11, t2, 26\n\t" + "srliw s10, t2, 6\n\t" + "slliw s0, t2, 21\n\t" + "srliw s6, t2, 11\n\t" + "slliw s7, t2, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t2, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t6, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t6, 2\n\t" + "slliw s0, t6, 19\n\t" + "addw t5, t5, s6\n\t" + "srliw s7, t6, 13\n\t" + "slliw s6, t6, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t6, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t3, t4\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t2\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t4\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s0\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 16(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t1, 6 */ + ".word 0x60635d1b\n\t" + /* roriw s11, t1, 11 */ + ".word 0x60b35d9b\n\t" + /* roriw s6, t1, 25 */ + ".word 0x61935b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t2, t3\n\t" + "and s0, s0, t1\n\t" + "xor s0, s0, t3\n\t" + "addw t4, t4, s6\n\t" + "addw t4, t4, s0\n\t" + "addw s6, s8, a7\n\t" + "addw t4, t4, s6\n\t" + /* roriw s10, t5, 2 */ + ".word 0x602f5d1b\n\t" + /* roriw s11, t5, 13 */ + ".word 0x60df5d9b\n\t" + /* roriw s7, t5, 22 */ + ".word 0x616f5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t6\n\t" + "addw a4, a4, t4\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, s11\n\t" +#else + "slliw s11, t1, 26\n\t" + "srliw s10, t1, 6\n\t" + "slliw s0, t1, 21\n\t" + "srliw s6, t1, 11\n\t" + "slliw s7, t1, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t1, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t5, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t5, 2\n\t" + "slliw s0, t5, 19\n\t" + "addw t4, t4, s6\n\t" + "srliw s7, t5, 13\n\t" + "slliw s6, t5, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t5, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t2, t3\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t1\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t3\n\t" + "addw s6, s8, a7\n\t" + "addw t4, t4, s0\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, a7, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a4, 6 */ + ".word 0x60675d1b\n\t" + /* roriw s11, a4, 11 */ + ".word 0x60b75d9b\n\t" + /* roriw s6, a4, 25 */ + ".word 0x61975b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t1, t2\n\t" + "and s0, s0, a4\n\t" + "xor s0, s0, t2\n\t" + "addw t3, t3, s6\n\t" + "addw t3, t3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s6\n\t" + /* roriw s10, t4, 2 */ + ".word 0x602edd1b\n\t" + /* roriw s11, t4, 13 */ + ".word 0x60dedd9b\n\t" + /* roriw s7, t4, 22 */ + ".word 0x616edb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t5\n\t" + "addw a3, a3, t3\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, s11\n\t" +#else + "slliw s11, a4, 26\n\t" + "srliw s10, a4, 6\n\t" + "slliw s0, a4, 21\n\t" + "srliw s6, a4, 11\n\t" + "slliw s7, a4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t4, 2\n\t" + "slliw s0, t4, 19\n\t" + "addw t3, t3, s6\n\t" + "srliw s7, t4, 13\n\t" + "slliw s6, t4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t1, t2\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t2\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s0\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 24(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a3, 6 */ + ".word 0x6066dd1b\n\t" + /* roriw s11, a3, 11 */ + ".word 0x60b6dd9b\n\t" + /* roriw s6, a3, 25 */ + ".word 0x6196db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a4, t1\n\t" + "and s0, s0, a3\n\t" + "xor s0, s0, t1\n\t" + "addw t2, t2, s6\n\t" + "addw t2, t2, s0\n\t" + "addw s6, s8, s1\n\t" + "addw t2, t2, s6\n\t" + /* roriw s10, t3, 2 */ + ".word 0x602e5d1b\n\t" + /* roriw s11, t3, 13 */ + ".word 0x60de5d9b\n\t" + /* roriw s7, t3, 22 */ + ".word 0x616e5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t4\n\t" + "addw t6, t6, t2\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, s11\n\t" +#else + "slliw s11, a3, 26\n\t" + "srliw s10, a3, 6\n\t" + "slliw s0, a3, 21\n\t" + "srliw s6, a3, 11\n\t" + "slliw s7, a3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t3, 2\n\t" + "slliw s0, t3, 19\n\t" + "addw t2, t2, s6\n\t" + "srliw s7, t3, 13\n\t" + "slliw s6, t3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a4, t1\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t1\n\t" + "addw s6, s8, s1\n\t" + "addw t2, t2, s0\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s1, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t6, 6 */ + ".word 0x606fdd1b\n\t" + /* roriw s11, t6, 11 */ + ".word 0x60bfdd9b\n\t" + /* roriw s6, t6, 25 */ + ".word 0x619fdb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a3, a4\n\t" + "and s0, s0, t6\n\t" + "xor s0, s0, a4\n\t" + "addw t1, t1, s6\n\t" + "addw t1, t1, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s6\n\t" + /* roriw s10, t2, 2 */ + ".word 0x6023dd1b\n\t" + /* roriw s11, t2, 13 */ + ".word 0x60d3dd9b\n\t" + /* roriw s7, t2, 22 */ + ".word 0x6163db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t3\n\t" + "addw t5, t5, t1\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, s11\n\t" +#else + "slliw s11, t6, 26\n\t" + "srliw s10, t6, 6\n\t" + "slliw s0, t6, 21\n\t" + "srliw s6, t6, 11\n\t" + "slliw s7, t6, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t6, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t2, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t2, 2\n\t" + "slliw s0, t2, 19\n\t" + "addw t1, t1, s6\n\t" + "srliw s7, t2, 13\n\t" + "slliw s6, t2, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t2, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a3, a4\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t6\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a4\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s0\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 32(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t5, 6 */ + ".word 0x606f5d1b\n\t" + /* roriw s11, t5, 11 */ + ".word 0x60bf5d9b\n\t" + /* roriw s6, t5, 25 */ + ".word 0x619f5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t6, a3\n\t" + "and s0, s0, t5\n\t" + "xor s0, s0, a3\n\t" + "addw a4, a4, s6\n\t" + "addw a4, a4, s0\n\t" + "addw s6, s8, s2\n\t" + "addw a4, a4, s6\n\t" + /* roriw s10, t1, 2 */ + ".word 0x60235d1b\n\t" + /* roriw s11, t1, 13 */ + ".word 0x60d35d9b\n\t" + /* roriw s7, t1, 22 */ + ".word 0x61635b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t2\n\t" + "addw t4, t4, a4\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, s11\n\t" +#else + "slliw s11, t5, 26\n\t" + "srliw s10, t5, 6\n\t" + "slliw s0, t5, 21\n\t" + "srliw s6, t5, 11\n\t" + "slliw s7, t5, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t5, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t1, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t1, 2\n\t" + "slliw s0, t1, 19\n\t" + "addw a4, a4, s6\n\t" + "srliw s7, t1, 13\n\t" + "slliw s6, t1, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t1, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t6, a3\n\t" + "xor s11, t1, t2\n\t" + "xor s6, t2, t3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t5\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a3\n\t" + "addw s6, s8, s2\n\t" + "addw a4, a4, s0\n\t" + "xor s11, s11, t2\n\t" + "addw a4, a4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, a4\n\t" + "addw a4, a4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s2, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t4, 6 */ + ".word 0x606edd1b\n\t" + /* roriw s11, t4, 11 */ + ".word 0x60bedd9b\n\t" + /* roriw s6, t4, 25 */ + ".word 0x619edb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t5, t6\n\t" + "and s0, s0, t4\n\t" + "xor s0, s0, t6\n\t" + "addw a3, a3, s6\n\t" + "addw a3, a3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s6\n\t" + /* roriw s10, a4, 2 */ + ".word 0x60275d1b\n\t" + /* roriw s11, a4, 13 */ + ".word 0x60d75d9b\n\t" + /* roriw s7, a4, 22 */ + ".word 0x61675b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t1\n\t" + "addw t3, t3, a3\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, s11\n\t" +#else + "slliw s11, t4, 26\n\t" + "srliw s10, t4, 6\n\t" + "slliw s0, t4, 21\n\t" + "srliw s6, t4, 11\n\t" + "slliw s7, t4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a4, 2\n\t" + "slliw s0, a4, 19\n\t" + "addw a3, a3, s6\n\t" + "srliw s7, a4, 13\n\t" + "slliw s6, a4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t5, t6\n\t" + "xor s11, a4, t1\n\t" + "xor s6, t1, t2\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t6\n\t" + "addw s6, s8, s9\n\t" + "addw a3, a3, s0\n\t" + "xor s11, s11, t1\n\t" + "addw a3, a3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, a3\n\t" + "addw a3, a3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 40(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t3, 6 */ + ".word 0x606e5d1b\n\t" + /* roriw s11, t3, 11 */ + ".word 0x60be5d9b\n\t" + /* roriw s6, t3, 25 */ + ".word 0x619e5b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t4, t5\n\t" + "and s0, s0, t3\n\t" + "xor s0, s0, t5\n\t" + "addw t6, t6, s6\n\t" + "addw t6, t6, s0\n\t" + "addw s6, s8, s3\n\t" + "addw t6, t6, s6\n\t" + /* roriw s10, a3, 2 */ + ".word 0x6026dd1b\n\t" + /* roriw s11, a3, 13 */ + ".word 0x60d6dd9b\n\t" + /* roriw s7, a3, 22 */ + ".word 0x6166db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a4\n\t" + "addw t2, t2, t6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, s11\n\t" +#else + "slliw s11, t3, 26\n\t" + "srliw s10, t3, 6\n\t" + "slliw s0, t3, 21\n\t" + "srliw s6, t3, 11\n\t" + "slliw s7, t3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, a3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, a3, 2\n\t" + "slliw s0, a3, 19\n\t" + "addw t6, t6, s6\n\t" + "srliw s7, a3, 13\n\t" + "slliw s6, a3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, a3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t4, t5\n\t" + "xor s11, a3, a4\n\t" + "xor s6, a4, t1\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t5\n\t" + "addw s6, s8, s3\n\t" + "addw t6, t6, s0\n\t" + "xor s11, s11, a4\n\t" + "addw t6, t6, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, t6\n\t" + "addw t6, t6, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s3, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t2, 6 */ + ".word 0x6063dd1b\n\t" + /* roriw s11, t2, 11 */ + ".word 0x60b3dd9b\n\t" + /* roriw s6, t2, 25 */ + ".word 0x6193db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t3, t4\n\t" + "and s0, s0, t2\n\t" + "xor s0, s0, t4\n\t" + "addw t5, t5, s6\n\t" + "addw t5, t5, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s6\n\t" + /* roriw s10, t6, 2 */ + ".word 0x602fdd1b\n\t" + /* roriw s11, t6, 13 */ + ".word 0x60dfdd9b\n\t" + /* roriw s7, t6, 22 */ + ".word 0x616fdb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, a3\n\t" + "addw t1, t1, t5\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, s11\n\t" +#else + "slliw s11, t2, 26\n\t" + "srliw s10, t2, 6\n\t" + "slliw s0, t2, 21\n\t" + "srliw s6, t2, 11\n\t" + "slliw s7, t2, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t2, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t6, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t6, 2\n\t" + "slliw s0, t6, 19\n\t" + "addw t5, t5, s6\n\t" + "srliw s7, t6, 13\n\t" + "slliw s6, t6, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t6, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t3, t4\n\t" + "xor s11, t6, a3\n\t" + "xor s6, a3, a4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t2\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t4\n\t" + "addw s6, s8, s9\n\t" + "addw t5, t5, s0\n\t" + "xor s11, s11, a3\n\t" + "addw t5, t5, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, t5\n\t" + "addw t5, t5, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 48(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t1, 6 */ + ".word 0x60635d1b\n\t" + /* roriw s11, t1, 11 */ + ".word 0x60b35d9b\n\t" + /* roriw s6, t1, 25 */ + ".word 0x61935b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t2, t3\n\t" + "and s0, s0, t1\n\t" + "xor s0, s0, t3\n\t" + "addw t4, t4, s6\n\t" + "addw t4, t4, s0\n\t" + "addw s6, s8, s4\n\t" + "addw t4, t4, s6\n\t" + /* roriw s10, t5, 2 */ + ".word 0x602f5d1b\n\t" + /* roriw s11, t5, 13 */ + ".word 0x60df5d9b\n\t" + /* roriw s7, t5, 22 */ + ".word 0x616f5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t6\n\t" + "addw a4, a4, t4\n\t" + "addw s11, s7, s11\n\t" + "addw t4, t4, s11\n\t" +#else + "slliw s11, t1, 26\n\t" + "srliw s10, t1, 6\n\t" + "slliw s0, t1, 21\n\t" + "srliw s6, t1, 11\n\t" + "slliw s7, t1, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t1, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t5, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t5, 2\n\t" + "slliw s0, t5, 19\n\t" + "addw t4, t4, s6\n\t" + "srliw s7, t5, 13\n\t" + "slliw s6, t5, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t5, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t2, t3\n\t" + "xor s11, t5, t6\n\t" + "xor s6, t6, a3\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t1\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t3\n\t" + "addw s6, s8, s4\n\t" + "addw t4, t4, s0\n\t" + "xor s11, s11, t6\n\t" + "addw t4, t4, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a4, a4, t4\n\t" + "addw t4, t4, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s4, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a4, 6 */ + ".word 0x60675d1b\n\t" + /* roriw s11, a4, 11 */ + ".word 0x60b75d9b\n\t" + /* roriw s6, a4, 25 */ + ".word 0x61975b1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, t1, t2\n\t" + "and s0, s0, a4\n\t" + "xor s0, s0, t2\n\t" + "addw t3, t3, s6\n\t" + "addw t3, t3, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s6\n\t" + /* roriw s10, t4, 2 */ + ".word 0x602edd1b\n\t" + /* roriw s11, t4, 13 */ + ".word 0x60dedd9b\n\t" + /* roriw s7, t4, 22 */ + ".word 0x616edb9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t5\n\t" + "addw a3, a3, t3\n\t" + "addw s11, s7, s11\n\t" + "addw t3, t3, s11\n\t" +#else + "slliw s11, a4, 26\n\t" + "srliw s10, a4, 6\n\t" + "slliw s0, a4, 21\n\t" + "srliw s6, a4, 11\n\t" + "slliw s7, a4, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a4, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t4, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t4, 2\n\t" + "slliw s0, t4, 19\n\t" + "addw t3, t3, s6\n\t" + "srliw s7, t4, 13\n\t" + "slliw s6, t4, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t4, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, t1, t2\n\t" + "xor s11, t4, t5\n\t" + "xor s6, t5, t6\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a4\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t2\n\t" + "addw s6, s8, s9\n\t" + "addw t3, t3, s0\n\t" + "xor s11, s11, t5\n\t" + "addw t3, t3, s6\n\t" + "addw s11, s7, s11\n\t" + "addw a3, a3, t3\n\t" + "addw t3, t3, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 56(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, a3, 6 */ + ".word 0x6066dd1b\n\t" + /* roriw s11, a3, 11 */ + ".word 0x60b6dd9b\n\t" + /* roriw s6, a3, 25 */ + ".word 0x6196db1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a4, t1\n\t" + "and s0, s0, a3\n\t" + "xor s0, s0, t1\n\t" + "addw t2, t2, s6\n\t" + "addw t2, t2, s0\n\t" + "addw s6, s8, s5\n\t" + "addw t2, t2, s6\n\t" + /* roriw s10, t3, 2 */ + ".word 0x602e5d1b\n\t" + /* roriw s11, t3, 13 */ + ".word 0x60de5d9b\n\t" + /* roriw s7, t3, 22 */ + ".word 0x616e5b9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t4\n\t" + "addw t6, t6, t2\n\t" + "addw s11, s7, s11\n\t" + "addw t2, t2, s11\n\t" +#else + "slliw s11, a3, 26\n\t" + "srliw s10, a3, 6\n\t" + "slliw s0, a3, 21\n\t" + "srliw s6, a3, 11\n\t" + "slliw s7, a3, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, a3, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t3, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t3, 2\n\t" + "slliw s0, t3, 19\n\t" + "addw t2, t2, s6\n\t" + "srliw s7, t3, 13\n\t" + "slliw s6, t3, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t3, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a4, t1\n\t" + "xor s11, t3, t4\n\t" + "xor s6, t4, t5\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, a3\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, t1\n\t" + "addw s6, s8, s5\n\t" + "addw t2, t2, s0\n\t" + "xor s11, s11, t4\n\t" + "addw t2, t2, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t6, t6, t2\n\t" + "addw t2, t2, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "srli s8, s8, 32\n\t" + "srli s9, s5, 32\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* roriw s10, t6, 6 */ + ".word 0x606fdd1b\n\t" + /* roriw s11, t6, 11 */ + ".word 0x60bfdd9b\n\t" + /* roriw s6, t6, 25 */ + ".word 0x619fdb1b\n\t" + "xor s6, s6, s10\n\t" + "xor s6, s6, s11\n\t" + "xor s0, a3, a4\n\t" + "and s0, s0, t6\n\t" + "xor s0, s0, a4\n\t" + "addw t1, t1, s6\n\t" + "addw t1, t1, s0\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s6\n\t" + /* roriw s10, t2, 2 */ + ".word 0x6023dd1b\n\t" + /* roriw s11, t2, 13 */ + ".word 0x60d3dd9b\n\t" + /* roriw s7, t2, 22 */ + ".word 0x6163db9b\n\t" + "xor s7, s7, s10\n\t" + "xor s7, s7, s11\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "and s11, s11, s6\n\t" + "xor s11, s11, t3\n\t" + "addw t5, t5, t1\n\t" + "addw s11, s7, s11\n\t" + "addw t1, t1, s11\n\t" +#else + "slliw s11, t6, 26\n\t" + "srliw s10, t6, 6\n\t" + "slliw s0, t6, 21\n\t" + "srliw s6, t6, 11\n\t" + "slliw s7, t6, 7\n\t" + "or s10, s10, s11\n\t" + "xor s6, s6, s0\n\t" + "srliw s11, t6, 25\n\t" + "xor s10, s10, s7\n\t" + "xor s6, s6, s11\n\t" + "slliw s11, t2, 30\n\t" + "xor s6, s6, s10\n\t" + "srliw s10, t2, 2\n\t" + "slliw s0, t2, 19\n\t" + "addw t1, t1, s6\n\t" + "srliw s7, t2, 13\n\t" + "slliw s6, t2, 10\n\t" + "or s10, s10, s11\n\t" + "xor s7, s7, s0\n\t" + "srliw s0, t2, 22\n\t" + "xor s10, s10, s6\n\t" + "xor s7, s7, s0\n\t" + "xor s0, a3, a4\n\t" + "xor s11, t2, t3\n\t" + "xor s6, t3, t4\n\t" + "xor s7, s7, s10\n\t" + "and s0, s0, t6\n\t" + "and s11, s11, s6\n\t" + "xor s0, s0, a4\n\t" + "addw s6, s8, s9\n\t" + "addw t1, t1, s0\n\t" + "xor s11, s11, t3\n\t" + "addw t1, t1, s6\n\t" + "addw s11, s7, s11\n\t" + "addw t5, t5, t1\n\t" + "addw t1, t1, s11\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "addi %[k], %[k], -192\n\t" + /* Add working variables back into digest state */ + "ld s6, 0(%[sha256])\n\t" + "ld s7, 8(%[sha256])\n\t" + "ld s8, 16(%[sha256])\n\t" + "ld s9, 24(%[sha256])\n\t" + "addw t1, t1, s6\n\t" + "addw t3, t3, s7\n\t" + "addw t5, t5, s8\n\t" + "addw a3, a3, s9\n\t" + "srli s6, s6, 32\n\t" + "srli s7, s7, 32\n\t" + "srli s8, s8, 32\n\t" + "srli s9, s9, 32\n\t" + "addw t2, t2, s6\n\t" + "addw t4, t4, s7\n\t" + "addw t6, t6, s8\n\t" + "addw a4, a4, s9\n\t" + /* Store digest */ + "sw t1, 0(%[sha256])\n\t" + "sw t2, 4(%[sha256])\n\t" + "sw t3, 8(%[sha256])\n\t" + "sw t4, 12(%[sha256])\n\t" + "sw t5, 16(%[sha256])\n\t" + "sw t6, 20(%[sha256])\n\t" + "sw a3, 24(%[sha256])\n\t" + "sw a4, 28(%[sha256])\n\t" + "addi %[data], %[data], 64\n\t" + "bnez %[len], L_SHA256_transform_riscv_len_begin_%=\n\t" + : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len) + : [k] "r" (k) + : "memory", "t1", "t2", "t3", "t4", "t5", "t6", "a3", "a4", "a5", "a6", + "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", + "s11", "s0" + ); +} + +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ +#endif /* !NO_SHA256 || WOLFSSL_SHA224 */ +#endif /* WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S b/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S new file mode 100644 index 00000000000..40930600553 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S @@ -0,0 +1,1221 @@ +/* riscv-64-sha3-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha3/sha3.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.S + */ +#ifdef WOLFSSL_RISCV_ASM +#ifndef WOLFSSL_RISCV_ASM_INLINE +#ifdef WOLFSSL_SHA3 +#ifdef WOLFSSL_RISCV_VECTOR + .section .rodata + .type L_SHA3_transform_vector_r, %object + .size L_SHA3_transform_vector_r, 192 + # 8-byte aligned, 64-bit aligned + .align 3 +L_SHA3_transform_vector_r: + .quad 0x0000000000000001,0x0000000000008082 + .quad 0x800000000000808a,0x8000000080008000 + .quad 0x000000000000808b,0x0000000080000001 + .quad 0x8000000080008081,0x8000000000008009 + .quad 0x000000000000008a,0x0000000000000088 + .quad 0x0000000080008009,0x000000008000000a + .quad 0x000000008000808b,0x800000000000008b + .quad 0x8000000000008089,0x8000000000008003 + .quad 0x8000000000008002,0x8000000000000080 + .quad 0x000000000000800a,0x800000008000000a + .quad 0x8000000080008081,0x8000000000008080 + .quad 0x0000000080000001,0x8000000080008008 + .text + .globl BlockSha3 + .type BlockSha3,@function + .align 2 +BlockSha3: + la t0, L_SHA3_transform_vector_r +#if defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + .option arch, +v, +zvkb, +zvbb +#else + .option arch, +v +#endif /* defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vsetivli zero, 1, e64, m1, ta, ma + li t3, 24 + mv t1, t0 + mv t2, a0 + vlseg8e64.v v0, (t2) + addi t2, a0, 64 + vlseg8e64.v v8, (t2) + addi t2, a0, 128 + vlseg8e64.v v16, (t2) + addi t2, a0, 192 + vle64.v v24, (t2) +L_riscv_64_block_sha3_vector_loop: + # COLUMN MIX + vxor.vv v25, v0, v5 + vxor.vv v26, v1, v6 + vxor.vv v27, v2, v7 + vxor.vv v28, v3, v8 + vxor.vv v29, v4, v9 + vxor.vv v25, v25, v10 + vxor.vv v26, v26, v11 + vxor.vv v27, v27, v12 + vxor.vv v28, v28, v13 + vxor.vv v29, v29, v14 + vxor.vv v25, v25, v15 + vxor.vv v26, v26, v16 + vxor.vv v27, v27, v17 + vxor.vv v28, v28, v18 + vxor.vv v29, v29, v19 + vxor.vv v25, v25, v20 + vxor.vv v26, v26, v21 + vxor.vv v27, v27, v22 + vxor.vv v28, v28, v23 + vxor.vv v29, v29, v24 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 63 + vsll.vi v31, v26, 1 + vsrl.vx v30, v26, t2 + vxor.vv v31, v31, v29 + vxor.vv v31, v31, v30 + vxor.vv v0, v0, v31 + vxor.vv v5, v5, v31 + vxor.vv v10, v10, v31 + vxor.vv v15, v15, v31 + vxor.vv v20, v20, v31 + vsll.vi v31, v27, 1 + vsrl.vx v30, v27, t2 + vxor.vv v31, v31, v25 + vxor.vv v31, v31, v30 + vxor.vv v1, v1, v31 + vxor.vv v6, v6, v31 + vxor.vv v11, v11, v31 + vxor.vv v16, v16, v31 + vxor.vv v21, v21, v31 + vsll.vi v31, v28, 1 + vsrl.vx v30, v28, t2 + vxor.vv v31, v31, v26 + vxor.vv v31, v31, v30 + vxor.vv v2, v2, v31 + vxor.vv v7, v7, v31 + vxor.vv v12, v12, v31 + vxor.vv v17, v17, v31 + vxor.vv v22, v22, v31 + vsll.vi v31, v29, 1 + vsrl.vx v30, v29, t2 + vxor.vv v31, v31, v27 + vxor.vv v31, v31, v30 + vxor.vv v3, v3, v31 + vxor.vv v8, v8, v31 + vxor.vv v13, v13, v31 + vxor.vv v18, v18, v31 + vxor.vv v23, v23, v31 + vsll.vi v31, v25, 1 + vsrl.vx v30, v25, t2 + vxor.vv v31, v31, v28 + vxor.vv v31, v31, v30 + vxor.vv v4, v4, v31 + vxor.vv v9, v9, v31 + vxor.vv v14, v14, v31 + vxor.vv v19, v19, v31 + vxor.vv v24, v24, v31 +#else + vror.vi v30, v26, 63 + vror.vi v31, v27, 63 + vxor.vv v30, v30, v29 + vxor.vv v31, v31, v25 + vxor.vv v0, v0, v30 + vxor.vv v5, v5, v30 + vxor.vv v10, v10, v30 + vxor.vv v15, v15, v30 + vxor.vv v20, v20, v30 + vxor.vv v1, v1, v31 + vxor.vv v6, v6, v31 + vxor.vv v11, v11, v31 + vxor.vv v16, v16, v31 + vxor.vv v21, v21, v31 + vror.vi v30, v28, 63 + vror.vi v31, v29, 63 + vror.vi v25, v25, 63 + vxor.vv v30, v30, v26 + vxor.vv v31, v31, v27 + vxor.vv v25, v25, v28 + vxor.vv v2, v2, v30 + vxor.vv v7, v7, v30 + vxor.vv v12, v12, v30 + vxor.vv v17, v17, v30 + vxor.vv v22, v22, v30 + vxor.vv v3, v3, v31 + vxor.vv v8, v8, v31 + vxor.vv v13, v13, v31 + vxor.vv v18, v18, v31 + vxor.vv v23, v23, v31 + vxor.vv v4, v4, v25 + vxor.vv v9, v9, v25 + vxor.vv v14, v14, v25 + vxor.vv v19, v19, v25 + vxor.vv v24, v24, v25 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + # SWAP ROTL (rho + pi) + vmv.v.v v26, v1 + vmv.v.v v25, v10 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 63 + vsll.vi v10, v26, 1 + vsrl.vx v26, v26, t2 + vor.vv v10, v10, v26 +#else + vror.vi v10, v26, 63 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v7 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 61 + vsll.vi v7, v25, 3 + vsrl.vx v25, v25, t2 + vor.vv v7, v7, v25 +#else + vror.vi v7, v25, 61 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v11 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 58 + vsll.vi v11, v26, 6 + vsrl.vx v26, v26, t2 + vor.vv v11, v11, v26 +#else + vror.vi v11, v26, 58 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v17 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 54 + vsll.vi v17, v25, 10 + vsrl.vx v25, v25, t2 + vor.vv v17, v17, v25 +#else + vror.vi v17, v25, 54 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v18 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 49 + vsll.vi v18, v26, 15 + vsrl.vx v26, v26, t2 + vor.vv v18, v18, v26 +#else + vror.vi v18, v26, 49 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v3 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 43 + vsll.vi v3, v25, 21 + vsrl.vx v25, v25, t2 + vor.vv v3, v3, v25 +#else + vror.vi v3, v25, 43 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v5 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 36 + vsll.vi v5, v26, 28 + vsrl.vx v26, v26, t2 + vor.vv v5, v5, v26 +#else + vror.vi v5, v26, 36 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v16 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 36 + vsrl.vi v16, v25, 28 + vsll.vx v25, v25, t2 + vor.vv v16, v16, v25 +#else + vror.vi v16, v25, 28 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v8 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 45 + vsrl.vi v8, v26, 19 + vsll.vx v26, v26, t2 + vor.vv v8, v8, v26 +#else + vror.vi v8, v26, 19 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v21 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 55 + vsrl.vi v21, v25, 9 + vsll.vx v25, v25, t2 + vor.vv v21, v21, v25 +#else + vror.vi v21, v25, 9 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v24 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 62 + vsll.vi v24, v26, 2 + vsrl.vx v26, v26, t2 + vor.vv v24, v24, v26 +#else + vror.vi v24, v26, 62 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v4 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 50 + vsll.vi v4, v25, 14 + vsrl.vx v25, v25, t2 + vor.vv v4, v4, v25 +#else + vror.vi v4, v25, 50 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v15 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 37 + vsll.vi v15, v26, 27 + vsrl.vx v26, v26, t2 + vor.vv v15, v15, v26 +#else + vror.vi v15, v26, 37 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v23 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 41 + vsrl.vi v23, v25, 23 + vsll.vx v25, v25, t2 + vor.vv v23, v23, v25 +#else + vror.vi v23, v25, 23 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v19 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 56 + vsrl.vi v19, v26, 8 + vsll.vx v26, v26, t2 + vor.vv v19, v19, v26 +#else + vror.vi v19, v26, 8 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v13 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 56 + vsll.vi v13, v25, 8 + vsrl.vx v25, v25, t2 + vor.vv v13, v13, v25 +#else + vror.vi v13, v25, 56 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v12 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 39 + vsll.vi v12, v26, 25 + vsrl.vx v26, v26, t2 + vor.vv v12, v12, v26 +#else + vror.vi v12, v26, 39 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v2 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 43 + vsrl.vi v2, v25, 21 + vsll.vx v25, v25, t2 + vor.vv v2, v2, v25 +#else + vror.vi v2, v25, 21 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v20 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 62 + vsrl.vi v20, v26, 2 + vsll.vx v26, v26, t2 + vor.vv v20, v20, v26 +#else + vror.vi v20, v26, 2 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v14 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 46 + vsll.vi v14, v25, 18 + vsrl.vx v25, v25, t2 + vor.vv v14, v14, v25 +#else + vror.vi v14, v25, 46 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v22 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 39 + vsrl.vi v22, v26, 25 + vsll.vx v26, v26, t2 + vor.vv v22, v22, v26 +#else + vror.vi v22, v26, 25 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v26, v9 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 61 + vsrl.vi v9, v25, 3 + vsll.vx v25, v25, t2 + vor.vv v9, v9, v25 +#else + vror.vi v9, v25, 3 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v6 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + li t2, 44 + vsll.vi v6, v26, 20 + vsrl.vx v26, v26, t2 + vor.vv v6, v6, v26 +#else + vror.vi v6, v26, 44 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + li t2, 44 + vsrl.vi v1, v25, 20 + vsll.vx v25, v25, t2 + vor.vv v1, v1, v25 + # ROW MIX (chi) + vmv.v.v v25, v0 + vmv.v.v v26, v1 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + vnot.v v30, v1 + vnot.v v31, v2 + vand.vv v30, v30, v2 + vand.vv v31, v31, v3 + vxor.vv v0, v30, v0 + vxor.vv v1, v31, v1 + vnot.v v30, v3 + vnot.v v31, v4 + vand.vv v30, v30, v4 + vand.vv v31, v31, v25 + vnot.v v25, v25 + vxor.vv v2, v30, v2 + vand.vv v25, v25, v26 + vxor.vv v3, v31, v3 + vxor.vv v4, v25, v4 +#else + vandn.vv v30, v2, v1 + vandn.vv v31, v3, v2 + vxor.vv v0, v30, v0 + vxor.vv v1, v31, v1 + vandn.vv v30, v4, v3 + vandn.vv v31, v25, v4 + vandn.vv v25, v26, v25 + vxor.vv v2, v30, v2 + vxor.vv v3, v31, v3 + vxor.vv v4, v25, v4 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v5 + vmv.v.v v26, v6 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + vnot.v v30, v6 + vnot.v v31, v7 + vand.vv v30, v30, v7 + vand.vv v31, v31, v8 + vxor.vv v5, v30, v5 + vxor.vv v6, v31, v6 + vnot.v v30, v8 + vnot.v v31, v9 + vand.vv v30, v30, v9 + vand.vv v31, v31, v25 + vnot.v v25, v25 + vxor.vv v7, v30, v7 + vand.vv v25, v25, v26 + vxor.vv v8, v31, v8 + vxor.vv v9, v25, v9 +#else + vandn.vv v30, v7, v6 + vandn.vv v31, v8, v7 + vxor.vv v5, v30, v5 + vxor.vv v6, v31, v6 + vandn.vv v30, v9, v8 + vandn.vv v31, v25, v9 + vandn.vv v25, v26, v25 + vxor.vv v7, v30, v7 + vxor.vv v8, v31, v8 + vxor.vv v9, v25, v9 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v10 + vmv.v.v v26, v11 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + vnot.v v30, v11 + vnot.v v31, v12 + vand.vv v30, v30, v12 + vand.vv v31, v31, v13 + vxor.vv v10, v30, v10 + vxor.vv v11, v31, v11 + vnot.v v30, v13 + vnot.v v31, v14 + vand.vv v30, v30, v14 + vand.vv v31, v31, v25 + vnot.v v25, v25 + vxor.vv v12, v30, v12 + vand.vv v25, v25, v26 + vxor.vv v13, v31, v13 + vxor.vv v14, v25, v14 +#else + vandn.vv v30, v12, v11 + vandn.vv v31, v13, v12 + vxor.vv v10, v30, v10 + vxor.vv v11, v31, v11 + vandn.vv v30, v14, v13 + vandn.vv v31, v25, v14 + vandn.vv v25, v26, v25 + vxor.vv v12, v30, v12 + vxor.vv v13, v31, v13 + vxor.vv v14, v25, v14 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v15 + vmv.v.v v26, v16 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + vnot.v v30, v16 + vnot.v v31, v17 + vand.vv v30, v30, v17 + vand.vv v31, v31, v18 + vxor.vv v15, v30, v15 + vxor.vv v16, v31, v16 + vnot.v v30, v18 + vnot.v v31, v19 + vand.vv v30, v30, v19 + vand.vv v31, v31, v25 + vnot.v v25, v25 + vxor.vv v17, v30, v17 + vand.vv v25, v25, v26 + vxor.vv v18, v31, v18 + vxor.vv v19, v25, v19 +#else + vandn.vv v30, v17, v16 + vandn.vv v31, v18, v17 + vxor.vv v15, v30, v15 + vxor.vv v16, v31, v16 + vandn.vv v30, v19, v18 + vandn.vv v31, v25, v19 + vandn.vv v25, v26, v25 + vxor.vv v17, v30, v17 + vxor.vv v18, v31, v18 + vxor.vv v19, v25, v19 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + vmv.v.v v25, v20 + vmv.v.v v26, v21 +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + vnot.v v30, v21 + vnot.v v31, v22 + vand.vv v30, v30, v22 + vand.vv v31, v31, v23 + vxor.vv v20, v30, v20 + vxor.vv v21, v31, v21 + vnot.v v30, v23 + vnot.v v31, v24 + vand.vv v30, v30, v24 + vand.vv v31, v31, v25 + vnot.v v25, v25 + vxor.vv v22, v30, v22 + vand.vv v25, v25, v26 + vxor.vv v23, v31, v23 + vxor.vv v24, v25, v24 +#else + vandn.vv v30, v22, v21 + vandn.vv v31, v23, v22 + vxor.vv v20, v30, v20 + vxor.vv v21, v31, v21 + vandn.vv v30, v24, v23 + vandn.vv v31, v25, v24 + vandn.vv v25, v26, v25 + vxor.vv v22, v30, v22 + vxor.vv v23, v31, v23 + vxor.vv v24, v25, v24 +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + # IOTA (round constant) + vl1re64.v v25, (t1) + addi t1, t1, 8 + addi t3, t3, -1 + vxor.vv v0, v0, v25 + bnez t3, L_riscv_64_block_sha3_vector_loop + mv t2, a0 + vsseg8e64.v v0, (t2) + addi t2, a0, 64 + vsseg8e64.v v8, (t2) + addi t2, a0, 128 + vsseg8e64.v v16, (t2) + addi t2, a0, 192 + vse64.v v24, (t2) + ret + .size BlockSha3,.-BlockSha3 +#else + .section .rodata + .type L_SHA3_transform_riscv_r, %object + .size L_SHA3_transform_riscv_r, 192 + # 8-byte aligned, 64-bit aligned + .align 3 +L_SHA3_transform_riscv_r: + .quad 0x0000000000000001,0x0000000000008082 + .quad 0x800000000000808a,0x8000000080008000 + .quad 0x000000000000808b,0x0000000080000001 + .quad 0x8000000080008081,0x8000000000008009 + .quad 0x000000000000008a,0x0000000000000088 + .quad 0x0000000080008009,0x000000008000000a + .quad 0x000000008000808b,0x800000000000008b + .quad 0x8000000000008089,0x8000000000008003 + .quad 0x8000000000008002,0x8000000000000080 + .quad 0x000000000000800a,0x800000008000000a + .quad 0x8000000080008081,0x8000000000008080 + .quad 0x0000000080000001,0x8000000080008008 + .text + .globl BlockSha3 + .type BlockSha3,@function + .align 2 +BlockSha3: + addi sp, sp, -128 + sd s0, 32(sp) + sd s1, 40(sp) + sd s2, 48(sp) + sd s3, 56(sp) + sd s4, 64(sp) + sd s5, 72(sp) + sd s6, 80(sp) + sd s7, 88(sp) + sd s8, 96(sp) + sd s9, 104(sp) + sd s10, 112(sp) + sd s11, 120(sp) + la t0, L_SHA3_transform_riscv_r + li s0, 24 + ld t1, 0(a0) + ld t2, 8(a0) + ld t3, 16(a0) + ld t4, 24(a0) + ld t5, 32(a0) + ld t6, 40(a0) + ld a1, 48(a0) + ld a2, 56(a0) + ld a3, 64(a0) + ld a4, 72(a0) + ld a5, 80(a0) + ld a6, 88(a0) + ld a7, 96(a0) + ld s1, 104(a0) + ld s2, 112(a0) + ld s3, 120(a0) + ld s4, 128(a0) + ld s5, 136(a0) + ld s6, 144(a0) + ld s7, 152(a0) + ld s8, 160(a0) + ld s9, 168(a0) + ld s10, 176(a0) +L_riscv_64_block_sha3_loop: + sd s0, 16(sp) + # COLUMN MIX + ld s11, 184(a0) + ld s0, 192(a0) + xor s8, s8, t1 + xor s9, s9, t2 + xor s10, s10, t3 + xor s11, s11, t4 + xor s0, s0, t5 + xor s8, s8, t6 + xor s9, s9, a1 + xor s10, s10, a2 + xor s11, s11, a3 + xor s0, s0, a4 + xor s8, s8, a5 + xor s9, s9, a6 + xor s10, s10, a7 + xor s11, s11, s1 + xor s0, s0, s2 + xor s8, s8, s3 + xor s9, s9, s4 + xor s10, s10, s5 + xor s11, s11, s6 + xor s0, s0, s7 + sd s9, 0(sp) + sd s11, 8(sp) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s11, s9, 63 + slli s9, s9, 1 + or s9, s9, s11 +#else + # rori s9, s9, 63 + .word 0x63fcdc93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s11, 160(a0) + xor s9, s9, s0 + xor t1, t1, s9 + xor t6, t6, s9 + xor s11, s11, s9 + xor a5, a5, s9 + xor s3, s3, s9 + sd s11, 160(a0) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s11, s10, 63 + slli s9, s10, 1 + or s9, s9, s11 +#else + # rori s9, s10, 63 + .word 0x63fd5c93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s11, 168(a0) + xor s9, s9, s8 + xor t2, t2, s9 + xor a1, a1, s9 + xor s11, s11, s9 + xor a6, a6, s9 + xor s4, s4, s9 + sd s11, 168(a0) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s11, s0, 63 + slli s0, s0, 1 + or s0, s0, s11 +#else + # rori s0, s0, 63 + .word 0x63f45413 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s11, 184(a0) + xor s0, s0, s10 + xor t4, t4, s0 + xor a3, a3, s0 + xor s11, s11, s0 + xor s1, s1, s0 + xor s6, s6, s0 + sd s11, 184(a0) + ld s11, 8(sp) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s10, s8, 63 + slli s8, s8, 1 + or s8, s8, s10 +#else + # rori s8, s8, 63 + .word 0x63fc5c13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s0, 192(a0) + xor s8, s8, s11 + xor t5, t5, s8 + xor a4, a4, s8 + xor s0, s0, s8 + xor s2, s2, s8 + xor s7, s7, s8 + ld s9, 0(sp) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s10, s11, 63 + slli s11, s11, 1 + or s11, s11, s10 +#else + # rori s11, s11, 63 + .word 0x63fddd93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 176(a0) + xor s11, s11, s9 + xor t3, t3, s11 + xor a2, a2, s11 + xor s10, s10, s11 + xor a7, a7, s11 + xor s5, s5, s11 + # SWAP ROTL (rho + pi) + mv s8, a5 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s9, t2, 63 + slli a5, t2, 1 + or a5, a5, s9 +#else + # rori a5, t2, 63 + .word 0x63f3d793 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, a2 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli a2, s8, 61 + slli s8, s8, 3 + or a2, a2, s8 +#else + # rori a2, s8, 61 + .word 0x63dc5613 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, a6 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli a6, s9, 58 + slli s9, s9, 6 + or a6, a6, s9 +#else + # rori a6, s9, 58 + .word 0x63acd813 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, s5 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s5, s8, 54 + slli s8, s8, 10 + or s5, s5, s8 +#else + # rori s5, s8, 54 + .word 0x636c5a93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, s6 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s6, s9, 49 + slli s9, s9, 15 + or s6, s6, s9 +#else + # rori s6, s9, 49 + .word 0x631cdb13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, t4 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli t4, s8, 43 + slli s8, s8, 21 + or t4, t4, s8 +#else + # rori t4, s8, 43 + .word 0x62bc5e93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, t6 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli t6, s9, 36 + slli s9, s9, 28 + or t6, t6, s9 +#else + # rori t6, s9, 36 + .word 0x624cdf93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, s4 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s4, s8, 28 + slli s8, s8, 36 + or s4, s4, s8 +#else + # rori s4, s8, 28 + .word 0x61cc5a13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, a3 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli a3, s9, 19 + slli s9, s9, 45 + or a3, a3, s9 +#else + # rori a3, s9, 19 + .word 0x613cd693 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s9, 168(a0) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s11, s8, 9 + slli s8, s8, 55 + or s8, s8, s11 +#else + # rori s8, s8, 9 + .word 0x609c5c13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s8, 168(a0) + mv s8, s0 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s0, s9, 62 + slli s9, s9, 2 + or s0, s0, s9 +#else + # rori s0, s9, 62 + .word 0x63ecd413 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, t5 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli t5, s8, 50 + slli s8, s8, 14 + or t5, t5, s8 +#else + # rori t5, s8, 50 + .word 0x632c5f13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, s3 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s3, s9, 37 + slli s9, s9, 27 + or s3, s3, s9 +#else + # rori s3, s9, 37 + .word 0x625cd993 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s9, 184(a0) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s11, s8, 23 + slli s8, s8, 41 + or s8, s8, s11 +#else + # rori s8, s8, 23 + .word 0x617c5c13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s8, 184(a0) + mv s8, s7 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s7, s9, 8 + slli s9, s9, 56 + or s7, s7, s9 +#else + # rori s7, s9, 8 + .word 0x608cdb93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, s1 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s1, s8, 56 + slli s8, s8, 8 + or s1, s1, s8 +#else + # rori s1, s8, 56 + .word 0x638c5493 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, a7 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli a7, s9, 39 + slli s9, s9, 25 + or a7, a7, s9 +#else + # rori a7, s9, 39 + .word 0x627cd893 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, t3 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli t3, s8, 21 + slli s8, s8, 43 + or t3, t3, s8 +#else + # rori t3, s8, 21 + .word 0x615c5e13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s8, 160(a0) +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s11, s9, 2 + slli s9, s9, 62 + or s9, s9, s11 +#else + # rori s9, s9, 2 + .word 0x602cdc93 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s9, 160(a0) + mv s9, s2 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s2, s8, 46 + slli s8, s8, 18 + or s2, s2, s8 +#else + # rori s2, s8, 46 + .word 0x62ec5913 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, s10 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli s10, s9, 25 + slli s9, s9, 39 + or s10, s10, s9 +#else + # rori s10, s9, 25 + .word 0x619cdd13 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s9, a4 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli a4, s8, 3 + slli s8, s8, 61 + or a4, a4, s8 +#else + # rori a4, s8, 3 + .word 0x603c5713 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s8, a1 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli a1, s9, 44 + slli s9, s9, 20 + or a1, a1, s9 +#else + # rori a1, s9, 44 + .word 0x62ccd593 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + srli t2, s8, 20 + slli s8, s8, 44 + or t2, t2, s8 +#else + # rori t2, s8, 20 + .word 0x614c5393 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + # ROW MIX (chi) + mv s8, t1 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, t2 + and s11, s11, t3 +#else + # andn s11, t3, t2 + .word 0x407e7db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor t1, t1, s11 + mv s9, t2 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, t3 + and s11, s11, t4 +#else + # andn s11, t4, t3 + .word 0x41cefdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor t2, t2, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, t4 + and s11, s11, t5 +#else + # andn s11, t5, t4 + .word 0x41df7db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor t3, t3, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, t5 + and s11, s11, s8 +#else + # andn s11, s8, t5 + .word 0x41ec7db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor t4, t4, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s8 + and s11, s11, s9 +#else + # andn s11, s9, s8 + .word 0x418cfdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor t5, t5, s11 + mv s8, t6 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, a1 + and s11, s11, a2 +#else + # andn s11, a2, a1 + .word 0x40b67db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor t6, t6, s11 + mv s9, a1 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, a2 + and s11, s11, a3 +#else + # andn s11, a3, a2 + .word 0x40c6fdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a1, a1, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, a3 + and s11, s11, a4 +#else + # andn s11, a4, a3 + .word 0x40d77db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a2, a2, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, a4 + and s11, s11, s8 +#else + # andn s11, s8, a4 + .word 0x40ec7db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a3, a3, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s8 + and s11, s11, s9 +#else + # andn s11, s9, s8 + .word 0x418cfdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a4, a4, s11 + mv s8, a5 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, a6 + and s11, s11, a7 +#else + # andn s11, a7, a6 + .word 0x4108fdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a5, a5, s11 + mv s9, a6 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, a7 + and s11, s11, s1 +#else + # andn s11, s1, a7 + .word 0x4114fdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a6, a6, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s1 + and s11, s11, s2 +#else + # andn s11, s2, s1 + .word 0x40997db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor a7, a7, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s2 + and s11, s11, s8 +#else + # andn s11, s8, s2 + .word 0x412c7db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s1, s1, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s8 + and s11, s11, s9 +#else + # andn s11, s9, s8 + .word 0x418cfdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s2, s2, s11 + mv s8, s3 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s4 + and s11, s11, s5 +#else + # andn s11, s5, s4 + .word 0x414afdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s3, s3, s11 + mv s9, s4 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s5 + and s11, s11, s6 +#else + # andn s11, s6, s5 + .word 0x415b7db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s4, s4, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s6 + and s11, s11, s7 +#else + # andn s11, s7, s6 + .word 0x416bfdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s5, s5, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s7 + and s11, s11, s8 +#else + # andn s11, s8, s7 + .word 0x417c7db3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s6, s6, s11 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s11, s8 + and s11, s11, s9 +#else + # andn s11, s9, s8 + .word 0x418cfdb3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s7, s7, s11 + sd s3, 120(a0) + sd s4, 128(a0) + sd s5, 136(a0) + ld s8, 160(a0) + ld s9, 168(a0) + ld s11, 184(a0) + mv s3, s8 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s5, s9 + and s5, s5, s10 +#else + # andn s5, s10, s9 + .word 0x419d7ab3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s8, s8, s5 + mv s4, s9 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s5, s10 + and s5, s5, s11 +#else + # andn s5, s11, s10 + .word 0x41adfab3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s9, s9, s5 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s5, s11 + and s5, s5, s0 +#else + # andn s5, s0, s11 + .word 0x41b47ab3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s10, s10, s5 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s5, s0 + and s5, s5, s3 +#else + # andn s5, s3, s0 + .word 0x4089fab3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s11, s11, s5 +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + not s5, s3 + and s5, s5, s4 +#else + # andn s5, s4, s3 + .word 0x413a7ab3 +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + xor s0, s0, s5 + ld s3, 120(a0) + ld s4, 128(a0) + ld s5, 136(a0) + sd s8, 160(a0) + sd s9, 168(a0) + sd s10, 176(a0) + sd s11, 184(a0) + sd s0, 192(a0) + # IOTA (round constant) + ld s0, 16(sp) + ld s11, 0(t0) + addi t0, t0, 8 + addi s0, s0, -1 + xor t1, t1, s11 + bnez s0, L_riscv_64_block_sha3_loop + sd t1, 0(a0) + sd t2, 8(a0) + sd t3, 16(a0) + sd t4, 24(a0) + sd t5, 32(a0) + sd t6, 40(a0) + sd a1, 48(a0) + sd a2, 56(a0) + sd a3, 64(a0) + sd a4, 72(a0) + sd a5, 80(a0) + sd a6, 88(a0) + sd a7, 96(a0) + sd s1, 104(a0) + sd s2, 112(a0) + sd s3, 120(a0) + sd s4, 128(a0) + sd s5, 136(a0) + sd s6, 144(a0) + sd s7, 152(a0) + ld s0, 32(sp) + ld s1, 40(sp) + ld s2, 48(sp) + ld s3, 56(sp) + ld s4, 64(sp) + ld s5, 72(sp) + ld s6, 80(sp) + ld s7, 88(sp) + ld s8, 96(sp) + ld s9, 104(sp) + ld s10, 112(sp) + ld s11, 120(sp) + addi sp, sp, 128 + ret + .size BlockSha3,.-BlockSha3 +#endif /* WOLFSSL_RISCV_VECTOR */ +#endif /* WOLFSSL_SHA3 */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm_c.c b/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm_c.c new file mode 100644 index 00000000000..cc4f317a365 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm_c.c @@ -0,0 +1,1206 @@ +/* riscv-64-sha3-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha3/sha3.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-sha3-asm.c + */ +#ifdef WOLFSSL_RISCV_ASM +#ifdef WOLFSSL_RISCV_ASM_INLINE +#include + +#ifdef WOLFSSL_SHA3 +#ifdef WOLFSSL_RISCV_VECTOR +XALIGNED(16) static const word64 L_SHA3_transform_vector_r[] = { + 0x0000000000000001UL, 0x0000000000008082UL, + 0x800000000000808aUL, 0x8000000080008000UL, + 0x000000000000808bUL, 0x0000000080000001UL, + 0x8000000080008081UL, 0x8000000000008009UL, + 0x000000000000008aUL, 0x0000000000000088UL, + 0x0000000080008009UL, 0x000000008000000aUL, + 0x000000008000808bUL, 0x800000000000008bUL, + 0x8000000000008089UL, 0x8000000000008003UL, + 0x8000000000008002UL, 0x8000000000000080UL, + 0x000000000000800aUL, 0x800000008000000aUL, + 0x8000000080008081UL, 0x8000000000008080UL, + 0x0000000080000001UL, 0x8000000080008008UL, +}; + +void BlockSha3(word64* s) +{ + const word64* r = L_SHA3_transform_vector_r; + + __asm__ __volatile__ ( +#if defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + " .option arch, +v, +zvkb, +zvbb\n\t" +#else + " .option arch, +v\n\t" +#endif /* defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vsetivli zero, 1, e64, m1, ta, ma\n\t" + "li t3, 24\n\t" + "mv t1, %[r]\n\t" + "mv t2, %[s]\n\t" + "vlseg8e64.v v0, (t2)\n\t" + "addi t2, %[s], 64\n\t" + "vlseg8e64.v v8, (t2)\n\t" + "addi t2, %[s], 128\n\t" + "vlseg8e64.v v16, (t2)\n\t" + "addi t2, %[s], 192\n\t" + "vle64.v v24, (t2)\n\t" + "\n" + "L_riscv_64_block_sha3_vector_loop:\n\t" + /* COLUMN MIX */ + "vxor.vv v25, v0, v5\n\t" + "vxor.vv v26, v1, v6\n\t" + "vxor.vv v27, v2, v7\n\t" + "vxor.vv v28, v3, v8\n\t" + "vxor.vv v29, v4, v9\n\t" + "vxor.vv v25, v25, v10\n\t" + "vxor.vv v26, v26, v11\n\t" + "vxor.vv v27, v27, v12\n\t" + "vxor.vv v28, v28, v13\n\t" + "vxor.vv v29, v29, v14\n\t" + "vxor.vv v25, v25, v15\n\t" + "vxor.vv v26, v26, v16\n\t" + "vxor.vv v27, v27, v17\n\t" + "vxor.vv v28, v28, v18\n\t" + "vxor.vv v29, v29, v19\n\t" + "vxor.vv v25, v25, v20\n\t" + "vxor.vv v26, v26, v21\n\t" + "vxor.vv v27, v27, v22\n\t" + "vxor.vv v28, v28, v23\n\t" + "vxor.vv v29, v29, v24\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 63\n\t" + "vsll.vi v31, v26, 1\n\t" + "vsrl.vx v30, v26, t2\n\t" + "vxor.vv v31, v31, v29\n\t" + "vxor.vv v31, v31, v30\n\t" + "vxor.vv v0, v0, v31\n\t" + "vxor.vv v5, v5, v31\n\t" + "vxor.vv v10, v10, v31\n\t" + "vxor.vv v15, v15, v31\n\t" + "vxor.vv v20, v20, v31\n\t" + "vsll.vi v31, v27, 1\n\t" + "vsrl.vx v30, v27, t2\n\t" + "vxor.vv v31, v31, v25\n\t" + "vxor.vv v31, v31, v30\n\t" + "vxor.vv v1, v1, v31\n\t" + "vxor.vv v6, v6, v31\n\t" + "vxor.vv v11, v11, v31\n\t" + "vxor.vv v16, v16, v31\n\t" + "vxor.vv v21, v21, v31\n\t" + "vsll.vi v31, v28, 1\n\t" + "vsrl.vx v30, v28, t2\n\t" + "vxor.vv v31, v31, v26\n\t" + "vxor.vv v31, v31, v30\n\t" + "vxor.vv v2, v2, v31\n\t" + "vxor.vv v7, v7, v31\n\t" + "vxor.vv v12, v12, v31\n\t" + "vxor.vv v17, v17, v31\n\t" + "vxor.vv v22, v22, v31\n\t" + "vsll.vi v31, v29, 1\n\t" + "vsrl.vx v30, v29, t2\n\t" + "vxor.vv v31, v31, v27\n\t" + "vxor.vv v31, v31, v30\n\t" + "vxor.vv v3, v3, v31\n\t" + "vxor.vv v8, v8, v31\n\t" + "vxor.vv v13, v13, v31\n\t" + "vxor.vv v18, v18, v31\n\t" + "vxor.vv v23, v23, v31\n\t" + "vsll.vi v31, v25, 1\n\t" + "vsrl.vx v30, v25, t2\n\t" + "vxor.vv v31, v31, v28\n\t" + "vxor.vv v31, v31, v30\n\t" + "vxor.vv v4, v4, v31\n\t" + "vxor.vv v9, v9, v31\n\t" + "vxor.vv v14, v14, v31\n\t" + "vxor.vv v19, v19, v31\n\t" + "vxor.vv v24, v24, v31\n\t" +#else + "vror.vi v30, v26, 63\n\t" + "vror.vi v31, v27, 63\n\t" + "vxor.vv v30, v30, v29\n\t" + "vxor.vv v31, v31, v25\n\t" + "vxor.vv v0, v0, v30\n\t" + "vxor.vv v5, v5, v30\n\t" + "vxor.vv v10, v10, v30\n\t" + "vxor.vv v15, v15, v30\n\t" + "vxor.vv v20, v20, v30\n\t" + "vxor.vv v1, v1, v31\n\t" + "vxor.vv v6, v6, v31\n\t" + "vxor.vv v11, v11, v31\n\t" + "vxor.vv v16, v16, v31\n\t" + "vxor.vv v21, v21, v31\n\t" + "vror.vi v30, v28, 63\n\t" + "vror.vi v31, v29, 63\n\t" + "vror.vi v25, v25, 63\n\t" + "vxor.vv v30, v30, v26\n\t" + "vxor.vv v31, v31, v27\n\t" + "vxor.vv v25, v25, v28\n\t" + "vxor.vv v2, v2, v30\n\t" + "vxor.vv v7, v7, v30\n\t" + "vxor.vv v12, v12, v30\n\t" + "vxor.vv v17, v17, v30\n\t" + "vxor.vv v22, v22, v30\n\t" + "vxor.vv v3, v3, v31\n\t" + "vxor.vv v8, v8, v31\n\t" + "vxor.vv v13, v13, v31\n\t" + "vxor.vv v18, v18, v31\n\t" + "vxor.vv v23, v23, v31\n\t" + "vxor.vv v4, v4, v25\n\t" + "vxor.vv v9, v9, v25\n\t" + "vxor.vv v14, v14, v25\n\t" + "vxor.vv v19, v19, v25\n\t" + "vxor.vv v24, v24, v25\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + /* SWAP ROTL (rho + pi) */ + "vmv.v.v v26, v1\n\t" + "vmv.v.v v25, v10\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 63\n\t" + "vsll.vi v10, v26, 1\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v10, v10, v26\n\t" +#else + "vror.vi v10, v26, 63\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v7\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 61\n\t" + "vsll.vi v7, v25, 3\n\t" + "vsrl.vx v25, v25, t2\n\t" + "vor.vv v7, v7, v25\n\t" +#else + "vror.vi v7, v25, 61\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v11\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 58\n\t" + "vsll.vi v11, v26, 6\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v11, v11, v26\n\t" +#else + "vror.vi v11, v26, 58\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v17\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 54\n\t" + "vsll.vi v17, v25, 10\n\t" + "vsrl.vx v25, v25, t2\n\t" + "vor.vv v17, v17, v25\n\t" +#else + "vror.vi v17, v25, 54\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v18\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 49\n\t" + "vsll.vi v18, v26, 15\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v18, v18, v26\n\t" +#else + "vror.vi v18, v26, 49\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v3\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 43\n\t" + "vsll.vi v3, v25, 21\n\t" + "vsrl.vx v25, v25, t2\n\t" + "vor.vv v3, v3, v25\n\t" +#else + "vror.vi v3, v25, 43\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v5\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 36\n\t" + "vsll.vi v5, v26, 28\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v5, v5, v26\n\t" +#else + "vror.vi v5, v26, 36\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v16\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 36\n\t" + "vsrl.vi v16, v25, 28\n\t" + "vsll.vx v25, v25, t2\n\t" + "vor.vv v16, v16, v25\n\t" +#else + "vror.vi v16, v25, 28\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v8\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 45\n\t" + "vsrl.vi v8, v26, 19\n\t" + "vsll.vx v26, v26, t2\n\t" + "vor.vv v8, v8, v26\n\t" +#else + "vror.vi v8, v26, 19\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v21\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 55\n\t" + "vsrl.vi v21, v25, 9\n\t" + "vsll.vx v25, v25, t2\n\t" + "vor.vv v21, v21, v25\n\t" +#else + "vror.vi v21, v25, 9\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v24\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 62\n\t" + "vsll.vi v24, v26, 2\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v24, v24, v26\n\t" +#else + "vror.vi v24, v26, 62\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v4\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 50\n\t" + "vsll.vi v4, v25, 14\n\t" + "vsrl.vx v25, v25, t2\n\t" + "vor.vv v4, v4, v25\n\t" +#else + "vror.vi v4, v25, 50\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v15\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 37\n\t" + "vsll.vi v15, v26, 27\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v15, v15, v26\n\t" +#else + "vror.vi v15, v26, 37\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v23\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 41\n\t" + "vsrl.vi v23, v25, 23\n\t" + "vsll.vx v25, v25, t2\n\t" + "vor.vv v23, v23, v25\n\t" +#else + "vror.vi v23, v25, 23\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v19\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 56\n\t" + "vsrl.vi v19, v26, 8\n\t" + "vsll.vx v26, v26, t2\n\t" + "vor.vv v19, v19, v26\n\t" +#else + "vror.vi v19, v26, 8\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v13\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 56\n\t" + "vsll.vi v13, v25, 8\n\t" + "vsrl.vx v25, v25, t2\n\t" + "vor.vv v13, v13, v25\n\t" +#else + "vror.vi v13, v25, 56\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v12\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 39\n\t" + "vsll.vi v12, v26, 25\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v12, v12, v26\n\t" +#else + "vror.vi v12, v26, 39\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v2\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 43\n\t" + "vsrl.vi v2, v25, 21\n\t" + "vsll.vx v25, v25, t2\n\t" + "vor.vv v2, v2, v25\n\t" +#else + "vror.vi v2, v25, 21\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v20\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 62\n\t" + "vsrl.vi v20, v26, 2\n\t" + "vsll.vx v26, v26, t2\n\t" + "vor.vv v20, v20, v26\n\t" +#else + "vror.vi v20, v26, 2\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v14\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 46\n\t" + "vsll.vi v14, v25, 18\n\t" + "vsrl.vx v25, v25, t2\n\t" + "vor.vv v14, v14, v25\n\t" +#else + "vror.vi v14, v25, 46\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v22\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 39\n\t" + "vsrl.vi v22, v26, 25\n\t" + "vsll.vx v26, v26, t2\n\t" + "vor.vv v22, v22, v26\n\t" +#else + "vror.vi v22, v26, 25\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v26, v9\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 61\n\t" + "vsrl.vi v9, v25, 3\n\t" + "vsll.vx v25, v25, t2\n\t" + "vor.vv v9, v9, v25\n\t" +#else + "vror.vi v9, v25, 3\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v6\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "li t2, 44\n\t" + "vsll.vi v6, v26, 20\n\t" + "vsrl.vx v26, v26, t2\n\t" + "vor.vv v6, v6, v26\n\t" +#else + "vror.vi v6, v26, 44\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "li t2, 44\n\t" + "vsrl.vi v1, v25, 20\n\t" + "vsll.vx v25, v25, t2\n\t" + "vor.vv v1, v1, v25\n\t" + /* ROW MIX (chi) */ + "vmv.v.v v25, v0\n\t" + "vmv.v.v v26, v1\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "vnot.v v30, v1\n\t" + "vnot.v v31, v2\n\t" + "vand.vv v30, v30, v2\n\t" + "vand.vv v31, v31, v3\n\t" + "vxor.vv v0, v30, v0\n\t" + "vxor.vv v1, v31, v1\n\t" + "vnot.v v30, v3\n\t" + "vnot.v v31, v4\n\t" + "vand.vv v30, v30, v4\n\t" + "vand.vv v31, v31, v25\n\t" + "vnot.v v25, v25\n\t" + "vxor.vv v2, v30, v2\n\t" + "vand.vv v25, v25, v26\n\t" + "vxor.vv v3, v31, v3\n\t" + "vxor.vv v4, v25, v4\n\t" +#else + "vandn.vv v30, v2, v1\n\t" + "vandn.vv v31, v3, v2\n\t" + "vxor.vv v0, v30, v0\n\t" + "vxor.vv v1, v31, v1\n\t" + "vandn.vv v30, v4, v3\n\t" + "vandn.vv v31, v25, v4\n\t" + "vandn.vv v25, v26, v25\n\t" + "vxor.vv v2, v30, v2\n\t" + "vxor.vv v3, v31, v3\n\t" + "vxor.vv v4, v25, v4\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v5\n\t" + "vmv.v.v v26, v6\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "vnot.v v30, v6\n\t" + "vnot.v v31, v7\n\t" + "vand.vv v30, v30, v7\n\t" + "vand.vv v31, v31, v8\n\t" + "vxor.vv v5, v30, v5\n\t" + "vxor.vv v6, v31, v6\n\t" + "vnot.v v30, v8\n\t" + "vnot.v v31, v9\n\t" + "vand.vv v30, v30, v9\n\t" + "vand.vv v31, v31, v25\n\t" + "vnot.v v25, v25\n\t" + "vxor.vv v7, v30, v7\n\t" + "vand.vv v25, v25, v26\n\t" + "vxor.vv v8, v31, v8\n\t" + "vxor.vv v9, v25, v9\n\t" +#else + "vandn.vv v30, v7, v6\n\t" + "vandn.vv v31, v8, v7\n\t" + "vxor.vv v5, v30, v5\n\t" + "vxor.vv v6, v31, v6\n\t" + "vandn.vv v30, v9, v8\n\t" + "vandn.vv v31, v25, v9\n\t" + "vandn.vv v25, v26, v25\n\t" + "vxor.vv v7, v30, v7\n\t" + "vxor.vv v8, v31, v8\n\t" + "vxor.vv v9, v25, v9\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v10\n\t" + "vmv.v.v v26, v11\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "vnot.v v30, v11\n\t" + "vnot.v v31, v12\n\t" + "vand.vv v30, v30, v12\n\t" + "vand.vv v31, v31, v13\n\t" + "vxor.vv v10, v30, v10\n\t" + "vxor.vv v11, v31, v11\n\t" + "vnot.v v30, v13\n\t" + "vnot.v v31, v14\n\t" + "vand.vv v30, v30, v14\n\t" + "vand.vv v31, v31, v25\n\t" + "vnot.v v25, v25\n\t" + "vxor.vv v12, v30, v12\n\t" + "vand.vv v25, v25, v26\n\t" + "vxor.vv v13, v31, v13\n\t" + "vxor.vv v14, v25, v14\n\t" +#else + "vandn.vv v30, v12, v11\n\t" + "vandn.vv v31, v13, v12\n\t" + "vxor.vv v10, v30, v10\n\t" + "vxor.vv v11, v31, v11\n\t" + "vandn.vv v30, v14, v13\n\t" + "vandn.vv v31, v25, v14\n\t" + "vandn.vv v25, v26, v25\n\t" + "vxor.vv v12, v30, v12\n\t" + "vxor.vv v13, v31, v13\n\t" + "vxor.vv v14, v25, v14\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v15\n\t" + "vmv.v.v v26, v16\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "vnot.v v30, v16\n\t" + "vnot.v v31, v17\n\t" + "vand.vv v30, v30, v17\n\t" + "vand.vv v31, v31, v18\n\t" + "vxor.vv v15, v30, v15\n\t" + "vxor.vv v16, v31, v16\n\t" + "vnot.v v30, v18\n\t" + "vnot.v v31, v19\n\t" + "vand.vv v30, v30, v19\n\t" + "vand.vv v31, v31, v25\n\t" + "vnot.v v25, v25\n\t" + "vxor.vv v17, v30, v17\n\t" + "vand.vv v25, v25, v26\n\t" + "vxor.vv v18, v31, v18\n\t" + "vxor.vv v19, v25, v19\n\t" +#else + "vandn.vv v30, v17, v16\n\t" + "vandn.vv v31, v18, v17\n\t" + "vxor.vv v15, v30, v15\n\t" + "vxor.vv v16, v31, v16\n\t" + "vandn.vv v30, v19, v18\n\t" + "vandn.vv v31, v25, v19\n\t" + "vandn.vv v25, v26, v25\n\t" + "vxor.vv v17, v30, v17\n\t" + "vxor.vv v18, v31, v18\n\t" + "vxor.vv v19, v25, v19\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + "vmv.v.v v25, v20\n\t" + "vmv.v.v v26, v21\n\t" +#if !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) + "vnot.v v30, v21\n\t" + "vnot.v v31, v22\n\t" + "vand.vv v30, v30, v22\n\t" + "vand.vv v31, v31, v23\n\t" + "vxor.vv v20, v30, v20\n\t" + "vxor.vv v21, v31, v21\n\t" + "vnot.v v30, v23\n\t" + "vnot.v v31, v24\n\t" + "vand.vv v30, v30, v24\n\t" + "vand.vv v31, v31, v25\n\t" + "vnot.v v25, v25\n\t" + "vxor.vv v22, v30, v22\n\t" + "vand.vv v25, v25, v26\n\t" + "vxor.vv v23, v31, v23\n\t" + "vxor.vv v24, v25, v24\n\t" +#else + "vandn.vv v30, v22, v21\n\t" + "vandn.vv v31, v23, v22\n\t" + "vxor.vv v20, v30, v20\n\t" + "vxor.vv v21, v31, v21\n\t" + "vandn.vv v30, v24, v23\n\t" + "vandn.vv v31, v25, v24\n\t" + "vandn.vv v25, v26, v25\n\t" + "vxor.vv v22, v30, v22\n\t" + "vxor.vv v23, v31, v23\n\t" + "vxor.vv v24, v25, v24\n\t" +#endif /* !defined(WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION) */ + /* IOTA (round constant) */ + "vl1re64.v v25, (t1)\n\t" + "addi t1, t1, 8\n\t" + "addi t3, t3, -1\n\t" + "vxor.vv v0, v0, v25\n\t" + "bnez t3, L_riscv_64_block_sha3_vector_loop\n\t" + "mv t2, %[s]\n\t" + "vsseg8e64.v v0, (t2)\n\t" + "addi t2, %[s], 64\n\t" + "vsseg8e64.v v8, (t2)\n\t" + "addi t2, %[s], 128\n\t" + "vsseg8e64.v v16, (t2)\n\t" + "addi t2, %[s], 192\n\t" + "vse64.v v24, (t2)\n\t" + : [s] "+r" (s) + : [r] "r" (r) + : "memory", "t1", "t2", "t3" +#ifdef WOLFSSL_RISCV_VECTOR + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR */ + ); +} + +#else +XALIGNED(16) static const word64 L_SHA3_transform_riscv_r[] = { + 0x0000000000000001UL, 0x0000000000008082UL, + 0x800000000000808aUL, 0x8000000080008000UL, + 0x000000000000808bUL, 0x0000000080000001UL, + 0x8000000080008081UL, 0x8000000000008009UL, + 0x000000000000008aUL, 0x0000000000000088UL, + 0x0000000080008009UL, 0x000000008000000aUL, + 0x000000008000808bUL, 0x800000000000008bUL, + 0x8000000000008089UL, 0x8000000000008003UL, + 0x8000000000008002UL, 0x8000000000000080UL, + 0x000000000000800aUL, 0x800000008000000aUL, + 0x8000000080008081UL, 0x8000000000008080UL, + 0x0000000080000001UL, 0x8000000080008008UL, +}; + +void BlockSha3(word64* s) +{ + const word64* r = L_SHA3_transform_riscv_r; + + __asm__ __volatile__ ( + "addi sp, sp, -32\n\t" + "li s0, 24\n\t" + "ld t1, 0(%[s])\n\t" + "ld t2, 8(%[s])\n\t" + "ld t3, 16(%[s])\n\t" + "ld t4, 24(%[s])\n\t" + "ld t5, 32(%[s])\n\t" + "ld t6, 40(%[s])\n\t" + "ld a1, 48(%[s])\n\t" + "ld a2, 56(%[s])\n\t" + "ld a3, 64(%[s])\n\t" + "ld a4, 72(%[s])\n\t" + "ld a5, 80(%[s])\n\t" + "ld a6, 88(%[s])\n\t" + "ld a7, 96(%[s])\n\t" + "ld s1, 104(%[s])\n\t" + "ld s2, 112(%[s])\n\t" + "ld s3, 120(%[s])\n\t" + "ld s4, 128(%[s])\n\t" + "ld s5, 136(%[s])\n\t" + "ld s6, 144(%[s])\n\t" + "ld s7, 152(%[s])\n\t" + "ld s8, 160(%[s])\n\t" + "ld s9, 168(%[s])\n\t" + "ld s10, 176(%[s])\n\t" + "\n" + "L_riscv_64_block_sha3_loop_%=:\n\t" + "sd s0, 16(sp)\n\t" + /* COLUMN MIX */ + "ld s11, 184(%[s])\n\t" + "ld s0, 192(%[s])\n\t" + "xor s8, s8, t1\n\t" + "xor s9, s9, t2\n\t" + "xor s10, s10, t3\n\t" + "xor s11, s11, t4\n\t" + "xor s0, s0, t5\n\t" + "xor s8, s8, t6\n\t" + "xor s9, s9, a1\n\t" + "xor s10, s10, a2\n\t" + "xor s11, s11, a3\n\t" + "xor s0, s0, a4\n\t" + "xor s8, s8, a5\n\t" + "xor s9, s9, a6\n\t" + "xor s10, s10, a7\n\t" + "xor s11, s11, s1\n\t" + "xor s0, s0, s2\n\t" + "xor s8, s8, s3\n\t" + "xor s9, s9, s4\n\t" + "xor s10, s10, s5\n\t" + "xor s11, s11, s6\n\t" + "xor s0, s0, s7\n\t" + "sd s9, 0(sp)\n\t" + "sd s11, 8(sp)\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s11, s9, 63\n\t" + "slli s9, s9, 1\n\t" + "or s9, s9, s11\n\t" +#else + /* rori s9, s9, 63 */ + ".word 0x63fcdc93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s11, 160(%[s])\n\t" + "xor s9, s9, s0\n\t" + "xor t1, t1, s9\n\t" + "xor t6, t6, s9\n\t" + "xor s11, s11, s9\n\t" + "xor a5, a5, s9\n\t" + "xor s3, s3, s9\n\t" + "sd s11, 160(%[s])\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s11, s10, 63\n\t" + "slli s9, s10, 1\n\t" + "or s9, s9, s11\n\t" +#else + /* rori s9, s10, 63 */ + ".word 0x63fd5c93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s11, 168(%[s])\n\t" + "xor s9, s9, s8\n\t" + "xor t2, t2, s9\n\t" + "xor a1, a1, s9\n\t" + "xor s11, s11, s9\n\t" + "xor a6, a6, s9\n\t" + "xor s4, s4, s9\n\t" + "sd s11, 168(%[s])\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s11, s0, 63\n\t" + "slli s0, s0, 1\n\t" + "or s0, s0, s11\n\t" +#else + /* rori s0, s0, 63 */ + ".word 0x63f45413\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s11, 184(%[s])\n\t" + "xor s0, s0, s10\n\t" + "xor t4, t4, s0\n\t" + "xor a3, a3, s0\n\t" + "xor s11, s11, s0\n\t" + "xor s1, s1, s0\n\t" + "xor s6, s6, s0\n\t" + "sd s11, 184(%[s])\n\t" + "ld s11, 8(sp)\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s10, s8, 63\n\t" + "slli s8, s8, 1\n\t" + "or s8, s8, s10\n\t" +#else + /* rori s8, s8, 63 */ + ".word 0x63fc5c13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s0, 192(%[s])\n\t" + "xor s8, s8, s11\n\t" + "xor t5, t5, s8\n\t" + "xor a4, a4, s8\n\t" + "xor s0, s0, s8\n\t" + "xor s2, s2, s8\n\t" + "xor s7, s7, s8\n\t" + "ld s9, 0(sp)\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s10, s11, 63\n\t" + "slli s11, s11, 1\n\t" + "or s11, s11, s10\n\t" +#else + /* rori s11, s11, 63 */ + ".word 0x63fddd93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 176(%[s])\n\t" + "xor s11, s11, s9\n\t" + "xor t3, t3, s11\n\t" + "xor a2, a2, s11\n\t" + "xor s10, s10, s11\n\t" + "xor a7, a7, s11\n\t" + "xor s5, s5, s11\n\t" + /* SWAP ROTL (rho + pi) */ + "mv s8, a5\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s9, t2, 63\n\t" + "slli a5, t2, 1\n\t" + "or a5, a5, s9\n\t" +#else + /* rori a5, t2, 63 */ + ".word 0x63f3d793\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, a2\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli a2, s8, 61\n\t" + "slli s8, s8, 3\n\t" + "or a2, a2, s8\n\t" +#else + /* rori a2, s8, 61 */ + ".word 0x63dc5613\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, a6\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli a6, s9, 58\n\t" + "slli s9, s9, 6\n\t" + "or a6, a6, s9\n\t" +#else + /* rori a6, s9, 58 */ + ".word 0x63acd813\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, s5\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s5, s8, 54\n\t" + "slli s8, s8, 10\n\t" + "or s5, s5, s8\n\t" +#else + /* rori s5, s8, 54 */ + ".word 0x636c5a93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, s6\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s6, s9, 49\n\t" + "slli s9, s9, 15\n\t" + "or s6, s6, s9\n\t" +#else + /* rori s6, s9, 49 */ + ".word 0x631cdb13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, t4\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli t4, s8, 43\n\t" + "slli s8, s8, 21\n\t" + "or t4, t4, s8\n\t" +#else + /* rori t4, s8, 43 */ + ".word 0x62bc5e93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, t6\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli t6, s9, 36\n\t" + "slli s9, s9, 28\n\t" + "or t6, t6, s9\n\t" +#else + /* rori t6, s9, 36 */ + ".word 0x624cdf93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, s4\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s4, s8, 28\n\t" + "slli s8, s8, 36\n\t" + "or s4, s4, s8\n\t" +#else + /* rori s4, s8, 28 */ + ".word 0x61cc5a13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, a3\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli a3, s9, 19\n\t" + "slli s9, s9, 45\n\t" + "or a3, a3, s9\n\t" +#else + /* rori a3, s9, 19 */ + ".word 0x613cd693\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s9, 168(%[s])\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s11, s8, 9\n\t" + "slli s8, s8, 55\n\t" + "or s8, s8, s11\n\t" +#else + /* rori s8, s8, 9 */ + ".word 0x609c5c13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s8, 168(%[s])\n\t" + "mv s8, s0\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s0, s9, 62\n\t" + "slli s9, s9, 2\n\t" + "or s0, s0, s9\n\t" +#else + /* rori s0, s9, 62 */ + ".word 0x63ecd413\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, t5\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli t5, s8, 50\n\t" + "slli s8, s8, 14\n\t" + "or t5, t5, s8\n\t" +#else + /* rori t5, s8, 50 */ + ".word 0x632c5f13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, s3\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s3, s9, 37\n\t" + "slli s9, s9, 27\n\t" + "or s3, s3, s9\n\t" +#else + /* rori s3, s9, 37 */ + ".word 0x625cd993\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s9, 184(%[s])\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s11, s8, 23\n\t" + "slli s8, s8, 41\n\t" + "or s8, s8, s11\n\t" +#else + /* rori s8, s8, 23 */ + ".word 0x617c5c13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s8, 184(%[s])\n\t" + "mv s8, s7\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s7, s9, 8\n\t" + "slli s9, s9, 56\n\t" + "or s7, s7, s9\n\t" +#else + /* rori s7, s9, 8 */ + ".word 0x608cdb93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, s1\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s1, s8, 56\n\t" + "slli s8, s8, 8\n\t" + "or s1, s1, s8\n\t" +#else + /* rori s1, s8, 56 */ + ".word 0x638c5493\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, a7\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli a7, s9, 39\n\t" + "slli s9, s9, 25\n\t" + "or a7, a7, s9\n\t" +#else + /* rori a7, s9, 39 */ + ".word 0x627cd893\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, t3\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli t3, s8, 21\n\t" + "slli s8, s8, 43\n\t" + "or t3, t3, s8\n\t" +#else + /* rori t3, s8, 21 */ + ".word 0x615c5e13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s8, 160(%[s])\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s11, s9, 2\n\t" + "slli s9, s9, 62\n\t" + "or s9, s9, s11\n\t" +#else + /* rori s9, s9, 2 */ + ".word 0x602cdc93\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s9, 160(%[s])\n\t" + "mv s9, s2\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s2, s8, 46\n\t" + "slli s8, s8, 18\n\t" + "or s2, s2, s8\n\t" +#else + /* rori s2, s8, 46 */ + ".word 0x62ec5913\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, s10\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli s10, s9, 25\n\t" + "slli s9, s9, 39\n\t" + "or s10, s10, s9\n\t" +#else + /* rori s10, s9, 25 */ + ".word 0x619cdd13\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s9, a4\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli a4, s8, 3\n\t" + "slli s8, s8, 61\n\t" + "or a4, a4, s8\n\t" +#else + /* rori a4, s8, 3 */ + ".word 0x603c5713\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s8, a1\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli a1, s9, 44\n\t" + "slli s9, s9, 20\n\t" + "or a1, a1, s9\n\t" +#else + /* rori a1, s9, 44 */ + ".word 0x62ccd593\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "srli t2, s8, 20\n\t" + "slli s8, s8, 44\n\t" + "or t2, t2, s8\n\t" +#else + /* rori t2, s8, 20 */ + ".word 0x614c5393\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + /* ROW MIX (chi) */ + "mv s8, t1\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, t2\n\t" + "and s11, s11, t3\n\t" +#else + /* andn s11, t3, t2 */ + ".word 0x407e7db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor t1, t1, s11\n\t" + "mv s9, t2\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, t3\n\t" + "and s11, s11, t4\n\t" +#else + /* andn s11, t4, t3 */ + ".word 0x41cefdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor t2, t2, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, t4\n\t" + "and s11, s11, t5\n\t" +#else + /* andn s11, t5, t4 */ + ".word 0x41df7db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor t3, t3, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, t5\n\t" + "and s11, s11, s8\n\t" +#else + /* andn s11, s8, t5 */ + ".word 0x41ec7db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor t4, t4, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s8\n\t" + "and s11, s11, s9\n\t" +#else + /* andn s11, s9, s8 */ + ".word 0x418cfdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor t5, t5, s11\n\t" + "mv s8, t6\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, a1\n\t" + "and s11, s11, a2\n\t" +#else + /* andn s11, a2, a1 */ + ".word 0x40b67db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor t6, t6, s11\n\t" + "mv s9, a1\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, a2\n\t" + "and s11, s11, a3\n\t" +#else + /* andn s11, a3, a2 */ + ".word 0x40c6fdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a1, a1, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, a3\n\t" + "and s11, s11, a4\n\t" +#else + /* andn s11, a4, a3 */ + ".word 0x40d77db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a2, a2, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, a4\n\t" + "and s11, s11, s8\n\t" +#else + /* andn s11, s8, a4 */ + ".word 0x40ec7db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a3, a3, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s8\n\t" + "and s11, s11, s9\n\t" +#else + /* andn s11, s9, s8 */ + ".word 0x418cfdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a4, a4, s11\n\t" + "mv s8, a5\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, a6\n\t" + "and s11, s11, a7\n\t" +#else + /* andn s11, a7, a6 */ + ".word 0x4108fdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a5, a5, s11\n\t" + "mv s9, a6\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, a7\n\t" + "and s11, s11, s1\n\t" +#else + /* andn s11, s1, a7 */ + ".word 0x4114fdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a6, a6, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s1\n\t" + "and s11, s11, s2\n\t" +#else + /* andn s11, s2, s1 */ + ".word 0x40997db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor a7, a7, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s2\n\t" + "and s11, s11, s8\n\t" +#else + /* andn s11, s8, s2 */ + ".word 0x412c7db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s1, s1, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s8\n\t" + "and s11, s11, s9\n\t" +#else + /* andn s11, s9, s8 */ + ".word 0x418cfdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s2, s2, s11\n\t" + "mv s8, s3\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s4\n\t" + "and s11, s11, s5\n\t" +#else + /* andn s11, s5, s4 */ + ".word 0x414afdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s3, s3, s11\n\t" + "mv s9, s4\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s5\n\t" + "and s11, s11, s6\n\t" +#else + /* andn s11, s6, s5 */ + ".word 0x415b7db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s4, s4, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s6\n\t" + "and s11, s11, s7\n\t" +#else + /* andn s11, s7, s6 */ + ".word 0x416bfdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s5, s5, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s7\n\t" + "and s11, s11, s8\n\t" +#else + /* andn s11, s8, s7 */ + ".word 0x417c7db3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s6, s6, s11\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s11, s8\n\t" + "and s11, s11, s9\n\t" +#else + /* andn s11, s9, s8 */ + ".word 0x418cfdb3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s7, s7, s11\n\t" + "sd s3, 120(%[s])\n\t" + "sd s4, 128(%[s])\n\t" + "sd s5, 136(%[s])\n\t" + "ld s8, 160(%[s])\n\t" + "ld s9, 168(%[s])\n\t" + "ld s11, 184(%[s])\n\t" + "mv s3, s8\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s5, s9\n\t" + "and s5, s5, s10\n\t" +#else + /* andn s5, s10, s9 */ + ".word 0x419d7ab3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s8, s8, s5\n\t" + "mv s4, s9\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s5, s10\n\t" + "and s5, s5, s11\n\t" +#else + /* andn s5, s11, s10 */ + ".word 0x41adfab3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s9, s9, s5\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s5, s11\n\t" + "and s5, s5, s0\n\t" +#else + /* andn s5, s0, s11 */ + ".word 0x41b47ab3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s10, s10, s5\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s5, s0\n\t" + "and s5, s5, s3\n\t" +#else + /* andn s5, s3, s0 */ + ".word 0x4089fab3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s11, s11, s5\n\t" +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + "not s5, s3\n\t" + "and s5, s5, s4\n\t" +#else + /* andn s5, s4, s3 */ + ".word 0x413a7ab3\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "xor s0, s0, s5\n\t" + "ld s3, 120(%[s])\n\t" + "ld s4, 128(%[s])\n\t" + "ld s5, 136(%[s])\n\t" + "sd s8, 160(%[s])\n\t" + "sd s9, 168(%[s])\n\t" + "sd s10, 176(%[s])\n\t" + "sd s11, 184(%[s])\n\t" + "sd s0, 192(%[s])\n\t" + /* IOTA (round constant) */ + "ld s0, 16(sp)\n\t" + "ld s11, 0(%[r])\n\t" + "addi %[r], %[r], 8\n\t" + "addi s0, s0, -1\n\t" + "xor t1, t1, s11\n\t" + "bnez s0, L_riscv_64_block_sha3_loop_%=\n\t" + "sd t1, 0(%[s])\n\t" + "sd t2, 8(%[s])\n\t" + "sd t3, 16(%[s])\n\t" + "sd t4, 24(%[s])\n\t" + "sd t5, 32(%[s])\n\t" + "sd t6, 40(%[s])\n\t" + "sd a1, 48(%[s])\n\t" + "sd a2, 56(%[s])\n\t" + "sd a3, 64(%[s])\n\t" + "sd a4, 72(%[s])\n\t" + "sd a5, 80(%[s])\n\t" + "sd a6, 88(%[s])\n\t" + "sd a7, 96(%[s])\n\t" + "sd s1, 104(%[s])\n\t" + "sd s2, 112(%[s])\n\t" + "sd s3, 120(%[s])\n\t" + "sd s4, 128(%[s])\n\t" + "sd s5, 136(%[s])\n\t" + "sd s6, 144(%[s])\n\t" + "sd s7, 152(%[s])\n\t" + "addi sp, sp, 32\n\t" + : [s] "+r" (s) + : [r] "r" (r) + : "memory", "t1", "t2", "t3", "t4", "t5", "t6", "a1", "a2", "a3", "a4", + "a5", "a6", "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", + "s9", "s10", "s11", "s0" + ); +} + +#endif /* WOLFSSL_RISCV_VECTOR */ +#endif /* WOLFSSL_SHA3 */ +#endif /* WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S b/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S new file mode 100644 index 00000000000..e268751e208 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S @@ -0,0 +1,5162 @@ +/* riscv-64-sha512-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha512.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.S + */ +#ifdef WOLFSSL_RISCV_ASM +#ifndef WOLFSSL_RISCV_ASM_INLINE +#if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + .section .rodata + .type L_SHA512_transform_riscv_vector_len_k, %object + .size L_SHA512_transform_riscv_vector_len_k, 640 + # 8-byte aligned, 64-bit aligned + .align 3 +L_SHA512_transform_riscv_vector_len_k: + .quad 0x428a2f98d728ae22,0x7137449123ef65cd + .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc + .quad 0x3956c25bf348b538,0x59f111f1b605d019 + .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 + .quad 0xd807aa98a3030242,0x12835b0145706fbe + .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 + .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 + .quad 0x9bdc06a725c71235,0xc19bf174cf692694 + .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 + .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 + .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 + .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 + .quad 0x983e5152ee66dfab,0xa831c66d2db43210 + .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 + .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 + .quad 0x06ca6351e003826f,0x142929670a0e6e70 + .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 + .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df + .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 + .quad 0x81c2c92e47edaee6,0x92722c851482353b + .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 + .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 + .quad 0xd192e819d6ef5218,0xd69906245565a910 + .quad 0xf40e35855771202a,0x106aa07032bbd1b8 + .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 + .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 + .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb + .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 + .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 + .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec + .quad 0x90befffa23631e28,0xa4506cebde82bde9 + .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b + .quad 0xca273eceea26619c,0xd186b8c721c0c207 + .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 + .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 + .quad 0x113f9804bef90dae,0x1b710b35131c471b + .quad 0x28db77f523047d84,0x32caab7b40c72493 + .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c + .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a + .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 + .text + .globl Transform_Sha512_Len_riscv_vector + .type Transform_Sha512_Len_riscv_vector,@function + .align 2 +Transform_Sha512_Len_riscv_vector: + addi sp, sp, -64 + la t0, L_SHA512_transform_riscv_vector_len_k + .option arch, +v, +zvkb, +zvknhb + # VLEN == 128: SEW=64, LMUL=2, 4 elements per group + vsetivli zero, 4, e64, m2, ta, ma + # Permute standard digest a..h into {f,e,b,a},{h,g,d,c} order + ld t2, 40(a0) + sd t2, 0(sp) + ld t2, 32(a0) + sd t2, 8(sp) + ld t2, 8(a0) + sd t2, 16(sp) + ld t2, 0(a0) + sd t2, 24(sp) + ld t2, 56(a0) + sd t2, 32(sp) + ld t2, 48(a0) + sd t2, 40(sp) + ld t2, 24(a0) + sd t2, 48(sp) + ld t2, 16(a0) + sd t2, 56(sp) + vl4re64.v v8, (sp) + srli a2, a2, 7 + # Start of loop processing a block +L_SHA512_transform_riscv_vector_len_begin: + # Save state to add back after compression + vmv4r.v v28, v8 + # Load 16 W into 4 m2 groups of 4 64-bit words + mv t1, a1 + vl8re64.v v0, (t1) + vrev8.v v0, v0 + vrev8.v v2, v2 + vrev8.v v4, v4 + vrev8.v v6, v6 + # Load K (5 x 16 64-bit words) and run rounds + mv t1, t0 + vl8re64.v v16, (t1) + vadd.vv v14, v0, v16 + vmv.x.s t2, v2 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v4 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v0, v12, v6 + vadd.vv v14, v2, v18 + vmv.x.s t2, v4 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v6 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v2, v12, v0 + vadd.vv v14, v4, v20 + vmv.x.s t2, v6 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v0 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v4, v12, v2 + vadd.vv v14, v6, v22 + vmv.x.s t2, v0 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v2 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v6, v12, v4 + addi t1, t0, 128 + vl8re64.v v16, (t1) + vadd.vv v14, v0, v16 + vmv.x.s t2, v2 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v4 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v0, v12, v6 + vadd.vv v14, v2, v18 + vmv.x.s t2, v4 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v6 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v2, v12, v0 + vadd.vv v14, v4, v20 + vmv.x.s t2, v6 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v0 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v4, v12, v2 + vadd.vv v14, v6, v22 + vmv.x.s t2, v0 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v2 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v6, v12, v4 + addi t1, t0, 256 + vl8re64.v v16, (t1) + vadd.vv v14, v0, v16 + vmv.x.s t2, v2 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v4 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v0, v12, v6 + vadd.vv v14, v2, v18 + vmv.x.s t2, v4 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v6 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v2, v12, v0 + vadd.vv v14, v4, v20 + vmv.x.s t2, v6 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v0 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v4, v12, v2 + vadd.vv v14, v6, v22 + vmv.x.s t2, v0 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v2 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v6, v12, v4 + addi t1, t0, 384 + vl8re64.v v16, (t1) + vadd.vv v14, v0, v16 + vmv.x.s t2, v2 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v4 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v0, v12, v6 + vadd.vv v14, v2, v18 + vmv.x.s t2, v4 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v6 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v2, v12, v0 + vadd.vv v14, v4, v20 + vmv.x.s t2, v6 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v0 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v4, v12, v2 + vadd.vv v14, v6, v22 + vmv.x.s t2, v0 + vsha2cl.vv v10, v8, v14 + vmv.v.v v12, v2 + vsha2ch.vv v8, v10, v14 + vmv.s.x v12, t2 + vsha2ms.vv v6, v12, v4 + addi t1, t0, 512 + vl8re64.v v16, (t1) + vadd.vv v14, v0, v16 + vsha2cl.vv v10, v8, v14 + vsha2ch.vv v8, v10, v14 + vadd.vv v14, v2, v18 + vsha2cl.vv v10, v8, v14 + vsha2ch.vv v8, v10, v14 + vadd.vv v14, v4, v20 + vsha2cl.vv v10, v8, v14 + vsha2ch.vv v8, v10, v14 + vadd.vv v14, v6, v22 + vsha2cl.vv v10, v8, v14 + vsha2ch.vv v8, v10, v14 + vadd.vv v8, v8, v28 + vadd.vv v10, v10, v30 + addi a2, a2, -1 + addi a1, a1, 128 + bnez a2, L_SHA512_transform_riscv_vector_len_begin + # Store state back in standard digest order a..h + vs4r.v v8, (sp) + ld t2, 24(sp) + sd t2, 0(a0) + ld t2, 16(sp) + sd t2, 8(a0) + ld t2, 56(sp) + sd t2, 16(a0) + ld t2, 48(sp) + sd t2, 24(a0) + ld t2, 8(sp) + sd t2, 32(a0) + ld t2, 0(sp) + sd t2, 40(a0) + ld t2, 40(sp) + sd t2, 48(a0) + ld t2, 32(sp) + sd t2, 56(a0) + addi sp, sp, 64 + ret + .size Transform_Sha512_Len_riscv_vector,.-Transform_Sha512_Len_riscv_vector +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + .section .rodata + .type L_SHA512_transform_riscv_crypto_len_k, %object + .size L_SHA512_transform_riscv_crypto_len_k, 640 + # 8-byte aligned, 64-bit aligned + .align 3 +L_SHA512_transform_riscv_crypto_len_k: + .quad 0x428a2f98d728ae22,0x7137449123ef65cd + .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc + .quad 0x3956c25bf348b538,0x59f111f1b605d019 + .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 + .quad 0xd807aa98a3030242,0x12835b0145706fbe + .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 + .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 + .quad 0x9bdc06a725c71235,0xc19bf174cf692694 + .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 + .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 + .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 + .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 + .quad 0x983e5152ee66dfab,0xa831c66d2db43210 + .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 + .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 + .quad 0x06ca6351e003826f,0x142929670a0e6e70 + .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 + .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df + .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 + .quad 0x81c2c92e47edaee6,0x92722c851482353b + .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 + .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 + .quad 0xd192e819d6ef5218,0xd69906245565a910 + .quad 0xf40e35855771202a,0x106aa07032bbd1b8 + .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 + .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 + .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb + .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 + .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 + .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec + .quad 0x90befffa23631e28,0xa4506cebde82bde9 + .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b + .quad 0xca273eceea26619c,0xd186b8c721c0c207 + .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 + .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 + .quad 0x113f9804bef90dae,0x1b710b35131c471b + .quad 0x28db77f523047d84,0x32caab7b40c72493 + .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c + .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a + .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 + .text + .globl Transform_Sha512_Len_riscv_crypto + .type Transform_Sha512_Len_riscv_crypto,@function + .align 2 +Transform_Sha512_Len_riscv_crypto: + addi sp, sp, -224 + sd s1, 136(sp) + sd s2, 144(sp) + sd s3, 152(sp) + sd s4, 160(sp) + sd s5, 168(sp) + sd s6, 176(sp) + sd s7, 184(sp) + sd s8, 192(sp) + sd s9, 200(sp) + sd s10, 208(sp) + sd s11, 216(sp) + la t0, L_SHA512_transform_riscv_crypto_len_k + .option arch, +zknh + # Load digest into working variables + ld t1, 0(a0) + ld t2, 8(a0) + ld t3, 16(a0) + ld t4, 24(a0) + ld t5, 32(a0) + ld t6, 40(a0) + ld a3, 48(a0) + ld a4, 56(a0) + srli a2, a2, 5 + # Start of loop processing a block +L_SHA512_transform_riscv_crypto_len_begin: + # Load W into stack buffer, big-endian +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu s8, 4(a1) + lbu s9, 5(a1) + lbu s10, 6(a1) + lbu s5, 7(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + lbu s8, 0(a1) + lbu s9, 1(a1) + lbu s10, 2(a1) + lbu s11, 3(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + or s5, s5, s11 + lbu s8, 12(a1) + lbu s9, 13(a1) + lbu s10, 14(a1) + lbu a5, 15(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + lbu s8, 8(a1) + lbu s9, 9(a1) + lbu s10, 10(a1) + lbu s11, 11(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + or a5, a5, s11 + lbu s8, 20(a1) + lbu s9, 21(a1) + lbu s10, 22(a1) + lbu a6, 23(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + lbu s8, 16(a1) + lbu s9, 17(a1) + lbu s10, 18(a1) + lbu s11, 19(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + or a6, a6, s11 + lbu s8, 28(a1) + lbu s9, 29(a1) + lbu s10, 30(a1) + lbu a7, 31(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + lbu s8, 24(a1) + lbu s9, 25(a1) + lbu s10, 26(a1) + lbu s11, 27(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + or a7, a7, s11 + lbu s8, 36(a1) + lbu s9, 37(a1) + lbu s10, 38(a1) + lbu s1, 39(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + lbu s8, 32(a1) + lbu s9, 33(a1) + lbu s10, 34(a1) + lbu s11, 35(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + or s1, s1, s11 + lbu s8, 44(a1) + lbu s9, 45(a1) + lbu s10, 46(a1) + lbu s2, 47(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + lbu s8, 40(a1) + lbu s9, 41(a1) + lbu s10, 42(a1) + lbu s11, 43(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + or s2, s2, s11 + lbu s8, 52(a1) + lbu s9, 53(a1) + lbu s10, 54(a1) + lbu s3, 55(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + lbu s8, 48(a1) + lbu s9, 49(a1) + lbu s10, 50(a1) + lbu s11, 51(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + or s3, s3, s11 + lbu s8, 60(a1) + lbu s9, 61(a1) + lbu s10, 62(a1) + lbu s4, 63(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + lbu s8, 56(a1) + lbu s9, 57(a1) + lbu s10, 58(a1) + lbu s11, 59(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + or s4, s4, s11 + sd s5, 0(sp) + sd a5, 8(sp) + sd a6, 16(sp) + sd a7, 24(sp) + sd s1, 32(sp) + sd s2, 40(sp) + sd s3, 48(sp) + sd s4, 56(sp) + lbu s8, 68(a1) + lbu s9, 69(a1) + lbu s10, 70(a1) + lbu s5, 71(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + lbu s8, 64(a1) + lbu s9, 65(a1) + lbu s10, 66(a1) + lbu s11, 67(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + or s5, s5, s11 + lbu s8, 76(a1) + lbu s9, 77(a1) + lbu s10, 78(a1) + lbu a5, 79(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + lbu s8, 72(a1) + lbu s9, 73(a1) + lbu s10, 74(a1) + lbu s11, 75(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + or a5, a5, s11 + lbu s8, 84(a1) + lbu s9, 85(a1) + lbu s10, 86(a1) + lbu a6, 87(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + lbu s8, 80(a1) + lbu s9, 81(a1) + lbu s10, 82(a1) + lbu s11, 83(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + or a6, a6, s11 + lbu s8, 92(a1) + lbu s9, 93(a1) + lbu s10, 94(a1) + lbu a7, 95(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + lbu s8, 88(a1) + lbu s9, 89(a1) + lbu s10, 90(a1) + lbu s11, 91(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + or a7, a7, s11 + lbu s8, 100(a1) + lbu s9, 101(a1) + lbu s10, 102(a1) + lbu s1, 103(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + lbu s8, 96(a1) + lbu s9, 97(a1) + lbu s10, 98(a1) + lbu s11, 99(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + or s1, s1, s11 + lbu s8, 108(a1) + lbu s9, 109(a1) + lbu s10, 110(a1) + lbu s2, 111(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + lbu s8, 104(a1) + lbu s9, 105(a1) + lbu s10, 106(a1) + lbu s11, 107(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + or s2, s2, s11 + lbu s8, 116(a1) + lbu s9, 117(a1) + lbu s10, 118(a1) + lbu s3, 119(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + lbu s8, 112(a1) + lbu s9, 113(a1) + lbu s10, 114(a1) + lbu s11, 115(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + or s3, s3, s11 + lbu s8, 124(a1) + lbu s9, 125(a1) + lbu s10, 126(a1) + lbu s4, 127(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + lbu s8, 120(a1) + lbu s9, 121(a1) + lbu s10, 122(a1) + lbu s11, 123(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + or s4, s4, s11 + sd s5, 64(sp) + sd a5, 72(sp) + sd a6, 80(sp) + sd a7, 88(sp) + sd s1, 96(sp) + sd s2, 104(sp) + sd s3, 112(sp) + sd s4, 120(sp) +#else + ld s5, 0(a1) + # rev8 s5, s5 + .word 0x6b8ada93 + ld a5, 8(a1) + # rev8 a5, a5 + .word 0x6b87d793 + ld a6, 16(a1) + # rev8 a6, a6 + .word 0x6b885813 + ld a7, 24(a1) + # rev8 a7, a7 + .word 0x6b88d893 + ld s1, 32(a1) + # rev8 s1, s1 + .word 0x6b84d493 + ld s2, 40(a1) + # rev8 s2, s2 + .word 0x6b895913 + ld s3, 48(a1) + # rev8 s3, s3 + .word 0x6b89d993 + ld s4, 56(a1) + # rev8 s4, s4 + .word 0x6b8a5a13 + sd s5, 0(sp) + sd a5, 8(sp) + sd a6, 16(sp) + sd a7, 24(sp) + sd s1, 32(sp) + sd s2, 40(sp) + sd s3, 48(sp) + sd s4, 56(sp) + ld s5, 64(a1) + # rev8 s5, s5 + .word 0x6b8ada93 + ld a5, 72(a1) + # rev8 a5, a5 + .word 0x6b87d793 + ld a6, 80(a1) + # rev8 a6, a6 + .word 0x6b885813 + ld a7, 88(a1) + # rev8 a7, a7 + .word 0x6b88d893 + ld s1, 96(a1) + # rev8 s1, s1 + .word 0x6b84d493 + ld s2, 104(a1) + # rev8 s2, s2 + .word 0x6b895913 + ld s3, 112(a1) + # rev8 s3, s3 + .word 0x6b89d993 + ld s4, 120(a1) + # rev8 s4, s4 + .word 0x6b8a5a13 + sd s5, 64(sp) + sd a5, 72(sp) + sd a6, 80(sp) + sd a7, 88(sp) + sd s1, 96(sp) + sd s2, 104(sp) + sd s3, 112(sp) + sd s4, 120(sp) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +L_SHA512_transform_riscv_crypto_len_inner: + # Reload W[0], W[14], W[15] for message schedule + ld a5, 0(sp) + ld s1, 112(sp) + ld s2, 120(sp) + addi a2, a2, -1 + ld s10, 0(t0) + ld s11, 8(t0) + mv s8, t5 + mv s9, t1 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 + ld a6, 8(sp) + ld a7, 72(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, t4 + mv s9, a4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 + mv s1, a5 + ld a5, 16(sp) + ld a7, 80(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 0(sp) + mv s2, a6 + sd a6, 8(sp) + ld s10, 16(t0) + ld s11, 24(t0) + mv s8, t3 + mv s9, a3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 + ld a6, 24(sp) + ld a7, 88(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, t2 + mv s9, t6 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 + mv s1, a5 + ld a5, 32(sp) + ld a7, 96(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 16(sp) + mv s2, a6 + sd a6, 24(sp) + ld s10, 32(t0) + ld s11, 40(t0) + mv s8, t1 + mv s9, t5 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 + ld a6, 40(sp) + ld a7, 104(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, a4 + mv s9, t4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 + mv s1, a5 + ld a5, 48(sp) + ld a7, 112(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 32(sp) + mv s2, a6 + sd a6, 40(sp) + ld s10, 48(t0) + ld s11, 56(t0) + mv s8, a3 + mv s9, t3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 + ld a6, 56(sp) + ld a7, 120(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, t6 + mv s9, t2 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 + mv s1, a5 + ld a5, 64(sp) + ld a7, 0(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 48(sp) + mv s2, a6 + sd a6, 56(sp) + ld s10, 64(t0) + ld s11, 72(t0) + mv s8, t5 + mv s9, t1 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 + ld a6, 72(sp) + ld a7, 8(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, t4 + mv s9, a4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 + mv s1, a5 + ld a5, 80(sp) + ld a7, 16(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 64(sp) + mv s2, a6 + sd a6, 72(sp) + ld s10, 80(t0) + ld s11, 88(t0) + mv s8, t3 + mv s9, a3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 + ld a6, 88(sp) + ld a7, 24(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, t2 + mv s9, t6 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 + mv s1, a5 + ld a5, 96(sp) + ld a7, 32(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 80(sp) + mv s2, a6 + sd a6, 88(sp) + ld s10, 96(t0) + ld s11, 104(t0) + mv s8, t1 + mv s9, t5 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 + ld a6, 104(sp) + ld a7, 40(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, a4 + mv s9, t4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 + mv s1, a5 + ld a5, 112(sp) + ld a7, 48(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 96(sp) + mv s2, a6 + sd a6, 104(sp) + ld s10, 112(t0) + ld s11, 120(t0) + mv s8, a3 + mv s9, t3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 + ld a6, 120(sp) + ld a7, 56(sp) + sha512sig0 s8, a6 + sha512sig1 s9, s1 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 + mv s8, t6 + mv s9, t2 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 + mv s1, a5 + ld a5, 0(sp) + ld a7, 64(sp) + sha512sig0 s8, a5 + sha512sig1 s9, s2 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 + sd s1, 112(sp) + mv s2, a6 + sd a6, 120(sp) + andi s8, a2, 3 + addi t0, t0, 128 + bnez s8, L_SHA512_transform_riscv_crypto_len_inner + ld s10, 0(t0) + ld a5, 0(sp) + mv s8, t5 + mv s9, t1 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 + ld s10, 8(t0) + ld a5, 8(sp) + mv s8, t4 + mv s9, a4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 + ld s10, 16(t0) + ld a5, 16(sp) + mv s8, t3 + mv s9, a3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 + ld s10, 24(t0) + ld a5, 24(sp) + mv s8, t2 + mv s9, t6 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 + ld s10, 32(t0) + ld a5, 32(sp) + mv s8, t1 + mv s9, t5 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 + ld s10, 40(t0) + ld a5, 40(sp) + mv s8, a4 + mv s9, t4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 + ld s10, 48(t0) + ld a5, 48(sp) + mv s8, a3 + mv s9, t3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 + ld s10, 56(t0) + ld a5, 56(sp) + mv s8, t6 + mv s9, t2 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 + ld s10, 64(t0) + ld a5, 64(sp) + mv s8, t5 + mv s9, t1 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 + ld s10, 72(t0) + ld a5, 72(sp) + mv s8, t4 + mv s9, a4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 + ld s10, 80(t0) + ld a5, 80(sp) + mv s8, t3 + mv s9, a3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 + ld s10, 88(t0) + ld a5, 88(sp) + mv s8, t2 + mv s9, t6 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 + ld s10, 96(t0) + ld a5, 96(sp) + mv s8, t1 + mv s9, t5 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 + ld s10, 104(t0) + ld a5, 104(sp) + mv s8, a4 + mv s9, t4 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 + ld s10, 112(t0) + ld a5, 112(sp) + mv s8, a3 + mv s9, t3 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 + ld s10, 120(t0) + ld a5, 120(sp) + mv s8, t6 + mv s9, t2 + sha512sum1 s8, s8 + sha512sum0 s9, s9 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 + addi t0, t0, -512 + # Add working variables back into digest state + ld s5, 0(a0) + ld a5, 8(a0) + ld a6, 16(a0) + ld a7, 24(a0) + ld s1, 32(a0) + ld s2, 40(a0) + ld s3, 48(a0) + ld s4, 56(a0) + add t1, t1, s5 + add t2, t2, a5 + add t3, t3, a6 + add t4, t4, a7 + add t5, t5, s1 + add t6, t6, s2 + add a3, a3, s3 + add a4, a4, s4 + # Store digest + sd t1, 0(a0) + sd t2, 8(a0) + sd t3, 16(a0) + sd t4, 24(a0) + sd t5, 32(a0) + sd t6, 40(a0) + sd a3, 48(a0) + sd a4, 56(a0) + addi a1, a1, 128 + bnez a2, L_SHA512_transform_riscv_crypto_len_begin + ld s1, 136(sp) + ld s2, 144(sp) + ld s3, 152(sp) + ld s4, 160(sp) + ld s5, 168(sp) + ld s6, 176(sp) + ld s7, 184(sp) + ld s8, 192(sp) + ld s9, 200(sp) + ld s10, 208(sp) + ld s11, 216(sp) + addi sp, sp, 224 + ret + .size Transform_Sha512_Len_riscv_crypto,.-Transform_Sha512_Len_riscv_crypto +#else + .section .rodata + .type L_SHA512_transform_riscv_len_k, %object + .size L_SHA512_transform_riscv_len_k, 640 + # 8-byte aligned, 64-bit aligned + .align 3 +L_SHA512_transform_riscv_len_k: + .quad 0x428a2f98d728ae22,0x7137449123ef65cd + .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc + .quad 0x3956c25bf348b538,0x59f111f1b605d019 + .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 + .quad 0xd807aa98a3030242,0x12835b0145706fbe + .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 + .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 + .quad 0x9bdc06a725c71235,0xc19bf174cf692694 + .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 + .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 + .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 + .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 + .quad 0x983e5152ee66dfab,0xa831c66d2db43210 + .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 + .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 + .quad 0x06ca6351e003826f,0x142929670a0e6e70 + .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 + .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df + .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 + .quad 0x81c2c92e47edaee6,0x92722c851482353b + .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 + .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 + .quad 0xd192e819d6ef5218,0xd69906245565a910 + .quad 0xf40e35855771202a,0x106aa07032bbd1b8 + .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 + .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 + .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb + .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 + .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 + .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec + .quad 0x90befffa23631e28,0xa4506cebde82bde9 + .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b + .quad 0xca273eceea26619c,0xd186b8c721c0c207 + .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 + .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 + .quad 0x113f9804bef90dae,0x1b710b35131c471b + .quad 0x28db77f523047d84,0x32caab7b40c72493 + .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c + .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a + .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 + .text + .globl Transform_Sha512_Len_riscv + .type Transform_Sha512_Len_riscv,@function + .align 2 +Transform_Sha512_Len_riscv: + addi sp, sp, -224 + sd s1, 136(sp) + sd s2, 144(sp) + sd s3, 152(sp) + sd s4, 160(sp) + sd s5, 168(sp) + sd s6, 176(sp) + sd s7, 184(sp) + sd s8, 192(sp) + sd s9, 200(sp) + sd s10, 208(sp) + sd s11, 216(sp) + la t0, L_SHA512_transform_riscv_len_k + # Load digest into working variables + ld t1, 0(a0) + ld t2, 8(a0) + ld t3, 16(a0) + ld t4, 24(a0) + ld t5, 32(a0) + ld t6, 40(a0) + ld a3, 48(a0) + ld a4, 56(a0) + srli a2, a2, 5 + # Start of loop processing a block +L_SHA512_transform_riscv_len_begin: + # Load W into stack buffer, big-endian +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + lbu s8, 4(a1) + lbu s9, 5(a1) + lbu s10, 6(a1) + lbu s5, 7(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + lbu s8, 0(a1) + lbu s9, 1(a1) + lbu s10, 2(a1) + lbu s11, 3(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + or s5, s5, s11 + lbu s8, 12(a1) + lbu s9, 13(a1) + lbu s10, 14(a1) + lbu a5, 15(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + lbu s8, 8(a1) + lbu s9, 9(a1) + lbu s10, 10(a1) + lbu s11, 11(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + or a5, a5, s11 + lbu s8, 20(a1) + lbu s9, 21(a1) + lbu s10, 22(a1) + lbu a6, 23(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + lbu s8, 16(a1) + lbu s9, 17(a1) + lbu s10, 18(a1) + lbu s11, 19(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + or a6, a6, s11 + lbu s8, 28(a1) + lbu s9, 29(a1) + lbu s10, 30(a1) + lbu a7, 31(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + lbu s8, 24(a1) + lbu s9, 25(a1) + lbu s10, 26(a1) + lbu s11, 27(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + or a7, a7, s11 + lbu s8, 36(a1) + lbu s9, 37(a1) + lbu s10, 38(a1) + lbu s1, 39(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + lbu s8, 32(a1) + lbu s9, 33(a1) + lbu s10, 34(a1) + lbu s11, 35(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + or s1, s1, s11 + lbu s8, 44(a1) + lbu s9, 45(a1) + lbu s10, 46(a1) + lbu s2, 47(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + lbu s8, 40(a1) + lbu s9, 41(a1) + lbu s10, 42(a1) + lbu s11, 43(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + or s2, s2, s11 + lbu s8, 52(a1) + lbu s9, 53(a1) + lbu s10, 54(a1) + lbu s3, 55(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + lbu s8, 48(a1) + lbu s9, 49(a1) + lbu s10, 50(a1) + lbu s11, 51(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + or s3, s3, s11 + lbu s8, 60(a1) + lbu s9, 61(a1) + lbu s10, 62(a1) + lbu s4, 63(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + lbu s8, 56(a1) + lbu s9, 57(a1) + lbu s10, 58(a1) + lbu s11, 59(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + or s4, s4, s11 + sd s5, 0(sp) + sd a5, 8(sp) + sd a6, 16(sp) + sd a7, 24(sp) + sd s1, 32(sp) + sd s2, 40(sp) + sd s3, 48(sp) + sd s4, 56(sp) + lbu s8, 68(a1) + lbu s9, 69(a1) + lbu s10, 70(a1) + lbu s5, 71(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + lbu s8, 64(a1) + lbu s9, 65(a1) + lbu s10, 66(a1) + lbu s11, 67(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s5, s5, s8 + or s5, s5, s9 + or s5, s5, s10 + or s5, s5, s11 + lbu s8, 76(a1) + lbu s9, 77(a1) + lbu s10, 78(a1) + lbu a5, 79(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + lbu s8, 72(a1) + lbu s9, 73(a1) + lbu s10, 74(a1) + lbu s11, 75(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a5, a5, s8 + or a5, a5, s9 + or a5, a5, s10 + or a5, a5, s11 + lbu s8, 84(a1) + lbu s9, 85(a1) + lbu s10, 86(a1) + lbu a6, 87(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + lbu s8, 80(a1) + lbu s9, 81(a1) + lbu s10, 82(a1) + lbu s11, 83(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a6, a6, s8 + or a6, a6, s9 + or a6, a6, s10 + or a6, a6, s11 + lbu s8, 92(a1) + lbu s9, 93(a1) + lbu s10, 94(a1) + lbu a7, 95(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + lbu s8, 88(a1) + lbu s9, 89(a1) + lbu s10, 90(a1) + lbu s11, 91(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or a7, a7, s8 + or a7, a7, s9 + or a7, a7, s10 + or a7, a7, s11 + lbu s8, 100(a1) + lbu s9, 101(a1) + lbu s10, 102(a1) + lbu s1, 103(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + lbu s8, 96(a1) + lbu s9, 97(a1) + lbu s10, 98(a1) + lbu s11, 99(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s1, s1, s8 + or s1, s1, s9 + or s1, s1, s10 + or s1, s1, s11 + lbu s8, 108(a1) + lbu s9, 109(a1) + lbu s10, 110(a1) + lbu s2, 111(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + lbu s8, 104(a1) + lbu s9, 105(a1) + lbu s10, 106(a1) + lbu s11, 107(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s2, s2, s8 + or s2, s2, s9 + or s2, s2, s10 + or s2, s2, s11 + lbu s8, 116(a1) + lbu s9, 117(a1) + lbu s10, 118(a1) + lbu s3, 119(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + lbu s8, 112(a1) + lbu s9, 113(a1) + lbu s10, 114(a1) + lbu s11, 115(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s3, s3, s8 + or s3, s3, s9 + or s3, s3, s10 + or s3, s3, s11 + lbu s8, 124(a1) + lbu s9, 125(a1) + lbu s10, 126(a1) + lbu s4, 127(a1) + slli s8, s8, 24 + slli s9, s9, 16 + slli s10, s10, 8 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + lbu s8, 120(a1) + lbu s9, 121(a1) + lbu s10, 122(a1) + lbu s11, 123(a1) + slli s8, s8, 56 + slli s9, s9, 48 + slli s10, s10, 40 + slli s11, s11, 32 + or s4, s4, s8 + or s4, s4, s9 + or s4, s4, s10 + or s4, s4, s11 + sd s5, 64(sp) + sd a5, 72(sp) + sd a6, 80(sp) + sd a7, 88(sp) + sd s1, 96(sp) + sd s2, 104(sp) + sd s3, 112(sp) + sd s4, 120(sp) +#else + ld s5, 0(a1) + # rev8 s5, s5 + .word 0x6b8ada93 + ld a5, 8(a1) + # rev8 a5, a5 + .word 0x6b87d793 + ld a6, 16(a1) + # rev8 a6, a6 + .word 0x6b885813 + ld a7, 24(a1) + # rev8 a7, a7 + .word 0x6b88d893 + ld s1, 32(a1) + # rev8 s1, s1 + .word 0x6b84d493 + ld s2, 40(a1) + # rev8 s2, s2 + .word 0x6b895913 + ld s3, 48(a1) + # rev8 s3, s3 + .word 0x6b89d993 + ld s4, 56(a1) + # rev8 s4, s4 + .word 0x6b8a5a13 + sd s5, 0(sp) + sd a5, 8(sp) + sd a6, 16(sp) + sd a7, 24(sp) + sd s1, 32(sp) + sd s2, 40(sp) + sd s3, 48(sp) + sd s4, 56(sp) + ld s5, 64(a1) + # rev8 s5, s5 + .word 0x6b8ada93 + ld a5, 72(a1) + # rev8 a5, a5 + .word 0x6b87d793 + ld a6, 80(a1) + # rev8 a6, a6 + .word 0x6b885813 + ld a7, 88(a1) + # rev8 a7, a7 + .word 0x6b88d893 + ld s1, 96(a1) + # rev8 s1, s1 + .word 0x6b84d493 + ld s2, 104(a1) + # rev8 s2, s2 + .word 0x6b895913 + ld s3, 112(a1) + # rev8 s3, s3 + .word 0x6b89d993 + ld s4, 120(a1) + # rev8 s4, s4 + .word 0x6b8a5a13 + sd s5, 64(sp) + sd a5, 72(sp) + sd a6, 80(sp) + sd a7, 88(sp) + sd s1, 96(sp) + sd s2, 104(sp) + sd s3, 112(sp) + sd s4, 120(sp) +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ +L_SHA512_transform_riscv_len_inner: + # Reload W[0], W[14], W[15] for message schedule + ld a5, 0(sp) + ld s1, 112(sp) + ld s2, 120(sp) + addi a2, a2, -1 + ld s10, 0(t0) + ld s11, 8(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t5, 14 + .word 0x60ef5a93 + # rori s6, t5, 18 + .word 0x612f5b13 + # rori s8, t5, 41 + .word 0x629f5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t1, 28 + .word 0x61c35a93 + # rori s6, t1, 34 + .word 0x62235b13 + # rori s9, t1, 39 + .word 0x62735c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#else + slli s6, t5, 50 + srli s5, t5, 14 + slli s7, t5, 46 + or s5, s5, s6 + srli s6, t5, 18 + xor s5, s5, s7 + slli s7, t5, 23 + xor s5, s5, s6 + srli s8, t5, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t1, 36 + srli s5, t1, 28 + slli s7, t1, 30 + or s5, s5, s6 + srli s6, t1, 34 + xor s5, s5, s7 + slli s7, t1, 25 + xor s5, s5, s6 + srli s9, t1, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 8(sp) + ld a7, 72(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t4, 14 + .word 0x60eeda93 + # rori s6, t4, 18 + .word 0x612edb13 + # rori s8, t4, 41 + .word 0x629edc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a4, 28 + .word 0x61c75a93 + # rori s6, a4, 34 + .word 0x62275b13 + # rori s9, a4, 39 + .word 0x62775c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#else + slli s6, t4, 50 + srli s5, t4, 14 + slli s7, t4, 46 + or s5, s5, s6 + srli s6, t4, 18 + xor s5, s5, s7 + slli s7, t4, 23 + xor s5, s5, s6 + srli s8, t4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a4, 36 + srli s5, a4, 28 + slli s7, a4, 30 + or s5, s5, s6 + srli s6, a4, 34 + xor s5, s5, s7 + slli s7, a4, 25 + xor s5, s5, s6 + srli s9, a4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 16(sp) + ld a7, 80(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 0(sp) + mv s2, a6 + sd a6, 8(sp) + ld s10, 16(t0) + ld s11, 24(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t3, 14 + .word 0x60ee5a93 + # rori s6, t3, 18 + .word 0x612e5b13 + # rori s8, t3, 41 + .word 0x629e5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a3, 28 + .word 0x61c6da93 + # rori s6, a3, 34 + .word 0x6226db13 + # rori s9, a3, 39 + .word 0x6276dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#else + slli s6, t3, 50 + srli s5, t3, 14 + slli s7, t3, 46 + or s5, s5, s6 + srli s6, t3, 18 + xor s5, s5, s7 + slli s7, t3, 23 + xor s5, s5, s6 + srli s8, t3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a3, 36 + srli s5, a3, 28 + slli s7, a3, 30 + or s5, s5, s6 + srli s6, a3, 34 + xor s5, s5, s7 + slli s7, a3, 25 + xor s5, s5, s6 + srli s9, a3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 24(sp) + ld a7, 88(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t2, 14 + .word 0x60e3da93 + # rori s6, t2, 18 + .word 0x6123db13 + # rori s8, t2, 41 + .word 0x6293dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t6, 28 + .word 0x61cfda93 + # rori s6, t6, 34 + .word 0x622fdb13 + # rori s9, t6, 39 + .word 0x627fdc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#else + slli s6, t2, 50 + srli s5, t2, 14 + slli s7, t2, 46 + or s5, s5, s6 + srli s6, t2, 18 + xor s5, s5, s7 + slli s7, t2, 23 + xor s5, s5, s6 + srli s8, t2, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t6, 36 + srli s5, t6, 28 + slli s7, t6, 30 + or s5, s5, s6 + srli s6, t6, 34 + xor s5, s5, s7 + slli s7, t6, 25 + xor s5, s5, s6 + srli s9, t6, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 32(sp) + ld a7, 96(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 16(sp) + mv s2, a6 + sd a6, 24(sp) + ld s10, 32(t0) + ld s11, 40(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t1, 14 + .word 0x60e35a93 + # rori s6, t1, 18 + .word 0x61235b13 + # rori s8, t1, 41 + .word 0x62935c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t5, 28 + .word 0x61cf5a93 + # rori s6, t5, 34 + .word 0x622f5b13 + # rori s9, t5, 39 + .word 0x627f5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#else + slli s6, t1, 50 + srli s5, t1, 14 + slli s7, t1, 46 + or s5, s5, s6 + srli s6, t1, 18 + xor s5, s5, s7 + slli s7, t1, 23 + xor s5, s5, s6 + srli s8, t1, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t5, 36 + srli s5, t5, 28 + slli s7, t5, 30 + or s5, s5, s6 + srli s6, t5, 34 + xor s5, s5, s7 + slli s7, t5, 25 + xor s5, s5, s6 + srli s9, t5, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 40(sp) + ld a7, 104(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a4, 14 + .word 0x60e75a93 + # rori s6, a4, 18 + .word 0x61275b13 + # rori s8, a4, 41 + .word 0x62975c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t4, 28 + .word 0x61ceda93 + # rori s6, t4, 34 + .word 0x622edb13 + # rori s9, t4, 39 + .word 0x627edc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#else + slli s6, a4, 50 + srli s5, a4, 14 + slli s7, a4, 46 + or s5, s5, s6 + srli s6, a4, 18 + xor s5, s5, s7 + slli s7, a4, 23 + xor s5, s5, s6 + srli s8, a4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t4, 36 + srli s5, t4, 28 + slli s7, t4, 30 + or s5, s5, s6 + srli s6, t4, 34 + xor s5, s5, s7 + slli s7, t4, 25 + xor s5, s5, s6 + srli s9, t4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 48(sp) + ld a7, 112(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 32(sp) + mv s2, a6 + sd a6, 40(sp) + ld s10, 48(t0) + ld s11, 56(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a3, 14 + .word 0x60e6da93 + # rori s6, a3, 18 + .word 0x6126db13 + # rori s8, a3, 41 + .word 0x6296dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t3, 28 + .word 0x61ce5a93 + # rori s6, t3, 34 + .word 0x622e5b13 + # rori s9, t3, 39 + .word 0x627e5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#else + slli s6, a3, 50 + srli s5, a3, 14 + slli s7, a3, 46 + or s5, s5, s6 + srli s6, a3, 18 + xor s5, s5, s7 + slli s7, a3, 23 + xor s5, s5, s6 + srli s8, a3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t3, 36 + srli s5, t3, 28 + slli s7, t3, 30 + or s5, s5, s6 + srli s6, t3, 34 + xor s5, s5, s7 + slli s7, t3, 25 + xor s5, s5, s6 + srli s9, t3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 56(sp) + ld a7, 120(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t6, 14 + .word 0x60efda93 + # rori s6, t6, 18 + .word 0x612fdb13 + # rori s8, t6, 41 + .word 0x629fdc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t2, 28 + .word 0x61c3da93 + # rori s6, t2, 34 + .word 0x6223db13 + # rori s9, t2, 39 + .word 0x6273dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#else + slli s6, t6, 50 + srli s5, t6, 14 + slli s7, t6, 46 + or s5, s5, s6 + srli s6, t6, 18 + xor s5, s5, s7 + slli s7, t6, 23 + xor s5, s5, s6 + srli s8, t6, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t2, 36 + srli s5, t2, 28 + slli s7, t2, 30 + or s5, s5, s6 + srli s6, t2, 34 + xor s5, s5, s7 + slli s7, t2, 25 + xor s5, s5, s6 + srli s9, t2, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 64(sp) + ld a7, 0(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 48(sp) + mv s2, a6 + sd a6, 56(sp) + ld s10, 64(t0) + ld s11, 72(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t5, 14 + .word 0x60ef5a93 + # rori s6, t5, 18 + .word 0x612f5b13 + # rori s8, t5, 41 + .word 0x629f5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t1, 28 + .word 0x61c35a93 + # rori s6, t1, 34 + .word 0x62235b13 + # rori s9, t1, 39 + .word 0x62735c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#else + slli s6, t5, 50 + srli s5, t5, 14 + slli s7, t5, 46 + or s5, s5, s6 + srli s6, t5, 18 + xor s5, s5, s7 + slli s7, t5, 23 + xor s5, s5, s6 + srli s8, t5, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t1, 36 + srli s5, t1, 28 + slli s7, t1, 30 + or s5, s5, s6 + srli s6, t1, 34 + xor s5, s5, s7 + slli s7, t1, 25 + xor s5, s5, s6 + srli s9, t1, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 72(sp) + ld a7, 8(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t4, 14 + .word 0x60eeda93 + # rori s6, t4, 18 + .word 0x612edb13 + # rori s8, t4, 41 + .word 0x629edc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a4, 28 + .word 0x61c75a93 + # rori s6, a4, 34 + .word 0x62275b13 + # rori s9, a4, 39 + .word 0x62775c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#else + slli s6, t4, 50 + srli s5, t4, 14 + slli s7, t4, 46 + or s5, s5, s6 + srli s6, t4, 18 + xor s5, s5, s7 + slli s7, t4, 23 + xor s5, s5, s6 + srli s8, t4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a4, 36 + srli s5, a4, 28 + slli s7, a4, 30 + or s5, s5, s6 + srli s6, a4, 34 + xor s5, s5, s7 + slli s7, a4, 25 + xor s5, s5, s6 + srli s9, a4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 80(sp) + ld a7, 16(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 64(sp) + mv s2, a6 + sd a6, 72(sp) + ld s10, 80(t0) + ld s11, 88(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t3, 14 + .word 0x60ee5a93 + # rori s6, t3, 18 + .word 0x612e5b13 + # rori s8, t3, 41 + .word 0x629e5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a3, 28 + .word 0x61c6da93 + # rori s6, a3, 34 + .word 0x6226db13 + # rori s9, a3, 39 + .word 0x6276dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#else + slli s6, t3, 50 + srli s5, t3, 14 + slli s7, t3, 46 + or s5, s5, s6 + srli s6, t3, 18 + xor s5, s5, s7 + slli s7, t3, 23 + xor s5, s5, s6 + srli s8, t3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a3, 36 + srli s5, a3, 28 + slli s7, a3, 30 + or s5, s5, s6 + srli s6, a3, 34 + xor s5, s5, s7 + slli s7, a3, 25 + xor s5, s5, s6 + srli s9, a3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 88(sp) + ld a7, 24(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t2, 14 + .word 0x60e3da93 + # rori s6, t2, 18 + .word 0x6123db13 + # rori s8, t2, 41 + .word 0x6293dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t6, 28 + .word 0x61cfda93 + # rori s6, t6, 34 + .word 0x622fdb13 + # rori s9, t6, 39 + .word 0x627fdc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#else + slli s6, t2, 50 + srli s5, t2, 14 + slli s7, t2, 46 + or s5, s5, s6 + srli s6, t2, 18 + xor s5, s5, s7 + slli s7, t2, 23 + xor s5, s5, s6 + srli s8, t2, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t6, 36 + srli s5, t6, 28 + slli s7, t6, 30 + or s5, s5, s6 + srli s6, t6, 34 + xor s5, s5, s7 + slli s7, t6, 25 + xor s5, s5, s6 + srli s9, t6, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 96(sp) + ld a7, 32(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 80(sp) + mv s2, a6 + sd a6, 88(sp) + ld s10, 96(t0) + ld s11, 104(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t1, 14 + .word 0x60e35a93 + # rori s6, t1, 18 + .word 0x61235b13 + # rori s8, t1, 41 + .word 0x62935c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t5, 28 + .word 0x61cf5a93 + # rori s6, t5, 34 + .word 0x622f5b13 + # rori s9, t5, 39 + .word 0x627f5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#else + slli s6, t1, 50 + srli s5, t1, 14 + slli s7, t1, 46 + or s5, s5, s6 + srli s6, t1, 18 + xor s5, s5, s7 + slli s7, t1, 23 + xor s5, s5, s6 + srli s8, t1, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t5, 36 + srli s5, t5, 28 + slli s7, t5, 30 + or s5, s5, s6 + srli s6, t5, 34 + xor s5, s5, s7 + slli s7, t5, 25 + xor s5, s5, s6 + srli s9, t5, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 104(sp) + ld a7, 40(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a4, 14 + .word 0x60e75a93 + # rori s6, a4, 18 + .word 0x61275b13 + # rori s8, a4, 41 + .word 0x62975c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t4, 28 + .word 0x61ceda93 + # rori s6, t4, 34 + .word 0x622edb13 + # rori s9, t4, 39 + .word 0x627edc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#else + slli s6, a4, 50 + srli s5, a4, 14 + slli s7, a4, 46 + or s5, s5, s6 + srli s6, a4, 18 + xor s5, s5, s7 + slli s7, a4, 23 + xor s5, s5, s6 + srli s8, a4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t4, 36 + srli s5, t4, 28 + slli s7, t4, 30 + or s5, s5, s6 + srli s6, t4, 34 + xor s5, s5, s7 + slli s7, t4, 25 + xor s5, s5, s6 + srli s9, t4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 112(sp) + ld a7, 48(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 96(sp) + mv s2, a6 + sd a6, 104(sp) + ld s10, 112(t0) + ld s11, 120(t0) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a3, 14 + .word 0x60e6da93 + # rori s6, a3, 18 + .word 0x6126db13 + # rori s8, a3, 41 + .word 0x6296dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t3, 28 + .word 0x61ce5a93 + # rori s6, t3, 34 + .word 0x622e5b13 + # rori s9, t3, 39 + .word 0x627e5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#else + slli s6, a3, 50 + srli s5, a3, 14 + slli s7, a3, 46 + or s5, s5, s6 + srli s6, a3, 18 + xor s5, s5, s7 + slli s7, a3, 23 + xor s5, s5, s6 + srli s8, a3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t3, 36 + srli s5, t3, 28 + slli s7, t3, 30 + or s5, s5, s6 + srli s6, t3, 34 + xor s5, s5, s7 + slli s7, t3, 25 + xor s5, s5, s6 + srli s9, t3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld a6, 120(sp) + ld a7, 56(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a6, 1 + .word 0x60185a93 + # rori s6, a6, 8 + .word 0x60885b13 + srli s8, a6, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s1, 19 + .word 0x6134da93 + # rori s6, s1, 61 + .word 0x63d4db13 + srli s9, s1, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#else + slli s6, a6, 63 + srli s7, a6, 1 + slli s5, a6, 56 + or s7, s7, s6 + srli s6, a6, 8 + xor s7, s7, s5 + srli s8, a6, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s1, 45 + srli s7, s1, 19 + slli s5, s1, 3 + or s7, s7, s6 + srli s6, s1, 61 + xor s7, s7, s5 + srli s9, s1, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a5, a5, s8 + add a5, s9, a5 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t6, 14 + .word 0x60efda93 + # rori s6, t6, 18 + .word 0x612fdb13 + # rori s8, t6, 41 + .word 0x629fdc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t2, 28 + .word 0x61c3da93 + # rori s6, t2, 34 + .word 0x6223db13 + # rori s9, t2, 39 + .word 0x6273dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#else + slli s6, t6, 50 + srli s5, t6, 14 + slli s7, t6, 46 + or s5, s5, s6 + srli s6, t6, 18 + xor s5, s5, s7 + slli s7, t6, 23 + xor s5, s5, s6 + srli s8, t6, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t2, 36 + srli s5, t2, 28 + slli s7, t2, 30 + or s5, s5, s6 + srli s6, t2, 34 + xor s5, s5, s7 + slli s7, t2, 25 + xor s5, s5, s6 + srli s9, t2, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s11, a6 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + mv s1, a5 + ld a5, 0(sp) + ld a7, 64(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a5, 1 + .word 0x6017da93 + # rori s6, a5, 8 + .word 0x6087db13 + srli s8, a5, 7 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, s2, 19 + .word 0x61395a93 + # rori s6, s2, 61 + .word 0x63d95b13 + srli s9, s2, 6 + xor s9, s9, s5 + xor s9, s9, s6 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#else + slli s6, a5, 63 + srli s7, a5, 1 + slli s5, a5, 56 + or s7, s7, s6 + srli s6, a5, 8 + xor s7, s7, s5 + srli s8, a5, 7 + xor s7, s7, s6 + xor s8, s8, s7 + slli s6, s2, 45 + srli s7, s2, 19 + slli s5, s2, 3 + or s7, s7, s6 + srli s6, s2, 61 + xor s7, s7, s5 + srli s9, s2, 6 + xor s7, s7, s6 + xor s9, s9, s7 + add s9, s9, a7 + add a6, a6, s8 + add a6, s9, a6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + sd s1, 112(sp) + mv s2, a6 + sd a6, 120(sp) + andi s8, a2, 3 + addi t0, t0, 128 + bnez s8, L_SHA512_transform_riscv_len_inner + ld s10, 0(t0) + ld a5, 0(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t5, 14 + .word 0x60ef5a93 + # rori s6, t5, 18 + .word 0x612f5b13 + # rori s8, t5, 41 + .word 0x629f5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t1, 28 + .word 0x61c35a93 + # rori s6, t1, 34 + .word 0x62235b13 + # rori s9, t1, 39 + .word 0x62735c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#else + slli s6, t5, 50 + srli s5, t5, 14 + slli s7, t5, 46 + or s5, s5, s6 + srli s6, t5, 18 + xor s5, s5, s7 + slli s7, t5, 23 + xor s5, s5, s6 + srli s8, t5, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t1, 36 + srli s5, t1, 28 + slli s7, t1, 30 + or s5, s5, s6 + srli s6, t1, 34 + xor s5, s5, s7 + slli s7, t1, 25 + xor s5, s5, s6 + srli s9, t1, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 8(t0) + ld a5, 8(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t4, 14 + .word 0x60eeda93 + # rori s6, t4, 18 + .word 0x612edb13 + # rori s8, t4, 41 + .word 0x629edc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a4, 28 + .word 0x61c75a93 + # rori s6, a4, 34 + .word 0x62275b13 + # rori s9, a4, 39 + .word 0x62775c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#else + slli s6, t4, 50 + srli s5, t4, 14 + slli s7, t4, 46 + or s5, s5, s6 + srli s6, t4, 18 + xor s5, s5, s7 + slli s7, t4, 23 + xor s5, s5, s6 + srli s8, t4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a4, 36 + srli s5, a4, 28 + slli s7, a4, 30 + or s5, s5, s6 + srli s6, a4, 34 + xor s5, s5, s7 + slli s7, a4, 25 + xor s5, s5, s6 + srli s9, a4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 16(t0) + ld a5, 16(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t3, 14 + .word 0x60ee5a93 + # rori s6, t3, 18 + .word 0x612e5b13 + # rori s8, t3, 41 + .word 0x629e5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a3, 28 + .word 0x61c6da93 + # rori s6, a3, 34 + .word 0x6226db13 + # rori s9, a3, 39 + .word 0x6276dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#else + slli s6, t3, 50 + srli s5, t3, 14 + slli s7, t3, 46 + or s5, s5, s6 + srli s6, t3, 18 + xor s5, s5, s7 + slli s7, t3, 23 + xor s5, s5, s6 + srli s8, t3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a3, 36 + srli s5, a3, 28 + slli s7, a3, 30 + or s5, s5, s6 + srli s6, a3, 34 + xor s5, s5, s7 + slli s7, a3, 25 + xor s5, s5, s6 + srli s9, a3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 24(t0) + ld a5, 24(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t2, 14 + .word 0x60e3da93 + # rori s6, t2, 18 + .word 0x6123db13 + # rori s8, t2, 41 + .word 0x6293dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t6, 28 + .word 0x61cfda93 + # rori s6, t6, 34 + .word 0x622fdb13 + # rori s9, t6, 39 + .word 0x627fdc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#else + slli s6, t2, 50 + srli s5, t2, 14 + slli s7, t2, 46 + or s5, s5, s6 + srli s6, t2, 18 + xor s5, s5, s7 + slli s7, t2, 23 + xor s5, s5, s6 + srli s8, t2, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t6, 36 + srli s5, t6, 28 + slli s7, t6, 30 + or s5, s5, s6 + srli s6, t6, 34 + xor s5, s5, s7 + slli s7, t6, 25 + xor s5, s5, s6 + srli s9, t6, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 32(t0) + ld a5, 32(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t1, 14 + .word 0x60e35a93 + # rori s6, t1, 18 + .word 0x61235b13 + # rori s8, t1, 41 + .word 0x62935c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t5, 28 + .word 0x61cf5a93 + # rori s6, t5, 34 + .word 0x622f5b13 + # rori s9, t5, 39 + .word 0x627f5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#else + slli s6, t1, 50 + srli s5, t1, 14 + slli s7, t1, 46 + or s5, s5, s6 + srli s6, t1, 18 + xor s5, s5, s7 + slli s7, t1, 23 + xor s5, s5, s6 + srli s8, t1, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t5, 36 + srli s5, t5, 28 + slli s7, t5, 30 + or s5, s5, s6 + srli s6, t5, 34 + xor s5, s5, s7 + slli s7, t5, 25 + xor s5, s5, s6 + srli s9, t5, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 40(t0) + ld a5, 40(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a4, 14 + .word 0x60e75a93 + # rori s6, a4, 18 + .word 0x61275b13 + # rori s8, a4, 41 + .word 0x62975c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t4, 28 + .word 0x61ceda93 + # rori s6, t4, 34 + .word 0x622edb13 + # rori s9, t4, 39 + .word 0x627edc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#else + slli s6, a4, 50 + srli s5, a4, 14 + slli s7, a4, 46 + or s5, s5, s6 + srli s6, a4, 18 + xor s5, s5, s7 + slli s7, a4, 23 + xor s5, s5, s6 + srli s8, a4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t4, 36 + srli s5, t4, 28 + slli s7, t4, 30 + or s5, s5, s6 + srli s6, t4, 34 + xor s5, s5, s7 + slli s7, t4, 25 + xor s5, s5, s6 + srli s9, t4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 48(t0) + ld a5, 48(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a3, 14 + .word 0x60e6da93 + # rori s6, a3, 18 + .word 0x6126db13 + # rori s8, a3, 41 + .word 0x6296dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t3, 28 + .word 0x61ce5a93 + # rori s6, t3, 34 + .word 0x622e5b13 + # rori s9, t3, 39 + .word 0x627e5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#else + slli s6, a3, 50 + srli s5, a3, 14 + slli s7, a3, 46 + or s5, s5, s6 + srli s6, a3, 18 + xor s5, s5, s7 + slli s7, a3, 23 + xor s5, s5, s6 + srli s8, a3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t3, 36 + srli s5, t3, 28 + slli s7, t3, 30 + or s5, s5, s6 + srli s6, t3, 34 + xor s5, s5, s7 + slli s7, t3, 25 + xor s5, s5, s6 + srli s9, t3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 56(t0) + ld a5, 56(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t6, 14 + .word 0x60efda93 + # rori s6, t6, 18 + .word 0x612fdb13 + # rori s8, t6, 41 + .word 0x629fdc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t2, 28 + .word 0x61c3da93 + # rori s6, t2, 34 + .word 0x6223db13 + # rori s9, t2, 39 + .word 0x6273dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#else + slli s6, t6, 50 + srli s5, t6, 14 + slli s7, t6, 46 + or s5, s5, s6 + srli s6, t6, 18 + xor s5, s5, s7 + slli s7, t6, 23 + xor s5, s5, s6 + srli s8, t6, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t2, 36 + srli s5, t2, 28 + slli s7, t2, 30 + or s5, s5, s6 + srli s6, t2, 34 + xor s5, s5, s7 + slli s7, t2, 25 + xor s5, s5, s6 + srli s9, t2, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 64(t0) + ld a5, 64(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t5, 14 + .word 0x60ef5a93 + # rori s6, t5, 18 + .word 0x612f5b13 + # rori s8, t5, 41 + .word 0x629f5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t1, 28 + .word 0x61c35a93 + # rori s6, t1, 34 + .word 0x62235b13 + # rori s9, t1, 39 + .word 0x62735c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#else + slli s6, t5, 50 + srli s5, t5, 14 + slli s7, t5, 46 + or s5, s5, s6 + srli s6, t5, 18 + xor s5, s5, s7 + slli s7, t5, 23 + xor s5, s5, s6 + srli s8, t5, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t1, 36 + srli s5, t1, 28 + slli s7, t1, 30 + or s5, s5, s6 + srli s6, t1, 34 + xor s5, s5, s7 + slli s7, t1, 25 + xor s5, s5, s6 + srli s9, t1, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t1, t2 + xor s7, t6, a3 + xor s6, t2, t3 + and s7, s7, t5 + and s6, s6, s5 + xor s7, s7, a3 + xor s6, s6, t2 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a4, a4, s5 + add s6, s9, s6 + add t4, t4, a4 + add a4, a4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 72(t0) + ld a5, 72(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t4, 14 + .word 0x60eeda93 + # rori s6, t4, 18 + .word 0x612edb13 + # rori s8, t4, 41 + .word 0x629edc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a4, 28 + .word 0x61c75a93 + # rori s6, a4, 34 + .word 0x62275b13 + # rori s9, a4, 39 + .word 0x62775c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#else + slli s6, t4, 50 + srli s5, t4, 14 + slli s7, t4, 46 + or s5, s5, s6 + srli s6, t4, 18 + xor s5, s5, s7 + slli s7, t4, 23 + xor s5, s5, s6 + srli s8, t4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a4, 36 + srli s5, a4, 28 + slli s7, a4, 30 + or s5, s5, s6 + srli s6, a4, 34 + xor s5, s5, s7 + slli s7, a4, 25 + xor s5, s5, s6 + srli s9, a4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a4, t1 + xor s7, t5, t6 + xor s6, t1, t2 + and s7, s7, t4 + and s6, s6, s5 + xor s7, s7, t6 + xor s6, s6, t1 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add a3, a3, s5 + add s6, s9, s6 + add t3, t3, a3 + add a3, a3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 80(t0) + ld a5, 80(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t3, 14 + .word 0x60ee5a93 + # rori s6, t3, 18 + .word 0x612e5b13 + # rori s8, t3, 41 + .word 0x629e5c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, a3, 28 + .word 0x61c6da93 + # rori s6, a3, 34 + .word 0x6226db13 + # rori s9, a3, 39 + .word 0x6276dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#else + slli s6, t3, 50 + srli s5, t3, 14 + slli s7, t3, 46 + or s5, s5, s6 + srli s6, t3, 18 + xor s5, s5, s7 + slli s7, t3, 23 + xor s5, s5, s6 + srli s8, t3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, a3, 36 + srli s5, a3, 28 + slli s7, a3, 30 + or s5, s5, s6 + srli s6, a3, 34 + xor s5, s5, s7 + slli s7, a3, 25 + xor s5, s5, s6 + srli s9, a3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, a3, a4 + xor s7, t4, t5 + xor s6, a4, t1 + and s7, s7, t3 + and s6, s6, s5 + xor s7, s7, t5 + xor s6, s6, a4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t6, t6, s5 + add s6, s9, s6 + add t2, t2, t6 + add t6, t6, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 88(t0) + ld a5, 88(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t2, 14 + .word 0x60e3da93 + # rori s6, t2, 18 + .word 0x6123db13 + # rori s8, t2, 41 + .word 0x6293dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t6, 28 + .word 0x61cfda93 + # rori s6, t6, 34 + .word 0x622fdb13 + # rori s9, t6, 39 + .word 0x627fdc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#else + slli s6, t2, 50 + srli s5, t2, 14 + slli s7, t2, 46 + or s5, s5, s6 + srli s6, t2, 18 + xor s5, s5, s7 + slli s7, t2, 23 + xor s5, s5, s6 + srli s8, t2, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t6, 36 + srli s5, t6, 28 + slli s7, t6, 30 + or s5, s5, s6 + srli s6, t6, 34 + xor s5, s5, s7 + slli s7, t6, 25 + xor s5, s5, s6 + srli s9, t6, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t6, a3 + xor s7, t3, t4 + xor s6, a3, a4 + and s7, s7, t2 + and s6, s6, s5 + xor s7, s7, t4 + xor s6, s6, a3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t5, t5, s5 + add s6, s9, s6 + add t1, t1, t5 + add t5, t5, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 96(t0) + ld a5, 96(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t1, 14 + .word 0x60e35a93 + # rori s6, t1, 18 + .word 0x61235b13 + # rori s8, t1, 41 + .word 0x62935c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t5, 28 + .word 0x61cf5a93 + # rori s6, t5, 34 + .word 0x622f5b13 + # rori s9, t5, 39 + .word 0x627f5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#else + slli s6, t1, 50 + srli s5, t1, 14 + slli s7, t1, 46 + or s5, s5, s6 + srli s6, t1, 18 + xor s5, s5, s7 + slli s7, t1, 23 + xor s5, s5, s6 + srli s8, t1, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t5, 36 + srli s5, t5, 28 + slli s7, t5, 30 + or s5, s5, s6 + srli s6, t5, 34 + xor s5, s5, s7 + slli s7, t5, 25 + xor s5, s5, s6 + srli s9, t5, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t5, t6 + xor s7, t2, t3 + xor s6, t6, a3 + and s7, s7, t1 + and s6, s6, s5 + xor s7, s7, t3 + xor s6, s6, t6 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t4, t4, s5 + add s6, s9, s6 + add a4, a4, t4 + add t4, t4, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 104(t0) + ld a5, 104(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a4, 14 + .word 0x60e75a93 + # rori s6, a4, 18 + .word 0x61275b13 + # rori s8, a4, 41 + .word 0x62975c13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t4, 28 + .word 0x61ceda93 + # rori s6, t4, 34 + .word 0x622edb13 + # rori s9, t4, 39 + .word 0x627edc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#else + slli s6, a4, 50 + srli s5, a4, 14 + slli s7, a4, 46 + or s5, s5, s6 + srli s6, a4, 18 + xor s5, s5, s7 + slli s7, a4, 23 + xor s5, s5, s6 + srli s8, a4, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t4, 36 + srli s5, t4, 28 + slli s7, t4, 30 + or s5, s5, s6 + srli s6, t4, 34 + xor s5, s5, s7 + slli s7, t4, 25 + xor s5, s5, s6 + srli s9, t4, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t4, t5 + xor s7, t1, t2 + xor s6, t5, t6 + and s7, s7, a4 + and s6, s6, s5 + xor s7, s7, t2 + xor s6, s6, t5 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t3, t3, s5 + add s6, s9, s6 + add a3, a3, t3 + add t3, t3, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 112(t0) + ld a5, 112(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, a3, 14 + .word 0x60e6da93 + # rori s6, a3, 18 + .word 0x6126db13 + # rori s8, a3, 41 + .word 0x6296dc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t3, 28 + .word 0x61ce5a93 + # rori s6, t3, 34 + .word 0x622e5b13 + # rori s9, t3, 39 + .word 0x627e5c93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#else + slli s6, a3, 50 + srli s5, a3, 14 + slli s7, a3, 46 + or s5, s5, s6 + srli s6, a3, 18 + xor s5, s5, s7 + slli s7, a3, 23 + xor s5, s5, s6 + srli s8, a3, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t3, 36 + srli s5, t3, 28 + slli s7, t3, 30 + or s5, s5, s6 + srli s6, t3, 34 + xor s5, s5, s7 + slli s7, t3, 25 + xor s5, s5, s6 + srli s9, t3, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t3, t4 + xor s7, a4, t1 + xor s6, t4, t5 + and s7, s7, a3 + and s6, s6, s5 + xor s7, s7, t1 + xor s6, s6, t4 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t2, t2, s5 + add s6, s9, s6 + add t6, t6, t2 + add t2, t2, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + ld s10, 120(t0) + ld a5, 120(sp) +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + # rori s5, t6, 14 + .word 0x60efda93 + # rori s6, t6, 18 + .word 0x612fdb13 + # rori s8, t6, 41 + .word 0x629fdc13 + xor s8, s8, s5 + xor s8, s8, s6 + # rori s5, t2, 28 + .word 0x61c3da93 + # rori s6, t2, 34 + .word 0x6223db13 + # rori s9, t2, 39 + .word 0x6273dc93 + xor s9, s9, s5 + xor s9, s9, s6 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#else + slli s6, t6, 50 + srli s5, t6, 14 + slli s7, t6, 46 + or s5, s5, s6 + srli s6, t6, 18 + xor s5, s5, s7 + slli s7, t6, 23 + xor s5, s5, s6 + srli s8, t6, 41 + xor s5, s5, s7 + xor s8, s8, s5 + slli s6, t2, 36 + srli s5, t2, 28 + slli s7, t2, 30 + or s5, s5, s6 + srli s6, t2, 34 + xor s5, s5, s7 + slli s7, t2, 25 + xor s5, s5, s6 + srli s9, t2, 39 + xor s5, s5, s7 + xor s9, s9, s5 + xor s5, t2, t3 + xor s7, a3, a4 + xor s6, t3, t4 + and s7, s7, t6 + and s6, s6, s5 + xor s7, s7, a4 + xor s6, s6, t3 + add s5, s8, s7 + add s7, s10, a5 + add s5, s5, s7 + add t1, t1, s5 + add s6, s9, s6 + add t5, t5, t1 + add t1, t1, s6 +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + addi t0, t0, -512 + # Add working variables back into digest state + ld s5, 0(a0) + ld a5, 8(a0) + ld a6, 16(a0) + ld a7, 24(a0) + ld s1, 32(a0) + ld s2, 40(a0) + ld s3, 48(a0) + ld s4, 56(a0) + add t1, t1, s5 + add t2, t2, a5 + add t3, t3, a6 + add t4, t4, a7 + add t5, t5, s1 + add t6, t6, s2 + add a3, a3, s3 + add a4, a4, s4 + # Store digest + sd t1, 0(a0) + sd t2, 8(a0) + sd t3, 16(a0) + sd t4, 24(a0) + sd t5, 32(a0) + sd t6, 40(a0) + sd a3, 48(a0) + sd a4, 56(a0) + addi a1, a1, 128 + bnez a2, L_SHA512_transform_riscv_len_begin + ld s1, 136(sp) + ld s2, 144(sp) + ld s3, 152(sp) + ld s4, 160(sp) + ld s5, 168(sp) + ld s6, 176(sp) + ld s7, 184(sp) + ld s8, 192(sp) + ld s9, 200(sp) + ld s10, 208(sp) + ld s11, 216(sp) + addi sp, sp, 224 + ret + .size Transform_Sha512_Len_riscv,.-Transform_Sha512_Len_riscv +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ +#endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm_c.c b/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm_c.c new file mode 100644 index 00000000000..5e65e0d4682 --- /dev/null +++ b/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm_c.c @@ -0,0 +1,5138 @@ +/* riscv-64-sha512-asm + * + * Copyright (C) 2006-2026 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 3 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 + */ + +#include +#include + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha512.rb riscv64 \ + * ../wolfssl/wolfcrypt/src/port/riscv64/riscv-64-sha512-asm.c + */ +#ifdef WOLFSSL_RISCV_ASM +#ifdef WOLFSSL_RISCV_ASM_INLINE +#include + +#if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM +XALIGNED(16) static const word64 L_SHA512_transform_riscv_vector_len_k[] = { + 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, + 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, + 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, + 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, + 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, + 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, + 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, + 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL, + 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL, + 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL, + 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL, + 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL, + 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL, + 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL, + 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL, + 0x06ca6351e003826fUL, 0x142929670a0e6e70UL, + 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL, + 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL, + 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL, + 0x81c2c92e47edaee6UL, 0x92722c851482353bUL, + 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL, + 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL, + 0xd192e819d6ef5218UL, 0xd69906245565a910UL, + 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL, + 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL, + 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL, + 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL, + 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL, + 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL, + 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL, + 0x90befffa23631e28UL, 0xa4506cebde82bde9UL, + 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL, + 0xca273eceea26619cUL, 0xd186b8c721c0c207UL, + 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL, + 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL, + 0x113f9804bef90daeUL, 0x1b710b35131c471bUL, + 0x28db77f523047d84UL, 0x32caab7b40c72493UL, + 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL, + 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL, + 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL, +}; + +void Transform_Sha512_Len_riscv_vector(wc_Sha512* sha512, const byte* data, + word32 len) +{ + const word64* k = L_SHA512_transform_riscv_vector_len_k; + + __asm__ __volatile__ ( + "addi sp, sp, -64\n\t" + " .option arch, +v, +zvkb, +zvknhb\n\t" + /* VLEN == 128: SEW=64, LMUL=2, 4 elements per group */ + "vsetivli zero, 4, e64, m2, ta, ma\n\t" + /* Permute standard digest a..h into {f,e,b,a},{h,g,d,c} order */ + "ld t2, 40(%[sha512])\n\t" + "sd t2, 0(sp)\n\t" + "ld t2, 32(%[sha512])\n\t" + "sd t2, 8(sp)\n\t" + "ld t2, 8(%[sha512])\n\t" + "sd t2, 16(sp)\n\t" + "ld t2, 0(%[sha512])\n\t" + "sd t2, 24(sp)\n\t" + "ld t2, 56(%[sha512])\n\t" + "sd t2, 32(sp)\n\t" + "ld t2, 48(%[sha512])\n\t" + "sd t2, 40(sp)\n\t" + "ld t2, 24(%[sha512])\n\t" + "sd t2, 48(sp)\n\t" + "ld t2, 16(%[sha512])\n\t" + "sd t2, 56(sp)\n\t" + "vl4re64.v v8, (sp)\n\t" + "srli %[len], %[len], 7\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA512_transform_riscv_vector_len_begin_%=:\n\t" + /* Save state to add back after compression */ + "vmv4r.v v28, v8\n\t" + /* Load 16 W into 4 m2 groups of 4 64-bit words */ + "mv t1, %[data]\n\t" + "vl8re64.v v0, (t1)\n\t" + "vrev8.v v0, v0\n\t" + "vrev8.v v2, v2\n\t" + "vrev8.v v4, v4\n\t" + "vrev8.v v6, v6\n\t" + /* Load K (5 x 16 64-bit words) and run rounds */ + "mv t1, %[k]\n\t" + "vl8re64.v v16, (t1)\n\t" + "vadd.vv v14, v0, v16\n\t" + "vmv.x.s t2, v2\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v4\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v0, v12, v6\n\t" + "vadd.vv v14, v2, v18\n\t" + "vmv.x.s t2, v4\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v6\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v2, v12, v0\n\t" + "vadd.vv v14, v4, v20\n\t" + "vmv.x.s t2, v6\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v0\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v4, v12, v2\n\t" + "vadd.vv v14, v6, v22\n\t" + "vmv.x.s t2, v0\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v2\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v6, v12, v4\n\t" + "addi t1, %[k], 128\n\t" + "vl8re64.v v16, (t1)\n\t" + "vadd.vv v14, v0, v16\n\t" + "vmv.x.s t2, v2\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v4\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v0, v12, v6\n\t" + "vadd.vv v14, v2, v18\n\t" + "vmv.x.s t2, v4\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v6\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v2, v12, v0\n\t" + "vadd.vv v14, v4, v20\n\t" + "vmv.x.s t2, v6\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v0\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v4, v12, v2\n\t" + "vadd.vv v14, v6, v22\n\t" + "vmv.x.s t2, v0\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v2\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v6, v12, v4\n\t" + "addi t1, %[k], 256\n\t" + "vl8re64.v v16, (t1)\n\t" + "vadd.vv v14, v0, v16\n\t" + "vmv.x.s t2, v2\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v4\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v0, v12, v6\n\t" + "vadd.vv v14, v2, v18\n\t" + "vmv.x.s t2, v4\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v6\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v2, v12, v0\n\t" + "vadd.vv v14, v4, v20\n\t" + "vmv.x.s t2, v6\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v0\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v4, v12, v2\n\t" + "vadd.vv v14, v6, v22\n\t" + "vmv.x.s t2, v0\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v2\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v6, v12, v4\n\t" + "addi t1, %[k], 384\n\t" + "vl8re64.v v16, (t1)\n\t" + "vadd.vv v14, v0, v16\n\t" + "vmv.x.s t2, v2\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v4\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v0, v12, v6\n\t" + "vadd.vv v14, v2, v18\n\t" + "vmv.x.s t2, v4\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v6\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v2, v12, v0\n\t" + "vadd.vv v14, v4, v20\n\t" + "vmv.x.s t2, v6\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v0\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v4, v12, v2\n\t" + "vadd.vv v14, v6, v22\n\t" + "vmv.x.s t2, v0\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vmv.v.v v12, v2\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vmv.s.x v12, t2\n\t" + "vsha2ms.vv v6, v12, v4\n\t" + "addi t1, %[k], 512\n\t" + "vl8re64.v v16, (t1)\n\t" + "vadd.vv v14, v0, v16\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vadd.vv v14, v2, v18\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vadd.vv v14, v4, v20\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vadd.vv v14, v6, v22\n\t" + "vsha2cl.vv v10, v8, v14\n\t" + "vsha2ch.vv v8, v10, v14\n\t" + "vadd.vv v8, v8, v28\n\t" + "vadd.vv v10, v10, v30\n\t" + "addi %[len], %[len], -1\n\t" + "addi %[data], %[data], 128\n\t" + "bnez %[len], L_SHA512_transform_riscv_vector_len_begin_%=\n\t" + /* Store state back in standard digest order a..h */ + "vs4r.v v8, (sp)\n\t" + "ld t2, 24(sp)\n\t" + "sd t2, 0(%[sha512])\n\t" + "ld t2, 16(sp)\n\t" + "sd t2, 8(%[sha512])\n\t" + "ld t2, 56(sp)\n\t" + "sd t2, 16(%[sha512])\n\t" + "ld t2, 48(sp)\n\t" + "sd t2, 24(%[sha512])\n\t" + "ld t2, 8(sp)\n\t" + "sd t2, 32(%[sha512])\n\t" + "ld t2, 0(sp)\n\t" + "sd t2, 40(%[sha512])\n\t" + "ld t2, 40(sp)\n\t" + "sd t2, 48(%[sha512])\n\t" + "ld t2, 32(sp)\n\t" + "sd t2, 56(%[sha512])\n\t" + "addi sp, sp, 64\n\t" + : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) + : [k] "r" (k) + : "memory", "t1", "t2" +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM + , "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", + "v30", "v31" +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + ); +} + +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) +XALIGNED(16) static const word64 L_SHA512_transform_riscv_crypto_len_k[] = { + 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, + 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, + 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, + 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, + 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, + 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, + 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, + 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL, + 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL, + 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL, + 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL, + 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL, + 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL, + 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL, + 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL, + 0x06ca6351e003826fUL, 0x142929670a0e6e70UL, + 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL, + 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL, + 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL, + 0x81c2c92e47edaee6UL, 0x92722c851482353bUL, + 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL, + 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL, + 0xd192e819d6ef5218UL, 0xd69906245565a910UL, + 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL, + 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL, + 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL, + 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL, + 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL, + 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL, + 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL, + 0x90befffa23631e28UL, 0xa4506cebde82bde9UL, + 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL, + 0xca273eceea26619cUL, 0xd186b8c721c0c207UL, + 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL, + 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL, + 0x113f9804bef90daeUL, 0x1b710b35131c471bUL, + 0x28db77f523047d84UL, 0x32caab7b40c72493UL, + 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL, + 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL, + 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL, +}; + +void Transform_Sha512_Len_riscv_crypto(wc_Sha512* sha512, const byte* data, + word32 len) +{ + const word64* k = L_SHA512_transform_riscv_crypto_len_k; + + __asm__ __volatile__ ( + "addi sp, sp, -128\n\t" + " .option arch, +zknh\n\t" + /* Load digest into working variables */ + "ld t1, 0(%[sha512])\n\t" + "ld t2, 8(%[sha512])\n\t" + "ld t3, 16(%[sha512])\n\t" + "ld t4, 24(%[sha512])\n\t" + "ld t5, 32(%[sha512])\n\t" + "ld t6, 40(%[sha512])\n\t" + "ld a3, 48(%[sha512])\n\t" + "ld a4, 56(%[sha512])\n\t" + "srli %[len], %[len], 5\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA512_transform_riscv_crypto_len_begin_%=:\n\t" + /* Load W into stack buffer, big-endian */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu s8, 4(%[data])\n\t" + "lbu s9, 5(%[data])\n\t" + "lbu s10, 6(%[data])\n\t" + "lbu s5, 7(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "lbu s8, 0(%[data])\n\t" + "lbu s9, 1(%[data])\n\t" + "lbu s10, 2(%[data])\n\t" + "lbu s11, 3(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "or s5, s5, s11\n\t" + "lbu s8, 12(%[data])\n\t" + "lbu s9, 13(%[data])\n\t" + "lbu s10, 14(%[data])\n\t" + "lbu a5, 15(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "lbu s8, 8(%[data])\n\t" + "lbu s9, 9(%[data])\n\t" + "lbu s10, 10(%[data])\n\t" + "lbu s11, 11(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "or a5, a5, s11\n\t" + "lbu s8, 20(%[data])\n\t" + "lbu s9, 21(%[data])\n\t" + "lbu s10, 22(%[data])\n\t" + "lbu a6, 23(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "lbu s8, 16(%[data])\n\t" + "lbu s9, 17(%[data])\n\t" + "lbu s10, 18(%[data])\n\t" + "lbu s11, 19(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "or a6, a6, s11\n\t" + "lbu s8, 28(%[data])\n\t" + "lbu s9, 29(%[data])\n\t" + "lbu s10, 30(%[data])\n\t" + "lbu a7, 31(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "lbu s8, 24(%[data])\n\t" + "lbu s9, 25(%[data])\n\t" + "lbu s10, 26(%[data])\n\t" + "lbu s11, 27(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "or a7, a7, s11\n\t" + "lbu s8, 36(%[data])\n\t" + "lbu s9, 37(%[data])\n\t" + "lbu s10, 38(%[data])\n\t" + "lbu s1, 39(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "lbu s8, 32(%[data])\n\t" + "lbu s9, 33(%[data])\n\t" + "lbu s10, 34(%[data])\n\t" + "lbu s11, 35(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "or s1, s1, s11\n\t" + "lbu s8, 44(%[data])\n\t" + "lbu s9, 45(%[data])\n\t" + "lbu s10, 46(%[data])\n\t" + "lbu s2, 47(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "lbu s8, 40(%[data])\n\t" + "lbu s9, 41(%[data])\n\t" + "lbu s10, 42(%[data])\n\t" + "lbu s11, 43(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "or s2, s2, s11\n\t" + "lbu s8, 52(%[data])\n\t" + "lbu s9, 53(%[data])\n\t" + "lbu s10, 54(%[data])\n\t" + "lbu s3, 55(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "lbu s8, 48(%[data])\n\t" + "lbu s9, 49(%[data])\n\t" + "lbu s10, 50(%[data])\n\t" + "lbu s11, 51(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "or s3, s3, s11\n\t" + "lbu s8, 60(%[data])\n\t" + "lbu s9, 61(%[data])\n\t" + "lbu s10, 62(%[data])\n\t" + "lbu s4, 63(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "lbu s8, 56(%[data])\n\t" + "lbu s9, 57(%[data])\n\t" + "lbu s10, 58(%[data])\n\t" + "lbu s11, 59(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "or s4, s4, s11\n\t" + "sd s5, 0(sp)\n\t" + "sd a5, 8(sp)\n\t" + "sd a6, 16(sp)\n\t" + "sd a7, 24(sp)\n\t" + "sd s1, 32(sp)\n\t" + "sd s2, 40(sp)\n\t" + "sd s3, 48(sp)\n\t" + "sd s4, 56(sp)\n\t" + "lbu s8, 68(%[data])\n\t" + "lbu s9, 69(%[data])\n\t" + "lbu s10, 70(%[data])\n\t" + "lbu s5, 71(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "lbu s8, 64(%[data])\n\t" + "lbu s9, 65(%[data])\n\t" + "lbu s10, 66(%[data])\n\t" + "lbu s11, 67(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "or s5, s5, s11\n\t" + "lbu s8, 76(%[data])\n\t" + "lbu s9, 77(%[data])\n\t" + "lbu s10, 78(%[data])\n\t" + "lbu a5, 79(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "lbu s8, 72(%[data])\n\t" + "lbu s9, 73(%[data])\n\t" + "lbu s10, 74(%[data])\n\t" + "lbu s11, 75(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "or a5, a5, s11\n\t" + "lbu s8, 84(%[data])\n\t" + "lbu s9, 85(%[data])\n\t" + "lbu s10, 86(%[data])\n\t" + "lbu a6, 87(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "lbu s8, 80(%[data])\n\t" + "lbu s9, 81(%[data])\n\t" + "lbu s10, 82(%[data])\n\t" + "lbu s11, 83(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "or a6, a6, s11\n\t" + "lbu s8, 92(%[data])\n\t" + "lbu s9, 93(%[data])\n\t" + "lbu s10, 94(%[data])\n\t" + "lbu a7, 95(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "lbu s8, 88(%[data])\n\t" + "lbu s9, 89(%[data])\n\t" + "lbu s10, 90(%[data])\n\t" + "lbu s11, 91(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "or a7, a7, s11\n\t" + "lbu s8, 100(%[data])\n\t" + "lbu s9, 101(%[data])\n\t" + "lbu s10, 102(%[data])\n\t" + "lbu s1, 103(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "lbu s8, 96(%[data])\n\t" + "lbu s9, 97(%[data])\n\t" + "lbu s10, 98(%[data])\n\t" + "lbu s11, 99(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "or s1, s1, s11\n\t" + "lbu s8, 108(%[data])\n\t" + "lbu s9, 109(%[data])\n\t" + "lbu s10, 110(%[data])\n\t" + "lbu s2, 111(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "lbu s8, 104(%[data])\n\t" + "lbu s9, 105(%[data])\n\t" + "lbu s10, 106(%[data])\n\t" + "lbu s11, 107(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "or s2, s2, s11\n\t" + "lbu s8, 116(%[data])\n\t" + "lbu s9, 117(%[data])\n\t" + "lbu s10, 118(%[data])\n\t" + "lbu s3, 119(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "lbu s8, 112(%[data])\n\t" + "lbu s9, 113(%[data])\n\t" + "lbu s10, 114(%[data])\n\t" + "lbu s11, 115(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "or s3, s3, s11\n\t" + "lbu s8, 124(%[data])\n\t" + "lbu s9, 125(%[data])\n\t" + "lbu s10, 126(%[data])\n\t" + "lbu s4, 127(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "lbu s8, 120(%[data])\n\t" + "lbu s9, 121(%[data])\n\t" + "lbu s10, 122(%[data])\n\t" + "lbu s11, 123(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "or s4, s4, s11\n\t" + "sd s5, 64(sp)\n\t" + "sd a5, 72(sp)\n\t" + "sd a6, 80(sp)\n\t" + "sd a7, 88(sp)\n\t" + "sd s1, 96(sp)\n\t" + "sd s2, 104(sp)\n\t" + "sd s3, 112(sp)\n\t" + "sd s4, 120(sp)\n\t" +#else + "ld s5, 0(%[data])\n\t" + /* rev8 s5, s5 */ + ".word 0x6b8ada93\n\t" + "ld a5, 8(%[data])\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + "ld a6, 16(%[data])\n\t" + /* rev8 a6, a6 */ + ".word 0x6b885813\n\t" + "ld a7, 24(%[data])\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + "ld s1, 32(%[data])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "ld s2, 40(%[data])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + "ld s3, 48(%[data])\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + "ld s4, 56(%[data])\n\t" + /* rev8 s4, s4 */ + ".word 0x6b8a5a13\n\t" + "sd s5, 0(sp)\n\t" + "sd a5, 8(sp)\n\t" + "sd a6, 16(sp)\n\t" + "sd a7, 24(sp)\n\t" + "sd s1, 32(sp)\n\t" + "sd s2, 40(sp)\n\t" + "sd s3, 48(sp)\n\t" + "sd s4, 56(sp)\n\t" + "ld s5, 64(%[data])\n\t" + /* rev8 s5, s5 */ + ".word 0x6b8ada93\n\t" + "ld a5, 72(%[data])\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + "ld a6, 80(%[data])\n\t" + /* rev8 a6, a6 */ + ".word 0x6b885813\n\t" + "ld a7, 88(%[data])\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + "ld s1, 96(%[data])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "ld s2, 104(%[data])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + "ld s3, 112(%[data])\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + "ld s4, 120(%[data])\n\t" + /* rev8 s4, s4 */ + ".word 0x6b8a5a13\n\t" + "sd s5, 64(sp)\n\t" + "sd a5, 72(sp)\n\t" + "sd a6, 80(sp)\n\t" + "sd a7, 88(sp)\n\t" + "sd s1, 96(sp)\n\t" + "sd s2, 104(sp)\n\t" + "sd s3, 112(sp)\n\t" + "sd s4, 120(sp)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "\n" + "L_SHA512_transform_riscv_crypto_len_inner_%=:\n\t" + /* Reload W[0], W[14], W[15] for message schedule */ + "ld a5, 0(sp)\n\t" + "ld s1, 112(sp)\n\t" + "ld s2, 120(sp)\n\t" + "addi %[len], %[len], -1\n\t" + "ld s10, 0(%[k])\n\t" + "ld s11, 8(%[k])\n\t" + "mv s8, t5\n\t" + "mv s9, t1\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" + "ld a6, 8(sp)\n\t" + "ld a7, 72(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, t4\n\t" + "mv s9, a4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 16(sp)\n\t" + "ld a7, 80(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 0(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 8(sp)\n\t" + "ld s10, 16(%[k])\n\t" + "ld s11, 24(%[k])\n\t" + "mv s8, t3\n\t" + "mv s9, a3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" + "ld a6, 24(sp)\n\t" + "ld a7, 88(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, t2\n\t" + "mv s9, t6\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 32(sp)\n\t" + "ld a7, 96(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 16(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 24(sp)\n\t" + "ld s10, 32(%[k])\n\t" + "ld s11, 40(%[k])\n\t" + "mv s8, t1\n\t" + "mv s9, t5\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" + "ld a6, 40(sp)\n\t" + "ld a7, 104(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, a4\n\t" + "mv s9, t4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 48(sp)\n\t" + "ld a7, 112(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 32(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 40(sp)\n\t" + "ld s10, 48(%[k])\n\t" + "ld s11, 56(%[k])\n\t" + "mv s8, a3\n\t" + "mv s9, t3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" + "ld a6, 56(sp)\n\t" + "ld a7, 120(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, t6\n\t" + "mv s9, t2\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 64(sp)\n\t" + "ld a7, 0(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 48(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 56(sp)\n\t" + "ld s10, 64(%[k])\n\t" + "ld s11, 72(%[k])\n\t" + "mv s8, t5\n\t" + "mv s9, t1\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" + "ld a6, 72(sp)\n\t" + "ld a7, 8(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, t4\n\t" + "mv s9, a4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 80(sp)\n\t" + "ld a7, 16(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 64(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 72(sp)\n\t" + "ld s10, 80(%[k])\n\t" + "ld s11, 88(%[k])\n\t" + "mv s8, t3\n\t" + "mv s9, a3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" + "ld a6, 88(sp)\n\t" + "ld a7, 24(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, t2\n\t" + "mv s9, t6\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 96(sp)\n\t" + "ld a7, 32(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 80(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 88(sp)\n\t" + "ld s10, 96(%[k])\n\t" + "ld s11, 104(%[k])\n\t" + "mv s8, t1\n\t" + "mv s9, t5\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" + "ld a6, 104(sp)\n\t" + "ld a7, 40(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, a4\n\t" + "mv s9, t4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 112(sp)\n\t" + "ld a7, 48(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 96(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 104(sp)\n\t" + "ld s10, 112(%[k])\n\t" + "ld s11, 120(%[k])\n\t" + "mv s8, a3\n\t" + "mv s9, t3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" + "ld a6, 120(sp)\n\t" + "ld a7, 56(sp)\n\t" + "sha512sig0 s8, a6\n\t" + "sha512sig1 s9, s1\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" + "mv s8, t6\n\t" + "mv s9, t2\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" + "mv s1, a5\n\t" + "ld a5, 0(sp)\n\t" + "ld a7, 64(sp)\n\t" + "sha512sig0 s8, a5\n\t" + "sha512sig1 s9, s2\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" + "sd s1, 112(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 120(sp)\n\t" + "andi s8, %[len], 3\n\t" + "addi %[k], %[k], 128\n\t" + "bnez s8, L_SHA512_transform_riscv_crypto_len_inner_%=\n\t" + "ld s10, 0(%[k])\n\t" + "ld a5, 0(sp)\n\t" + "mv s8, t5\n\t" + "mv s9, t1\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" + "ld s10, 8(%[k])\n\t" + "ld a5, 8(sp)\n\t" + "mv s8, t4\n\t" + "mv s9, a4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" + "ld s10, 16(%[k])\n\t" + "ld a5, 16(sp)\n\t" + "mv s8, t3\n\t" + "mv s9, a3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" + "ld s10, 24(%[k])\n\t" + "ld a5, 24(sp)\n\t" + "mv s8, t2\n\t" + "mv s9, t6\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" + "ld s10, 32(%[k])\n\t" + "ld a5, 32(sp)\n\t" + "mv s8, t1\n\t" + "mv s9, t5\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" + "ld s10, 40(%[k])\n\t" + "ld a5, 40(sp)\n\t" + "mv s8, a4\n\t" + "mv s9, t4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" + "ld s10, 48(%[k])\n\t" + "ld a5, 48(sp)\n\t" + "mv s8, a3\n\t" + "mv s9, t3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" + "ld s10, 56(%[k])\n\t" + "ld a5, 56(sp)\n\t" + "mv s8, t6\n\t" + "mv s9, t2\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" + "ld s10, 64(%[k])\n\t" + "ld a5, 64(sp)\n\t" + "mv s8, t5\n\t" + "mv s9, t1\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" + "ld s10, 72(%[k])\n\t" + "ld a5, 72(sp)\n\t" + "mv s8, t4\n\t" + "mv s9, a4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" + "ld s10, 80(%[k])\n\t" + "ld a5, 80(sp)\n\t" + "mv s8, t3\n\t" + "mv s9, a3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" + "ld s10, 88(%[k])\n\t" + "ld a5, 88(sp)\n\t" + "mv s8, t2\n\t" + "mv s9, t6\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" + "ld s10, 96(%[k])\n\t" + "ld a5, 96(sp)\n\t" + "mv s8, t1\n\t" + "mv s9, t5\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" + "ld s10, 104(%[k])\n\t" + "ld a5, 104(sp)\n\t" + "mv s8, a4\n\t" + "mv s9, t4\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" + "ld s10, 112(%[k])\n\t" + "ld a5, 112(sp)\n\t" + "mv s8, a3\n\t" + "mv s9, t3\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" + "ld s10, 120(%[k])\n\t" + "ld a5, 120(sp)\n\t" + "mv s8, t6\n\t" + "mv s9, t2\n\t" + "sha512sum1 s8, s8\n\t" + "sha512sum0 s9, s9\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" + "addi %[k], %[k], -512\n\t" + /* Add working variables back into digest state */ + "ld s5, 0(%[sha512])\n\t" + "ld a5, 8(%[sha512])\n\t" + "ld a6, 16(%[sha512])\n\t" + "ld a7, 24(%[sha512])\n\t" + "ld s1, 32(%[sha512])\n\t" + "ld s2, 40(%[sha512])\n\t" + "ld s3, 48(%[sha512])\n\t" + "ld s4, 56(%[sha512])\n\t" + "add t1, t1, s5\n\t" + "add t2, t2, a5\n\t" + "add t3, t3, a6\n\t" + "add t4, t4, a7\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s2\n\t" + "add a3, a3, s3\n\t" + "add a4, a4, s4\n\t" + /* Store digest */ + "sd t1, 0(%[sha512])\n\t" + "sd t2, 8(%[sha512])\n\t" + "sd t3, 16(%[sha512])\n\t" + "sd t4, 24(%[sha512])\n\t" + "sd t5, 32(%[sha512])\n\t" + "sd t6, 40(%[sha512])\n\t" + "sd a3, 48(%[sha512])\n\t" + "sd a4, 56(%[sha512])\n\t" + "addi %[data], %[data], 128\n\t" + "bnez %[len], L_SHA512_transform_riscv_crypto_len_begin_%=\n\t" + "addi sp, sp, 128\n\t" + : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) + : [k] "r" (k) + : "memory", "t1", "t2", "t3", "t4", "t5", "t6", "a3", "a4", "a5", "a6", + "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", + "s11" + ); +} + +#else +XALIGNED(16) static const word64 L_SHA512_transform_riscv_len_k[] = { + 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, + 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, + 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, + 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, + 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, + 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, + 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, + 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL, + 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL, + 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL, + 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL, + 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL, + 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL, + 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL, + 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL, + 0x06ca6351e003826fUL, 0x142929670a0e6e70UL, + 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL, + 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL, + 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL, + 0x81c2c92e47edaee6UL, 0x92722c851482353bUL, + 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL, + 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL, + 0xd192e819d6ef5218UL, 0xd69906245565a910UL, + 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL, + 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL, + 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL, + 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL, + 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL, + 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL, + 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL, + 0x90befffa23631e28UL, 0xa4506cebde82bde9UL, + 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL, + 0xca273eceea26619cUL, 0xd186b8c721c0c207UL, + 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL, + 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL, + 0x113f9804bef90daeUL, 0x1b710b35131c471bUL, + 0x28db77f523047d84UL, 0x32caab7b40c72493UL, + 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL, + 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL, + 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL, +}; + +void Transform_Sha512_Len_riscv(wc_Sha512* sha512, const byte* data, word32 len) +{ + const word64* k = L_SHA512_transform_riscv_len_k; + + __asm__ __volatile__ ( + "addi sp, sp, -128\n\t" + /* Load digest into working variables */ + "ld t1, 0(%[sha512])\n\t" + "ld t2, 8(%[sha512])\n\t" + "ld t3, 16(%[sha512])\n\t" + "ld t4, 24(%[sha512])\n\t" + "ld t5, 32(%[sha512])\n\t" + "ld t6, 40(%[sha512])\n\t" + "ld a3, 48(%[sha512])\n\t" + "ld a4, 56(%[sha512])\n\t" + "srli %[len], %[len], 5\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA512_transform_riscv_len_begin_%=:\n\t" + /* Load W into stack buffer, big-endian */ +#if !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || \ + defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) + "lbu s8, 4(%[data])\n\t" + "lbu s9, 5(%[data])\n\t" + "lbu s10, 6(%[data])\n\t" + "lbu s5, 7(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "lbu s8, 0(%[data])\n\t" + "lbu s9, 1(%[data])\n\t" + "lbu s10, 2(%[data])\n\t" + "lbu s11, 3(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "or s5, s5, s11\n\t" + "lbu s8, 12(%[data])\n\t" + "lbu s9, 13(%[data])\n\t" + "lbu s10, 14(%[data])\n\t" + "lbu a5, 15(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "lbu s8, 8(%[data])\n\t" + "lbu s9, 9(%[data])\n\t" + "lbu s10, 10(%[data])\n\t" + "lbu s11, 11(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "or a5, a5, s11\n\t" + "lbu s8, 20(%[data])\n\t" + "lbu s9, 21(%[data])\n\t" + "lbu s10, 22(%[data])\n\t" + "lbu a6, 23(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "lbu s8, 16(%[data])\n\t" + "lbu s9, 17(%[data])\n\t" + "lbu s10, 18(%[data])\n\t" + "lbu s11, 19(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "or a6, a6, s11\n\t" + "lbu s8, 28(%[data])\n\t" + "lbu s9, 29(%[data])\n\t" + "lbu s10, 30(%[data])\n\t" + "lbu a7, 31(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "lbu s8, 24(%[data])\n\t" + "lbu s9, 25(%[data])\n\t" + "lbu s10, 26(%[data])\n\t" + "lbu s11, 27(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "or a7, a7, s11\n\t" + "lbu s8, 36(%[data])\n\t" + "lbu s9, 37(%[data])\n\t" + "lbu s10, 38(%[data])\n\t" + "lbu s1, 39(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "lbu s8, 32(%[data])\n\t" + "lbu s9, 33(%[data])\n\t" + "lbu s10, 34(%[data])\n\t" + "lbu s11, 35(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "or s1, s1, s11\n\t" + "lbu s8, 44(%[data])\n\t" + "lbu s9, 45(%[data])\n\t" + "lbu s10, 46(%[data])\n\t" + "lbu s2, 47(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "lbu s8, 40(%[data])\n\t" + "lbu s9, 41(%[data])\n\t" + "lbu s10, 42(%[data])\n\t" + "lbu s11, 43(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "or s2, s2, s11\n\t" + "lbu s8, 52(%[data])\n\t" + "lbu s9, 53(%[data])\n\t" + "lbu s10, 54(%[data])\n\t" + "lbu s3, 55(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "lbu s8, 48(%[data])\n\t" + "lbu s9, 49(%[data])\n\t" + "lbu s10, 50(%[data])\n\t" + "lbu s11, 51(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "or s3, s3, s11\n\t" + "lbu s8, 60(%[data])\n\t" + "lbu s9, 61(%[data])\n\t" + "lbu s10, 62(%[data])\n\t" + "lbu s4, 63(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "lbu s8, 56(%[data])\n\t" + "lbu s9, 57(%[data])\n\t" + "lbu s10, 58(%[data])\n\t" + "lbu s11, 59(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "or s4, s4, s11\n\t" + "sd s5, 0(sp)\n\t" + "sd a5, 8(sp)\n\t" + "sd a6, 16(sp)\n\t" + "sd a7, 24(sp)\n\t" + "sd s1, 32(sp)\n\t" + "sd s2, 40(sp)\n\t" + "sd s3, 48(sp)\n\t" + "sd s4, 56(sp)\n\t" + "lbu s8, 68(%[data])\n\t" + "lbu s9, 69(%[data])\n\t" + "lbu s10, 70(%[data])\n\t" + "lbu s5, 71(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "lbu s8, 64(%[data])\n\t" + "lbu s9, 65(%[data])\n\t" + "lbu s10, 66(%[data])\n\t" + "lbu s11, 67(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s5, s5, s8\n\t" + "or s5, s5, s9\n\t" + "or s5, s5, s10\n\t" + "or s5, s5, s11\n\t" + "lbu s8, 76(%[data])\n\t" + "lbu s9, 77(%[data])\n\t" + "lbu s10, 78(%[data])\n\t" + "lbu a5, 79(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "lbu s8, 72(%[data])\n\t" + "lbu s9, 73(%[data])\n\t" + "lbu s10, 74(%[data])\n\t" + "lbu s11, 75(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a5, a5, s8\n\t" + "or a5, a5, s9\n\t" + "or a5, a5, s10\n\t" + "or a5, a5, s11\n\t" + "lbu s8, 84(%[data])\n\t" + "lbu s9, 85(%[data])\n\t" + "lbu s10, 86(%[data])\n\t" + "lbu a6, 87(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "lbu s8, 80(%[data])\n\t" + "lbu s9, 81(%[data])\n\t" + "lbu s10, 82(%[data])\n\t" + "lbu s11, 83(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a6, a6, s8\n\t" + "or a6, a6, s9\n\t" + "or a6, a6, s10\n\t" + "or a6, a6, s11\n\t" + "lbu s8, 92(%[data])\n\t" + "lbu s9, 93(%[data])\n\t" + "lbu s10, 94(%[data])\n\t" + "lbu a7, 95(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "lbu s8, 88(%[data])\n\t" + "lbu s9, 89(%[data])\n\t" + "lbu s10, 90(%[data])\n\t" + "lbu s11, 91(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or a7, a7, s8\n\t" + "or a7, a7, s9\n\t" + "or a7, a7, s10\n\t" + "or a7, a7, s11\n\t" + "lbu s8, 100(%[data])\n\t" + "lbu s9, 101(%[data])\n\t" + "lbu s10, 102(%[data])\n\t" + "lbu s1, 103(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "lbu s8, 96(%[data])\n\t" + "lbu s9, 97(%[data])\n\t" + "lbu s10, 98(%[data])\n\t" + "lbu s11, 99(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s1, s1, s8\n\t" + "or s1, s1, s9\n\t" + "or s1, s1, s10\n\t" + "or s1, s1, s11\n\t" + "lbu s8, 108(%[data])\n\t" + "lbu s9, 109(%[data])\n\t" + "lbu s10, 110(%[data])\n\t" + "lbu s2, 111(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "lbu s8, 104(%[data])\n\t" + "lbu s9, 105(%[data])\n\t" + "lbu s10, 106(%[data])\n\t" + "lbu s11, 107(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s2, s2, s8\n\t" + "or s2, s2, s9\n\t" + "or s2, s2, s10\n\t" + "or s2, s2, s11\n\t" + "lbu s8, 116(%[data])\n\t" + "lbu s9, 117(%[data])\n\t" + "lbu s10, 118(%[data])\n\t" + "lbu s3, 119(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "lbu s8, 112(%[data])\n\t" + "lbu s9, 113(%[data])\n\t" + "lbu s10, 114(%[data])\n\t" + "lbu s11, 115(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s3, s3, s8\n\t" + "or s3, s3, s9\n\t" + "or s3, s3, s10\n\t" + "or s3, s3, s11\n\t" + "lbu s8, 124(%[data])\n\t" + "lbu s9, 125(%[data])\n\t" + "lbu s10, 126(%[data])\n\t" + "lbu s4, 127(%[data])\n\t" + "slli s8, s8, 24\n\t" + "slli s9, s9, 16\n\t" + "slli s10, s10, 8\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "lbu s8, 120(%[data])\n\t" + "lbu s9, 121(%[data])\n\t" + "lbu s10, 122(%[data])\n\t" + "lbu s11, 123(%[data])\n\t" + "slli s8, s8, 56\n\t" + "slli s9, s9, 48\n\t" + "slli s10, s10, 40\n\t" + "slli s11, s11, 32\n\t" + "or s4, s4, s8\n\t" + "or s4, s4, s9\n\t" + "or s4, s4, s10\n\t" + "or s4, s4, s11\n\t" + "sd s5, 64(sp)\n\t" + "sd a5, 72(sp)\n\t" + "sd a6, 80(sp)\n\t" + "sd a7, 88(sp)\n\t" + "sd s1, 96(sp)\n\t" + "sd s2, 104(sp)\n\t" + "sd s3, 112(sp)\n\t" + "sd s4, 120(sp)\n\t" +#else + "ld s5, 0(%[data])\n\t" + /* rev8 s5, s5 */ + ".word 0x6b8ada93\n\t" + "ld a5, 8(%[data])\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + "ld a6, 16(%[data])\n\t" + /* rev8 a6, a6 */ + ".word 0x6b885813\n\t" + "ld a7, 24(%[data])\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + "ld s1, 32(%[data])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "ld s2, 40(%[data])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + "ld s3, 48(%[data])\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + "ld s4, 56(%[data])\n\t" + /* rev8 s4, s4 */ + ".word 0x6b8a5a13\n\t" + "sd s5, 0(sp)\n\t" + "sd a5, 8(sp)\n\t" + "sd a6, 16(sp)\n\t" + "sd a7, 24(sp)\n\t" + "sd s1, 32(sp)\n\t" + "sd s2, 40(sp)\n\t" + "sd s3, 48(sp)\n\t" + "sd s4, 56(sp)\n\t" + "ld s5, 64(%[data])\n\t" + /* rev8 s5, s5 */ + ".word 0x6b8ada93\n\t" + "ld a5, 72(%[data])\n\t" + /* rev8 a5, a5 */ + ".word 0x6b87d793\n\t" + "ld a6, 80(%[data])\n\t" + /* rev8 a6, a6 */ + ".word 0x6b885813\n\t" + "ld a7, 88(%[data])\n\t" + /* rev8 a7, a7 */ + ".word 0x6b88d893\n\t" + "ld s1, 96(%[data])\n\t" + /* rev8 s1, s1 */ + ".word 0x6b84d493\n\t" + "ld s2, 104(%[data])\n\t" + /* rev8 s2, s2 */ + ".word 0x6b895913\n\t" + "ld s3, 112(%[data])\n\t" + /* rev8 s3, s3 */ + ".word 0x6b89d993\n\t" + "ld s4, 120(%[data])\n\t" + /* rev8 s4, s4 */ + ".word 0x6b8a5a13\n\t" + "sd s5, 64(sp)\n\t" + "sd a5, 72(sp)\n\t" + "sd a6, 80(sp)\n\t" + "sd a7, 88(sp)\n\t" + "sd s1, 96(sp)\n\t" + "sd s2, 104(sp)\n\t" + "sd s3, 112(sp)\n\t" + "sd s4, 120(sp)\n\t" +#endif /* !defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) || + * defined(WOLFSSL_RISCV_ASM_NO_UNALIGNED) */ + "\n" + "L_SHA512_transform_riscv_len_inner_%=:\n\t" + /* Reload W[0], W[14], W[15] for message schedule */ + "ld a5, 0(sp)\n\t" + "ld s1, 112(sp)\n\t" + "ld s2, 120(sp)\n\t" + "addi %[len], %[len], -1\n\t" + "ld s10, 0(%[k])\n\t" + "ld s11, 8(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t5, 14 */ + ".word 0x60ef5a93\n\t" + /* rori s6, t5, 18 */ + ".word 0x612f5b13\n\t" + /* rori s8, t5, 41 */ + ".word 0x629f5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t1, 28 */ + ".word 0x61c35a93\n\t" + /* rori s6, t1, 34 */ + ".word 0x62235b13\n\t" + /* rori s9, t1, 39 */ + ".word 0x62735c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#else + "slli s6, t5, 50\n\t" + "srli s5, t5, 14\n\t" + "slli s7, t5, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t5, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t1, 36\n\t" + "srli s5, t1, 28\n\t" + "slli s7, t1, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t1, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 8(sp)\n\t" + "ld a7, 72(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t4, 14 */ + ".word 0x60eeda93\n\t" + /* rori s6, t4, 18 */ + ".word 0x612edb13\n\t" + /* rori s8, t4, 41 */ + ".word 0x629edc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a4, 28 */ + ".word 0x61c75a93\n\t" + /* rori s6, a4, 34 */ + ".word 0x62275b13\n\t" + /* rori s9, a4, 39 */ + ".word 0x62775c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#else + "slli s6, t4, 50\n\t" + "srli s5, t4, 14\n\t" + "slli s7, t4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a4, 36\n\t" + "srli s5, a4, 28\n\t" + "slli s7, a4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 16(sp)\n\t" + "ld a7, 80(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 0(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 8(sp)\n\t" + "ld s10, 16(%[k])\n\t" + "ld s11, 24(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t3, 14 */ + ".word 0x60ee5a93\n\t" + /* rori s6, t3, 18 */ + ".word 0x612e5b13\n\t" + /* rori s8, t3, 41 */ + ".word 0x629e5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a3, 28 */ + ".word 0x61c6da93\n\t" + /* rori s6, a3, 34 */ + ".word 0x6226db13\n\t" + /* rori s9, a3, 39 */ + ".word 0x6276dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#else + "slli s6, t3, 50\n\t" + "srli s5, t3, 14\n\t" + "slli s7, t3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a3, 36\n\t" + "srli s5, a3, 28\n\t" + "slli s7, a3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 24(sp)\n\t" + "ld a7, 88(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t2, 14 */ + ".word 0x60e3da93\n\t" + /* rori s6, t2, 18 */ + ".word 0x6123db13\n\t" + /* rori s8, t2, 41 */ + ".word 0x6293dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t6, 28 */ + ".word 0x61cfda93\n\t" + /* rori s6, t6, 34 */ + ".word 0x622fdb13\n\t" + /* rori s9, t6, 39 */ + ".word 0x627fdc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#else + "slli s6, t2, 50\n\t" + "srli s5, t2, 14\n\t" + "slli s7, t2, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t2, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t6, 36\n\t" + "srli s5, t6, 28\n\t" + "slli s7, t6, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t6, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 32(sp)\n\t" + "ld a7, 96(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 16(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 24(sp)\n\t" + "ld s10, 32(%[k])\n\t" + "ld s11, 40(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t1, 14 */ + ".word 0x60e35a93\n\t" + /* rori s6, t1, 18 */ + ".word 0x61235b13\n\t" + /* rori s8, t1, 41 */ + ".word 0x62935c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t5, 28 */ + ".word 0x61cf5a93\n\t" + /* rori s6, t5, 34 */ + ".word 0x622f5b13\n\t" + /* rori s9, t5, 39 */ + ".word 0x627f5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#else + "slli s6, t1, 50\n\t" + "srli s5, t1, 14\n\t" + "slli s7, t1, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t1, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t5, 36\n\t" + "srli s5, t5, 28\n\t" + "slli s7, t5, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t5, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 40(sp)\n\t" + "ld a7, 104(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a4, 14 */ + ".word 0x60e75a93\n\t" + /* rori s6, a4, 18 */ + ".word 0x61275b13\n\t" + /* rori s8, a4, 41 */ + ".word 0x62975c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t4, 28 */ + ".word 0x61ceda93\n\t" + /* rori s6, t4, 34 */ + ".word 0x622edb13\n\t" + /* rori s9, t4, 39 */ + ".word 0x627edc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#else + "slli s6, a4, 50\n\t" + "srli s5, a4, 14\n\t" + "slli s7, a4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t4, 36\n\t" + "srli s5, t4, 28\n\t" + "slli s7, t4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 48(sp)\n\t" + "ld a7, 112(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 32(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 40(sp)\n\t" + "ld s10, 48(%[k])\n\t" + "ld s11, 56(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a3, 14 */ + ".word 0x60e6da93\n\t" + /* rori s6, a3, 18 */ + ".word 0x6126db13\n\t" + /* rori s8, a3, 41 */ + ".word 0x6296dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t3, 28 */ + ".word 0x61ce5a93\n\t" + /* rori s6, t3, 34 */ + ".word 0x622e5b13\n\t" + /* rori s9, t3, 39 */ + ".word 0x627e5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#else + "slli s6, a3, 50\n\t" + "srli s5, a3, 14\n\t" + "slli s7, a3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t3, 36\n\t" + "srli s5, t3, 28\n\t" + "slli s7, t3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 56(sp)\n\t" + "ld a7, 120(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t6, 14 */ + ".word 0x60efda93\n\t" + /* rori s6, t6, 18 */ + ".word 0x612fdb13\n\t" + /* rori s8, t6, 41 */ + ".word 0x629fdc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t2, 28 */ + ".word 0x61c3da93\n\t" + /* rori s6, t2, 34 */ + ".word 0x6223db13\n\t" + /* rori s9, t2, 39 */ + ".word 0x6273dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#else + "slli s6, t6, 50\n\t" + "srli s5, t6, 14\n\t" + "slli s7, t6, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t6, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t2, 36\n\t" + "srli s5, t2, 28\n\t" + "slli s7, t2, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t2, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 64(sp)\n\t" + "ld a7, 0(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 48(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 56(sp)\n\t" + "ld s10, 64(%[k])\n\t" + "ld s11, 72(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t5, 14 */ + ".word 0x60ef5a93\n\t" + /* rori s6, t5, 18 */ + ".word 0x612f5b13\n\t" + /* rori s8, t5, 41 */ + ".word 0x629f5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t1, 28 */ + ".word 0x61c35a93\n\t" + /* rori s6, t1, 34 */ + ".word 0x62235b13\n\t" + /* rori s9, t1, 39 */ + ".word 0x62735c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#else + "slli s6, t5, 50\n\t" + "srli s5, t5, 14\n\t" + "slli s7, t5, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t5, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t1, 36\n\t" + "srli s5, t1, 28\n\t" + "slli s7, t1, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t1, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 72(sp)\n\t" + "ld a7, 8(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t4, 14 */ + ".word 0x60eeda93\n\t" + /* rori s6, t4, 18 */ + ".word 0x612edb13\n\t" + /* rori s8, t4, 41 */ + ".word 0x629edc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a4, 28 */ + ".word 0x61c75a93\n\t" + /* rori s6, a4, 34 */ + ".word 0x62275b13\n\t" + /* rori s9, a4, 39 */ + ".word 0x62775c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#else + "slli s6, t4, 50\n\t" + "srli s5, t4, 14\n\t" + "slli s7, t4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a4, 36\n\t" + "srli s5, a4, 28\n\t" + "slli s7, a4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 80(sp)\n\t" + "ld a7, 16(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 64(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 72(sp)\n\t" + "ld s10, 80(%[k])\n\t" + "ld s11, 88(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t3, 14 */ + ".word 0x60ee5a93\n\t" + /* rori s6, t3, 18 */ + ".word 0x612e5b13\n\t" + /* rori s8, t3, 41 */ + ".word 0x629e5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a3, 28 */ + ".word 0x61c6da93\n\t" + /* rori s6, a3, 34 */ + ".word 0x6226db13\n\t" + /* rori s9, a3, 39 */ + ".word 0x6276dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#else + "slli s6, t3, 50\n\t" + "srli s5, t3, 14\n\t" + "slli s7, t3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a3, 36\n\t" + "srli s5, a3, 28\n\t" + "slli s7, a3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 88(sp)\n\t" + "ld a7, 24(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t2, 14 */ + ".word 0x60e3da93\n\t" + /* rori s6, t2, 18 */ + ".word 0x6123db13\n\t" + /* rori s8, t2, 41 */ + ".word 0x6293dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t6, 28 */ + ".word 0x61cfda93\n\t" + /* rori s6, t6, 34 */ + ".word 0x622fdb13\n\t" + /* rori s9, t6, 39 */ + ".word 0x627fdc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#else + "slli s6, t2, 50\n\t" + "srli s5, t2, 14\n\t" + "slli s7, t2, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t2, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t6, 36\n\t" + "srli s5, t6, 28\n\t" + "slli s7, t6, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t6, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 96(sp)\n\t" + "ld a7, 32(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 80(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 88(sp)\n\t" + "ld s10, 96(%[k])\n\t" + "ld s11, 104(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t1, 14 */ + ".word 0x60e35a93\n\t" + /* rori s6, t1, 18 */ + ".word 0x61235b13\n\t" + /* rori s8, t1, 41 */ + ".word 0x62935c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t5, 28 */ + ".word 0x61cf5a93\n\t" + /* rori s6, t5, 34 */ + ".word 0x622f5b13\n\t" + /* rori s9, t5, 39 */ + ".word 0x627f5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#else + "slli s6, t1, 50\n\t" + "srli s5, t1, 14\n\t" + "slli s7, t1, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t1, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t5, 36\n\t" + "srli s5, t5, 28\n\t" + "slli s7, t5, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t5, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 104(sp)\n\t" + "ld a7, 40(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a4, 14 */ + ".word 0x60e75a93\n\t" + /* rori s6, a4, 18 */ + ".word 0x61275b13\n\t" + /* rori s8, a4, 41 */ + ".word 0x62975c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t4, 28 */ + ".word 0x61ceda93\n\t" + /* rori s6, t4, 34 */ + ".word 0x622edb13\n\t" + /* rori s9, t4, 39 */ + ".word 0x627edc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#else + "slli s6, a4, 50\n\t" + "srli s5, a4, 14\n\t" + "slli s7, a4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t4, 36\n\t" + "srli s5, t4, 28\n\t" + "slli s7, t4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 112(sp)\n\t" + "ld a7, 48(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 96(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 104(sp)\n\t" + "ld s10, 112(%[k])\n\t" + "ld s11, 120(%[k])\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a3, 14 */ + ".word 0x60e6da93\n\t" + /* rori s6, a3, 18 */ + ".word 0x6126db13\n\t" + /* rori s8, a3, 41 */ + ".word 0x6296dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t3, 28 */ + ".word 0x61ce5a93\n\t" + /* rori s6, t3, 34 */ + ".word 0x622e5b13\n\t" + /* rori s9, t3, 39 */ + ".word 0x627e5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#else + "slli s6, a3, 50\n\t" + "srli s5, a3, 14\n\t" + "slli s7, a3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t3, 36\n\t" + "srli s5, t3, 28\n\t" + "slli s7, t3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld a6, 120(sp)\n\t" + "ld a7, 56(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a6, 1 */ + ".word 0x60185a93\n\t" + /* rori s6, a6, 8 */ + ".word 0x60885b13\n\t" + "srli s8, a6, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s1, 19 */ + ".word 0x6134da93\n\t" + /* rori s6, s1, 61 */ + ".word 0x63d4db13\n\t" + "srli s9, s1, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#else + "slli s6, a6, 63\n\t" + "srli s7, a6, 1\n\t" + "slli s5, a6, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a6, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a6, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s1, 45\n\t" + "srli s7, s1, 19\n\t" + "slli s5, s1, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s1, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s1, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a5, a5, s8\n\t" + "add a5, s9, a5\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t6, 14 */ + ".word 0x60efda93\n\t" + /* rori s6, t6, 18 */ + ".word 0x612fdb13\n\t" + /* rori s8, t6, 41 */ + ".word 0x629fdc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t2, 28 */ + ".word 0x61c3da93\n\t" + /* rori s6, t2, 34 */ + ".word 0x6223db13\n\t" + /* rori s9, t2, 39 */ + ".word 0x6273dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#else + "slli s6, t6, 50\n\t" + "srli s5, t6, 14\n\t" + "slli s7, t6, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t6, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t2, 36\n\t" + "srli s5, t2, 28\n\t" + "slli s7, t2, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t2, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s11, a6\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "mv s1, a5\n\t" + "ld a5, 0(sp)\n\t" + "ld a7, 64(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a5, 1 */ + ".word 0x6017da93\n\t" + /* rori s6, a5, 8 */ + ".word 0x6087db13\n\t" + "srli s8, a5, 7\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, s2, 19 */ + ".word 0x61395a93\n\t" + /* rori s6, s2, 61 */ + ".word 0x63d95b13\n\t" + "srli s9, s2, 6\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#else + "slli s6, a5, 63\n\t" + "srli s7, a5, 1\n\t" + "slli s5, a5, 56\n\t" + "or s7, s7, s6\n\t" + "srli s6, a5, 8\n\t" + "xor s7, s7, s5\n\t" + "srli s8, a5, 7\n\t" + "xor s7, s7, s6\n\t" + "xor s8, s8, s7\n\t" + "slli s6, s2, 45\n\t" + "srli s7, s2, 19\n\t" + "slli s5, s2, 3\n\t" + "or s7, s7, s6\n\t" + "srli s6, s2, 61\n\t" + "xor s7, s7, s5\n\t" + "srli s9, s2, 6\n\t" + "xor s7, s7, s6\n\t" + "xor s9, s9, s7\n\t" + "add s9, s9, a7\n\t" + "add a6, a6, s8\n\t" + "add a6, s9, a6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "sd s1, 112(sp)\n\t" + "mv s2, a6\n\t" + "sd a6, 120(sp)\n\t" + "andi s8, %[len], 3\n\t" + "addi %[k], %[k], 128\n\t" + "bnez s8, L_SHA512_transform_riscv_len_inner_%=\n\t" + "ld s10, 0(%[k])\n\t" + "ld a5, 0(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t5, 14 */ + ".word 0x60ef5a93\n\t" + /* rori s6, t5, 18 */ + ".word 0x612f5b13\n\t" + /* rori s8, t5, 41 */ + ".word 0x629f5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t1, 28 */ + ".word 0x61c35a93\n\t" + /* rori s6, t1, 34 */ + ".word 0x62235b13\n\t" + /* rori s9, t1, 39 */ + ".word 0x62735c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#else + "slli s6, t5, 50\n\t" + "srli s5, t5, 14\n\t" + "slli s7, t5, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t5, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t1, 36\n\t" + "srli s5, t1, 28\n\t" + "slli s7, t1, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t1, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 8(%[k])\n\t" + "ld a5, 8(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t4, 14 */ + ".word 0x60eeda93\n\t" + /* rori s6, t4, 18 */ + ".word 0x612edb13\n\t" + /* rori s8, t4, 41 */ + ".word 0x629edc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a4, 28 */ + ".word 0x61c75a93\n\t" + /* rori s6, a4, 34 */ + ".word 0x62275b13\n\t" + /* rori s9, a4, 39 */ + ".word 0x62775c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#else + "slli s6, t4, 50\n\t" + "srli s5, t4, 14\n\t" + "slli s7, t4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a4, 36\n\t" + "srli s5, a4, 28\n\t" + "slli s7, a4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 16(%[k])\n\t" + "ld a5, 16(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t3, 14 */ + ".word 0x60ee5a93\n\t" + /* rori s6, t3, 18 */ + ".word 0x612e5b13\n\t" + /* rori s8, t3, 41 */ + ".word 0x629e5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a3, 28 */ + ".word 0x61c6da93\n\t" + /* rori s6, a3, 34 */ + ".word 0x6226db13\n\t" + /* rori s9, a3, 39 */ + ".word 0x6276dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#else + "slli s6, t3, 50\n\t" + "srli s5, t3, 14\n\t" + "slli s7, t3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a3, 36\n\t" + "srli s5, a3, 28\n\t" + "slli s7, a3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 24(%[k])\n\t" + "ld a5, 24(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t2, 14 */ + ".word 0x60e3da93\n\t" + /* rori s6, t2, 18 */ + ".word 0x6123db13\n\t" + /* rori s8, t2, 41 */ + ".word 0x6293dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t6, 28 */ + ".word 0x61cfda93\n\t" + /* rori s6, t6, 34 */ + ".word 0x622fdb13\n\t" + /* rori s9, t6, 39 */ + ".word 0x627fdc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#else + "slli s6, t2, 50\n\t" + "srli s5, t2, 14\n\t" + "slli s7, t2, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t2, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t6, 36\n\t" + "srli s5, t6, 28\n\t" + "slli s7, t6, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t6, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 32(%[k])\n\t" + "ld a5, 32(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t1, 14 */ + ".word 0x60e35a93\n\t" + /* rori s6, t1, 18 */ + ".word 0x61235b13\n\t" + /* rori s8, t1, 41 */ + ".word 0x62935c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t5, 28 */ + ".word 0x61cf5a93\n\t" + /* rori s6, t5, 34 */ + ".word 0x622f5b13\n\t" + /* rori s9, t5, 39 */ + ".word 0x627f5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#else + "slli s6, t1, 50\n\t" + "srli s5, t1, 14\n\t" + "slli s7, t1, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t1, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t5, 36\n\t" + "srli s5, t5, 28\n\t" + "slli s7, t5, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t5, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 40(%[k])\n\t" + "ld a5, 40(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a4, 14 */ + ".word 0x60e75a93\n\t" + /* rori s6, a4, 18 */ + ".word 0x61275b13\n\t" + /* rori s8, a4, 41 */ + ".word 0x62975c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t4, 28 */ + ".word 0x61ceda93\n\t" + /* rori s6, t4, 34 */ + ".word 0x622edb13\n\t" + /* rori s9, t4, 39 */ + ".word 0x627edc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#else + "slli s6, a4, 50\n\t" + "srli s5, a4, 14\n\t" + "slli s7, a4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t4, 36\n\t" + "srli s5, t4, 28\n\t" + "slli s7, t4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 48(%[k])\n\t" + "ld a5, 48(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a3, 14 */ + ".word 0x60e6da93\n\t" + /* rori s6, a3, 18 */ + ".word 0x6126db13\n\t" + /* rori s8, a3, 41 */ + ".word 0x6296dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t3, 28 */ + ".word 0x61ce5a93\n\t" + /* rori s6, t3, 34 */ + ".word 0x622e5b13\n\t" + /* rori s9, t3, 39 */ + ".word 0x627e5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#else + "slli s6, a3, 50\n\t" + "srli s5, a3, 14\n\t" + "slli s7, a3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t3, 36\n\t" + "srli s5, t3, 28\n\t" + "slli s7, t3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 56(%[k])\n\t" + "ld a5, 56(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t6, 14 */ + ".word 0x60efda93\n\t" + /* rori s6, t6, 18 */ + ".word 0x612fdb13\n\t" + /* rori s8, t6, 41 */ + ".word 0x629fdc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t2, 28 */ + ".word 0x61c3da93\n\t" + /* rori s6, t2, 34 */ + ".word 0x6223db13\n\t" + /* rori s9, t2, 39 */ + ".word 0x6273dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#else + "slli s6, t6, 50\n\t" + "srli s5, t6, 14\n\t" + "slli s7, t6, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t6, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t2, 36\n\t" + "srli s5, t2, 28\n\t" + "slli s7, t2, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t2, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 64(%[k])\n\t" + "ld a5, 64(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t5, 14 */ + ".word 0x60ef5a93\n\t" + /* rori s6, t5, 18 */ + ".word 0x612f5b13\n\t" + /* rori s8, t5, 41 */ + ".word 0x629f5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t1, 28 */ + ".word 0x61c35a93\n\t" + /* rori s6, t1, 34 */ + ".word 0x62235b13\n\t" + /* rori s9, t1, 39 */ + ".word 0x62735c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#else + "slli s6, t5, 50\n\t" + "srli s5, t5, 14\n\t" + "slli s7, t5, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t5, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t1, 36\n\t" + "srli s5, t1, 28\n\t" + "slli s7, t1, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t1, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t1, t2\n\t" + "xor s7, t6, a3\n\t" + "xor s6, t2, t3\n\t" + "and s7, s7, t5\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a3\n\t" + "xor s6, s6, t2\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a4, a4, s5\n\t" + "add s6, s9, s6\n\t" + "add t4, t4, a4\n\t" + "add a4, a4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 72(%[k])\n\t" + "ld a5, 72(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t4, 14 */ + ".word 0x60eeda93\n\t" + /* rori s6, t4, 18 */ + ".word 0x612edb13\n\t" + /* rori s8, t4, 41 */ + ".word 0x629edc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a4, 28 */ + ".word 0x61c75a93\n\t" + /* rori s6, a4, 34 */ + ".word 0x62275b13\n\t" + /* rori s9, a4, 39 */ + ".word 0x62775c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#else + "slli s6, t4, 50\n\t" + "srli s5, t4, 14\n\t" + "slli s7, t4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a4, 36\n\t" + "srli s5, a4, 28\n\t" + "slli s7, a4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a4, t1\n\t" + "xor s7, t5, t6\n\t" + "xor s6, t1, t2\n\t" + "and s7, s7, t4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t6\n\t" + "xor s6, s6, t1\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add a3, a3, s5\n\t" + "add s6, s9, s6\n\t" + "add t3, t3, a3\n\t" + "add a3, a3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 80(%[k])\n\t" + "ld a5, 80(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t3, 14 */ + ".word 0x60ee5a93\n\t" + /* rori s6, t3, 18 */ + ".word 0x612e5b13\n\t" + /* rori s8, t3, 41 */ + ".word 0x629e5c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, a3, 28 */ + ".word 0x61c6da93\n\t" + /* rori s6, a3, 34 */ + ".word 0x6226db13\n\t" + /* rori s9, a3, 39 */ + ".word 0x6276dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#else + "slli s6, t3, 50\n\t" + "srli s5, t3, 14\n\t" + "slli s7, t3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, a3, 36\n\t" + "srli s5, a3, 28\n\t" + "slli s7, a3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, a3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, a3, a4\n\t" + "xor s7, t4, t5\n\t" + "xor s6, a4, t1\n\t" + "and s7, s7, t3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t5\n\t" + "xor s6, s6, a4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t6, t6, s5\n\t" + "add s6, s9, s6\n\t" + "add t2, t2, t6\n\t" + "add t6, t6, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 88(%[k])\n\t" + "ld a5, 88(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t2, 14 */ + ".word 0x60e3da93\n\t" + /* rori s6, t2, 18 */ + ".word 0x6123db13\n\t" + /* rori s8, t2, 41 */ + ".word 0x6293dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t6, 28 */ + ".word 0x61cfda93\n\t" + /* rori s6, t6, 34 */ + ".word 0x622fdb13\n\t" + /* rori s9, t6, 39 */ + ".word 0x627fdc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#else + "slli s6, t2, 50\n\t" + "srli s5, t2, 14\n\t" + "slli s7, t2, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t2, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t6, 36\n\t" + "srli s5, t6, 28\n\t" + "slli s7, t6, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t6, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t6, a3\n\t" + "xor s7, t3, t4\n\t" + "xor s6, a3, a4\n\t" + "and s7, s7, t2\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t4\n\t" + "xor s6, s6, a3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t5, t5, s5\n\t" + "add s6, s9, s6\n\t" + "add t1, t1, t5\n\t" + "add t5, t5, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 96(%[k])\n\t" + "ld a5, 96(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t1, 14 */ + ".word 0x60e35a93\n\t" + /* rori s6, t1, 18 */ + ".word 0x61235b13\n\t" + /* rori s8, t1, 41 */ + ".word 0x62935c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t5, 28 */ + ".word 0x61cf5a93\n\t" + /* rori s6, t5, 34 */ + ".word 0x622f5b13\n\t" + /* rori s9, t5, 39 */ + ".word 0x627f5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#else + "slli s6, t1, 50\n\t" + "srli s5, t1, 14\n\t" + "slli s7, t1, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t1, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t1, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t1, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t5, 36\n\t" + "srli s5, t5, 28\n\t" + "slli s7, t5, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t5, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t5, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t5, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t5, t6\n\t" + "xor s7, t2, t3\n\t" + "xor s6, t6, a3\n\t" + "and s7, s7, t1\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t3\n\t" + "xor s6, s6, t6\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t4, t4, s5\n\t" + "add s6, s9, s6\n\t" + "add a4, a4, t4\n\t" + "add t4, t4, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 104(%[k])\n\t" + "ld a5, 104(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a4, 14 */ + ".word 0x60e75a93\n\t" + /* rori s6, a4, 18 */ + ".word 0x61275b13\n\t" + /* rori s8, a4, 41 */ + ".word 0x62975c13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t4, 28 */ + ".word 0x61ceda93\n\t" + /* rori s6, t4, 34 */ + ".word 0x622edb13\n\t" + /* rori s9, t4, 39 */ + ".word 0x627edc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#else + "slli s6, a4, 50\n\t" + "srli s5, a4, 14\n\t" + "slli s7, a4, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a4, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a4, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a4, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t4, 36\n\t" + "srli s5, t4, 28\n\t" + "slli s7, t4, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t4, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t4, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t4, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t4, t5\n\t" + "xor s7, t1, t2\n\t" + "xor s6, t5, t6\n\t" + "and s7, s7, a4\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t2\n\t" + "xor s6, s6, t5\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t3, t3, s5\n\t" + "add s6, s9, s6\n\t" + "add a3, a3, t3\n\t" + "add t3, t3, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 112(%[k])\n\t" + "ld a5, 112(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, a3, 14 */ + ".word 0x60e6da93\n\t" + /* rori s6, a3, 18 */ + ".word 0x6126db13\n\t" + /* rori s8, a3, 41 */ + ".word 0x6296dc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t3, 28 */ + ".word 0x61ce5a93\n\t" + /* rori s6, t3, 34 */ + ".word 0x622e5b13\n\t" + /* rori s9, t3, 39 */ + ".word 0x627e5c93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#else + "slli s6, a3, 50\n\t" + "srli s5, a3, 14\n\t" + "slli s7, a3, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, a3, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, a3, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, a3, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t3, 36\n\t" + "srli s5, t3, 28\n\t" + "slli s7, t3, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t3, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t3, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t3, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t3, t4\n\t" + "xor s7, a4, t1\n\t" + "xor s6, t4, t5\n\t" + "and s7, s7, a3\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, t1\n\t" + "xor s6, s6, t4\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t2, t2, s5\n\t" + "add s6, s9, s6\n\t" + "add t6, t6, t2\n\t" + "add t2, t2, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "ld s10, 120(%[k])\n\t" + "ld a5, 120(sp)\n\t" +#if defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) + /* rori s5, t6, 14 */ + ".word 0x60efda93\n\t" + /* rori s6, t6, 18 */ + ".word 0x612fdb13\n\t" + /* rori s8, t6, 41 */ + ".word 0x629fdc13\n\t" + "xor s8, s8, s5\n\t" + "xor s8, s8, s6\n\t" + /* rori s5, t2, 28 */ + ".word 0x61c3da93\n\t" + /* rori s6, t2, 34 */ + ".word 0x6223db13\n\t" + /* rori s9, t2, 39 */ + ".word 0x6273dc93\n\t" + "xor s9, s9, s5\n\t" + "xor s9, s9, s6\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#else + "slli s6, t6, 50\n\t" + "srli s5, t6, 14\n\t" + "slli s7, t6, 46\n\t" + "or s5, s5, s6\n\t" + "srli s6, t6, 18\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t6, 23\n\t" + "xor s5, s5, s6\n\t" + "srli s8, t6, 41\n\t" + "xor s5, s5, s7\n\t" + "xor s8, s8, s5\n\t" + "slli s6, t2, 36\n\t" + "srli s5, t2, 28\n\t" + "slli s7, t2, 30\n\t" + "or s5, s5, s6\n\t" + "srli s6, t2, 34\n\t" + "xor s5, s5, s7\n\t" + "slli s7, t2, 25\n\t" + "xor s5, s5, s6\n\t" + "srli s9, t2, 39\n\t" + "xor s5, s5, s7\n\t" + "xor s9, s9, s5\n\t" + "xor s5, t2, t3\n\t" + "xor s7, a3, a4\n\t" + "xor s6, t3, t4\n\t" + "and s7, s7, t6\n\t" + "and s6, s6, s5\n\t" + "xor s7, s7, a4\n\t" + "xor s6, s6, t3\n\t" + "add s5, s8, s7\n\t" + "add s7, s10, a5\n\t" + "add s5, s5, s7\n\t" + "add t1, t1, s5\n\t" + "add s6, s9, s6\n\t" + "add t5, t5, t1\n\t" + "add t1, t1, s6\n\t" +#endif /* defined(WOLFSSL_RISCV_BASE_BIT_MANIPULATION) */ + "addi %[k], %[k], -512\n\t" + /* Add working variables back into digest state */ + "ld s5, 0(%[sha512])\n\t" + "ld a5, 8(%[sha512])\n\t" + "ld a6, 16(%[sha512])\n\t" + "ld a7, 24(%[sha512])\n\t" + "ld s1, 32(%[sha512])\n\t" + "ld s2, 40(%[sha512])\n\t" + "ld s3, 48(%[sha512])\n\t" + "ld s4, 56(%[sha512])\n\t" + "add t1, t1, s5\n\t" + "add t2, t2, a5\n\t" + "add t3, t3, a6\n\t" + "add t4, t4, a7\n\t" + "add t5, t5, s1\n\t" + "add t6, t6, s2\n\t" + "add a3, a3, s3\n\t" + "add a4, a4, s4\n\t" + /* Store digest */ + "sd t1, 0(%[sha512])\n\t" + "sd t2, 8(%[sha512])\n\t" + "sd t3, 16(%[sha512])\n\t" + "sd t4, 24(%[sha512])\n\t" + "sd t5, 32(%[sha512])\n\t" + "sd t6, 40(%[sha512])\n\t" + "sd a3, 48(%[sha512])\n\t" + "sd a4, 56(%[sha512])\n\t" + "addi %[data], %[data], 128\n\t" + "bnez %[len], L_SHA512_transform_riscv_len_begin_%=\n\t" + "addi sp, sp, 128\n\t" + : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) + : [k] "r" (k) + : "memory", "t1", "t2", "t3", "t4", "t5", "t6", "a3", "a4", "a5", "a6", + "a7", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", + "s11" + ); +} + +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ +#endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */ +#endif /* WOLFSSL_RISCV_ASM_INLINE */ +#endif /* WOLFSSL_RISCV_ASM */ diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 2a2b30d617a..4c3d4fd2ebb 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -60,7 +60,7 @@ on the specific device platform. #endif -#if !defined(NO_SHA256) && !defined(WOLFSSL_RISCV_ASM) +#if !defined(NO_SHA256) #if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ @@ -130,6 +130,7 @@ on the specific device platform. defined(WOLFSSL_PPC32_ASM) || \ defined(WOLFSSL_PPC64_ASM) || \ defined(WOLFSSL_ARMASM) || \ + defined(WOLFSSL_RISCV_ASM) || \ (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))) #error "WOLF_CRYPTO_CB_ONLY_SHA256 is incompatible with SHA-256 hardware" \ @@ -249,6 +250,8 @@ on the specific device platform. #define SHA256_UPDATE_REV_BYTES(ctx) 0 #elif defined(WOLFSSL_ARMASM) #define SHA256_UPDATE_REV_BYTES(ctx) 0 +#elif defined(WOLFSSL_RISCV_ASM) + #define SHA256_UPDATE_REV_BYTES(ctx) 0 #else #define SHA256_UPDATE_REV_BYTES(ctx) SHA256_REV_BYTES(ctx) #endif @@ -1392,6 +1395,60 @@ static WC_INLINE int Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, #define XTRANSFORM Transform_Sha256 #define XTRANSFORM_LEN Transform_Sha256_Len +#elif defined(WOLFSSL_RISCV_ASM) && !defined(WOLF_CRYPTO_CB_ONLY_SHA256) + +int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId) +{ + int ret = 0; + + if (sha256 == NULL) + return BAD_FUNC_ARG; + ret = InitSha256(sha256); + if (ret != 0) + return ret; + + sha256->heap = heap; +#ifdef WOLF_CRYPTO_CB + sha256->devId = devId; + sha256->devCtx = NULL; +#else + (void)devId; +#endif + +#ifdef WOLFSSL_SMALL_STACK_CACHE + sha256->W = NULL; +#endif + + return ret; +} + +static WC_INLINE int Transform_Sha256(wc_Sha256* sha256, const byte* data) +{ +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) + Transform_Sha256_Len_riscv_vector(sha256, data, WC_SHA256_BLOCK_SIZE); +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + Transform_Sha256_Len_riscv_crypto(sha256, data, WC_SHA256_BLOCK_SIZE); +#else + Transform_Sha256_Len_riscv(sha256, data, WC_SHA256_BLOCK_SIZE); +#endif + return 0; +} + +static WC_INLINE int Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, + word32 len) +{ +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) + Transform_Sha256_Len_riscv_vector(sha256, data, len); +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + Transform_Sha256_Len_riscv_crypto(sha256, data, len); +#else + Transform_Sha256_Len_riscv(sha256, data, len); +#endif + return 0; +} +#define XTRANSFORM Transform_Sha256 +#define XTRANSFORM_LEN Transform_Sha256_Len + #elif defined(WOLF_CRYPTO_CB_ONLY_SHA256) /* Software SHA-256 stripped; every op dispatches via cryptocb. */ int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId) @@ -1987,7 +2044,8 @@ static WC_INLINE int Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, 2 * sizeof(word32)); } #endif - #if defined(WOLFSSL_ARMASM) && !defined(FREESCALE_MMCAU_SHA) + #if (defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM)) && \ + !defined(FREESCALE_MMCAU_SHA) ByteReverseWords( &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)], &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)], 2 * sizeof(word32)); @@ -2107,7 +2165,7 @@ static WC_INLINE int Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, return BAD_FUNC_ARG; } - #ifdef WOLFSSL_ARMASM + #if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) #ifdef __aarch64__ if (Transform_Sha256_Len_p == Transform_Sha256_Len) { return Transform_Sha256(sha256, data); diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index dbd3b41edec..311ff37e436 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -64,8 +64,7 @@ " acceleration backends" #endif -#if (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) && \ - !defined(WOLFSSL_RISCV_ASM) +#if (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) /* determine if we are using Espressif SHA hardware acceleration */ #undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW @@ -188,6 +187,7 @@ defined(PSOC6_HASH_SHA2) || \ defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) || \ defined(WOLFSSL_ARMASM) || \ + defined(WOLFSSL_RISCV_ASM) || \ (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) #error "WOLF_CRYPTO_CB_ONLY_SHA512 is incompatible with SHA-512 hardware" \ @@ -1655,6 +1655,32 @@ static WC_INLINE int Transform_Sha512(wc_Sha512* sha512, const byte* data) #define Sha512_SetTransform() WC_DO_NOTHING +#elif defined(WOLFSSL_RISCV_ASM) + +static WC_INLINE int Transform_Sha512(wc_Sha512* sha512, const byte* data) +{ +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) + Transform_Sha512_Len_riscv_vector(sha512, data, WC_SHA512_BLOCK_SIZE); +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + Transform_Sha512_Len_riscv_crypto(sha512, data, WC_SHA512_BLOCK_SIZE); +#else + Transform_Sha512_Len_riscv(sha512, data, WC_SHA512_BLOCK_SIZE); +#endif + return 0; +} +static WC_INLINE int Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, + word32 len) +{ +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) + Transform_Sha512_Len_riscv_vector(sha512, data, len); +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + Transform_Sha512_Len_riscv_crypto(sha512, data, len); +#else + Transform_Sha512_Len_riscv(sha512, data, len); +#endif + return 0; +} + #else #define Transform_Sha512(sha512) _Transform_Sha512(sha512) @@ -1775,7 +1801,8 @@ int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId) #endif /* WOLFSSL_SHA512 */ #if (!defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PPC64_ASM) && \ - !defined(WOLFSSL_PPC32_ASM)) || defined(NEED_SOFT_SHA512) + !defined(WOLFSSL_PPC32_ASM) && !defined(WOLFSSL_RISCV_ASM)) || \ + defined(NEED_SOFT_SHA512) static const word64 K512[80] = { W64LIT(0x428a2f98d728ae22), W64LIT(0x7137449123ef65cd), @@ -1961,14 +1988,15 @@ static WC_INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, word32 le #if (!defined(WOLFSSL_ESP32_CRYPT) || \ defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \ - !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PPC64_ASM) + !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PPC64_ASM) && \ + !defined(WOLFSSL_RISCV_ASM) ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_BLOCK_SIZE); #endif } #endif #if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_PPC64_ASM) || \ - defined(WOLFSSL_PPC32_ASM) + defined(WOLFSSL_PPC32_ASM) || defined(WOLFSSL_RISCV_ASM) ret = Transform_Sha512(sha512, (const byte*)sha512->buffer); #elif !defined(WOLFSSL_ESP32_CRYPT) || \ defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ @@ -1994,7 +2022,8 @@ static WC_INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, word32 le } } -#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_PPC64_ASM) || defined(WOLFSSL_PPC32_ASM) +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_PPC64_ASM) || \ + defined(WOLFSSL_PPC32_ASM) || defined(WOLFSSL_RISCV_ASM) if (len >= WC_SHA512_BLOCK_SIZE) { word32 blocksLen = len & ~((word32)WC_SHA512_BLOCK_SIZE-1); @@ -2203,7 +2232,8 @@ static WC_INLINE int Sha512Final(wc_Sha512* sha512) #if (!defined(WOLFSSL_ESP32_CRYPT) || \ defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \ - !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PPC64_ASM) + !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PPC64_ASM) && \ + !defined(WOLFSSL_RISCV_ASM) ByteReverseWords64(sha512->buffer,sha512->buffer, WC_SHA512_BLOCK_SIZE); #endif @@ -2211,7 +2241,7 @@ static WC_INLINE int Sha512Final(wc_Sha512* sha512) #endif /* LITTLE_ENDIAN_ORDER */ #if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_PPC64_ASM) || \ - defined(WOLFSSL_PPC32_ASM) + defined(WOLFSSL_PPC32_ASM) || defined(WOLFSSL_RISCV_ASM) ret = Transform_Sha512(sha512, (const byte*)sha512->buffer); if (ret != 0) return ret; @@ -2260,7 +2290,8 @@ static WC_INLINE int Sha512Final(wc_Sha512* sha512) #if (!defined(WOLFSSL_ESP32_CRYPT) || \ defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \ - !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PPC64_ASM) + !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PPC64_ASM) && \ + !defined(WOLFSSL_RISCV_ASM) ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_PAD_SIZE); #endif #endif @@ -2285,7 +2316,7 @@ static WC_INLINE int Sha512Final(wc_Sha512* sha512) &(sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2]), WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE); } -#elif defined(WOLFSSL_ARMASM) +#elif defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) #define SHA512_PAD_LEN_64 (WC_SHA512_PAD_SIZE / sizeof(word64)) { ByteReverseWords64(&(sha512->buffer[SHA512_PAD_LEN_64]), @@ -2306,7 +2337,7 @@ static WC_INLINE int Sha512Final(wc_Sha512* sha512) #endif #if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_PPC64_ASM) || \ - defined(WOLFSSL_PPC32_ASM) + defined(WOLFSSL_PPC32_ASM) || defined(WOLFSSL_RISCV_ASM) ret = Transform_Sha512(sha512, (const byte*)sha512->buffer); if (ret != 0) return ret; @@ -2571,7 +2602,7 @@ int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data) } #endif /* LITTLE_ENDIAN_ORDER */ -#if defined(WOLFSSL_ARMASM) +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) ByteReverseWords64(buffer, (word64*)data, WC_SHA512_BLOCK_SIZE); Transform_Sha512(sha, (const byte*)buffer); ret = 0; diff --git a/wolfssl/wolfcrypt/aes.h b/wolfssl/wolfcrypt/aes.h index 8d21f44a7e4..51986b4ba54 100644 --- a/wolfssl/wolfcrypt/aes.h +++ b/wolfssl/wolfcrypt/aes.h @@ -42,6 +42,7 @@ block cipher mechanism that uses n-bit binary string parameter key with 128-bits #endif #if !defined(NO_AES) || defined(WOLFSSL_SM4) + typedef struct Gcm { ALIGN16 byte H[16]; #ifdef OPENSSL_EXTRA @@ -1134,6 +1135,84 @@ WOLFSSL_LOCAL void AES_XTS_decrypt_AARCH32(const byte* in, byte* out, #endif /* !__aarch64__ && !WOLFSSL_ARMASM_NO_HW_CRYPTO */ #endif /* WOLFSSL_ARMASM */ +#if defined(WOLFSSL_RISCV_ASM) +/* Block cipher and key schedule - all RISC-V paths (vector/scalar/base). */ +WOLFSSL_LOCAL void AES_set_key_RISCV64(const byte* userKey, int keylen, + byte* key, int dir); +WOLFSSL_LOCAL void AES_encrypt_RISCV64(const byte* in, byte* out, byte* key, + int nr); +#ifdef HAVE_AES_DECRYPT +WOLFSSL_LOCAL void AES_decrypt_RISCV64(const byte* in, byte* out, byte* key, + int nr); +#endif + +#ifdef HAVE_AES_ECB +WOLFSSL_LOCAL void AES_encrypt_blocks_RISCV64(const byte* in, byte* out, + word32 sz, byte* key, int nr); +WOLFSSL_LOCAL void AES_decrypt_blocks_RISCV64(const byte* in, byte* out, + word32 sz, byte* key, int nr); +#endif +#ifdef HAVE_AES_CBC +WOLFSSL_LOCAL void AES_CBC_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + byte* reg, byte* key, int nr); +WOLFSSL_LOCAL void AES_CBC_decrypt_RISCV64(const byte* in, byte* out, word32 sz, + byte* reg, byte* key, int nr); +#endif +#ifdef WOLFSSL_AES_COUNTER +WOLFSSL_LOCAL void AES_CTR_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + byte* reg, byte* key, byte* tmp, word32* left, int nr); +#endif +#ifdef WOLFSSL_AES_XTS +WOLFSSL_LOCAL void AES_XTS_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr); +WOLFSSL_LOCAL void AES_XTS_decrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* i, byte* key, byte* key2, byte* tmp, int nr); +#endif + +#ifdef HAVE_AESGCM +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) || \ + defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) +WOLFSSL_LOCAL void AES_GCM_set_key_RISCV64(const byte* nonce, byte* key, + byte* gcm_h, int nr); +#endif +WOLFSSL_LOCAL void AES_GCM_encrypt_RISCV64(const byte* in, byte* out, word32 sz, + const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, const byte* aad, + word32 aadSz, byte* key, byte* gcm_h, byte* tmp, byte* reg, int nr); +WOLFSSL_LOCAL int AES_GCM_decrypt_RISCV64(byte* in, byte* out, word32 sz, + const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, + const byte* aad, word32 aadSz, byte* key, byte* gcm_h, byte* tmp, byte* reg, + int nr); +#if defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) +WOLFSSL_LOCAL void GHASH_RISCV64(byte* x, byte* h, const byte* in, + word32 blocks); +#endif +#if defined(WOLFSSL_AESGCM_STREAM) +WOLFSSL_LOCAL void AES_GCM_init_RISCV64(const byte* key, int nr, + const byte* nonce, word32 nonceSz, byte* gcm_h, byte* counter, + byte* initCtr); +WOLFSSL_LOCAL void AES_GCM_ghash_block_RISCV64(const byte* data, byte* tag, + byte* gcm_h); +WOLFSSL_LOCAL void AES_GCM_aad_update_RISCV64(const byte* addt, word32 abytes, + byte* tag, byte* h); +WOLFSSL_LOCAL void AES_GCM_encrypt_block_RISCV64(const byte* key, int nr, + byte* out, const byte* in, byte* counter); +WOLFSSL_LOCAL void AES_GCM_encrypt_update_RISCV64(const byte* key, int nr, + byte* out, const byte* in, word32 nbytes, byte* tag, byte* h, + byte* counter); +WOLFSSL_LOCAL void AES_GCM_encrypt_final_RISCV64(byte* tag, byte* authTag, + word32 tbytes, word32 nbytes, word32 abytes, byte* h, byte* initCtr); +#ifdef HAVE_AES_DECRYPT +WOLFSSL_LOCAL void AES_GCM_decrypt_update_RISCV64(const byte* key, int nr, + byte* out, const byte* in, word32 nbytes, byte* tag, byte* h, + byte* counter); +WOLFSSL_LOCAL void AES_GCM_decrypt_final_RISCV64(byte* tag, const byte* authTag, + word32 tbytes, word32 nbytes, word32 abytes, byte* h, byte* initCtr, + int* res); +#endif +#endif /* WOLFSSL_AESGCM_STREAM */ +#endif /* HAVE_AESGCM */ +#endif /* WOLFSSL_RISCV_ASM */ + #if defined(WOLFSSL_PPC64_ASM) WOLFSSL_LOCAL void AES_set_encrypt_key(const unsigned char* key, word32 len, unsigned char* ks); diff --git a/wolfssl/wolfcrypt/chacha.h b/wolfssl/wolfcrypt/chacha.h index a2467ba1f9b..b7b15e7dff5 100644 --- a/wolfssl/wolfcrypt/chacha.h +++ b/wolfssl/wolfcrypt/chacha.h @@ -72,6 +72,10 @@ Block counter is located at index 12. #ifndef NO_CHACHA_ASM #define USE_ARM_CHACHA_SPEEDUP #endif +#elif defined(WOLFSSL_RISCV_ASM) + #ifndef NO_CHACHA_ASM + #define USE_RISCV_CHACHA_SPEEDUP + #endif #endif enum { @@ -88,7 +92,7 @@ typedef struct ChaCha { word32 left; /* number of bytes leftover */ #if defined(USE_INTEL_CHACHA_SPEEDUP) || defined(USE_ARM_CHACHA_SPEEDUP) word32 over[CHACHA_CHUNK_WORDS]; -#elif defined(WOLFSSL_RISCV_ASM) +#elif defined(USE_RISCV_CHACHA_SPEEDUP) ALIGN8 word32 over[CHACHA_CHUNK_WORDS]; #endif } ChaCha; @@ -112,7 +116,7 @@ WOLFSSL_API int wc_XChacha_SetKey(ChaCha *ctx, const byte *key, word32 keySz, word32 counter); #endif -#if defined(USE_ARM_CHACHA_SPEEDUP) +#if defined(USE_ARM_CHACHA_SPEEDUP) || defined(USE_RISCV_CHACHA_SPEEDUP) WOLFSSL_LOCAL void wc_chacha_setiv(word32* x, const byte* iv, word32 counter); WOLFSSL_LOCAL void wc_chacha_setkey(word32* x, const byte* key, word32 keySz); diff --git a/wolfssl/wolfcrypt/libwolfssl_sources_asm.h b/wolfssl/wolfcrypt/libwolfssl_sources_asm.h index c23b822a76c..19ddd555313 100644 --- a/wolfssl/wolfcrypt/libwolfssl_sources_asm.h +++ b/wolfssl/wolfcrypt/libwolfssl_sources_asm.h @@ -43,6 +43,19 @@ #define WC_CONFIG_H_INCLUDED #endif +/* Generated assembly is guarded by the same feature macros as the C sources + * (e.g. WOLFSSL_SHA512). In an autoconf build those macros are not in config.h + * - they live in wolfssl/options.h - so pull them in here, before settings.h, + * so the assembler sees the same configuration as the compiler. This is a + * custom configuration method (options.h consumed directly), so tell settings.h + * not to warn about options.h in a library object. */ +#if defined(HAVE_CONFIG_H) && !defined(WOLFSSL_USER_SETTINGS) + #ifndef WOLFSSL_CUSTOM_CONFIG + #define WOLFSSL_CUSTOM_CONFIG + #endif + #include +#endif + #include #endif /* LIBWOLFSSL_SOURCES_ASM_H */ diff --git a/wolfssl/wolfcrypt/poly1305.h b/wolfssl/wolfcrypt/poly1305.h index 46d9a62e33c..dbf575cd1e4 100644 --- a/wolfssl/wolfcrypt/poly1305.h +++ b/wolfssl/wolfcrypt/poly1305.h @@ -140,14 +140,29 @@ typedef struct Poly1305 { unsigned char buffer[POLY1305_BLOCK_SIZE]; unsigned char finished; #elif defined(WOLFSSL_RISCV_ASM) - word64 r[2]; -#ifdef WOLFSSL_RISCV_VECTOR - word64 r2[6]; -#endif + /* Same layout/offsets as the generic POLY130564 struct (the scalar/base + * asm and common C depend on these offsets: r=0, h=24, pad=48, leftover=64, + * buffer=72, finished=88). */ + word64 r[3]; word64 h[3]; word64 pad[2]; size_t leftover; unsigned char buffer[POLY1305_BLOCK_SIZE]; + unsigned char finished; +#ifdef WOLFSSL_RISCV_VECTOR + /* Powers of r for the vector blocks path (44/44/42-bit limbs), stored as eight + * contiguous power-arrays so a single strided vector load gathers one limb's + * [r^4|r^3|r^2|r^1] (4-block, at r2[0]) or [r^8|r^7|r^6|r^5] (8-block pass A, at + * r2[12]) or [r^2|r^1] (2-block tail). Layout (word64): + * r2[0..2]=r^4, r2[3..5]=r^3, r2[6..8]=r^2, r2[9..11]=r^1, + * r2[12..14]=r^8, r2[15..17]=r^7, r2[18..20]=r^6, r2[21..23]=r^5. + * Placed AFTER finished so the offsets above are unchanged. */ + word64 r2[24]; + /* Lazily-computed-powers level (offset 288): 0=none, 1=r^2 ready, 2=r^2..r^4 + * ready, 3=r^2..r^8 ready. SetKey clears it; the blocks path computes only the + * powers a given message size needs, so small messages skip the power setup. */ + unsigned char r2_level; +#endif #else #if defined(POLY130564) word64 r[3]; @@ -161,7 +176,7 @@ typedef struct Poly1305 { size_t leftover; unsigned char buffer[POLY1305_BLOCK_SIZE]; unsigned char finished; -#endif /* WOLFSSL_ARMASM */ +#endif /* USE_INTEL_POLY1305_SPEEDUP */ } Poly1305; /* does init */ @@ -208,11 +223,12 @@ void poly1305_final(Poly1305* ctx, byte* mac); #if defined(WOLFSSL_RISCV_ASM) #define poly1305_blocks poly1305_blocks_riscv64 -#define poly1305_block poly1305_block_riscv64 void poly1305_blocks_riscv64(Poly1305* ctx, const unsigned char *m, size_t bytes); -void poly1305_block_riscv64(Poly1305* ctx, const unsigned char *m); +void poly1305_block_16_riscv64(Poly1305* ctx, const unsigned char *m); +void poly1305_set_key_riscv64(Poly1305* ctx, const byte* key); +void poly1305_final_riscv64(Poly1305* ctx, byte* mac); #endif #ifdef __cplusplus diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index 05732d45b22..8c0f49b30c9 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -347,6 +347,15 @@ void Transform_Sha256_Len_crypto(wc_Sha256* sha256, const byte* data, word32 len); #endif +#if defined(WOLFSSL_RISCV_ASM) +void Transform_Sha256_Len_riscv(wc_Sha256* sha256, const byte* data, + word32 len); +void Transform_Sha256_Len_riscv_crypto(wc_Sha256* sha256, const byte* data, + word32 len); +void Transform_Sha256_Len_riscv_vector(wc_Sha256* sha256, const byte* data, + word32 len); +#endif + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/wolfssl/wolfcrypt/sha512.h b/wolfssl/wolfcrypt/sha512.h index 791c153048a..5f2ea96f212 100644 --- a/wolfssl/wolfcrypt/sha512.h +++ b/wolfssl/wolfcrypt/sha512.h @@ -242,6 +242,15 @@ WOLFSSL_LOCAL void Transform_Sha512_Len_base(wc_Sha512* sha512, const byte* data, word32 len); #endif #endif /* WOLFSSL_ARMASM */ + +#if defined(WOLFSSL_RISCV_ASM) +WOLFSSL_LOCAL void Transform_Sha512_Len_riscv(wc_Sha512* sha512, + const byte* data, word32 len); +WOLFSSL_LOCAL void Transform_Sha512_Len_riscv_crypto(wc_Sha512* sha512, + const byte* data, word32 len); +WOLFSSL_LOCAL void Transform_Sha512_Len_riscv_vector(wc_Sha512* sha512, + const byte* data, word32 len); +#endif #endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */ #if defined(WOLFSSL_SHA512)