diff --git a/.github/workflows/windows-arm64.yml b/.github/workflows/windows-arm64.yml
new file mode 100644
index 0000000000..41627a4343
--- /dev/null
+++ b/.github/workflows/windows-arm64.yml
@@ -0,0 +1,57 @@
+name: Windows ARM64 Test
+
+# Builds and tests wolfSSL on a native Windows-on-ARM64 runner. Unlike the
+# cross-compiled ARM64 job in os-check.yml (which runs on an x64 runner and can
+# only build), this runs on GitHub's native windows-11-arm image so the test
+# suite executes on the target ISA. The WolfSSLAarch64Asm=true leg assembles
+# the ARMv8 crypto .asm (armasm64) and enables the WOLFSSL_ARMASM code paths.
+
+on:
+ push:
+ branches: [ 'release/**' ]
+ paths-ignore:
+ - '**/*.md'
+ - 'doc/**'
+ pull_request:
+ types: [opened, synchronize, reopened, ready_for_review]
+ branches: [ '*' ]
+ paths-ignore:
+ - '**/*.md'
+ - 'doc/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ windows_arm64_build:
+ name: Windows ARM64 Build Test
+ if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
+ runs-on: windows-11-arm
+ strategy:
+ fail-fast: false
+ matrix:
+ # false: pure-C ARM64 build. true: assemble the ARMv8 crypto .asm and
+ # enable the matching WOLFSSL_ARMASM code paths.
+ asm: [ false, true ]
+ timeout-minutes: 10
+ env:
+ SOLUTION_FILE_PATH: wolfssl64.sln
+ BUILD_CONFIGURATION: Release
+ steps:
+ - uses: actions/checkout@v5
+
+ - name: Add MSBuild to PATH
+ uses: microsoft/setup-msbuild@v3
+
+ - name: Restore NuGet packages
+ working-directory: ${{env.GITHUB_WORKSPACE}}
+ run: nuget restore ${{env.SOLUTION_FILE_PATH}}
+
+ - name: Build
+ working-directory: ${{env.GITHUB_WORKSPACE}}
+ run: msbuild /m /p:PlatformToolset=v143 /p:Platform=ARM64 /p:Configuration=${{env.BUILD_CONFIGURATION}} /p:WolfSSLAarch64Asm=${{matrix.asm}} ${{env.SOLUTION_FILE_PATH}}
+
+ - name: Run Test
+ working-directory: ${{env.GITHUB_WORKSPACE}}
+ run: Release/ARM64/testsuite.exe
diff --git a/examples/client/client.vcxproj b/examples/client/client.vcxproj
index d6a21467c1..67c3a89b4c 100644
--- a/examples/client/client.vcxproj
+++ b/examples/client/client.vcxproj
@@ -486,6 +486,13 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/examples/echoclient/echoclient.vcxproj b/examples/echoclient/echoclient.vcxproj
index 233b1cdbd2..4adfb1d222 100644
--- a/examples/echoclient/echoclient.vcxproj
+++ b/examples/echoclient/echoclient.vcxproj
@@ -486,6 +486,13 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/examples/echoserver/echoserver.vcxproj b/examples/echoserver/echoserver.vcxproj
index 29f440f56c..ad8b11e133 100644
--- a/examples/echoserver/echoserver.vcxproj
+++ b/examples/echoserver/echoserver.vcxproj
@@ -486,6 +486,13 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/examples/server/server.vcxproj b/examples/server/server.vcxproj
index 9343976a6d..f29a5e3a41 100644
--- a/examples/server/server.vcxproj
+++ b/examples/server/server.vcxproj
@@ -486,6 +486,13 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/sslSniffer/sslSniffer.vcxproj b/sslSniffer/sslSniffer.vcxproj
index 4925b99b83..e4f758ed25 100644
--- a/sslSniffer/sslSniffer.vcxproj
+++ b/sslSniffer/sslSniffer.vcxproj
@@ -264,6 +264,13 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/sslSniffer/sslSnifferTest/sslSniffTest.vcxproj b/sslSniffer/sslSnifferTest/sslSniffTest.vcxproj
index f98f33cc1f..e60a5da82a 100644
--- a/sslSniffer/sslSnifferTest/sslSniffTest.vcxproj
+++ b/sslSniffer/sslSnifferTest/sslSniffTest.vcxproj
@@ -265,6 +265,13 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/testsuite/testsuite.vcxproj b/testsuite/testsuite.vcxproj
index 8bc4242f0a..c01794d93e 100644
--- a/testsuite/testsuite.vcxproj
+++ b/testsuite/testsuite.vcxproj
@@ -492,6 +492,13 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/wolfcrypt/src/cpuid.c b/wolfcrypt/src/cpuid.c
index 807658152b..db9dce5911 100644
--- a/wolfcrypt/src/cpuid.c
+++ b/wolfcrypt/src/cpuid.c
@@ -403,6 +403,73 @@
new_cpuid_flags |= CPUID_SM4;
#endif
+ (void)wolfSSL_Atomic_Uint_CompareExchange
+ (&cpuid_flags, &old_cpuid_flags, new_cpuid_flags);
+ }
+ }
+#elif defined(_WIN32)
+ /* Windows on ARM64. IsProcessorFeaturePresent() is the documented way to
+ * query instruction-set extensions: NEON (the 32x64-bit VFP register bank),
+ * the mandatory ARMv8 crypto extension (AES / PMULL / SHA-1 / SHA-256,
+ * reported as one feature), and the optional FEAT_SHA3 / FEAT_SHA512
+ * extensions each have their own flag. FEAT_RDM (SQRDMLSH, ARMv8.1) has no
+ * dedicated flag, so it is gated on the ARMv8.2 dot-product feature. */
+ #include
+
+ /* Older Windows SDKs may not define these processor-feature constants. */
+ #ifndef PF_ARM_VFP_32_REGISTERS_AVAILABLE
+ #define PF_ARM_VFP_32_REGISTERS_AVAILABLE 18
+ #endif
+ #ifndef PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE
+ #define PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE 30
+ #endif
+ #ifndef PF_ARM_SHA3_INSTRUCTIONS_AVAILABLE
+ #define PF_ARM_SHA3_INSTRUCTIONS_AVAILABLE 64
+ #endif
+ #ifndef PF_ARM_SHA512_INSTRUCTIONS_AVAILABLE
+ #define PF_ARM_SHA512_INSTRUCTIONS_AVAILABLE 65
+ #endif
+ /* No dedicated flag for FEAT_RDM (ARMv8.1); gate on ARMv8.2 dot-product -
+ * a CPU reporting v8.2 DP necessarily implements the v8.1 RDM (SQRDMLSH)
+ * instructions the ML-KEM assembly uses. */
+ #ifndef PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE
+ #define PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE 43
+ #endif
+
+ static WC_INLINE void cpuid_set_flags(void)
+ {
+ if (WOLFSSL_ATOMIC_LOAD(cpuid_flags) == WC_CPUID_INITIALIZER) {
+ cpuid_flags_t new_cpuid_flags = 0,
+ old_cpuid_flags = WC_CPUID_INITIALIZER;
+
+ #ifndef WOLFSSL_ARMASM_NO_NEON
+ if (IsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE))
+ new_cpuid_flags |= CPUID_ASIMD;
+ #endif
+ #ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO
+ if (IsProcessorFeaturePresent(
+ PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE)) {
+ new_cpuid_flags |= CPUID_AES;
+ new_cpuid_flags |= CPUID_PMULL;
+ new_cpuid_flags |= CPUID_SHA256;
+ }
+ #endif
+ #ifdef WOLFSSL_ARMASM_CRYPTO_SHA512
+ if (IsProcessorFeaturePresent(
+ PF_ARM_SHA512_INSTRUCTIONS_AVAILABLE))
+ new_cpuid_flags |= CPUID_SHA512;
+ #endif
+ #if !defined(WOLFSSL_AARCH64_NO_SQRDMLSH)
+ if (IsProcessorFeaturePresent(
+ PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE))
+ new_cpuid_flags |= CPUID_RDM;
+ #endif
+ #ifdef WOLFSSL_ARMASM_CRYPTO_SHA3
+ if (IsProcessorFeaturePresent(
+ PF_ARM_SHA3_INSTRUCTIONS_AVAILABLE))
+ new_cpuid_flags |= CPUID_SHA3;
+ #endif
+
(void)wolfSSL_Atomic_Uint_CompareExchange
(&cpuid_flags, &old_cpuid_flags, new_cpuid_flags);
}
diff --git a/wolfcrypt/src/include.am b/wolfcrypt/src/include.am
index dba03978c4..0004fbedec 100644
--- a/wolfcrypt/src/include.am
+++ b/wolfcrypt/src/include.am
@@ -28,6 +28,14 @@ EXTRA_DIST += wolfcrypt/src/sha512_asm.asm
EXTRA_DIST += wolfcrypt/src/sha3_asm.asm
EXTRA_DIST += wolfcrypt/src/wc_mlkem_asm.asm
EXTRA_DIST += wolfcrypt/src/wc_mldsa_asm.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-aes-asm.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-chacha-asm.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-curve25519.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-mlkem-asm.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-poly1305-asm.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-sha256-asm.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-sha3-asm.asm
+EXTRA_DIST += wolfcrypt/src/port/arm/armv8-sha512-asm.asm
EXTRA_DIST += wolfcrypt/src/wc_dsp.c
EXTRA_DIST += wolfcrypt/src/sp_dsp32.c
EXTRA_DIST += wolfcrypt/src/sp_x86_64_asm.asm
diff --git a/wolfcrypt/src/port/arm/armv8-aes-asm.asm b/wolfcrypt/src/port/arm/armv8-aes-asm.asm
new file mode 100644
index 0000000000..d202cded52
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-aes-asm.asm
@@ -0,0 +1,55923 @@
+; /* armv8-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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./aes/aes.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-aes-asm.asm
+ IF :LNOT::DEF:NO_AES :LAND: {TRUE}
+ IF :LNOT::DEF:WOLFSSL_ARMASM_NO_HW_CRYPTO
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_set_key_AARCH64
+AES_set_key_AARCH64 PROC
+ cmp x1, #24
+ blt L_aes_set_key_arm64_crypto_start_128
+ bgt L_aes_set_key_arm64_crypto_start_256
+ ldr x4, [x0], #8
+ ldr x6, [x0], #8
+ ldr x8, [x0], #8
+ stp x4, x6, [x2], #16
+ str x8, [x2], #8
+ lsr x5, x4, #32
+ lsr x7, x6, #32
+ lsr x9, x8, #32
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #1
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #2
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #4
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #8
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #16
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #32
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #0x40
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ dup v1.4s, w9
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #0x80
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ cmp x3, #0
+ beq L_aes_set_key_arm64_crypto_done
+ sub x2, x2, #0xd0
+ ldur q0, [x2]
+ ldur q1, [x2, #192]
+ stur q1, [x2]
+ stur q0, [x2, #192]
+ ldur q0, [x2, #16]
+ ldur q1, [x2, #176]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #16]
+ stur q0, [x2, #176]
+ ldur q0, [x2, #32]
+ ldur q1, [x2, #160]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #32]
+ stur q0, [x2, #160]
+ ldur q0, [x2, #48]
+ ldur q1, [x2, #144]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #48]
+ stur q0, [x2, #144]
+ ldur q0, [x2, #64]
+ ldur q1, [x2, #128]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #64]
+ stur q0, [x2, #128]
+ ldur q0, [x2, #80]
+ ldur q1, [x2, #112]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #80]
+ stur q0, [x2, #112]
+ ldur q0, [x2, #96]
+ aesimc v0.16b, v0.16b
+ stur q0, [x2, #96]
+ b L_aes_set_key_arm64_crypto_done
+L_aes_set_key_arm64_crypto_start_256
+ ldr x4, [x0], #8
+ ldr x6, [x0], #8
+ ldr x8, [x0], #8
+ ldr x10, [x0], #8
+ stp x4, x6, [x2], #16
+ stp x8, x10, [x2], #16
+ lsr x5, x4, #32
+ lsr x7, x6, #32
+ lsr x9, x8, #32
+ lsr x11, x10, #32
+ dup v1.4s, w11
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #1
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ eor w8, w8, w12
+ eor w9, w9, w8
+ eor w10, w10, w9
+ eor w11, w11, w10
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ stp w10, w11, [x2], #8
+ dup v1.4s, w11
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #2
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ eor w8, w8, w12
+ eor w9, w9, w8
+ eor w10, w10, w9
+ eor w11, w11, w10
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ stp w10, w11, [x2], #8
+ dup v1.4s, w11
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #4
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ eor w8, w8, w12
+ eor w9, w9, w8
+ eor w10, w10, w9
+ eor w11, w11, w10
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ stp w10, w11, [x2], #8
+ dup v1.4s, w11
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #8
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ eor w8, w8, w12
+ eor w9, w9, w8
+ eor w10, w10, w9
+ eor w11, w11, w10
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ stp w10, w11, [x2], #8
+ dup v1.4s, w11
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #16
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ eor w8, w8, w12
+ eor w9, w9, w8
+ eor w10, w10, w9
+ eor w11, w11, w10
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ stp w10, w11, [x2], #8
+ dup v1.4s, w11
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #32
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ eor w8, w8, w12
+ eor w9, w9, w8
+ eor w10, w10, w9
+ eor w11, w11, w10
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ stp w10, w11, [x2], #8
+ dup v1.4s, w11
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #0x40
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ cmp x3, #0
+ beq L_aes_set_key_arm64_crypto_done
+ sub x2, x2, #0xf0
+ ldur q0, [x2]
+ ldur q1, [x2, #224]
+ stur q1, [x2]
+ stur q0, [x2, #224]
+ ldur q0, [x2, #16]
+ ldur q1, [x2, #208]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #16]
+ stur q0, [x2, #208]
+ ldur q0, [x2, #32]
+ ldur q1, [x2, #192]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #32]
+ stur q0, [x2, #192]
+ ldur q0, [x2, #48]
+ ldur q1, [x2, #176]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #48]
+ stur q0, [x2, #176]
+ ldur q0, [x2, #64]
+ ldur q1, [x2, #160]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #64]
+ stur q0, [x2, #160]
+ ldur q0, [x2, #80]
+ ldur q1, [x2, #144]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #80]
+ stur q0, [x2, #144]
+ ldur q0, [x2, #96]
+ ldur q1, [x2, #128]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #96]
+ stur q0, [x2, #128]
+ ldur q0, [x2, #112]
+ aesimc v0.16b, v0.16b
+ stur q0, [x2, #112]
+ b L_aes_set_key_arm64_crypto_done
+L_aes_set_key_arm64_crypto_start_128
+ ldr x4, [x0], #8
+ ldr x6, [x0], #8
+ stp x4, x6, [x2], #16
+ lsr x5, x4, #32
+ lsr x7, x6, #32
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #1
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #2
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #4
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #8
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #16
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #32
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #0x40
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ ror w12, w12, #8
+ eor w4, w4, #0x80
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ mov w13, #27
+ ror w12, w12, #8
+ eor w4, w4, w13
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ dup v1.4s, w7
+ movi v0.16b, #0
+ aese v0.16b, v1.16b
+ mov w12, v0.s[0]
+ mov w13, #54
+ ror w12, w12, #8
+ eor w4, w4, w13
+ eor w4, w4, w12
+ eor w5, w5, w4
+ eor w6, w6, w5
+ eor w7, w7, w6
+ stp w4, w5, [x2], #8
+ stp w6, w7, [x2], #8
+ cmp x3, #0
+ beq L_aes_set_key_arm64_crypto_done
+ sub x2, x2, #0xb0
+ ldur q0, [x2]
+ ldur q1, [x2, #160]
+ stur q1, [x2]
+ stur q0, [x2, #160]
+ ldur q0, [x2, #16]
+ ldur q1, [x2, #144]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #16]
+ stur q0, [x2, #144]
+ ldur q0, [x2, #32]
+ ldur q1, [x2, #128]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #32]
+ stur q0, [x2, #128]
+ ldur q0, [x2, #48]
+ ldur q1, [x2, #112]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #48]
+ stur q0, [x2, #112]
+ ldur q0, [x2, #64]
+ ldur q1, [x2, #96]
+ aesimc v0.16b, v0.16b
+ aesimc v1.16b, v1.16b
+ stur q1, [x2, #64]
+ stur q0, [x2, #96]
+ ldur q0, [x2, #80]
+ aesimc v0.16b, v0.16b
+ stur q0, [x2, #80]
+L_aes_set_key_arm64_crypto_done
+ ret
+ ENDP
+ IF :DEF:HAVE_AESCCM :LOR: :DEF:HAVE_AESGCM :LOR: :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER :LOR: :DEF:HAVE_AES_CBC
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_encrypt_AARCH64
+AES_encrypt_AARCH64 PROC
+ ld1 {v0.16b}, [x0]
+ ld1 {v1.2d, v2.2d, v3.2d, v4.2d}, [x2], #0x40
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v3.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v4.16b
+ aesmc v0.16b, v0.16b
+ ld1 {v1.2d, v2.2d, v3.2d, v4.2d}, [x2], #0x40
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v3.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v4.16b
+ aesmc v0.16b, v0.16b
+ subs w3, w3, #10
+ ld1 {v1.2d, v2.2d}, [x2], #32
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ beq L_aes_encrypt_arm64_crypto_round_done
+ ld1 {v1.2d, v2.2d}, [x2], #32
+ subs w3, w3, #2
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ beq L_aes_encrypt_arm64_crypto_round_done
+ ld1 {v1.2d, v2.2d}, [x2], #32
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+L_aes_encrypt_arm64_crypto_round_done
+ ld1 {v1.2d}, [x2]
+ eor v0.16b, v0.16b, v1.16b
+ st1 {v0.16b}, [x1]
+ ret
+ ENDP
+ ENDIF
+ IF :LNOT::DEF:WC_AES_BITSLICED :LOR: :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_decrypt_AARCH64
+AES_decrypt_AARCH64 PROC
+ ld1 {v0.16b}, [x0]
+ ld1 {v1.2d, v2.2d, v3.2d, v4.2d}, [x2], #0x40
+ aesd v0.16b, v1.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v2.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v3.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v4.16b
+ aesimc v0.16b, v0.16b
+ ld1 {v1.2d, v2.2d, v3.2d, v4.2d}, [x2], #0x40
+ aesd v0.16b, v1.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v2.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v3.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v4.16b
+ aesimc v0.16b, v0.16b
+ ld1 {v1.2d, v2.2d}, [x2], #32
+ aesd v0.16b, v1.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v2.16b
+ subs w3, w3, #10
+ beq L_aes_decrypt_arm64_crypto_round_done
+ ld1 {v1.2d, v2.2d}, [x2], #32
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v1.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v2.16b
+ subs w3, w3, #2
+ beq L_aes_decrypt_arm64_crypto_round_done
+ ld1 {v1.2d, v2.2d}, [x2], #32
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v1.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v2.16b
+L_aes_decrypt_arm64_crypto_round_done
+ ld1 {v1.2d}, [x2]
+ eor v0.16b, v0.16b, v1.16b
+ st1 {v0.16b}, [x1]
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ IF :DEF:HAVE_AES_ECB
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_encrypt_blocks_AARCH64
+AES_encrypt_blocks_AARCH64 PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x3], #0x40
+ ld1 {v24.2d, v25.2d, v26.2d}, [x3], #48
+ lsr w2, w2, #4
+ cmp w4, #12
+ blt L_aes_encrypt_blocks_arm64_crypto_start_128
+ bgt L_aes_encrypt_blocks_arm64_crypto_start_256
+ ; AES_ECB_192
+ IF :LNOT::DEF:NO_AES_192
+ ld1 {v27.2d, v28.2d}, [x3], #32
+ cmp w2, #1
+ beq L_aes_encrypt_blocks_arm64_crypto_192_start_1
+ cmp w2, #8
+ blt L_aes_encrypt_blocks_arm64_crypto_192_start_4
+L_aes_encrypt_blocks_arm64_crypto_192_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v16.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v16.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v16.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v17.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v17.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v17.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v18.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v18.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v18.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v19.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v19.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v19.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v20.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v20.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v20.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v21.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v21.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v21.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v22.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v22.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v22.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v23.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v23.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v23.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v24.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v24.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v24.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v25.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v25.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v25.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v25.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v25.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v25.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v26.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v26.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v26.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v26.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v26.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v26.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aese v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ aese v2.16b, v27.16b
+ eor v2.16b, v2.16b, v28.16b
+ aese v3.16b, v27.16b
+ eor v3.16b, v3.16b, v28.16b
+ aese v4.16b, v27.16b
+ eor v4.16b, v4.16b, v28.16b
+ aese v5.16b, v27.16b
+ eor v5.16b, v5.16b, v28.16b
+ aese v6.16b, v27.16b
+ eor v6.16b, v6.16b, v28.16b
+ aese v7.16b, v27.16b
+ eor v7.16b, v7.16b, v28.16b
+ sub w2, w2, #8
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ st1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ cmp w2, #8
+ bge L_aes_encrypt_blocks_arm64_crypto_192_start_8
+L_aes_encrypt_blocks_arm64_crypto_192_start_4
+ cmp w2, #4
+ blt L_aes_encrypt_blocks_arm64_crypto_192_start_2
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v25.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v25.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v26.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v26.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aese v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ aese v2.16b, v27.16b
+ eor v2.16b, v2.16b, v28.16b
+ aese v3.16b, v27.16b
+ eor v3.16b, v3.16b, v28.16b
+ sub w2, w2, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+L_aes_encrypt_blocks_arm64_crypto_192_start_2
+ cmp w2, #2
+ blt L_aes_encrypt_blocks_arm64_crypto_192_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aese v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ sub w2, w2, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_encrypt_blocks_arm64_crypto_192_start_1
+ cbz w2, L_aes_encrypt_blocks_arm64_crypto_192_done
+ ld1 {v0.16b}, [x0], #16
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ st1 {v0.16b}, [x1], #16
+L_aes_encrypt_blocks_arm64_crypto_192_done
+ ENDIF
+ b L_aes_encrypt_blocks_arm64_crypto_done
+ ; AES_ECB_256
+L_aes_encrypt_blocks_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ ld1 {v27.2d, v28.2d, v29.2d, v30.2d}, [x3], #0x40
+ cmp w2, #1
+ beq L_aes_encrypt_blocks_arm64_crypto_256_start_1
+ cmp w2, #8
+ blt L_aes_encrypt_blocks_arm64_crypto_256_start_4
+L_aes_encrypt_blocks_arm64_crypto_256_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v16.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v16.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v16.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v17.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v17.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v17.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v18.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v18.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v18.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v19.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v19.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v19.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v20.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v20.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v20.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v21.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v21.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v21.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v22.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v22.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v22.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v23.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v23.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v23.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v24.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v24.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v24.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v25.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v25.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v25.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v25.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v25.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v25.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v26.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v26.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v26.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v26.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v26.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v26.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v27.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v27.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v27.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v27.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v27.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v27.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v27.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v28.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v28.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v28.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v28.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v28.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v28.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v28.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aese v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ aese v2.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ aese v3.16b, v29.16b
+ eor v3.16b, v3.16b, v30.16b
+ aese v4.16b, v29.16b
+ eor v4.16b, v4.16b, v30.16b
+ aese v5.16b, v29.16b
+ eor v5.16b, v5.16b, v30.16b
+ aese v6.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ aese v7.16b, v29.16b
+ eor v7.16b, v7.16b, v30.16b
+ sub w2, w2, #8
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ st1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ cmp w2, #8
+ bge L_aes_encrypt_blocks_arm64_crypto_256_start_8
+L_aes_encrypt_blocks_arm64_crypto_256_start_4
+ cmp w2, #4
+ blt L_aes_encrypt_blocks_arm64_crypto_256_start_2
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v25.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v25.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v26.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v26.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v27.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v27.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v27.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v28.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v28.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v28.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aese v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ aese v2.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ aese v3.16b, v29.16b
+ eor v3.16b, v3.16b, v30.16b
+ sub w2, w2, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+L_aes_encrypt_blocks_arm64_crypto_256_start_2
+ cmp w2, #2
+ blt L_aes_encrypt_blocks_arm64_crypto_256_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v27.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v28.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aese v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ sub w2, w2, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_encrypt_blocks_arm64_crypto_256_start_1
+ cbz w2, L_aes_encrypt_blocks_arm64_crypto_256_done
+ ld1 {v0.16b}, [x0], #16
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ st1 {v0.16b}, [x1], #16
+L_aes_encrypt_blocks_arm64_crypto_256_done
+ ENDIF
+ b L_aes_encrypt_blocks_arm64_crypto_done
+ ; AES_ECB_128
+L_aes_encrypt_blocks_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w2, #1
+ beq L_aes_encrypt_blocks_arm64_crypto_128_start_1
+ cmp w2, #8
+ blt L_aes_encrypt_blocks_arm64_crypto_128_start_4
+L_aes_encrypt_blocks_arm64_crypto_128_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v16.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v16.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v16.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v17.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v17.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v17.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v18.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v18.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v18.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v19.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v19.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v19.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v20.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v20.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v20.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v21.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v21.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v21.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v22.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v22.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v22.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v23.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v23.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v23.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v5.16b, v24.16b
+ aesmc v5.16b, v5.16b
+ aese v6.16b, v24.16b
+ aesmc v6.16b, v6.16b
+ aese v7.16b, v24.16b
+ aesmc v7.16b, v7.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aese v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ aese v2.16b, v25.16b
+ eor v2.16b, v2.16b, v26.16b
+ aese v3.16b, v25.16b
+ eor v3.16b, v3.16b, v26.16b
+ aese v4.16b, v25.16b
+ eor v4.16b, v4.16b, v26.16b
+ aese v5.16b, v25.16b
+ eor v5.16b, v5.16b, v26.16b
+ aese v6.16b, v25.16b
+ eor v6.16b, v6.16b, v26.16b
+ aese v7.16b, v25.16b
+ eor v7.16b, v7.16b, v26.16b
+ sub w2, w2, #8
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ st1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ cmp w2, #8
+ bge L_aes_encrypt_blocks_arm64_crypto_128_start_8
+L_aes_encrypt_blocks_arm64_crypto_128_start_4
+ cmp w2, #4
+ blt L_aes_encrypt_blocks_arm64_crypto_128_start_2
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aese v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ aese v2.16b, v25.16b
+ eor v2.16b, v2.16b, v26.16b
+ aese v3.16b, v25.16b
+ eor v3.16b, v3.16b, v26.16b
+ sub w2, w2, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+L_aes_encrypt_blocks_arm64_crypto_128_start_2
+ cmp w2, #2
+ blt L_aes_encrypt_blocks_arm64_crypto_128_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aese v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ sub w2, w2, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_encrypt_blocks_arm64_crypto_128_start_1
+ cbz w2, L_aes_encrypt_blocks_arm64_crypto_128_done
+ ld1 {v0.16b}, [x0], #16
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ st1 {v0.16b}, [x1], #16
+L_aes_encrypt_blocks_arm64_crypto_128_done
+ ENDIF
+L_aes_encrypt_blocks_arm64_crypto_done
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_decrypt_blocks_AARCH64
+AES_decrypt_blocks_AARCH64 PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x3], #0x40
+ ld1 {v24.2d, v25.2d, v26.2d}, [x3], #48
+ lsr w2, w2, #4
+ cmp w4, #12
+ blt L_aes_decrypt_blocks_arm64_crypto_start_128
+ bgt L_aes_decrypt_blocks_arm64_crypto_start_256
+ ; AES_ECB_192
+ IF :LNOT::DEF:NO_AES_192
+ ld1 {v27.2d, v28.2d}, [x3], #32
+ cmp w2, #1
+ beq L_aes_decrypt_blocks_arm64_crypto_192_start_1
+ cmp w2, #8
+ blt L_aes_decrypt_blocks_arm64_crypto_192_start_4
+L_aes_decrypt_blocks_arm64_crypto_192_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v16.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v16.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v16.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v16.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v17.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v17.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v17.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v17.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v18.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v18.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v18.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v18.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v19.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v19.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v19.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v19.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v20.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v20.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v20.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v20.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v21.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v21.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v21.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v21.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v22.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v22.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v22.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v22.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v23.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v23.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v23.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v23.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v24.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v24.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v24.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v24.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v25.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v25.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v25.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v25.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v25.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v25.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v26.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v26.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v26.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v26.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v26.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v26.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aesd v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ aesd v2.16b, v27.16b
+ eor v2.16b, v2.16b, v28.16b
+ aesd v3.16b, v27.16b
+ eor v3.16b, v3.16b, v28.16b
+ aesd v4.16b, v27.16b
+ eor v4.16b, v4.16b, v28.16b
+ aesd v5.16b, v27.16b
+ eor v5.16b, v5.16b, v28.16b
+ aesd v6.16b, v27.16b
+ eor v6.16b, v6.16b, v28.16b
+ aesd v7.16b, v27.16b
+ eor v7.16b, v7.16b, v28.16b
+ sub w2, w2, #8
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ st1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ cmp w2, #8
+ bge L_aes_decrypt_blocks_arm64_crypto_192_start_8
+L_aes_decrypt_blocks_arm64_crypto_192_start_4
+ cmp w2, #4
+ blt L_aes_decrypt_blocks_arm64_crypto_192_start_2
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v25.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v25.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v26.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v26.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aesd v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ aesd v2.16b, v27.16b
+ eor v2.16b, v2.16b, v28.16b
+ aesd v3.16b, v27.16b
+ eor v3.16b, v3.16b, v28.16b
+ sub w2, w2, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+L_aes_decrypt_blocks_arm64_crypto_192_start_2
+ cmp w2, #2
+ blt L_aes_decrypt_blocks_arm64_crypto_192_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aesd v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ sub w2, w2, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_decrypt_blocks_arm64_crypto_192_start_1
+ cbz w2, L_aes_decrypt_blocks_arm64_crypto_192_done
+ ld1 {v0.16b}, [x0], #16
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ st1 {v0.16b}, [x1], #16
+L_aes_decrypt_blocks_arm64_crypto_192_done
+ ENDIF
+ b L_aes_decrypt_blocks_arm64_crypto_done
+ ; AES_ECB_256
+L_aes_decrypt_blocks_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ ld1 {v27.2d, v28.2d, v29.2d, v30.2d}, [x3], #0x40
+ cmp w2, #1
+ beq L_aes_decrypt_blocks_arm64_crypto_256_start_1
+ cmp w2, #8
+ blt L_aes_decrypt_blocks_arm64_crypto_256_start_4
+L_aes_decrypt_blocks_arm64_crypto_256_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v16.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v16.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v16.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v16.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v17.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v17.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v17.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v17.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v18.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v18.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v18.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v18.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v19.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v19.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v19.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v19.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v20.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v20.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v20.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v20.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v21.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v21.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v21.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v21.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v22.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v22.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v22.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v22.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v23.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v23.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v23.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v23.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v24.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v24.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v24.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v24.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v25.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v25.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v25.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v25.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v25.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v25.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v26.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v26.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v26.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v26.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v26.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v26.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v27.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v27.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v27.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v27.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v27.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v27.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v27.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v28.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v28.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v28.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v28.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v28.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v28.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v28.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aesd v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ aesd v2.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ aesd v3.16b, v29.16b
+ eor v3.16b, v3.16b, v30.16b
+ aesd v4.16b, v29.16b
+ eor v4.16b, v4.16b, v30.16b
+ aesd v5.16b, v29.16b
+ eor v5.16b, v5.16b, v30.16b
+ aesd v6.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ aesd v7.16b, v29.16b
+ eor v7.16b, v7.16b, v30.16b
+ sub w2, w2, #8
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ st1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ cmp w2, #8
+ bge L_aes_decrypt_blocks_arm64_crypto_256_start_8
+L_aes_decrypt_blocks_arm64_crypto_256_start_4
+ cmp w2, #4
+ blt L_aes_decrypt_blocks_arm64_crypto_256_start_2
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v25.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v25.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v26.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v26.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v27.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v27.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v27.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v28.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v28.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v28.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aesd v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ aesd v2.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ aesd v3.16b, v29.16b
+ eor v3.16b, v3.16b, v30.16b
+ sub w2, w2, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+L_aes_decrypt_blocks_arm64_crypto_256_start_2
+ cmp w2, #2
+ blt L_aes_decrypt_blocks_arm64_crypto_256_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v27.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v28.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aesd v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ sub w2, w2, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_decrypt_blocks_arm64_crypto_256_start_1
+ cbz w2, L_aes_decrypt_blocks_arm64_crypto_256_done
+ ld1 {v0.16b}, [x0], #16
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ st1 {v0.16b}, [x1], #16
+L_aes_decrypt_blocks_arm64_crypto_256_done
+ ENDIF
+ b L_aes_decrypt_blocks_arm64_crypto_done
+ ; AES_ECB_128
+L_aes_decrypt_blocks_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w2, #1
+ beq L_aes_decrypt_blocks_arm64_crypto_128_start_1
+ cmp w2, #8
+ blt L_aes_decrypt_blocks_arm64_crypto_128_start_4
+L_aes_decrypt_blocks_arm64_crypto_128_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v16.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v16.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v16.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v16.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v17.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v17.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v17.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v17.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v18.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v18.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v18.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v18.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v19.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v19.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v19.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v19.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v20.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v20.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v20.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v20.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v21.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v21.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v21.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v21.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v22.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v22.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v22.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v22.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v23.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v23.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v23.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v23.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v4.16b, v24.16b
+ aesimc v4.16b, v4.16b
+ aesd v5.16b, v24.16b
+ aesimc v5.16b, v5.16b
+ aesd v6.16b, v24.16b
+ aesimc v6.16b, v6.16b
+ aesd v7.16b, v24.16b
+ aesimc v7.16b, v7.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aesd v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ aesd v2.16b, v25.16b
+ eor v2.16b, v2.16b, v26.16b
+ aesd v3.16b, v25.16b
+ eor v3.16b, v3.16b, v26.16b
+ aesd v4.16b, v25.16b
+ eor v4.16b, v4.16b, v26.16b
+ aesd v5.16b, v25.16b
+ eor v5.16b, v5.16b, v26.16b
+ aesd v6.16b, v25.16b
+ eor v6.16b, v6.16b, v26.16b
+ aesd v7.16b, v25.16b
+ eor v7.16b, v7.16b, v26.16b
+ sub w2, w2, #8
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ st1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ cmp w2, #8
+ bge L_aes_decrypt_blocks_arm64_crypto_128_start_8
+L_aes_decrypt_blocks_arm64_crypto_128_start_4
+ cmp w2, #4
+ blt L_aes_decrypt_blocks_arm64_crypto_128_start_2
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aesd v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ aesd v2.16b, v25.16b
+ eor v2.16b, v2.16b, v26.16b
+ aesd v3.16b, v25.16b
+ eor v3.16b, v3.16b, v26.16b
+ sub w2, w2, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+L_aes_decrypt_blocks_arm64_crypto_128_start_2
+ cmp w2, #2
+ blt L_aes_decrypt_blocks_arm64_crypto_128_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aesd v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ sub w2, w2, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_decrypt_blocks_arm64_crypto_128_start_1
+ cbz w2, L_aes_decrypt_blocks_arm64_crypto_128_done
+ ld1 {v0.16b}, [x0], #16
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ st1 {v0.16b}, [x1], #16
+L_aes_decrypt_blocks_arm64_crypto_128_done
+ ENDIF
+L_aes_decrypt_blocks_arm64_crypto_done
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ IF :DEF:HAVE_AES_CBC
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CBC_encrypt_AARCH64
+AES_CBC_encrypt_AARCH64 PROC
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v0.2d}, [x3]
+ subs w5, w5, #12
+ lsr w2, w2, #4
+ blt L_aes_cbc_encrypt_arm64_crypto_start_128
+ bgt L_aes_cbc_encrypt_arm64_crypto_start_256
+ ; AES_CBC_192
+ IF :LNOT::DEF:NO_AES_192
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+L_aes_cbc_encrypt_arm64_crypto_loop_192
+ ld1 {v28.2d}, [x4]
+ ld1 {v1.16b}, [x0], #16
+ subs w2, w2, #1
+ eor v0.16b, v0.16b, v1.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ st1 {v0.16b}, [x1], #16
+ bne L_aes_cbc_encrypt_arm64_crypto_loop_192
+ ENDIF
+ b L_aes_cbc_encrypt_arm64_crypto_done
+ ; AES_CBC_256
+L_aes_cbc_encrypt_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+ ld1 {v28.2d, v29.2d}, [x4], #32
+L_aes_cbc_encrypt_arm64_crypto_loop_256
+ ld1 {v30.2d}, [x4]
+ ld1 {v1.16b}, [x0], #16
+ subs w2, w2, #1
+ eor v0.16b, v0.16b, v1.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ st1 {v0.16b}, [x1], #16
+ bne L_aes_cbc_encrypt_arm64_crypto_loop_256
+ ENDIF
+ b L_aes_cbc_encrypt_arm64_crypto_done
+ ; AES_CBC_128
+L_aes_cbc_encrypt_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ ld1 {v24.2d, v25.2d}, [x4], #32
+L_aes_cbc_encrypt_arm64_crypto_loop_128
+ ld1 {v26.2d}, [x4]
+ ld1 {v1.16b}, [x0], #16
+ subs w2, w2, #1
+ eor v0.16b, v0.16b, v1.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ st1 {v0.16b}, [x1], #16
+ bne L_aes_cbc_encrypt_arm64_crypto_loop_128
+ ENDIF
+L_aes_cbc_encrypt_arm64_crypto_done
+ st1 {v0.2d}, [x3]
+ ret
+ ENDP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CBC_decrypt_AARCH64
+AES_CBC_decrypt_AARCH64 PROC
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v0.2d}, [x3]
+ lsr w2, w2, #4
+ cmp w5, #12
+ blt L_aes_cbc_decrypt_blocks_arm64_crypto_start_128
+ bgt L_aes_cbc_decrypt_blocks_arm64_crypto_start_256
+ ; AES_CBC_192
+ IF :LNOT::DEF:NO_AES_192
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+ ld1 {v28.2d}, [x4]
+ cmp w2, #10
+ ble L_aes_cbc_decrypt_blocks_arm64_crypto_192_start_1
+L_aes_cbc_decrypt_blocks_arm64_crypto_192_start_1_long
+ ld1 {v1.16b}, [x0], #16
+ sub w2, w2, #1
+ mov v2.16b, v1.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ eor v1.16b, v1.16b, v0.16b
+ mov v0.16b, v2.16b
+ st1 {v1.16b}, [x1], #16
+ cmp w2, #1
+ bge L_aes_cbc_decrypt_blocks_arm64_crypto_192_start_1_long
+ b L_aes_cbc_decrypt_blocks_arm64_crypto_done
+L_aes_cbc_decrypt_blocks_arm64_crypto_192_start_1
+ ld1 {v1.16b}, [x0], #16
+ sub w2, w2, #1
+ eor v2.16b, v0.16b, v28.16b
+ mov v0.16b, v1.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v27.16b
+ eor v1.16b, v1.16b, v2.16b
+ st1 {v1.16b}, [x1], #16
+ cmp w2, #1
+ bge L_aes_cbc_decrypt_blocks_arm64_crypto_192_start_1
+ ENDIF
+ b L_aes_cbc_decrypt_blocks_arm64_crypto_done
+ ; AES_CBC_256
+L_aes_cbc_decrypt_blocks_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+ ld1 {v28.2d, v29.2d}, [x4], #32
+ ld1 {v30.2d}, [x4]
+ cmp w2, #5
+ ble L_aes_cbc_decrypt_blocks_arm64_crypto_256_start_1
+L_aes_cbc_decrypt_blocks_arm64_crypto_256_start_1_long
+ ld1 {v1.16b}, [x0], #16
+ sub w2, w2, #1
+ mov v2.16b, v1.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v27.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v28.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ eor v1.16b, v1.16b, v0.16b
+ mov v0.16b, v2.16b
+ st1 {v1.16b}, [x1], #16
+ cmp w2, #1
+ bge L_aes_cbc_decrypt_blocks_arm64_crypto_256_start_1_long
+ b L_aes_cbc_decrypt_blocks_arm64_crypto_done
+L_aes_cbc_decrypt_blocks_arm64_crypto_256_start_1
+ ld1 {v1.16b}, [x0], #16
+ sub w2, w2, #1
+ eor v2.16b, v0.16b, v30.16b
+ mov v0.16b, v1.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v27.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v28.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v29.16b
+ eor v1.16b, v1.16b, v2.16b
+ st1 {v1.16b}, [x1], #16
+ cmp w2, #1
+ bge L_aes_cbc_decrypt_blocks_arm64_crypto_256_start_1
+ ENDIF
+ b L_aes_cbc_decrypt_blocks_arm64_crypto_done
+ ; AES_CBC_128
+L_aes_cbc_decrypt_blocks_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ ld1 {v24.2d, v25.2d}, [x4], #32
+ ld1 {v26.2d}, [x4]
+ cmp w2, #24
+ ble L_aes_cbc_decrypt_blocks_arm64_crypto_128_start_1
+L_aes_cbc_decrypt_blocks_arm64_crypto_128_start_1_long
+ ld1 {v1.16b}, [x0], #16
+ sub w2, w2, #1
+ mov v2.16b, v1.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ eor v1.16b, v1.16b, v0.16b
+ mov v0.16b, v2.16b
+ st1 {v1.16b}, [x1], #16
+ cmp w2, #1
+ bge L_aes_cbc_decrypt_blocks_arm64_crypto_128_start_1_long
+ b L_aes_cbc_decrypt_blocks_arm64_crypto_done
+L_aes_cbc_decrypt_blocks_arm64_crypto_128_start_1
+ ld1 {v1.16b}, [x0], #16
+ sub w2, w2, #1
+ eor v2.16b, v0.16b, v26.16b
+ mov v0.16b, v1.16b
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v1.16b, v25.16b
+ eor v1.16b, v1.16b, v2.16b
+ st1 {v1.16b}, [x1], #16
+ cmp w2, #1
+ bge L_aes_cbc_decrypt_blocks_arm64_crypto_128_start_1
+ ENDIF
+L_aes_cbc_decrypt_blocks_arm64_crypto_done
+ st1 {v0.2d}, [x3]
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ IF :DEF:WOLFSSL_AES_COUNTER
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CTR_encrypt_AARCH64
+AES_CTR_encrypt_AARCH64 PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ stp x20, x21, [x29, #32]
+ stp x22, x23, [x29, #48]
+ stp x24, x25, [x29, #64]
+ stp d8, d9, [x29, #80]
+ stp d10, d11, [x29, #96]
+ stp d12, d13, [x29, #112]
+ stp d14, d15, [x29, #128]
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x4], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x4], #0x40
+ ld1 {v15.2d}, [x3]
+ rev64 v16.16b, v15.16b
+ lsr w8, w2, #4
+ and w2, w2, #15
+ mov x9, v16.d[1]
+ mov x10, v16.d[0]
+ cmp w7, #12
+ blt L_aes_ctr_encrypt_arm64_crypto_start_128
+ bgt L_aes_ctr_encrypt_arm64_crypto_start_256
+ ; AES_CTR_192
+ IF :LNOT::DEF:NO_AES_192
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x4], #0x40
+ ld1 {v12.2d}, [x4]
+ cmp w8, #1
+ ble L_aes_ctr_encrypt_arm64_crypto_192_start_1
+ adds x11, x9, #1
+ adc x12, x10, xzr
+ cmp w8, #8
+ blt L_aes_ctr_encrypt_arm64_crypto_192_start_4
+ adds x13, x9, #2
+ adc x14, x10, xzr
+ adds x15, x9, #3
+ adc x16, x10, xzr
+L_aes_ctr_encrypt_arm64_crypto_192_start_8
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x0], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x0], #0x40
+ mov v17.d[0], x12
+ mov v17.d[1], x11
+ mov v18.d[0], x14
+ mov v18.d[1], x13
+ adds x17, x9, #4
+ mov v19.d[0], x16
+ adc x19, x10, xzr
+ mov v19.d[1], x15
+ adds x20, x9, #5
+ mov v20.d[0], x19
+ adc x21, x10, xzr
+ mov v20.d[1], x17
+ adds x22, x9, #6
+ mov v21.d[0], x21
+ adc x23, x10, xzr
+ mov v21.d[1], x20
+ adds x24, x9, #7
+ mov v22.d[0], x23
+ adc x25, x10, xzr
+ mov v22.d[1], x22
+ mov v23.d[0], x25
+ mov v23.d[1], x24
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ rev64 v18.16b, v18.16b
+ rev64 v19.16b, v19.16b
+ rev64 v20.16b, v20.16b
+ rev64 v21.16b, v21.16b
+ rev64 v22.16b, v22.16b
+ rev64 v23.16b, v23.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v0.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v0.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v0.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v0.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v0.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v0.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v1.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v1.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v1.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v1.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v1.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v1.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v2.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v2.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v2.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v2.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v2.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v2.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v3.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v3.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v3.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v3.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v3.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v3.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v4.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v4.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v4.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v4.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v4.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v4.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v5.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v5.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v5.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v5.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v5.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v5.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v6.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v6.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v6.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v6.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v6.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v6.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v7.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v7.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v7.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v7.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v7.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v7.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v8.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v8.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v8.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v8.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v8.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v8.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v9.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v9.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v9.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v9.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v9.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v9.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v10.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v10.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v10.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v10.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v10.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v10.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v18.16b, v11.16b
+ eor v18.16b, v18.16b, v12.16b
+ aese v19.16b, v11.16b
+ eor v19.16b, v19.16b, v12.16b
+ aese v20.16b, v11.16b
+ eor v20.16b, v20.16b, v12.16b
+ aese v21.16b, v11.16b
+ eor v21.16b, v21.16b, v12.16b
+ aese v22.16b, v11.16b
+ eor v22.16b, v22.16b, v12.16b
+ aese v23.16b, v11.16b
+ eor v23.16b, v23.16b, v12.16b
+ adds x9, x9, #8
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ adds x11, x11, #8
+ eor v26.16b, v26.16b, v18.16b
+ adc x12, x12, xzr
+ eor v27.16b, v27.16b, v19.16b
+ adds x13, x13, #8
+ eor v28.16b, v28.16b, v20.16b
+ adc x14, x14, xzr
+ eor v29.16b, v29.16b, v21.16b
+ adds x15, x15, #8
+ eor v30.16b, v30.16b, v22.16b
+ adc x16, x16, xzr
+ eor v31.16b, v31.16b, v23.16b
+ sub w8, w8, #8
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ st1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x1], #0x40
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+ cmp w8, #8
+ bge L_aes_ctr_encrypt_arm64_crypto_192_start_8
+L_aes_ctr_encrypt_arm64_crypto_192_start_4
+ cmp w8, #4
+ blt L_aes_ctr_encrypt_arm64_crypto_192_start_2
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x0], #0x40
+ adds x13, x9, #2
+ mov v17.d[0], x12
+ adc x14, x10, xzr
+ mov v17.d[1], x11
+ adds x15, x9, #3
+ mov v18.d[0], x14
+ adc x16, x10, xzr
+ mov v18.d[1], x13
+ mov v19.d[0], x16
+ mov v19.d[1], x15
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ rev64 v18.16b, v18.16b
+ rev64 v19.16b, v19.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v0.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v0.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v1.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v1.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v2.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v2.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v3.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v3.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v4.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v4.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v5.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v5.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v6.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v6.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v7.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v7.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v8.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v8.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v9.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v9.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v10.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v10.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v18.16b, v11.16b
+ eor v18.16b, v18.16b, v12.16b
+ aese v19.16b, v11.16b
+ eor v19.16b, v19.16b, v12.16b
+ adds x9, x9, #4
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ adds x11, x11, #4
+ eor v26.16b, v26.16b, v18.16b
+ adc x12, x12, xzr
+ eor v27.16b, v27.16b, v19.16b
+ sub w8, w8, #4
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+L_aes_ctr_encrypt_arm64_crypto_192_start_2
+ cmp w8, #2
+ blt L_aes_ctr_encrypt_arm64_crypto_192_start_1
+ ld1 {v24.16b, v25.16b}, [x0], #32
+ eor v20.16b, v20.16b, v20.16b
+ ext v19.16b, v16.16b, v16.16b, #8
+ movi v18.16b, #1
+ ext v18.16b, v18.16b, v20.16b, #15
+ add v17.2d, v19.2d, v18.2d
+ cmeq v19.2d, v17.2d, #0
+ ext v19.16b, v20.16b, v19.16b, #8
+ sub v17.2d, v17.2d, v19.2d
+ ext v17.16b, v17.16b, v17.16b, #8
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ adds x9, x9, #2
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ sub w8, w8, #2
+ st1 {v24.16b, v25.16b}, [x1], #32
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+L_aes_ctr_encrypt_arm64_crypto_192_start_1
+ cbz w8, L_aes_ctr_encrypt_arm64_crypto_192_done
+ ld1 {v24.16b}, [x0], #16
+ rev64 v16.16b, v16.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ adds x9, x9, #1
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ st1 {v24.16b}, [x1], #16
+L_aes_ctr_encrypt_arm64_crypto_192_done
+ cbz w2, L_aes_ctr_encrypt_arm64_crypto_192_partial_done
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+ rev64 v16.16b, v16.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ adds x9, x9, #1
+ adc x10, x10, xzr
+ st1 {v16.2d}, [x5]
+ mov w13, #16
+ sub w13, w13, w2
+L_aes_ctr_encrypt_arm64_crypto_192_start_byte
+ ldrb w11, [x5], #1
+ ldrb w12, [x0], #1
+ eor w11, w11, w12
+ subs w2, w2, #1
+ strb w11, [x1], #1
+ bgt L_aes_ctr_encrypt_arm64_crypto_192_start_byte
+ str w13, [x6]
+L_aes_ctr_encrypt_arm64_crypto_192_partial_done
+ ENDIF
+ b L_aes_ctr_encrypt_arm64_crypto_done
+ ; AES_CTR_256
+L_aes_ctr_encrypt_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x4], #0x40
+ ld1 {v12.2d, v13.2d}, [x4], #32
+ ld1 {v14.2d}, [x4]
+ cmp w8, #1
+ ble L_aes_ctr_encrypt_arm64_crypto_256_start_1
+ adds x11, x9, #1
+ adc x12, x10, xzr
+ cmp w8, #8
+ blt L_aes_ctr_encrypt_arm64_crypto_256_start_4
+ adds x13, x9, #2
+ adc x14, x10, xzr
+ adds x15, x9, #3
+ adc x16, x10, xzr
+L_aes_ctr_encrypt_arm64_crypto_256_start_8
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x0], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x0], #0x40
+ mov v17.d[0], x12
+ mov v17.d[1], x11
+ mov v18.d[0], x14
+ mov v18.d[1], x13
+ adds x17, x9, #4
+ mov v19.d[0], x16
+ adc x19, x10, xzr
+ mov v19.d[1], x15
+ adds x20, x9, #5
+ mov v20.d[0], x19
+ adc x21, x10, xzr
+ mov v20.d[1], x17
+ adds x22, x9, #6
+ mov v21.d[0], x21
+ adc x23, x10, xzr
+ mov v21.d[1], x20
+ adds x24, x9, #7
+ mov v22.d[0], x23
+ adc x25, x10, xzr
+ mov v22.d[1], x22
+ mov v23.d[0], x25
+ mov v23.d[1], x24
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ rev64 v18.16b, v18.16b
+ rev64 v19.16b, v19.16b
+ rev64 v20.16b, v20.16b
+ rev64 v21.16b, v21.16b
+ rev64 v22.16b, v22.16b
+ rev64 v23.16b, v23.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v0.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v0.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v0.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v0.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v0.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v0.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v1.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v1.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v1.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v1.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v1.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v1.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v2.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v2.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v2.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v2.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v2.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v2.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v3.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v3.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v3.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v3.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v3.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v3.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v4.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v4.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v4.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v4.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v4.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v4.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v5.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v5.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v5.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v5.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v5.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v5.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v6.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v6.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v6.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v6.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v6.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v6.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v7.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v7.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v7.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v7.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v7.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v7.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v8.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v8.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v8.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v8.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v8.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v8.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v9.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v9.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v9.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v9.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v9.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v9.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v10.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v10.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v10.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v10.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v10.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v10.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v11.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v11.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v11.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v11.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v11.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v11.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v12.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v12.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v12.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v12.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v12.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v12.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v14.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v14.16b
+ aese v18.16b, v13.16b
+ eor v18.16b, v18.16b, v14.16b
+ aese v19.16b, v13.16b
+ eor v19.16b, v19.16b, v14.16b
+ aese v20.16b, v13.16b
+ eor v20.16b, v20.16b, v14.16b
+ aese v21.16b, v13.16b
+ eor v21.16b, v21.16b, v14.16b
+ aese v22.16b, v13.16b
+ eor v22.16b, v22.16b, v14.16b
+ aese v23.16b, v13.16b
+ eor v23.16b, v23.16b, v14.16b
+ adds x9, x9, #8
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ adds x11, x11, #8
+ eor v26.16b, v26.16b, v18.16b
+ adc x12, x12, xzr
+ eor v27.16b, v27.16b, v19.16b
+ adds x13, x13, #8
+ eor v28.16b, v28.16b, v20.16b
+ adc x14, x14, xzr
+ eor v29.16b, v29.16b, v21.16b
+ adds x15, x15, #8
+ eor v30.16b, v30.16b, v22.16b
+ adc x16, x16, xzr
+ eor v31.16b, v31.16b, v23.16b
+ sub w8, w8, #8
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ st1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x1], #0x40
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+ cmp w8, #8
+ bge L_aes_ctr_encrypt_arm64_crypto_256_start_8
+L_aes_ctr_encrypt_arm64_crypto_256_start_4
+ cmp w8, #4
+ blt L_aes_ctr_encrypt_arm64_crypto_256_start_2
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x0], #0x40
+ adds x13, x9, #2
+ mov v17.d[0], x12
+ adc x14, x10, xzr
+ mov v17.d[1], x11
+ adds x15, x9, #3
+ mov v18.d[0], x14
+ adc x16, x10, xzr
+ mov v18.d[1], x13
+ mov v19.d[0], x16
+ mov v19.d[1], x15
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ rev64 v18.16b, v18.16b
+ rev64 v19.16b, v19.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v0.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v0.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v1.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v1.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v2.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v2.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v3.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v3.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v4.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v4.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v5.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v5.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v6.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v6.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v7.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v7.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v8.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v8.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v9.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v9.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v10.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v10.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v11.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v11.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v12.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v12.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v14.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v14.16b
+ aese v18.16b, v13.16b
+ eor v18.16b, v18.16b, v14.16b
+ aese v19.16b, v13.16b
+ eor v19.16b, v19.16b, v14.16b
+ adds x9, x9, #4
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ adds x11, x11, #4
+ eor v26.16b, v26.16b, v18.16b
+ adc x12, x12, xzr
+ eor v27.16b, v27.16b, v19.16b
+ sub w8, w8, #4
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+L_aes_ctr_encrypt_arm64_crypto_256_start_2
+ cmp w8, #2
+ blt L_aes_ctr_encrypt_arm64_crypto_256_start_1
+ ld1 {v24.16b, v25.16b}, [x0], #32
+ eor v20.16b, v20.16b, v20.16b
+ ext v19.16b, v16.16b, v16.16b, #8
+ movi v18.16b, #1
+ ext v18.16b, v18.16b, v20.16b, #15
+ add v17.2d, v19.2d, v18.2d
+ cmeq v19.2d, v17.2d, #0
+ ext v19.16b, v20.16b, v19.16b, #8
+ sub v17.2d, v17.2d, v19.2d
+ ext v17.16b, v17.16b, v17.16b, #8
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v14.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v14.16b
+ adds x9, x9, #2
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ sub w8, w8, #2
+ st1 {v24.16b, v25.16b}, [x1], #32
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+L_aes_ctr_encrypt_arm64_crypto_256_start_1
+ cbz w8, L_aes_ctr_encrypt_arm64_crypto_256_done
+ ld1 {v24.16b}, [x0], #16
+ rev64 v16.16b, v16.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v14.16b
+ adds x9, x9, #1
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ st1 {v24.16b}, [x1], #16
+L_aes_ctr_encrypt_arm64_crypto_256_done
+ cbz w2, L_aes_ctr_encrypt_arm64_crypto_256_partial_done
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+ rev64 v16.16b, v16.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v14.16b
+ adds x9, x9, #1
+ adc x10, x10, xzr
+ st1 {v16.2d}, [x5]
+ mov w13, #16
+ sub w13, w13, w2
+L_aes_ctr_encrypt_arm64_crypto_256_start_byte
+ ldrb w11, [x5], #1
+ ldrb w12, [x0], #1
+ eor w11, w11, w12
+ subs w2, w2, #1
+ strb w11, [x1], #1
+ bgt L_aes_ctr_encrypt_arm64_crypto_256_start_byte
+ str w13, [x6]
+L_aes_ctr_encrypt_arm64_crypto_256_partial_done
+ ENDIF
+ b L_aes_ctr_encrypt_arm64_crypto_done
+ ; AES_CTR_128
+L_aes_ctr_encrypt_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ ld1 {v8.2d, v9.2d}, [x4], #32
+ ld1 {v10.2d}, [x4]
+ cmp w8, #1
+ ble L_aes_ctr_encrypt_arm64_crypto_128_start_1
+ adds x11, x9, #1
+ adc x12, x10, xzr
+ cmp w8, #8
+ blt L_aes_ctr_encrypt_arm64_crypto_128_start_4
+ adds x13, x9, #2
+ adc x14, x10, xzr
+ adds x15, x9, #3
+ adc x16, x10, xzr
+L_aes_ctr_encrypt_arm64_crypto_128_start_8
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x0], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x0], #0x40
+ mov v17.d[0], x12
+ mov v17.d[1], x11
+ mov v18.d[0], x14
+ mov v18.d[1], x13
+ adds x17, x9, #4
+ mov v19.d[0], x16
+ adc x19, x10, xzr
+ mov v19.d[1], x15
+ adds x20, x9, #5
+ mov v20.d[0], x19
+ adc x21, x10, xzr
+ mov v20.d[1], x17
+ adds x22, x9, #6
+ mov v21.d[0], x21
+ adc x23, x10, xzr
+ mov v21.d[1], x20
+ adds x24, x9, #7
+ mov v22.d[0], x23
+ adc x25, x10, xzr
+ mov v22.d[1], x22
+ mov v23.d[0], x25
+ mov v23.d[1], x24
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ rev64 v18.16b, v18.16b
+ rev64 v19.16b, v19.16b
+ rev64 v20.16b, v20.16b
+ rev64 v21.16b, v21.16b
+ rev64 v22.16b, v22.16b
+ rev64 v23.16b, v23.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v0.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v0.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v0.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v0.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v0.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v0.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v1.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v1.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v1.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v1.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v1.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v1.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v2.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v2.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v2.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v2.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v2.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v2.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v3.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v3.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v3.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v3.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v3.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v3.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v4.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v4.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v4.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v4.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v4.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v4.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v5.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v5.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v5.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v5.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v5.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v5.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v6.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v6.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v6.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v6.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v6.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v6.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v7.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v7.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v7.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v7.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v7.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v7.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v8.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v8.16b
+ aesmc v19.16b, v19.16b
+ aese v20.16b, v8.16b
+ aesmc v20.16b, v20.16b
+ aese v21.16b, v8.16b
+ aesmc v21.16b, v21.16b
+ aese v22.16b, v8.16b
+ aesmc v22.16b, v22.16b
+ aese v23.16b, v8.16b
+ aesmc v23.16b, v23.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ aese v18.16b, v9.16b
+ eor v18.16b, v18.16b, v10.16b
+ aese v19.16b, v9.16b
+ eor v19.16b, v19.16b, v10.16b
+ aese v20.16b, v9.16b
+ eor v20.16b, v20.16b, v10.16b
+ aese v21.16b, v9.16b
+ eor v21.16b, v21.16b, v10.16b
+ aese v22.16b, v9.16b
+ eor v22.16b, v22.16b, v10.16b
+ aese v23.16b, v9.16b
+ eor v23.16b, v23.16b, v10.16b
+ adds x9, x9, #8
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ adds x11, x11, #8
+ eor v26.16b, v26.16b, v18.16b
+ adc x12, x12, xzr
+ eor v27.16b, v27.16b, v19.16b
+ adds x13, x13, #8
+ eor v28.16b, v28.16b, v20.16b
+ adc x14, x14, xzr
+ eor v29.16b, v29.16b, v21.16b
+ adds x15, x15, #8
+ eor v30.16b, v30.16b, v22.16b
+ adc x16, x16, xzr
+ eor v31.16b, v31.16b, v23.16b
+ sub w8, w8, #8
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ st1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x1], #0x40
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+ cmp w8, #8
+ bge L_aes_ctr_encrypt_arm64_crypto_128_start_8
+L_aes_ctr_encrypt_arm64_crypto_128_start_4
+ cmp w8, #4
+ blt L_aes_ctr_encrypt_arm64_crypto_128_start_2
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x0], #0x40
+ adds x13, x9, #2
+ mov v17.d[0], x12
+ adc x14, x10, xzr
+ mov v17.d[1], x11
+ adds x15, x9, #3
+ mov v18.d[0], x14
+ adc x16, x10, xzr
+ mov v18.d[1], x13
+ mov v19.d[0], x16
+ mov v19.d[1], x15
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ rev64 v18.16b, v18.16b
+ rev64 v19.16b, v19.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v0.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v0.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v1.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v1.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v2.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v2.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v3.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v3.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v4.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v4.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v5.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v5.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v6.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v6.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v7.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v7.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v18.16b, v8.16b
+ aesmc v18.16b, v18.16b
+ aese v19.16b, v8.16b
+ aesmc v19.16b, v19.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ aese v18.16b, v9.16b
+ eor v18.16b, v18.16b, v10.16b
+ aese v19.16b, v9.16b
+ eor v19.16b, v19.16b, v10.16b
+ adds x9, x9, #4
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ adds x11, x11, #4
+ eor v26.16b, v26.16b, v18.16b
+ adc x12, x12, xzr
+ eor v27.16b, v27.16b, v19.16b
+ sub w8, w8, #4
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+L_aes_ctr_encrypt_arm64_crypto_128_start_2
+ cmp w8, #2
+ blt L_aes_ctr_encrypt_arm64_crypto_128_start_1
+ ld1 {v24.16b, v25.16b}, [x0], #32
+ eor v20.16b, v20.16b, v20.16b
+ ext v19.16b, v16.16b, v16.16b, #8
+ movi v18.16b, #1
+ ext v18.16b, v18.16b, v20.16b, #15
+ add v17.2d, v19.2d, v18.2d
+ cmeq v19.2d, v17.2d, #0
+ ext v19.16b, v20.16b, v19.16b, #8
+ sub v17.2d, v17.2d, v19.2d
+ ext v17.16b, v17.16b, v17.16b, #8
+ rev64 v16.16b, v16.16b
+ rev64 v17.16b, v17.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ adds x9, x9, #2
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ eor v25.16b, v25.16b, v17.16b
+ sub w8, w8, #2
+ st1 {v24.16b, v25.16b}, [x1], #32
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+L_aes_ctr_encrypt_arm64_crypto_128_start_1
+ cbz w8, L_aes_ctr_encrypt_arm64_crypto_128_done
+ ld1 {v24.16b}, [x0], #16
+ rev64 v16.16b, v16.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ adds x9, x9, #1
+ eor v24.16b, v24.16b, v16.16b
+ adc x10, x10, xzr
+ st1 {v24.16b}, [x1], #16
+L_aes_ctr_encrypt_arm64_crypto_128_done
+ cbz w2, L_aes_ctr_encrypt_arm64_crypto_128_partial_done
+ mov v16.d[0], x10
+ mov v16.d[1], x9
+ rev64 v16.16b, v16.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ adds x9, x9, #1
+ adc x10, x10, xzr
+ st1 {v16.2d}, [x5]
+ mov w13, #16
+ sub w13, w13, w2
+L_aes_ctr_encrypt_arm64_crypto_128_start_byte
+ ldrb w11, [x5], #1
+ ldrb w12, [x0], #1
+ eor w11, w11, w12
+ subs w2, w2, #1
+ strb w11, [x1], #1
+ bgt L_aes_ctr_encrypt_arm64_crypto_128_start_byte
+ str w13, [x6]
+L_aes_ctr_encrypt_arm64_crypto_128_partial_done
+ ENDIF
+L_aes_ctr_encrypt_arm64_crypto_done
+ rev x11, x10
+ rev x12, x9
+ stp x11, x12, [x3]
+ ldp x17, x19, [x29, #16]
+ ldp x20, x21, [x29, #32]
+ ldp x22, x23, [x29, #48]
+ ldp x24, x25, [x29, #64]
+ ldp d8, d9, [x29, #80]
+ ldp d10, d11, [x29, #96]
+ ldp d12, d13, [x29, #112]
+ ldp d14, d15, [x29, #128]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:HAVE_AESGCM
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_set_key_AARCH64
+AES_GCM_set_key_AARCH64 PROC
+ ld1 {v0.16b}, [x0]
+ ld1 {v1.2d, v2.2d, v3.2d, v4.2d}, [x1], #0x40
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v3.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v4.16b
+ aesmc v0.16b, v0.16b
+ ld1 {v1.2d, v2.2d, v3.2d, v4.2d}, [x1], #0x40
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v3.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v4.16b
+ aesmc v0.16b, v0.16b
+ subs w3, w3, #10
+ ld1 {v1.2d, v2.2d}, [x1], #32
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ beq L_aes_gcm_set_key_arm64_crypto_round_done
+ ld1 {v1.2d, v2.2d}, [x1], #32
+ subs w3, w3, #2
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+ beq L_aes_gcm_set_key_arm64_crypto_round_done
+ ld1 {v1.2d, v2.2d}, [x1], #32
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v1.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v2.16b
+L_aes_gcm_set_key_arm64_crypto_round_done
+ ld1 {v1.2d}, [x1]
+ eor v0.16b, v0.16b, v1.16b
+ rbit v0.16b, v0.16b
+ st1 {v0.2d}, [x2]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_AARCH64
+AES_GCM_encrypt_AARCH64 PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ str x24, [x29, #72]
+ stp d8, d9, [x29, #80]
+ stp d10, d11, [x29, #96]
+ stp d12, d13, [x29, #112]
+ stp d14, d15, [x29, #128]
+ ldr w8, [x29, #144]
+ ldr x9, [x29, #152]
+ ldr x10, [x29, #160]
+ ldr x11, [x29, #168]
+ ldr x12, [x29, #176]
+ ldr w13, [x29, #184]
+ movi v27.16b, #0x87
+ eor v26.16b, v26.16b, v26.16b
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x10]
+ cmp w8, #0x40
+ csetm x16, lt
+ cmp w2, #32
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_encrypt_arm64_crypto_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w8, #0x100
+ csetm x16, lt
+ cmp w2, #0x40
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_encrypt_arm64_crypto_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w8, #0x400
+ csetm x16, lt
+ cmp w2, #0x200
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_encrypt_arm64_crypto_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_encrypt_arm64_crypto_h_done
+ lsr w14, w8, #4
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_start_2
+ cmp w14, #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_start_4
+L_aes_gcm_encrypt_arm64_crypto_aad_start_8
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #8
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_aad_start_8
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_done
+ beq L_aes_gcm_encrypt_arm64_crypto_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_start_2
+L_aes_gcm_encrypt_arm64_crypto_aad_start_4
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #4
+ cmp w14, #4
+ bge L_aes_gcm_encrypt_arm64_crypto_aad_start_4
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_done
+ beq L_aes_gcm_encrypt_arm64_crypto_aad_start_1
+L_aes_gcm_encrypt_arm64_crypto_aad_start_2
+ ld1 {v18.16b, v19.16b}, [x7], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #2
+ cmp w14, #1
+ bgt L_aes_gcm_encrypt_arm64_crypto_aad_start_2
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_done
+L_aes_gcm_encrypt_arm64_crypto_aad_start_1
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_aad_done
+L_aes_gcm_encrypt_arm64_crypto_aad_both_1
+ ld1 {v18.16b}, [x7], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_encrypt_arm64_crypto_aad_both_1
+L_aes_gcm_encrypt_arm64_crypto_aad_done
+ and w14, w8, #15
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_aad_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w14
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_start_dw
+ ldr x19, [x7], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_aad_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_start_sw
+ ldr w19, [x7], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_aad_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_aad_start_byte
+ ldrh w19, [x7], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_aad_start_byte
+ cbz w20, L_aes_gcm_encrypt_arm64_crypto_aad_end_bytes
+ ldrb w19, [x7], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_aad_start_byte
+L_aes_gcm_encrypt_arm64_crypto_aad_end_bytes
+ sub x11, x11, x14
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_aad_partial_done
+ ; Load Nonce
+ cmp w4, #12
+ bne L_aes_gcm_encrypt_arm64_crypto_ghash_nonce
+ ldr x16, [x3]
+ movi v13.4s, #1, lsl 24
+ ldr w17, [x3, #8]
+ mov v13.d[0], x16
+ mov v13.s[2], w17
+ mov w15, #1
+ b L_aes_gcm_encrypt_arm64_crypto_done_nonce
+L_aes_gcm_encrypt_arm64_crypto_ghash_nonce
+ eor v13.16b, v13.16b, v13.16b
+ lsr w14, w4, #4
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_nonce_done
+L_aes_gcm_encrypt_arm64_crypto_nonce_start_1
+ ld1 {v18.16b}, [x3], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_encrypt_arm64_crypto_nonce_start_1
+L_aes_gcm_encrypt_arm64_crypto_nonce_done
+ and w24, w4, #15
+ cbz x24, L_aes_gcm_encrypt_arm64_crypto_nonce_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w24
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_nonce_start_dw
+ ldr x19, [x3], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_nonce_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_nonce_start_sw
+ ldr w19, [x3], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_nonce_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_nonce_start_byte
+ ldrh w19, [x3], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_nonce_start_byte
+ cbz w20, L_aes_gcm_encrypt_arm64_crypto_nonce_end_bytes
+ ldrb w19, [x3], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_nonce_start_byte
+L_aes_gcm_encrypt_arm64_crypto_nonce_end_bytes
+ sub x11, x11, x24
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_nonce_partial_done
+ eor x14, x14, x14
+ ubfiz x24, x4, #3, #32
+ mov v28.d[0], x14
+ mov v28.d[1], x24
+ rev64 v28.16b, v28.16b
+ rbit v28.16b, v28.16b
+ eor v13.16b, v13.16b, v28.16b
+ pmull v28.1q, v13.1d, v22.1d
+ pmull2 v29.1q, v13.2d, v22.2d
+ ext v31.16b, v13.16b, v13.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ rbit v13.16b, v13.16b
+ mov w15, v13.s[3]
+ rev w15, w15
+L_aes_gcm_encrypt_arm64_crypto_done_nonce
+ st1 {v13.2d}, [x12]
+ lsr w14, w2, #4
+ cmp w13, #12
+ blt L_aes_gcm_encrypt_arm64_crypto_start_128
+ bgt L_aes_gcm_encrypt_arm64_crypto_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w14, #32
+ blt L_aes_gcm_encrypt_arm64_crypto_192_start_4
+L_aes_gcm_encrypt_arm64_crypto_192_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ rev w23, w23
+ rev w22, w22
+ rev w21, w21
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_192_end_8
+L_aes_gcm_encrypt_arm64_crypto_192_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ mov v28.d[1], v31.d[0]
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_192_both_8
+L_aes_gcm_encrypt_arm64_crypto_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_192_done
+ beq L_aes_gcm_encrypt_arm64_crypto_192_start_1
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_192_end_4
+L_aes_gcm_encrypt_arm64_crypto_192_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ bge L_aes_gcm_encrypt_arm64_crypto_192_both_4
+L_aes_gcm_encrypt_arm64_crypto_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_encrypt_arm64_crypto_192_start_1
+ blt L_aes_gcm_encrypt_arm64_crypto_192_done
+L_aes_gcm_encrypt_arm64_crypto_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_192_done
+L_aes_gcm_encrypt_arm64_crypto_192_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_192_done
+ ands w14, w2, #15
+ beq L_aes_gcm_encrypt_arm64_crypto_192_partial_done
+ eor v16.16b, v16.16b, v16.16b
+ mov w19, w14
+ st1 {v16.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_192_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_192_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_192_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_192_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_192_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_192_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_192_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_192_start_byte
+L_aes_gcm_encrypt_arm64_crypto_192_end_bytes
+ sub x11, x11, x14
+ ld1 {v16.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v16.16b, v16.16b, v14.16b
+ st1 {v16.2d}, [x11]
+ mov w19, w14
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_192_out_start_dw
+ ldr x17, [x11], #8
+ sub x19, x19, #8
+ str x17, [x1], #8
+L_aes_gcm_encrypt_arm64_crypto_192_out_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_192_out_start_sw
+ ldr w17, [x11], #4
+ sub x19, x19, #4
+ str w17, [x1], #4
+L_aes_gcm_encrypt_arm64_crypto_192_out_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_192_out_start_byte
+ ldrh w17, [x11], #2
+ sub x19, x19, #2
+ strh w17, [x1], #2
+L_aes_gcm_encrypt_arm64_crypto_192_out_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_192_out_end_bytes
+ ldrb w17, [x11], #1
+ subs x19, x19, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_192_out_start_byte
+L_aes_gcm_encrypt_arm64_crypto_192_out_end_bytes
+ mov x17, #16
+ sub x17, x17, x14
+L_aes_gcm_encrypt_arm64_crypto_192_start_zero
+ subs x17, x17, #1
+ strb wzr, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_192_start_zero
+ sub x11, x11, #16
+ ld1 {v14.2d}, [x11]
+ rbit v14.16b, v14.16b
+ eor v15.16b, v26.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v15.1d, v22.1d
+ pmull2 v29.1q, v15.2d, v22.2d
+ ext v31.16b, v15.16b, v15.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_192_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ bne L_aes_gcm_encrypt_arm64_crypto_192_tag_partial
+ st1 {v26.16b}, [x5]
+ b L_aes_gcm_encrypt_arm64_crypto_done
+L_aes_gcm_encrypt_arm64_crypto_192_tag_partial
+ st1 {v26.16b}, [x11]
+ cmp w6, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_192_tag_start_dw
+ ldr x16, [x11], #8
+ sub w6, w6, #8
+ str x16, [x5], #8
+L_aes_gcm_encrypt_arm64_crypto_192_tag_start_dw
+ cmp w6, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_192_tag_start_sw
+ ldr w16, [x11], #4
+ sub w6, w6, #4
+ str w16, [x5], #4
+L_aes_gcm_encrypt_arm64_crypto_192_tag_start_sw
+ cmp w6, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_192_tag_start_byte
+ ldrh w16, [x11], #2
+ sub w6, w6, #2
+ strh w16, [x5], #2
+L_aes_gcm_encrypt_arm64_crypto_192_tag_start_byte
+ cbz w6, L_aes_gcm_encrypt_arm64_crypto_192_tag_end_bytes
+ ldrb w16, [x11], #1
+ subs w6, w6, #1
+ strb w16, [x5], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_192_tag_start_byte
+L_aes_gcm_encrypt_arm64_crypto_192_tag_end_bytes
+ ENDIF
+ b L_aes_gcm_encrypt_arm64_crypto_done
+ ; AES_GCM_256
+L_aes_gcm_encrypt_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w14, #32
+ blt L_aes_gcm_encrypt_arm64_crypto_256_start_4
+L_aes_gcm_encrypt_arm64_crypto_256_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ rev w23, w23
+ rev w22, w22
+ rev w21, w21
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_256_end_8
+L_aes_gcm_encrypt_arm64_crypto_256_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ mov v28.d[1], v31.d[0]
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_256_both_8
+L_aes_gcm_encrypt_arm64_crypto_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9], #16
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_256_done
+ beq L_aes_gcm_encrypt_arm64_crypto_256_start_1
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_256_end_4
+L_aes_gcm_encrypt_arm64_crypto_256_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ bge L_aes_gcm_encrypt_arm64_crypto_256_both_4
+L_aes_gcm_encrypt_arm64_crypto_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_encrypt_arm64_crypto_256_start_1
+ blt L_aes_gcm_encrypt_arm64_crypto_256_done
+L_aes_gcm_encrypt_arm64_crypto_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_256_done
+L_aes_gcm_encrypt_arm64_crypto_256_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_256_done
+ ands w14, w2, #15
+ beq L_aes_gcm_encrypt_arm64_crypto_256_partial_done
+ eor v16.16b, v16.16b, v16.16b
+ mov w19, w14
+ st1 {v16.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_256_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_256_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_256_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_256_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_256_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_256_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_256_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_256_start_byte
+L_aes_gcm_encrypt_arm64_crypto_256_end_bytes
+ sub x11, x11, x14
+ ld1 {v16.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v16.16b, v16.16b, v14.16b
+ st1 {v16.2d}, [x11]
+ mov w19, w14
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_256_out_start_dw
+ ldr x17, [x11], #8
+ sub x19, x19, #8
+ str x17, [x1], #8
+L_aes_gcm_encrypt_arm64_crypto_256_out_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_256_out_start_sw
+ ldr w17, [x11], #4
+ sub x19, x19, #4
+ str w17, [x1], #4
+L_aes_gcm_encrypt_arm64_crypto_256_out_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_256_out_start_byte
+ ldrh w17, [x11], #2
+ sub x19, x19, #2
+ strh w17, [x1], #2
+L_aes_gcm_encrypt_arm64_crypto_256_out_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_256_out_end_bytes
+ ldrb w17, [x11], #1
+ subs x19, x19, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_256_out_start_byte
+L_aes_gcm_encrypt_arm64_crypto_256_out_end_bytes
+ mov x17, #16
+ sub x17, x17, x14
+L_aes_gcm_encrypt_arm64_crypto_256_start_zero
+ subs x17, x17, #1
+ strb wzr, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_256_start_zero
+ sub x11, x11, #16
+ ld1 {v14.2d}, [x11]
+ rbit v14.16b, v14.16b
+ eor v15.16b, v26.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v15.1d, v22.1d
+ pmull2 v29.1q, v15.2d, v22.2d
+ ext v31.16b, v15.16b, v15.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_256_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v28.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ ldr q11, [x9, #-32]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ ldr q12, [x9, #-16]
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ bne L_aes_gcm_encrypt_arm64_crypto_256_tag_partial
+ st1 {v26.16b}, [x5]
+ b L_aes_gcm_encrypt_arm64_crypto_done
+L_aes_gcm_encrypt_arm64_crypto_256_tag_partial
+ st1 {v26.16b}, [x11]
+ cmp w6, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_256_tag_start_dw
+ ldr x16, [x11], #8
+ sub w6, w6, #8
+ str x16, [x5], #8
+L_aes_gcm_encrypt_arm64_crypto_256_tag_start_dw
+ cmp w6, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_256_tag_start_sw
+ ldr w16, [x11], #4
+ sub w6, w6, #4
+ str w16, [x5], #4
+L_aes_gcm_encrypt_arm64_crypto_256_tag_start_sw
+ cmp w6, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_256_tag_start_byte
+ ldrh w16, [x11], #2
+ sub w6, w6, #2
+ strh w16, [x5], #2
+L_aes_gcm_encrypt_arm64_crypto_256_tag_start_byte
+ cbz w6, L_aes_gcm_encrypt_arm64_crypto_256_tag_end_bytes
+ ldrb w16, [x11], #1
+ subs w6, w6, #1
+ strb w16, [x5], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_256_tag_start_byte
+L_aes_gcm_encrypt_arm64_crypto_256_tag_end_bytes
+ ENDIF
+ b L_aes_gcm_encrypt_arm64_crypto_done
+ ; AES_GCM_128
+L_aes_gcm_encrypt_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w14, #32
+ blt L_aes_gcm_encrypt_arm64_crypto_128_start_4
+L_aes_gcm_encrypt_arm64_crypto_128_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ rev w23, w23
+ rev w22, w22
+ rev w21, w21
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_128_end_8
+L_aes_gcm_encrypt_arm64_crypto_128_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ mov v28.d[1], v31.d[0]
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_128_both_8
+L_aes_gcm_encrypt_arm64_crypto_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d}, [x9], #32
+ ld1 {v10.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_128_done
+ beq L_aes_gcm_encrypt_arm64_crypto_128_start_1
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_128_end_4
+L_aes_gcm_encrypt_arm64_crypto_128_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ bge L_aes_gcm_encrypt_arm64_crypto_128_both_4
+L_aes_gcm_encrypt_arm64_crypto_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_encrypt_arm64_crypto_128_start_1
+ blt L_aes_gcm_encrypt_arm64_crypto_128_done
+L_aes_gcm_encrypt_arm64_crypto_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_128_done
+L_aes_gcm_encrypt_arm64_crypto_128_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x0], #16
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_128_done
+ ands w14, w2, #15
+ beq L_aes_gcm_encrypt_arm64_crypto_128_partial_done
+ eor v16.16b, v16.16b, v16.16b
+ mov w19, w14
+ st1 {v16.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_128_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_128_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_128_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_128_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_128_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_128_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_128_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_128_start_byte
+L_aes_gcm_encrypt_arm64_crypto_128_end_bytes
+ sub x11, x11, x14
+ ld1 {v16.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ eor v16.16b, v16.16b, v14.16b
+ st1 {v16.2d}, [x11]
+ mov w19, w14
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_128_out_start_dw
+ ldr x17, [x11], #8
+ sub x19, x19, #8
+ str x17, [x1], #8
+L_aes_gcm_encrypt_arm64_crypto_128_out_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_128_out_start_sw
+ ldr w17, [x11], #4
+ sub x19, x19, #4
+ str w17, [x1], #4
+L_aes_gcm_encrypt_arm64_crypto_128_out_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_128_out_start_byte
+ ldrh w17, [x11], #2
+ sub x19, x19, #2
+ strh w17, [x1], #2
+L_aes_gcm_encrypt_arm64_crypto_128_out_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_128_out_end_bytes
+ ldrb w17, [x11], #1
+ subs x19, x19, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_128_out_start_byte
+L_aes_gcm_encrypt_arm64_crypto_128_out_end_bytes
+ mov x17, #16
+ sub x17, x17, x14
+L_aes_gcm_encrypt_arm64_crypto_128_start_zero
+ subs x17, x17, #1
+ strb wzr, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_128_start_zero
+ sub x11, x11, #16
+ ld1 {v14.2d}, [x11]
+ rbit v14.16b, v14.16b
+ eor v15.16b, v26.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v15.1d, v22.1d
+ pmull2 v29.1q, v15.2d, v22.2d
+ ext v31.16b, v15.16b, v15.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_128_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ ext v31.16b, v26.16b, v26.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ bne L_aes_gcm_encrypt_arm64_crypto_128_tag_partial
+ st1 {v26.16b}, [x5]
+ b L_aes_gcm_encrypt_arm64_crypto_done
+L_aes_gcm_encrypt_arm64_crypto_128_tag_partial
+ st1 {v26.16b}, [x11]
+ cmp w6, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_128_tag_start_dw
+ ldr x16, [x11], #8
+ sub w6, w6, #8
+ str x16, [x5], #8
+L_aes_gcm_encrypt_arm64_crypto_128_tag_start_dw
+ cmp w6, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_128_tag_start_sw
+ ldr w16, [x11], #4
+ sub w6, w6, #4
+ str w16, [x5], #4
+L_aes_gcm_encrypt_arm64_crypto_128_tag_start_sw
+ cmp w6, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_128_tag_start_byte
+ ldrh w16, [x11], #2
+ sub w6, w6, #2
+ strh w16, [x5], #2
+L_aes_gcm_encrypt_arm64_crypto_128_tag_start_byte
+ cbz w6, L_aes_gcm_encrypt_arm64_crypto_128_tag_end_bytes
+ ldrb w16, [x11], #1
+ subs w6, w6, #1
+ strb w16, [x5], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_128_tag_start_byte
+L_aes_gcm_encrypt_arm64_crypto_128_tag_end_bytes
+ ENDIF
+L_aes_gcm_encrypt_arm64_crypto_done
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldr x24, [x29, #72]
+ ldp d8, d9, [x29, #80]
+ ldp d10, d11, [x29, #96]
+ ldp d12, d13, [x29, #112]
+ ldp d14, d15, [x29, #128]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_decrypt_AARCH64
+AES_GCM_decrypt_AARCH64 PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ str x24, [x29, #72]
+ stp d8, d9, [x29, #80]
+ stp d10, d11, [x29, #96]
+ stp d12, d13, [x29, #112]
+ stp d14, d15, [x29, #128]
+ ldr w8, [x29, #144]
+ ldr x9, [x29, #152]
+ ldr x10, [x29, #160]
+ ldr x11, [x29, #168]
+ ldr x12, [x29, #176]
+ ldr w13, [x29, #184]
+ movi v27.16b, #0x87
+ eor v26.16b, v26.16b, v26.16b
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x10]
+ cmp w8, #0x40
+ csetm x16, lt
+ cmp w2, #32
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_decrypt_arm64_crypto_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w8, #0x100
+ csetm x16, lt
+ cmp w2, #0x40
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_decrypt_arm64_crypto_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w8, #0x400
+ csetm x16, lt
+ cmp w2, #0x200
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_decrypt_arm64_crypto_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_decrypt_arm64_crypto_h_done
+ lsr w14, w8, #4
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_start_2
+ cmp w14, #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_start_4
+L_aes_gcm_decrypt_arm64_crypto_aad_start_8
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #8
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_aad_start_8
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_done
+ beq L_aes_gcm_decrypt_arm64_crypto_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_start_2
+L_aes_gcm_decrypt_arm64_crypto_aad_start_4
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #4
+ cmp w14, #4
+ bge L_aes_gcm_decrypt_arm64_crypto_aad_start_4
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_done
+ beq L_aes_gcm_decrypt_arm64_crypto_aad_start_1
+L_aes_gcm_decrypt_arm64_crypto_aad_start_2
+ ld1 {v18.16b, v19.16b}, [x7], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #2
+ cmp w14, #1
+ bgt L_aes_gcm_decrypt_arm64_crypto_aad_start_2
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_done
+L_aes_gcm_decrypt_arm64_crypto_aad_start_1
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_aad_done
+L_aes_gcm_decrypt_arm64_crypto_aad_both_1
+ ld1 {v18.16b}, [x7], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_aad_both_1
+L_aes_gcm_decrypt_arm64_crypto_aad_done
+ and w14, w8, #15
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_aad_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w14
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_start_dw
+ ldr x19, [x7], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_aad_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_start_sw
+ ldr w19, [x7], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_aad_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_aad_start_byte
+ ldrh w19, [x7], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_aad_start_byte
+ cbz w20, L_aes_gcm_decrypt_arm64_crypto_aad_end_bytes
+ ldrb w19, [x7], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_aad_start_byte
+L_aes_gcm_decrypt_arm64_crypto_aad_end_bytes
+ sub x11, x11, x14
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_aad_partial_done
+ ; Load Nonce
+ cmp w4, #12
+ bne L_aes_gcm_decrypt_arm64_crypto_ghash_nonce
+ ldr x16, [x3]
+ movi v13.4s, #1, lsl 24
+ ldr w17, [x3, #8]
+ mov v13.d[0], x16
+ mov v13.s[2], w17
+ mov w15, #1
+ b L_aes_gcm_decrypt_arm64_crypto_done_nonce
+L_aes_gcm_decrypt_arm64_crypto_ghash_nonce
+ eor v13.16b, v13.16b, v13.16b
+ lsr w14, w4, #4
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_nonce_done
+L_aes_gcm_decrypt_arm64_crypto_nonce_start_1
+ ld1 {v18.16b}, [x3], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_nonce_start_1
+L_aes_gcm_decrypt_arm64_crypto_nonce_done
+ and w24, w4, #15
+ cbz x24, L_aes_gcm_decrypt_arm64_crypto_nonce_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w24
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_nonce_start_dw
+ ldr x19, [x3], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_nonce_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_nonce_start_sw
+ ldr w19, [x3], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_nonce_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_nonce_start_byte
+ ldrh w19, [x3], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_nonce_start_byte
+ cbz w20, L_aes_gcm_decrypt_arm64_crypto_nonce_end_bytes
+ ldrb w19, [x3], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_nonce_start_byte
+L_aes_gcm_decrypt_arm64_crypto_nonce_end_bytes
+ sub x11, x11, x24
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_nonce_partial_done
+ eor x14, x14, x14
+ ubfiz x24, x4, #3, #32
+ mov v28.d[0], x14
+ mov v28.d[1], x24
+ rev64 v28.16b, v28.16b
+ rbit v28.16b, v28.16b
+ eor v13.16b, v13.16b, v28.16b
+ pmull v28.1q, v13.1d, v22.1d
+ pmull2 v29.1q, v13.2d, v22.2d
+ ext v31.16b, v13.16b, v13.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ rbit v13.16b, v13.16b
+ mov w15, v13.s[3]
+ rev w15, w15
+L_aes_gcm_decrypt_arm64_crypto_done_nonce
+ st1 {v13.2d}, [x12]
+ lsr w14, w2, #4
+ cmp w13, #12
+ blt L_aes_gcm_decrypt_arm64_crypto_start_128
+ bgt L_aes_gcm_decrypt_arm64_crypto_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w14, #32
+ blt L_aes_gcm_decrypt_arm64_crypto_192_start_4
+L_aes_gcm_decrypt_arm64_crypto_192_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ mov v14.s[3], w24
+ rev w23, w23
+ mov v15.s[3], w23
+ rev w22, w22
+ mov v16.s[3], w22
+ rev w21, w21
+ mov v17.s[3], w21
+ rev w20, w20
+ mov v8.s[3], w20
+ rev w19, w19
+ mov v9.s[3], w19
+ rev w17, w17
+ mov v10.s[3], w17
+ rev w16, w15
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_192_end_8
+L_aes_gcm_decrypt_arm64_crypto_192_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w24
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w23
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w22
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w21
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w20
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w19
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w17
+ rev w16, w15
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_192_both_8
+L_aes_gcm_decrypt_arm64_crypto_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_192_done
+ beq L_aes_gcm_decrypt_arm64_crypto_192_start_1
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w19, w19
+ mov v15.s[3], w19
+ rev w17, w17
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_192_end_4
+L_aes_gcm_decrypt_arm64_crypto_192_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w20
+ rev w19, w19
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w19
+ rev w17, w17
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ bge L_aes_gcm_decrypt_arm64_crypto_192_both_4
+L_aes_gcm_decrypt_arm64_crypto_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_decrypt_arm64_crypto_192_start_1
+ blt L_aes_gcm_decrypt_arm64_crypto_192_done
+L_aes_gcm_decrypt_arm64_crypto_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w16, w15
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_192_done
+L_aes_gcm_decrypt_arm64_crypto_192_start_1
+ ld1 {v15.16b}, [x0], #16
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.16b}, [x1], #16
+L_aes_gcm_decrypt_arm64_crypto_192_done
+ ands w14, w2, #15
+ beq L_aes_gcm_decrypt_arm64_crypto_192_partial_done
+ eor v15.16b, v15.16b, v15.16b
+ mov w19, w14
+ st1 {v15.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_192_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_192_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_192_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_192_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_192_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_192_start_byte
+ cbz x19, L_aes_gcm_decrypt_arm64_crypto_192_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_192_start_byte
+L_aes_gcm_decrypt_arm64_crypto_192_end_bytes
+ sub x11, x11, x14
+ ld1 {v15.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.2d}, [x11]
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_192_out_start_dw
+ ldr x17, [x11], #8
+ sub w14, w14, #8
+ str x17, [x1], #8
+L_aes_gcm_decrypt_arm64_crypto_192_out_start_dw
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_192_out_start_sw
+ ldr w17, [x11], #4
+ sub w14, w14, #4
+ str w17, [x1], #4
+L_aes_gcm_decrypt_arm64_crypto_192_out_start_sw
+ cmp w14, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_192_out_start_byte
+ ldrh w17, [x11], #2
+ sub w14, w14, #2
+ strh w17, [x1], #2
+L_aes_gcm_decrypt_arm64_crypto_192_out_start_byte
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_192_out_end_bytes
+ ldrb w17, [x11], #1
+ subs w14, w14, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_192_out_start_byte
+L_aes_gcm_decrypt_arm64_crypto_192_out_end_bytes
+L_aes_gcm_decrypt_arm64_crypto_192_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_192_part_tag
+ ld1 {v28.16b}, [x5]
+ b L_aes_gcm_decrypt_arm64_crypto_192_tag_loaded
+L_aes_gcm_decrypt_arm64_crypto_192_part_tag
+ ubfiz x6, x6, #0, #32
+ eor v28.16b, v28.16b, v28.16b
+ mov x17, x6
+ st1 {v28.2d}, [x11]
+ cmp x17, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_192_tag_start_dw
+ ldr x16, [x5], #8
+ sub x17, x17, #8
+ str x16, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_192_tag_start_dw
+ cmp x17, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_192_tag_start_sw
+ ldr w16, [x5], #4
+ sub x17, x17, #4
+ str w16, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_192_tag_start_sw
+ cmp x17, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_192_tag_start_byte
+ ldrh w16, [x5], #2
+ sub x17, x17, #2
+ strh w16, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_192_tag_start_byte
+ cbz x17, L_aes_gcm_decrypt_arm64_crypto_192_tag_end_bytes
+ ldrb w16, [x5], #1
+ subs x17, x17, #1
+ strb w16, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_192_tag_start_byte
+L_aes_gcm_decrypt_arm64_crypto_192_tag_end_bytes
+ sub x11, x11, x6
+ ld1 {v28.2d}, [x11]
+ mov x17, #16
+ st1 {v26.2d}, [x11]
+ sub x17, x17, x6
+ add x11, x11, x6
+L_aes_gcm_decrypt_arm64_crypto_192_calc_tag_byte
+ strb wzr, [x11], #1
+ subs x17, x17, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_192_calc_tag_byte
+ subs x11, x11, #16
+ ld1 {v26.2d}, [x11]
+L_aes_gcm_decrypt_arm64_crypto_192_tag_loaded
+ eor v28.16b, v28.16b, v26.16b
+ mov x16, v28.d[0]
+ mov x17, v28.d[1]
+ mov w19, #-180
+ orr x16, x16, x17
+ cmp x16, #0
+ csetm x0, ne
+ and x0, x0, x19
+ ENDIF
+ b L_aes_gcm_decrypt_arm64_crypto_done
+ ; AES_GCM_256
+L_aes_gcm_decrypt_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w14, #32
+ blt L_aes_gcm_decrypt_arm64_crypto_256_start_4
+L_aes_gcm_decrypt_arm64_crypto_256_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ mov v14.s[3], w24
+ rev w23, w23
+ mov v15.s[3], w23
+ rev w22, w22
+ mov v16.s[3], w22
+ rev w21, w21
+ mov v17.s[3], w21
+ rev w20, w20
+ mov v8.s[3], w20
+ rev w19, w19
+ mov v9.s[3], w19
+ rev w17, w17
+ mov v10.s[3], w17
+ rev w16, w15
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_256_end_8
+L_aes_gcm_decrypt_arm64_crypto_256_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w24
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w23
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w22
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w21
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w20
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w19
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w17
+ rev w16, w15
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_256_both_8
+L_aes_gcm_decrypt_arm64_crypto_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9], #16
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_256_done
+ beq L_aes_gcm_decrypt_arm64_crypto_256_start_1
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w19, w19
+ mov v15.s[3], w19
+ rev w17, w17
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_256_end_4
+L_aes_gcm_decrypt_arm64_crypto_256_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w20
+ rev w19, w19
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w19
+ rev w17, w17
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ bge L_aes_gcm_decrypt_arm64_crypto_256_both_4
+L_aes_gcm_decrypt_arm64_crypto_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_decrypt_arm64_crypto_256_start_1
+ blt L_aes_gcm_decrypt_arm64_crypto_256_done
+L_aes_gcm_decrypt_arm64_crypto_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w16, w15
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_256_done
+L_aes_gcm_decrypt_arm64_crypto_256_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_256_done
+ ands w14, w2, #15
+ beq L_aes_gcm_decrypt_arm64_crypto_256_partial_done
+ eor v15.16b, v15.16b, v15.16b
+ mov w19, w14
+ st1 {v15.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_256_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_256_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_256_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_256_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_256_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_256_start_byte
+ cbz x19, L_aes_gcm_decrypt_arm64_crypto_256_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_256_start_byte
+L_aes_gcm_decrypt_arm64_crypto_256_end_bytes
+ sub x11, x11, x14
+ ld1 {v15.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.2d}, [x11]
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_256_out_start_dw
+ ldr x17, [x11], #8
+ sub w14, w14, #8
+ str x17, [x1], #8
+L_aes_gcm_decrypt_arm64_crypto_256_out_start_dw
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_256_out_start_sw
+ ldr w17, [x11], #4
+ sub w14, w14, #4
+ str w17, [x1], #4
+L_aes_gcm_decrypt_arm64_crypto_256_out_start_sw
+ cmp w14, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_256_out_start_byte
+ ldrh w17, [x11], #2
+ sub w14, w14, #2
+ strh w17, [x1], #2
+L_aes_gcm_decrypt_arm64_crypto_256_out_start_byte
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_256_out_end_bytes
+ ldrb w17, [x11], #1
+ subs w14, w14, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_256_out_start_byte
+L_aes_gcm_decrypt_arm64_crypto_256_out_end_bytes
+L_aes_gcm_decrypt_arm64_crypto_256_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v28.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ ldr q11, [x9, #-32]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ ldr q12, [x9, #-16]
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_256_part_tag
+ ld1 {v28.16b}, [x5]
+ b L_aes_gcm_decrypt_arm64_crypto_256_tag_loaded
+L_aes_gcm_decrypt_arm64_crypto_256_part_tag
+ ubfiz x6, x6, #0, #32
+ eor v28.16b, v28.16b, v28.16b
+ mov x17, x6
+ st1 {v28.2d}, [x11]
+ cmp x17, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_256_tag_start_dw
+ ldr x16, [x5], #8
+ sub x17, x17, #8
+ str x16, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_256_tag_start_dw
+ cmp x17, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_256_tag_start_sw
+ ldr w16, [x5], #4
+ sub x17, x17, #4
+ str w16, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_256_tag_start_sw
+ cmp x17, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_256_tag_start_byte
+ ldrh w16, [x5], #2
+ sub x17, x17, #2
+ strh w16, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_256_tag_start_byte
+ cbz x17, L_aes_gcm_decrypt_arm64_crypto_256_tag_end_bytes
+ ldrb w16, [x5], #1
+ subs x17, x17, #1
+ strb w16, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_256_tag_start_byte
+L_aes_gcm_decrypt_arm64_crypto_256_tag_end_bytes
+ sub x11, x11, x6
+ ld1 {v28.2d}, [x11]
+ mov x17, #16
+ st1 {v26.2d}, [x11]
+ sub x17, x17, x6
+ add x11, x11, x6
+L_aes_gcm_decrypt_arm64_crypto_256_calc_tag_byte
+ strb wzr, [x11], #1
+ subs x17, x17, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_256_calc_tag_byte
+ subs x11, x11, #16
+ ld1 {v26.2d}, [x11]
+L_aes_gcm_decrypt_arm64_crypto_256_tag_loaded
+ eor v28.16b, v28.16b, v26.16b
+ mov x16, v28.d[0]
+ mov x17, v28.d[1]
+ mov w19, #-180
+ orr x16, x16, x17
+ cmp x16, #0
+ csetm x0, ne
+ and x0, x0, x19
+ ENDIF
+ b L_aes_gcm_decrypt_arm64_crypto_done
+ ; AES_GCM_128
+L_aes_gcm_decrypt_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w14, #32
+ blt L_aes_gcm_decrypt_arm64_crypto_128_start_4
+L_aes_gcm_decrypt_arm64_crypto_128_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ mov v14.s[3], w24
+ rev w23, w23
+ mov v15.s[3], w23
+ rev w22, w22
+ mov v16.s[3], w22
+ rev w21, w21
+ mov v17.s[3], w21
+ rev w20, w20
+ mov v8.s[3], w20
+ rev w19, w19
+ mov v9.s[3], w19
+ rev w17, w17
+ mov v10.s[3], w17
+ rev w16, w15
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_128_end_8
+L_aes_gcm_decrypt_arm64_crypto_128_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w24
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w23
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w22
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w21
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w20
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w19
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w17
+ rev w16, w15
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_128_both_8
+L_aes_gcm_decrypt_arm64_crypto_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d}, [x9], #32
+ ld1 {v10.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_128_done
+ beq L_aes_gcm_decrypt_arm64_crypto_128_start_1
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w19, w19
+ mov v15.s[3], w19
+ rev w17, w17
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_128_end_4
+L_aes_gcm_decrypt_arm64_crypto_128_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w20
+ rev w19, w19
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w19
+ rev w17, w17
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ bge L_aes_gcm_decrypt_arm64_crypto_128_both_4
+L_aes_gcm_decrypt_arm64_crypto_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_decrypt_arm64_crypto_128_start_1
+ blt L_aes_gcm_decrypt_arm64_crypto_128_done
+L_aes_gcm_decrypt_arm64_crypto_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w16, w15
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_128_done
+L_aes_gcm_decrypt_arm64_crypto_128_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x0], #16
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_128_done
+ ands w14, w2, #15
+ beq L_aes_gcm_decrypt_arm64_crypto_128_partial_done
+ eor v15.16b, v15.16b, v15.16b
+ mov w19, w14
+ st1 {v15.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_128_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_128_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_128_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_128_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_128_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_128_start_byte
+ cbz x19, L_aes_gcm_decrypt_arm64_crypto_128_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_128_start_byte
+L_aes_gcm_decrypt_arm64_crypto_128_end_bytes
+ sub x11, x11, x14
+ ld1 {v15.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.2d}, [x11]
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_128_out_start_dw
+ ldr x17, [x11], #8
+ sub w14, w14, #8
+ str x17, [x1], #8
+L_aes_gcm_decrypt_arm64_crypto_128_out_start_dw
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_128_out_start_sw
+ ldr w17, [x11], #4
+ sub w14, w14, #4
+ str w17, [x1], #4
+L_aes_gcm_decrypt_arm64_crypto_128_out_start_sw
+ cmp w14, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_128_out_start_byte
+ ldrh w17, [x11], #2
+ sub w14, w14, #2
+ strh w17, [x1], #2
+L_aes_gcm_decrypt_arm64_crypto_128_out_start_byte
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_128_out_end_bytes
+ ldrb w17, [x11], #1
+ subs w14, w14, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_128_out_start_byte
+L_aes_gcm_decrypt_arm64_crypto_128_out_end_bytes
+L_aes_gcm_decrypt_arm64_crypto_128_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ ext v31.16b, v26.16b, v26.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_128_part_tag
+ ld1 {v28.16b}, [x5]
+ b L_aes_gcm_decrypt_arm64_crypto_128_tag_loaded
+L_aes_gcm_decrypt_arm64_crypto_128_part_tag
+ ubfiz x6, x6, #0, #32
+ eor v28.16b, v28.16b, v28.16b
+ mov x17, x6
+ st1 {v28.2d}, [x11]
+ cmp x17, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_128_tag_start_dw
+ ldr x16, [x5], #8
+ sub x17, x17, #8
+ str x16, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_128_tag_start_dw
+ cmp x17, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_128_tag_start_sw
+ ldr w16, [x5], #4
+ sub x17, x17, #4
+ str w16, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_128_tag_start_sw
+ cmp x17, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_128_tag_start_byte
+ ldrh w16, [x5], #2
+ sub x17, x17, #2
+ strh w16, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_128_tag_start_byte
+ cbz x17, L_aes_gcm_decrypt_arm64_crypto_128_tag_end_bytes
+ ldrb w16, [x5], #1
+ subs x17, x17, #1
+ strb w16, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_128_tag_start_byte
+L_aes_gcm_decrypt_arm64_crypto_128_tag_end_bytes
+ sub x11, x11, x6
+ ld1 {v28.2d}, [x11]
+ mov x17, #16
+ st1 {v26.2d}, [x11]
+ sub x17, x17, x6
+ add x11, x11, x6
+L_aes_gcm_decrypt_arm64_crypto_128_calc_tag_byte
+ strb wzr, [x11], #1
+ subs x17, x17, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_128_calc_tag_byte
+ subs x11, x11, #16
+ ld1 {v26.2d}, [x11]
+L_aes_gcm_decrypt_arm64_crypto_128_tag_loaded
+ eor v28.16b, v28.16b, v26.16b
+ mov x16, v28.d[0]
+ mov x17, v28.d[1]
+ mov w19, #-180
+ orr x16, x16, x17
+ cmp x16, #0
+ csetm x0, ne
+ and x0, x0, x19
+ ENDIF
+L_aes_gcm_decrypt_arm64_crypto_done
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldr x24, [x29, #72]
+ ldp d8, d9, [x29, #80]
+ ldp d10, d11, [x29, #96]
+ ldp d12, d13, [x29, #112]
+ ldp d14, d15, [x29, #128]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:WOLFSSL_ARMASM_CRYPTO_SHA3
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_AARCH64_EOR3
+AES_GCM_encrypt_AARCH64_EOR3 PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ str x24, [x29, #72]
+ stp d8, d9, [x29, #80]
+ stp d10, d11, [x29, #96]
+ stp d12, d13, [x29, #112]
+ stp d14, d15, [x29, #128]
+ ldr w8, [x29, #144]
+ ldr x9, [x29, #152]
+ ldr x10, [x29, #160]
+ ldr x11, [x29, #168]
+ ldr x12, [x29, #176]
+ ldr w13, [x29, #184]
+ movi v27.16b, #0x87
+ eor v26.16b, v26.16b, v26.16b
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x10]
+ cmp w8, #0x40
+ csetm x16, lt
+ cmp w2, #32
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w8, #0x100
+ csetm x16, lt
+ cmp w2, #0x40
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w8, #0x400
+ csetm x16, lt
+ cmp w2, #0x200
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_encrypt_arm64_crypto_eor3_h_done
+ lsr w14, w8, #4
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_2
+ cmp w14, #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_8
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #8
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_8
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_done
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_2
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_4
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #4
+ cmp w14, #4
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_4
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_done
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_1
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_2
+ ld1 {v18.16b, v19.16b}, [x7], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #2
+ cmp w14, #1
+ bgt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_1
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_eor3_aad_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_both_1
+ ld1 {v18.16b}, [x7], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_aad_both_1
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_done
+ and w14, w8, #15
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_eor3_aad_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w14
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_dw
+ ldr x19, [x7], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_sw
+ ldr w19, [x7], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_byte
+ ldrh w19, [x7], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_byte
+ cbz w20, L_aes_gcm_encrypt_arm64_crypto_eor3_aad_end_bytes
+ ldrb w19, [x7], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_aad_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_end_bytes
+ sub x11, x11, x14
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_aad_partial_done
+ ; Load Nonce
+ cmp w4, #12
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_ghash_nonce
+ ldr x16, [x3]
+ movi v13.4s, #1, lsl 24
+ ldr w17, [x3, #8]
+ mov v13.d[0], x16
+ mov v13.s[2], w17
+ mov w15, #1
+ b L_aes_gcm_encrypt_arm64_crypto_eor3_done_nonce
+L_aes_gcm_encrypt_arm64_crypto_eor3_ghash_nonce
+ eor v13.16b, v13.16b, v13.16b
+ lsr w14, w4, #4
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_1
+ ld1 {v18.16b}, [x3], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_1
+L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_done
+ and w24, w4, #15
+ cbz x24, L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w24
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_dw
+ ldr x19, [x3], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_sw
+ ldr w19, [x3], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_byte
+ ldrh w19, [x3], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_byte
+ cbz w20, L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_end_bytes
+ ldrb w19, [x3], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_end_bytes
+ sub x11, x11, x24
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_nonce_partial_done
+ eor x14, x14, x14
+ ubfiz x24, x4, #3, #32
+ mov v28.d[0], x14
+ mov v28.d[1], x24
+ rev64 v28.16b, v28.16b
+ rbit v28.16b, v28.16b
+ eor v13.16b, v13.16b, v28.16b
+ pmull v28.1q, v13.1d, v22.1d
+ pmull2 v29.1q, v13.2d, v22.2d
+ ext v31.16b, v13.16b, v13.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ rbit v13.16b, v13.16b
+ mov w15, v13.s[3]
+ rev w15, w15
+L_aes_gcm_encrypt_arm64_crypto_eor3_done_nonce
+ st1 {v13.2d}, [x12]
+ lsr w14, w2, #4
+ cmp w13, #12
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_start_128
+ bgt L_aes_gcm_encrypt_arm64_crypto_eor3_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w14, #32
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ rev w23, w23
+ rev w22, w22
+ rev w21, w21
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_end_8
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_192_both_8
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_done
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_1
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_end_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_192_both_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_eor3_192_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_done
+ ands w14, w2, #15
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_192_partial_done
+ eor v16.16b, v16.16b, v16.16b
+ mov w19, w14
+ st1 {v16.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_eor3_192_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_end_bytes
+ sub x11, x11, x14
+ ld1 {v16.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v16.16b, v16.16b, v14.16b
+ st1 {v16.2d}, [x11]
+ mov w19, w14
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_start_dw
+ ldr x17, [x11], #8
+ sub x19, x19, #8
+ str x17, [x1], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_start_sw
+ ldr w17, [x11], #4
+ sub x19, x19, #4
+ str w17, [x1], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_start_byte
+ ldrh w17, [x11], #2
+ sub x19, x19, #2
+ strh w17, [x1], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_end_bytes
+ ldrb w17, [x11], #1
+ subs x19, x19, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_out_end_bytes
+ mov x17, #16
+ sub x17, x17, x14
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_zero
+ subs x17, x17, #1
+ strb wzr, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_192_start_zero
+ sub x11, x11, #16
+ ld1 {v14.2d}, [x11]
+ rbit v14.16b, v14.16b
+ eor v15.16b, v26.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v15.1d, v22.1d
+ pmull2 v29.1q, v15.2d, v22.2d
+ ext v31.16b, v15.16b, v15.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_partial
+ st1 {v26.16b}, [x5]
+ b L_aes_gcm_encrypt_arm64_crypto_eor3_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_partial
+ st1 {v26.16b}, [x11]
+ cmp w6, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_start_dw
+ ldr x16, [x11], #8
+ sub w6, w6, #8
+ str x16, [x5], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_start_dw
+ cmp w6, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_start_sw
+ ldr w16, [x11], #4
+ sub w6, w6, #4
+ str w16, [x5], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_start_sw
+ cmp w6, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_start_byte
+ ldrh w16, [x11], #2
+ sub w6, w6, #2
+ strh w16, [x5], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_start_byte
+ cbz w6, L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_end_bytes
+ ldrb w16, [x11], #1
+ subs w6, w6, #1
+ strb w16, [x5], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_192_tag_end_bytes
+ ENDIF
+ b L_aes_gcm_encrypt_arm64_crypto_eor3_done
+ ; AES_GCM_256
+L_aes_gcm_encrypt_arm64_crypto_eor3_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w14, #32
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ rev w23, w23
+ rev w22, w22
+ rev w21, w21
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_end_8
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_256_both_8
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9], #16
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_done
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_1
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_end_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_256_both_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_eor3_256_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_done
+ ands w14, w2, #15
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_256_partial_done
+ eor v16.16b, v16.16b, v16.16b
+ mov w19, w14
+ st1 {v16.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_eor3_256_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_end_bytes
+ sub x11, x11, x14
+ ld1 {v16.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v16.16b, v16.16b, v14.16b
+ st1 {v16.2d}, [x11]
+ mov w19, w14
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_start_dw
+ ldr x17, [x11], #8
+ sub x19, x19, #8
+ str x17, [x1], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_start_sw
+ ldr w17, [x11], #4
+ sub x19, x19, #4
+ str w17, [x1], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_start_byte
+ ldrh w17, [x11], #2
+ sub x19, x19, #2
+ strh w17, [x1], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_end_bytes
+ ldrb w17, [x11], #1
+ subs x19, x19, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_out_end_bytes
+ mov x17, #16
+ sub x17, x17, x14
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_zero
+ subs x17, x17, #1
+ strb wzr, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_256_start_zero
+ sub x11, x11, #16
+ ld1 {v14.2d}, [x11]
+ rbit v14.16b, v14.16b
+ eor v15.16b, v26.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v15.1d, v22.1d
+ pmull2 v29.1q, v15.2d, v22.2d
+ ext v31.16b, v15.16b, v15.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v28.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ ldr q11, [x9, #-32]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ ldr q12, [x9, #-16]
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_partial
+ st1 {v26.16b}, [x5]
+ b L_aes_gcm_encrypt_arm64_crypto_eor3_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_partial
+ st1 {v26.16b}, [x11]
+ cmp w6, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_start_dw
+ ldr x16, [x11], #8
+ sub w6, w6, #8
+ str x16, [x5], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_start_dw
+ cmp w6, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_start_sw
+ ldr w16, [x11], #4
+ sub w6, w6, #4
+ str w16, [x5], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_start_sw
+ cmp w6, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_start_byte
+ ldrh w16, [x11], #2
+ sub w6, w6, #2
+ strh w16, [x5], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_start_byte
+ cbz w6, L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_end_bytes
+ ldrb w16, [x11], #1
+ subs w6, w6, #1
+ strb w16, [x5], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_256_tag_end_bytes
+ ENDIF
+ b L_aes_gcm_encrypt_arm64_crypto_eor3_done
+ ; AES_GCM_128
+L_aes_gcm_encrypt_arm64_crypto_eor3_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w14, #32
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ rev w23, w23
+ rev w22, w22
+ rev w21, w21
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_end_8
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ rev w16, w15
+ mov v14.s[3], w24
+ mov v15.s[3], w23
+ mov v16.s[3], w22
+ mov v17.s[3], w21
+ mov v8.s[3], w20
+ mov v9.s[3], w19
+ mov v10.s[3], w17
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_128_both_8
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d}, [x9], #32
+ ld1 {v10.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_done
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_1
+ cmp w14, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_end_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rev w19, w19
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w19
+ mov v16.s[3], w17
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w14, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x1], #0x40
+ bge L_aes_gcm_encrypt_arm64_crypto_eor3_128_both_4
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_1
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ rev w16, w15
+ mov v14.s[3], w20
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_encrypt_arm64_crypto_eor3_128_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x0], #16
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_done
+ ands w14, w2, #15
+ beq L_aes_gcm_encrypt_arm64_crypto_eor3_128_partial_done
+ eor v16.16b, v16.16b, v16.16b
+ mov w19, w14
+ st1 {v16.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_eor3_128_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_end_bytes
+ sub x11, x11, x14
+ ld1 {v16.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ eor v16.16b, v16.16b, v14.16b
+ st1 {v16.2d}, [x11]
+ mov w19, w14
+ cmp x19, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_start_dw
+ ldr x17, [x11], #8
+ sub x19, x19, #8
+ str x17, [x1], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_start_sw
+ ldr w17, [x11], #4
+ sub x19, x19, #4
+ str w17, [x1], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_start_byte
+ ldrh w17, [x11], #2
+ sub x19, x19, #2
+ strh w17, [x1], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_start_byte
+ cbz x19, L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_end_bytes
+ ldrb w17, [x11], #1
+ subs x19, x19, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_out_end_bytes
+ mov x17, #16
+ sub x17, x17, x14
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_zero
+ subs x17, x17, #1
+ strb wzr, [x11], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_128_start_zero
+ sub x11, x11, #16
+ ld1 {v14.2d}, [x11]
+ rbit v14.16b, v14.16b
+ eor v15.16b, v26.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v15.1d, v22.1d
+ pmull2 v29.1q, v15.2d, v22.2d
+ ext v31.16b, v15.16b, v15.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ ext v31.16b, v26.16b, v26.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_partial
+ st1 {v26.16b}, [x5]
+ b L_aes_gcm_encrypt_arm64_crypto_eor3_done
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_partial
+ st1 {v26.16b}, [x11]
+ cmp w6, #8
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_start_dw
+ ldr x16, [x11], #8
+ sub w6, w6, #8
+ str x16, [x5], #8
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_start_dw
+ cmp w6, #4
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_start_sw
+ ldr w16, [x11], #4
+ sub w6, w6, #4
+ str w16, [x5], #4
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_start_sw
+ cmp w6, #2
+ blt L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_start_byte
+ ldrh w16, [x11], #2
+ sub w6, w6, #2
+ strh w16, [x5], #2
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_start_byte
+ cbz w6, L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_end_bytes
+ ldrb w16, [x11], #1
+ subs w6, w6, #1
+ strb w16, [x5], #1
+ bne L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_start_byte
+L_aes_gcm_encrypt_arm64_crypto_eor3_128_tag_end_bytes
+ ENDIF
+L_aes_gcm_encrypt_arm64_crypto_eor3_done
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldr x24, [x29, #72]
+ ldp d8, d9, [x29, #80]
+ ldp d10, d11, [x29, #96]
+ ldp d12, d13, [x29, #112]
+ ldp d14, d15, [x29, #128]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_decrypt_AARCH64_EOR3
+AES_GCM_decrypt_AARCH64_EOR3 PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ str x24, [x29, #72]
+ stp d8, d9, [x29, #80]
+ stp d10, d11, [x29, #96]
+ stp d12, d13, [x29, #112]
+ stp d14, d15, [x29, #128]
+ ldr w8, [x29, #144]
+ ldr x9, [x29, #152]
+ ldr x10, [x29, #160]
+ ldr x11, [x29, #168]
+ ldr x12, [x29, #176]
+ ldr w13, [x29, #184]
+ movi v27.16b, #0x87
+ eor v26.16b, v26.16b, v26.16b
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x10]
+ cmp w8, #0x40
+ csetm x16, lt
+ cmp w2, #32
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w8, #0x100
+ csetm x16, lt
+ cmp w2, #0x40
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w8, #0x400
+ csetm x16, lt
+ cmp w2, #0x200
+ csetm x17, lt
+ ands x16, x16, x17
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_decrypt_arm64_crypto_eor3_h_done
+ lsr w14, w8, #4
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_2
+ cmp w14, #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_8
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #8
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_8
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_done
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_1
+ cmp w14, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_2
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_4
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x7], #0x40
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #4
+ cmp w14, #4
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_4
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_done
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_1
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_2
+ ld1 {v18.16b, v19.16b}, [x7], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ sub w14, w14, #2
+ cmp w14, #1
+ bgt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_1
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_aad_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_both_1
+ ld1 {v18.16b}, [x7], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_aad_both_1
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_done
+ and w14, w8, #15
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_aad_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w14
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_dw
+ ldr x19, [x7], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_sw
+ ldr w19, [x7], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_byte
+ ldrh w19, [x7], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_byte
+ cbz w20, L_aes_gcm_decrypt_arm64_crypto_eor3_aad_end_bytes
+ ldrb w19, [x7], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_aad_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_end_bytes
+ sub x11, x11, x14
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_eor3_aad_partial_done
+ ; Load Nonce
+ cmp w4, #12
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_ghash_nonce
+ ldr x16, [x3]
+ movi v13.4s, #1, lsl 24
+ ldr w17, [x3, #8]
+ mov v13.d[0], x16
+ mov v13.s[2], w17
+ mov w15, #1
+ b L_aes_gcm_decrypt_arm64_crypto_eor3_done_nonce
+L_aes_gcm_decrypt_arm64_crypto_eor3_ghash_nonce
+ eor v13.16b, v13.16b, v13.16b
+ lsr w14, w4, #4
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_1
+ ld1 {v18.16b}, [x3], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+ subs w14, w14, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_1
+L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_done
+ and w24, w4, #15
+ cbz x24, L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_partial_done
+ eor v28.16b, v28.16b, v28.16b
+ mov w20, w24
+ st1 {v28.2d}, [x11]
+ cmp w20, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_dw
+ ldr x19, [x3], #8
+ sub w20, w20, #8
+ str x19, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_dw
+ cmp w20, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_sw
+ ldr w19, [x3], #4
+ sub w20, w20, #4
+ str w19, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_sw
+ cmp w20, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_byte
+ ldrh w19, [x3], #2
+ sub w20, w20, #2
+ strh w19, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_byte
+ cbz w20, L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_end_bytes
+ ldrb w19, [x3], #1
+ subs w20, w20, #1
+ strb w19, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_end_bytes
+ sub x11, x11, x24
+ ld1 {v18.2d}, [x11]
+ rbit v18.16b, v18.16b
+ eor v21.16b, v13.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_eor3_nonce_partial_done
+ eor x14, x14, x14
+ ubfiz x24, x4, #3, #32
+ mov v28.d[0], x14
+ mov v28.d[1], x24
+ rev64 v28.16b, v28.16b
+ rbit v28.16b, v28.16b
+ eor v13.16b, v13.16b, v28.16b
+ pmull v28.1q, v13.1d, v22.1d
+ pmull2 v29.1q, v13.2d, v22.2d
+ ext v31.16b, v13.16b, v13.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v13.16b, v28.16b, v30.16b
+ rbit v13.16b, v13.16b
+ mov w15, v13.s[3]
+ rev w15, w15
+L_aes_gcm_decrypt_arm64_crypto_eor3_done_nonce
+ st1 {v13.2d}, [x12]
+ lsr w14, w2, #4
+ cmp w13, #12
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_start_128
+ bgt L_aes_gcm_decrypt_arm64_crypto_eor3_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w14, #32
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ mov v14.s[3], w24
+ rev w23, w23
+ mov v15.s[3], w23
+ rev w22, w22
+ mov v16.s[3], w22
+ rev w21, w21
+ mov v17.s[3], w21
+ rev w20, w20
+ mov v8.s[3], w20
+ rev w19, w19
+ mov v9.s[3], w19
+ rev w17, w17
+ mov v10.s[3], w17
+ rev w16, w15
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_end_8
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w24
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w23
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w22
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w21
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w20
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w19
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w17
+ rev w16, w15
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_192_both_8
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_done
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_1
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w19, w19
+ mov v15.s[3], w19
+ rev w17, w17
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_end_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w20
+ rev w19, w19
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w19
+ rev w17, w17
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_192_both_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w16, w15
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_192_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_1
+ ld1 {v15.16b}, [x0], #16
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.16b}, [x1], #16
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_done
+ ands w14, w2, #15
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_192_partial_done
+ eor v15.16b, v15.16b, v15.16b
+ mov w19, w14
+ st1 {v15.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_byte
+ cbz x19, L_aes_gcm_decrypt_arm64_crypto_eor3_192_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_192_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_end_bytes
+ sub x11, x11, x14
+ ld1 {v15.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.2d}, [x11]
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_start_dw
+ ldr x17, [x11], #8
+ sub w14, w14, #8
+ str x17, [x1], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_start_dw
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_start_sw
+ ldr w17, [x11], #4
+ sub w14, w14, #4
+ str w17, [x1], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_start_sw
+ cmp w14, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_start_byte
+ ldrh w17, [x11], #2
+ sub w14, w14, #2
+ strh w17, [x1], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_start_byte
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_end_bytes
+ ldrb w17, [x11], #1
+ subs w14, w14, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_out_end_bytes
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_part_tag
+ ld1 {v28.16b}, [x5]
+ b L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_loaded
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_part_tag
+ ubfiz x6, x6, #0, #32
+ eor v28.16b, v28.16b, v28.16b
+ mov x17, x6
+ st1 {v28.2d}, [x11]
+ cmp x17, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_start_dw
+ ldr x16, [x5], #8
+ sub x17, x17, #8
+ str x16, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_start_dw
+ cmp x17, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_start_sw
+ ldr w16, [x5], #4
+ sub x17, x17, #4
+ str w16, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_start_sw
+ cmp x17, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_start_byte
+ ldrh w16, [x5], #2
+ sub x17, x17, #2
+ strh w16, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_start_byte
+ cbz x17, L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_end_bytes
+ ldrb w16, [x5], #1
+ subs x17, x17, #1
+ strb w16, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_end_bytes
+ sub x11, x11, x6
+ ld1 {v28.2d}, [x11]
+ mov x17, #16
+ st1 {v26.2d}, [x11]
+ sub x17, x17, x6
+ add x11, x11, x6
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_calc_tag_byte
+ strb wzr, [x11], #1
+ subs x17, x17, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_192_calc_tag_byte
+ subs x11, x11, #16
+ ld1 {v26.2d}, [x11]
+L_aes_gcm_decrypt_arm64_crypto_eor3_192_tag_loaded
+ eor v28.16b, v28.16b, v26.16b
+ mov x16, v28.d[0]
+ mov x17, v28.d[1]
+ mov w19, #-180
+ orr x16, x16, x17
+ cmp x16, #0
+ csetm x0, ne
+ and x0, x0, x19
+ ENDIF
+ b L_aes_gcm_decrypt_arm64_crypto_eor3_done
+ ; AES_GCM_256
+L_aes_gcm_decrypt_arm64_crypto_eor3_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w14, #32
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ mov v14.s[3], w24
+ rev w23, w23
+ mov v15.s[3], w23
+ rev w22, w22
+ mov v16.s[3], w22
+ rev w21, w21
+ mov v17.s[3], w21
+ rev w20, w20
+ mov v8.s[3], w20
+ rev w19, w19
+ mov v9.s[3], w19
+ rev w17, w17
+ mov v10.s[3], w17
+ rev w16, w15
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_end_8
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w24
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w23
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w22
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w21
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w20
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w19
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w17
+ rev w16, w15
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_256_both_8
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x9], #0x40
+ ld1 {v12.2d}, [x9], #16
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_done
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_1
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w19, w19
+ mov v15.s[3], w19
+ rev w17, w17
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_end_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w20
+ rev w19, w19
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w19
+ rev w17, w17
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_256_both_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w16, w15
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_256_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_done
+ ands w14, w2, #15
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_256_partial_done
+ eor v15.16b, v15.16b, v15.16b
+ mov w19, w14
+ st1 {v15.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_byte
+ cbz x19, L_aes_gcm_decrypt_arm64_crypto_eor3_256_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_256_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_end_bytes
+ sub x11, x11, x14
+ ld1 {v15.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ ; Done GHASH
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.2d}, [x11]
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_start_dw
+ ldr x17, [x11], #8
+ sub w14, w14, #8
+ str x17, [x1], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_start_dw
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_start_sw
+ ldr w17, [x11], #4
+ sub w14, w14, #4
+ str w17, [x1], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_start_sw
+ cmp w14, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_start_byte
+ ldrh w17, [x11], #2
+ sub w14, w14, #2
+ strh w17, [x1], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_start_byte
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_end_bytes
+ ldrb w17, [x11], #1
+ subs w14, w14, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_out_end_bytes
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v28.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v26.16b, v26.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ ldr q11, [x9, #-32]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ ldr q12, [x9, #-16]
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x9]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ ldr q30, [x9, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_part_tag
+ ld1 {v28.16b}, [x5]
+ b L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_loaded
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_part_tag
+ ubfiz x6, x6, #0, #32
+ eor v28.16b, v28.16b, v28.16b
+ mov x17, x6
+ st1 {v28.2d}, [x11]
+ cmp x17, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_start_dw
+ ldr x16, [x5], #8
+ sub x17, x17, #8
+ str x16, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_start_dw
+ cmp x17, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_start_sw
+ ldr w16, [x5], #4
+ sub x17, x17, #4
+ str w16, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_start_sw
+ cmp x17, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_start_byte
+ ldrh w16, [x5], #2
+ sub x17, x17, #2
+ strh w16, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_start_byte
+ cbz x17, L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_end_bytes
+ ldrb w16, [x5], #1
+ subs x17, x17, #1
+ strb w16, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_end_bytes
+ sub x11, x11, x6
+ ld1 {v28.2d}, [x11]
+ mov x17, #16
+ st1 {v26.2d}, [x11]
+ sub x17, x17, x6
+ add x11, x11, x6
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_calc_tag_byte
+ strb wzr, [x11], #1
+ subs x17, x17, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_256_calc_tag_byte
+ subs x11, x11, #16
+ ld1 {v26.2d}, [x11]
+L_aes_gcm_decrypt_arm64_crypto_eor3_256_tag_loaded
+ eor v28.16b, v28.16b, v26.16b
+ mov x16, v28.d[0]
+ mov x17, v28.d[1]
+ mov w19, #-180
+ orr x16, x16, x17
+ cmp x16, #0
+ csetm x0, ne
+ and x0, x0, x19
+ ENDIF
+ b L_aes_gcm_decrypt_arm64_crypto_eor3_done
+ ; AES_GCM_128
+L_aes_gcm_decrypt_arm64_crypto_eor3_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w14, #32
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rev w24, w24
+ mov v14.s[3], w24
+ rev w23, w23
+ mov v15.s[3], w23
+ rev w22, w22
+ mov v16.s[3], w22
+ rev w21, w21
+ mov v17.s[3], w21
+ rev w20, w20
+ mov v8.s[3], w20
+ rev w19, w19
+ mov v9.s[3], w19
+ rev w17, w17
+ mov v10.s[3], w17
+ rev w16, w15
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x12]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_end_8
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_both_8
+ ldr q12, [x9]
+ add w24, w15, #1
+ mov v14.16b, v13.16b
+ add w23, w15, #2
+ mov v15.16b, v13.16b
+ add w22, w15, #3
+ mov v16.16b, v13.16b
+ add w21, w15, #4
+ mov v17.16b, v13.16b
+ add w20, w15, #5
+ mov v8.16b, v13.16b
+ add w19, w15, #6
+ mov v9.16b, v13.16b
+ add w17, w15, #7
+ mov v10.16b, v13.16b
+ add w15, w15, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w24, w24
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w24
+ rev w23, w23
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w23
+ rev w22, w22
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w22
+ rev w21, w21
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w21
+ rev w20, w20
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w20
+ rev w19, w19
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w19
+ rev w17, w17
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w17
+ rev w16, w15
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w16
+ ldr q13, [x9, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w14, w14, #8
+ ldr q12, [x9, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x9, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x0], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x0], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x0], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x0], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x9, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x12]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x1], #0x40
+ cmp w14, #8
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_128_both_8
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x9], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x9], #0x40
+ ld1 {v8.2d, v9.2d}, [x9], #32
+ ld1 {v10.2d}, [x9]
+ cmp w14, #1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_done
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_1
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w19, w19
+ mov v15.s[3], w19
+ rev w17, w17
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x0], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x0], #16
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_end_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_both_4
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w19, w15, #2
+ mov v15.16b, v13.16b
+ add w17, w15, #3
+ mov v16.16b, v13.16b
+ add w15, w15, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w20, w20
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w20
+ rev w19, w19
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w19
+ rev w17, w17
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w17
+ rev w16, w15
+ mov v17.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w14, w14, #4
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x0], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w14, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x1], #0x40
+ bge L_aes_gcm_decrypt_arm64_crypto_eor3_128_both_4
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w14, #1
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_1
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_2
+ add w20, w15, #1
+ mov v14.16b, v13.16b
+ add w15, w15, #2
+ mov v15.16b, v13.16b
+ rev w20, w20
+ mov v14.s[3], w20
+ rev w16, w15
+ mov v15.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w14, w14, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x0], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x0], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x1], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_128_done
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_1
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x0], #16
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x1], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_done
+ ands w14, w2, #15
+ beq L_aes_gcm_decrypt_arm64_crypto_eor3_128_partial_done
+ eor v15.16b, v15.16b, v15.16b
+ mov w19, w14
+ st1 {v15.2d}, [x11]
+ cmp x19, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_dw
+ ldr x17, [x0], #8
+ sub x19, x19, #8
+ str x17, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_dw
+ cmp x19, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_sw
+ ldr w17, [x0], #4
+ sub x19, x19, #4
+ str w17, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_sw
+ cmp x19, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_byte
+ ldrh w17, [x0], #2
+ sub x19, x19, #2
+ strh w17, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_byte
+ cbz x19, L_aes_gcm_decrypt_arm64_crypto_eor3_128_end_bytes
+ ldrb w17, [x0], #1
+ subs x19, x19, #1
+ strb w17, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_128_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_end_bytes
+ sub x11, x11, x14
+ ld1 {v15.2d}, [x11]
+ add w15, w15, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w16, w15
+ mov v14.s[3], w16
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.2d}, [x11]
+ cmp w14, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_start_dw
+ ldr x17, [x11], #8
+ sub w14, w14, #8
+ str x17, [x1], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_start_dw
+ cmp w14, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_start_sw
+ ldr w17, [x11], #4
+ sub w14, w14, #4
+ str w17, [x1], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_start_sw
+ cmp w14, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_start_byte
+ ldrh w17, [x11], #2
+ sub w14, w14, #2
+ strh w17, [x1], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_start_byte
+ cbz w14, L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_end_bytes
+ ldrb w17, [x11], #1
+ subs w14, w14, #1
+ strb w17, [x1], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_out_end_bytes
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_partial_done
+ ld1 {v14.2d}, [x12]
+ ubfiz x8, x8, #3, #32
+ rbit x8, x8
+ mov v28.d[0], x8
+ ubfiz x2, x2, #3, #32
+ rbit x2, x2
+ mov v28.d[1], x2
+ eor v26.16b, v26.16b, v28.16b
+ pmull v28.1q, v26.1d, v22.1d
+ pmull2 v29.1q, v26.2d, v22.2d
+ ext v31.16b, v26.16b, v26.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ rbit v26.16b, v26.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ eor v26.16b, v26.16b, v14.16b
+ cmp w6, #16
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_part_tag
+ ld1 {v28.16b}, [x5]
+ b L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_loaded
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_part_tag
+ ubfiz x6, x6, #0, #32
+ eor v28.16b, v28.16b, v28.16b
+ mov x17, x6
+ st1 {v28.2d}, [x11]
+ cmp x17, #8
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_start_dw
+ ldr x16, [x5], #8
+ sub x17, x17, #8
+ str x16, [x11], #8
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_start_dw
+ cmp x17, #4
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_start_sw
+ ldr w16, [x5], #4
+ sub x17, x17, #4
+ str w16, [x11], #4
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_start_sw
+ cmp x17, #2
+ blt L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_start_byte
+ ldrh w16, [x5], #2
+ sub x17, x17, #2
+ strh w16, [x11], #2
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_start_byte
+ cbz x17, L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_end_bytes
+ ldrb w16, [x5], #1
+ subs x17, x17, #1
+ strb w16, [x11], #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_start_byte
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_end_bytes
+ sub x11, x11, x6
+ ld1 {v28.2d}, [x11]
+ mov x17, #16
+ st1 {v26.2d}, [x11]
+ sub x17, x17, x6
+ add x11, x11, x6
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_calc_tag_byte
+ strb wzr, [x11], #1
+ subs x17, x17, #1
+ bne L_aes_gcm_decrypt_arm64_crypto_eor3_128_calc_tag_byte
+ subs x11, x11, #16
+ ld1 {v26.2d}, [x11]
+L_aes_gcm_decrypt_arm64_crypto_eor3_128_tag_loaded
+ eor v28.16b, v28.16b, v26.16b
+ mov x16, v28.d[0]
+ mov x17, v28.d[1]
+ mov w19, #-180
+ orr x16, x16, x17
+ cmp x16, #0
+ csetm x0, ne
+ and x0, x0, x19
+ ENDIF
+L_aes_gcm_decrypt_arm64_crypto_eor3_done
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldr x24, [x29, #72]
+ ldp d8, d9, [x29, #80]
+ ldp d10, d11, [x29, #96]
+ ldp d12, d13, [x29, #112]
+ ldp d14, d15, [x29, #128]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ IF :DEF:WOLFSSL_AESGCM_STREAM
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_init_AARCH64
+AES_GCM_init_AARCH64 PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ movi v6.16b, #0x87
+ ld1 {v5.2d}, [x4]
+ ushr v6.2d, v6.2d, #56
+ ; Load Nonce
+ cmp w3, #12
+ bne L_aes_gcm_init_arm64_crypto_ghash_nonce
+ ldr x9, [x2]
+ movi v4.4s, #1, lsl 24
+ ldr w10, [x2, #8]
+ mov v4.d[0], x9
+ mov v4.s[2], w10
+ mov w8, #1
+ b L_aes_gcm_init_arm64_crypto_done_nonce
+L_aes_gcm_init_arm64_crypto_ghash_nonce
+ eor v4.16b, v4.16b, v4.16b
+ lsr w7, w3, #4
+ cbz w7, L_aes_gcm_init_arm64_crypto_done
+L_aes_gcm_init_arm64_crypto_start_1
+ ld1 {v0.16b}, [x2], #16
+ rbit v0.16b, v0.16b
+ eor v3.16b, v4.16b, v0.16b
+ ; X = C * H^1
+ pmull v7.1q, v3.1d, v5.1d
+ pmull2 v8.1q, v3.2d, v5.2d
+ ext v10.16b, v3.16b, v3.16b, #8
+ pmull v9.1q, v10.1d, v5.1d
+ pmull2 v10.1q, v10.2d, v5.2d
+ eor v9.16b, v9.16b, v10.16b
+ ; Reduce
+ ext v10.16b, v7.16b, v8.16b, #8
+ pmull2 v8.1q, v8.2d, v6.2d
+ eor v10.16b, v10.16b, v8.16b
+ eor v10.16b, v10.16b, v9.16b
+ pmull2 v9.1q, v10.2d, v6.2d
+ mov v7.d[1], v10.d[0]
+ eor v4.16b, v7.16b, v9.16b
+ ; Done GHASH
+ subs w7, w7, #1
+ bne L_aes_gcm_init_arm64_crypto_start_1
+L_aes_gcm_init_arm64_crypto_done
+ and w13, w3, #15
+ cbz x13, L_aes_gcm_init_arm64_crypto_partial_done
+ eor v7.16b, v7.16b, v7.16b
+ mov w12, w13
+ st1 {v7.2d}, [x6]
+ cmp w12, #8
+ blt L_aes_gcm_init_arm64_crypto_start_dw
+ ldr x11, [x2], #8
+ sub w12, w12, #8
+ str x11, [x6], #8
+L_aes_gcm_init_arm64_crypto_start_dw
+ cmp w12, #4
+ blt L_aes_gcm_init_arm64_crypto_start_sw
+ ldr w11, [x2], #4
+ sub w12, w12, #4
+ str w11, [x6], #4
+L_aes_gcm_init_arm64_crypto_start_sw
+ cmp w12, #2
+ blt L_aes_gcm_init_arm64_crypto_start_byte
+ ldrh w11, [x2], #2
+ sub w12, w12, #2
+ strh w11, [x6], #2
+L_aes_gcm_init_arm64_crypto_start_byte
+ cbz w12, L_aes_gcm_init_arm64_crypto_end_bytes
+ ldrb w11, [x2], #1
+ subs w12, w12, #1
+ strb w11, [x6], #1
+ bne L_aes_gcm_init_arm64_crypto_start_byte
+L_aes_gcm_init_arm64_crypto_end_bytes
+ sub x6, x6, x13
+ ld1 {v0.2d}, [x6]
+ rbit v0.16b, v0.16b
+ eor v3.16b, v4.16b, v0.16b
+ ; X = C * H^1
+ pmull v7.1q, v3.1d, v5.1d
+ pmull2 v8.1q, v3.2d, v5.2d
+ ext v10.16b, v3.16b, v3.16b, #8
+ pmull v9.1q, v10.1d, v5.1d
+ pmull2 v10.1q, v10.2d, v5.2d
+ eor v9.16b, v9.16b, v10.16b
+ ; Reduce
+ ext v10.16b, v7.16b, v8.16b, #8
+ pmull2 v8.1q, v8.2d, v6.2d
+ eor v10.16b, v10.16b, v8.16b
+ eor v10.16b, v10.16b, v9.16b
+ pmull2 v9.1q, v10.2d, v6.2d
+ mov v7.d[1], v10.d[0]
+ eor v4.16b, v7.16b, v9.16b
+ ; Done GHASH
+L_aes_gcm_init_arm64_crypto_partial_done
+ eor x7, x7, x7
+ ubfiz x13, x3, #3, #32
+ mov v7.d[0], x7
+ mov v7.d[1], x13
+ rev64 v7.16b, v7.16b
+ rbit v7.16b, v7.16b
+ eor v4.16b, v4.16b, v7.16b
+ pmull v7.1q, v4.1d, v5.1d
+ pmull2 v8.1q, v4.2d, v5.2d
+ ext v10.16b, v4.16b, v4.16b, #8
+ pmull v9.1q, v10.1d, v5.1d
+ pmull2 v10.1q, v10.2d, v5.2d
+ eor v9.16b, v9.16b, v10.16b
+ ext v10.16b, v7.16b, v8.16b, #8
+ pmull2 v8.1q, v8.2d, v6.2d
+ eor v10.16b, v10.16b, v8.16b
+ eor v10.16b, v10.16b, v9.16b
+ pmull2 v9.1q, v10.2d, v6.2d
+ mov v7.d[1], v10.d[0]
+ eor v4.16b, v7.16b, v9.16b
+ rbit v4.16b, v4.16b
+ mov w8, v4.s[3]
+ rev w8, w8
+L_aes_gcm_init_arm64_crypto_done_nonce
+ st1 {v4.2d}, [x5]
+ ld1 {v7.2d, v8.2d, v9.2d, v10.2d}, [x0], #0x40
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v9.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v10.16b
+ aesmc v4.16b, v4.16b
+ ld1 {v7.2d, v8.2d, v9.2d, v10.2d}, [x0], #0x40
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v9.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v10.16b
+ aesmc v4.16b, v4.16b
+ subs w1, w1, #10
+ ld1 {v7.2d, v8.2d}, [x0], #32
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ beq L_aes_gcm_init_arm64_crypto_round_done
+ ld1 {v7.2d, v8.2d}, [x0], #32
+ subs w1, w1, #2
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ beq L_aes_gcm_init_arm64_crypto_round_done
+ ld1 {v7.2d, v8.2d}, [x0], #32
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+L_aes_gcm_init_arm64_crypto_round_done
+ ld1 {v7.2d}, [x0]
+ eor v4.16b, v4.16b, v7.16b
+ st1 {v4.2d}, [x6]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_ghash_block_AARCH64
+AES_GCM_ghash_block_AARCH64 PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ ld1 {v6.2d}, [x1]
+ movi v7.16b, #0x87
+ ld1 {v5.2d}, [x2]
+ ushr v7.2d, v7.2d, #56
+ ld1 {v4.2d}, [x0]
+ rbit v4.16b, v4.16b
+ eor v8.16b, v6.16b, v4.16b
+ ; X = C * H^1
+ pmull v0.1q, v8.1d, v5.1d
+ pmull2 v1.1q, v8.2d, v5.2d
+ ext v3.16b, v8.16b, v8.16b, #8
+ pmull v2.1q, v3.1d, v5.1d
+ pmull2 v3.1q, v3.2d, v5.2d
+ eor v2.16b, v2.16b, v3.16b
+ ; Reduce
+ ext v3.16b, v0.16b, v1.16b, #8
+ pmull2 v1.1q, v1.2d, v7.2d
+ eor v3.16b, v3.16b, v1.16b
+ eor v3.16b, v3.16b, v2.16b
+ pmull2 v2.1q, v3.2d, v7.2d
+ mov v0.d[1], v3.d[0]
+ eor v6.16b, v0.16b, v2.16b
+ ; Done GHASH
+ st1 {v6.2d}, [x1]
+ ldp d8, d9, [x29, #16]
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_aad_update_AARCH64
+AES_GCM_aad_update_AARCH64 PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ ld1 {v20.2d}, [x2]
+ movi v21.16b, #0x87
+ ld1 {v12.2d}, [x3]
+ ushr v21.2d, v21.2d, #56
+ cmp x1, #0x40
+ blt L_aes_gcm_aad_update_arm64_crypto_h_done
+ ; Square H => H^2
+ pmull2 v11.1q, v12.2d, v12.2d
+ pmull v10.1q, v12.1d, v12.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v13.16b, v10.16b, v11.16b
+ cmp x1, #0x100
+ blt L_aes_gcm_aad_update_arm64_crypto_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v8.1q, v12.1d, v13.1d
+ pmull2 v9.1q, v12.2d, v13.2d
+ ext v11.16b, v12.16b, v12.16b, #8
+ pmull v10.1q, v11.1d, v13.1d
+ pmull2 v11.1q, v11.2d, v13.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor v11.16b, v11.16b, v9.16b
+ eor v11.16b, v11.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v14.16b, v8.16b, v10.16b
+ ; Square H^2 => H^4
+ pmull2 v11.1q, v13.2d, v13.2d
+ pmull v10.1q, v13.1d, v13.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v15.16b, v10.16b, v11.16b
+ ; Done
+ cmp x1, #0x400
+ blt L_aes_gcm_aad_update_arm64_crypto_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v8.1q, v12.1d, v15.1d
+ pmull2 v9.1q, v12.2d, v15.2d
+ ext v11.16b, v12.16b, v12.16b, #8
+ pmull v10.1q, v11.1d, v15.1d
+ pmull2 v11.1q, v11.2d, v15.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor v11.16b, v11.16b, v9.16b
+ eor v11.16b, v11.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v16.16b, v8.16b, v10.16b
+ ; Square H^3 => H^6
+ pmull2 v11.1q, v14.2d, v14.2d
+ pmull v10.1q, v14.1d, v14.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v17.16b, v10.16b, v11.16b
+ ; Multiply H and H^6 => H^7
+ pmull v8.1q, v12.1d, v17.1d
+ pmull2 v9.1q, v12.2d, v17.2d
+ ext v11.16b, v12.16b, v12.16b, #8
+ pmull v10.1q, v11.1d, v17.1d
+ pmull2 v11.1q, v11.2d, v17.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor v11.16b, v11.16b, v9.16b
+ eor v11.16b, v11.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v18.16b, v8.16b, v10.16b
+ ; Square H^4 => H^8
+ pmull2 v11.1q, v15.2d, v15.2d
+ pmull v10.1q, v15.1d, v15.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v19.16b, v10.16b, v11.16b
+ ; Done
+L_aes_gcm_aad_update_arm64_crypto_h_done
+ lsr x1, x1, #4
+ cmp x1, #4
+ blt L_aes_gcm_aad_update_arm64_crypto_start_1
+ cmp x1, #16
+ blt L_aes_gcm_aad_update_arm64_crypto_start_2
+ cmp x1, #0x40
+ blt L_aes_gcm_aad_update_arm64_crypto_start_4
+L_aes_gcm_aad_update_arm64_crypto_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ rbit v4.16b, v4.16b
+ rbit v5.16b, v5.16b
+ rbit v6.16b, v6.16b
+ rbit v7.16b, v7.16b
+ eor v0.16b, v0.16b, v20.16b
+ ; X = C * H^1
+ pmull v8.1q, v7.1d, v12.1d
+ pmull2 v9.1q, v7.2d, v12.2d
+ ext v11.16b, v7.16b, v7.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; X += C * H^2
+ pmull v11.1q, v13.1d, v6.1d
+ pmull2 v20.1q, v13.2d, v6.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v6.16b, v6.16b, #8
+ pmull v11.1q, v20.1d, v13.1d
+ pmull2 v20.1q, v20.2d, v13.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^3
+ pmull v11.1q, v14.1d, v5.1d
+ pmull2 v20.1q, v14.2d, v5.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v5.16b, v5.16b, #8
+ pmull v11.1q, v20.1d, v14.1d
+ pmull2 v20.1q, v20.2d, v14.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^4
+ pmull v11.1q, v15.1d, v4.1d
+ pmull2 v20.1q, v15.2d, v4.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v4.16b, v4.16b, #8
+ pmull v11.1q, v20.1d, v15.1d
+ pmull2 v20.1q, v20.2d, v15.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^5
+ pmull v11.1q, v16.1d, v3.1d
+ pmull2 v20.1q, v16.2d, v3.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v3.16b, v3.16b, #8
+ pmull v11.1q, v20.1d, v16.1d
+ pmull2 v20.1q, v20.2d, v16.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^6
+ pmull v11.1q, v17.1d, v2.1d
+ pmull2 v20.1q, v17.2d, v2.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v2.16b, v2.16b, #8
+ pmull v11.1q, v20.1d, v17.1d
+ pmull2 v20.1q, v20.2d, v17.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^7
+ pmull v11.1q, v18.1d, v1.1d
+ pmull2 v20.1q, v18.2d, v1.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v1.16b, v1.16b, #8
+ pmull v11.1q, v20.1d, v18.1d
+ pmull2 v20.1q, v20.2d, v18.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^8
+ pmull v11.1q, v19.1d, v0.1d
+ pmull2 v20.1q, v19.2d, v0.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v0.16b, v0.16b, #8
+ pmull v11.1q, v20.1d, v19.1d
+ pmull2 v20.1q, v20.2d, v19.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor v11.16b, v11.16b, v9.16b
+ eor v11.16b, v11.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ sub x1, x1, #8
+ cmp x1, #8
+ bge L_aes_gcm_aad_update_arm64_crypto_start_8
+ cmp x1, #1
+ blt L_aes_gcm_aad_update_arm64_crypto_done
+ beq L_aes_gcm_aad_update_arm64_crypto_start_1
+ cmp x1, #16
+ blt L_aes_gcm_aad_update_arm64_crypto_start_2
+L_aes_gcm_aad_update_arm64_crypto_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v0.16b, v0.16b, v20.16b
+ ; X = C * H^1
+ pmull v8.1q, v3.1d, v12.1d
+ pmull2 v9.1q, v3.2d, v12.2d
+ ext v11.16b, v3.16b, v3.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; X += C * H^2
+ pmull v11.1q, v13.1d, v2.1d
+ pmull2 v20.1q, v13.2d, v2.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v2.16b, v2.16b, #8
+ pmull v11.1q, v20.1d, v13.1d
+ pmull2 v20.1q, v20.2d, v13.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^3
+ pmull v11.1q, v14.1d, v1.1d
+ pmull2 v20.1q, v14.2d, v1.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v1.16b, v1.16b, #8
+ pmull v11.1q, v20.1d, v14.1d
+ pmull2 v20.1q, v20.2d, v14.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; X += C * H^4
+ pmull v11.1q, v15.1d, v0.1d
+ pmull2 v20.1q, v15.2d, v0.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v0.16b, v0.16b, #8
+ pmull v11.1q, v20.1d, v15.1d
+ pmull2 v20.1q, v20.2d, v15.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor v11.16b, v11.16b, v9.16b
+ eor v11.16b, v11.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ sub x1, x1, #4
+ cmp x1, #4
+ bge L_aes_gcm_aad_update_arm64_crypto_start_4
+ cmp x1, #1
+ blt L_aes_gcm_aad_update_arm64_crypto_done
+ beq L_aes_gcm_aad_update_arm64_crypto_start_1
+L_aes_gcm_aad_update_arm64_crypto_start_2
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ eor v3.16b, v20.16b, v0.16b
+ ; X = C * H^1
+ pmull v8.1q, v1.1d, v12.1d
+ pmull2 v9.1q, v1.2d, v12.2d
+ ext v11.16b, v1.16b, v1.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; X += C * H^2
+ pmull v11.1q, v13.1d, v3.1d
+ pmull2 v20.1q, v13.2d, v3.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v3.16b, v3.16b, #8
+ pmull v11.1q, v20.1d, v13.1d
+ pmull2 v20.1q, v20.2d, v13.2d
+ eor v20.16b, v20.16b, v11.16b
+ eor v10.16b, v10.16b, v20.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor v11.16b, v11.16b, v9.16b
+ eor v11.16b, v11.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ sub x1, x1, #2
+ cmp x1, #1
+ bgt L_aes_gcm_aad_update_arm64_crypto_start_2
+ blt L_aes_gcm_aad_update_arm64_crypto_done
+L_aes_gcm_aad_update_arm64_crypto_start_1
+ cbz x1, L_aes_gcm_aad_update_arm64_crypto_done
+L_aes_gcm_aad_update_arm64_crypto_both_1
+ ld1 {v0.16b}, [x0], #16
+ rbit v0.16b, v0.16b
+ eor v3.16b, v20.16b, v0.16b
+ ; X = C * H^1
+ pmull v8.1q, v3.1d, v12.1d
+ pmull2 v9.1q, v3.2d, v12.2d
+ ext v11.16b, v3.16b, v3.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor v11.16b, v11.16b, v9.16b
+ eor v11.16b, v11.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ subs x1, x1, #1
+ bne L_aes_gcm_aad_update_arm64_crypto_both_1
+L_aes_gcm_aad_update_arm64_crypto_done
+ st1 {v20.2d}, [x2]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_block_AARCH64
+AES_GCM_encrypt_block_AARCH64 PROC
+ ld1 {v5.2d}, [x4]
+ ld1 {v4.2d}, [x3]
+ mov w5, v5.s[3]
+ rev w5, w5
+ add w5, w5, #1
+ rev w5, w5
+ mov v5.s[3], w5
+ st1 {v5.2d}, [x4]
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v2.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v3.16b
+ aesmc v5.16b, v5.16b
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v2.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v3.16b
+ aesmc v5.16b, v5.16b
+ subs w1, w1, #10
+ ld1 {v0.2d, v1.2d}, [x0], #32
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ beq L_aes_gcm_encrypt_block_arm64_crypto_round_done
+ ld1 {v0.2d, v1.2d}, [x0], #32
+ subs w1, w1, #2
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ beq L_aes_gcm_encrypt_block_arm64_crypto_round_done
+ ld1 {v0.2d, v1.2d}, [x0], #32
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+L_aes_gcm_encrypt_block_arm64_crypto_round_done
+ ld1 {v0.2d}, [x0]
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v5.16b
+ st1 {v4.2d}, [x2]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_update_AARCH64
+AES_GCM_encrypt_update_AARCH64 PROC
+ stp x29, x30, [sp, #-96]!
+ add x29, sp, #0
+ str x17, [x29, #24]
+ stp d8, d9, [x29, #32]
+ stp d10, d11, [x29, #48]
+ stp d12, d13, [x29, #64]
+ stp d14, d15, [x29, #80]
+ ld1 {v13.2d}, [x7]
+ movi v27.16b, #0x87
+ ld1 {v26.2d}, [x5]
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x6]
+ mov w9, v13.s[3]
+ rev w9, w9
+ cmp w4, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w4, #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w4, #0x200
+ blt L_aes_gcm_encrypt_update_arm64_crypto_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_encrypt_update_arm64_crypto_h_done
+ lsr w8, w4, #4
+ cmp x1, #12
+ blt L_aes_gcm_encrypt_update_arm64_crypto_start_128
+ bgt L_aes_gcm_encrypt_update_arm64_crypto_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w8, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_192_start_4
+L_aes_gcm_encrypt_update_arm64_crypto_192_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ rev w16, w16
+ rev w15, w15
+ rev w14, w14
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_encrypt_update_arm64_crypto_192_end_8
+L_aes_gcm_encrypt_update_arm64_crypto_192_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ mov v28.d[1], v31.d[0]
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_encrypt_update_arm64_crypto_192_both_8
+L_aes_gcm_encrypt_update_arm64_crypto_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_192_done
+ beq L_aes_gcm_encrypt_update_arm64_crypto_192_start_1
+ cmp w8, #4
+ blt L_aes_gcm_encrypt_update_arm64_crypto_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_192_end_4
+L_aes_gcm_encrypt_update_arm64_crypto_192_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rbit v19.16b, v19.16b
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ bge L_aes_gcm_encrypt_update_arm64_crypto_192_both_4
+L_aes_gcm_encrypt_update_arm64_crypto_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_encrypt_update_arm64_crypto_192_start_1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_192_done
+L_aes_gcm_encrypt_update_arm64_crypto_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_encrypt_update_arm64_crypto_192_done
+L_aes_gcm_encrypt_update_arm64_crypto_192_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_192_done
+ ENDIF
+ b L_aes_gcm_encrypt_update_arm64_crypto_done
+ ; AES_GCM_256
+L_aes_gcm_encrypt_update_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w8, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_256_start_4
+L_aes_gcm_encrypt_update_arm64_crypto_256_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ rev w16, w16
+ rev w15, w15
+ rev w14, w14
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_encrypt_update_arm64_crypto_256_end_8
+L_aes_gcm_encrypt_update_arm64_crypto_256_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ mov v28.d[1], v31.d[0]
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_encrypt_update_arm64_crypto_256_both_8
+L_aes_gcm_encrypt_update_arm64_crypto_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0], #16
+ cmp w8, #1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_256_done
+ beq L_aes_gcm_encrypt_update_arm64_crypto_256_start_1
+ cmp w8, #4
+ blt L_aes_gcm_encrypt_update_arm64_crypto_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_256_end_4
+L_aes_gcm_encrypt_update_arm64_crypto_256_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rbit v19.16b, v19.16b
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ bge L_aes_gcm_encrypt_update_arm64_crypto_256_both_4
+L_aes_gcm_encrypt_update_arm64_crypto_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_encrypt_update_arm64_crypto_256_start_1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_256_done
+L_aes_gcm_encrypt_update_arm64_crypto_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_encrypt_update_arm64_crypto_256_done
+L_aes_gcm_encrypt_update_arm64_crypto_256_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x0, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_256_done
+ ENDIF
+ b L_aes_gcm_encrypt_update_arm64_crypto_done
+ ; AES_GCM_128
+L_aes_gcm_encrypt_update_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w8, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_128_start_4
+L_aes_gcm_encrypt_update_arm64_crypto_128_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ rev w16, w16
+ rev w15, w15
+ rev w14, w14
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_encrypt_update_arm64_crypto_128_end_8
+L_aes_gcm_encrypt_update_arm64_crypto_128_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ mov v28.d[1], v31.d[0]
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_encrypt_update_arm64_crypto_128_both_8
+L_aes_gcm_encrypt_update_arm64_crypto_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d}, [x0], #32
+ ld1 {v10.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_128_done
+ beq L_aes_gcm_encrypt_update_arm64_crypto_128_start_1
+ cmp w8, #4
+ blt L_aes_gcm_encrypt_update_arm64_crypto_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_128_end_4
+L_aes_gcm_encrypt_update_arm64_crypto_128_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rbit v19.16b, v19.16b
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ bge L_aes_gcm_encrypt_update_arm64_crypto_128_both_4
+L_aes_gcm_encrypt_update_arm64_crypto_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_encrypt_update_arm64_crypto_128_start_1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_128_done
+L_aes_gcm_encrypt_update_arm64_crypto_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_encrypt_update_arm64_crypto_128_done
+L_aes_gcm_encrypt_update_arm64_crypto_128_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x3], #16
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_128_done
+ ENDIF
+L_aes_gcm_encrypt_update_arm64_crypto_done
+ rev w9, w9
+ mov v13.s[3], w9
+ st1 {v26.2d}, [x5]
+ st1 {v13.2d}, [x7]
+ ldr x17, [x29, #24]
+ ldp d8, d9, [x29, #32]
+ ldp d10, d11, [x29, #48]
+ ldp d12, d13, [x29, #64]
+ ldp d14, d15, [x29, #80]
+ ldp x29, x30, [sp], #0x60
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_final_AARCH64
+AES_GCM_encrypt_final_AARCH64 PROC
+ ld1 {v5.2d}, [x0]
+ movi v6.16b, #0x87
+ ld1 {v4.2d}, [x5]
+ ushr v6.2d, v6.2d, #56
+ ld1 {v7.2d}, [x6]
+ ubfiz x4, x4, #3, #32
+ rbit x4, x4
+ mov v0.d[0], x4
+ ubfiz x3, x3, #3, #32
+ rbit x3, x3
+ mov v0.d[1], x3
+ eor v5.16b, v5.16b, v0.16b
+ pmull v0.1q, v5.1d, v4.1d
+ pmull2 v1.1q, v5.2d, v4.2d
+ ext v3.16b, v5.16b, v5.16b, #8
+ pmull v2.1q, v3.1d, v4.1d
+ pmull2 v3.1q, v3.2d, v4.2d
+ eor v2.16b, v2.16b, v3.16b
+ ; Reduce
+ ext v3.16b, v0.16b, v1.16b, #8
+ pmull2 v1.1q, v1.2d, v6.2d
+ eor v3.16b, v3.16b, v1.16b
+ eor v3.16b, v3.16b, v2.16b
+ pmull2 v2.1q, v3.2d, v6.2d
+ mov v0.d[1], v3.d[0]
+ eor v5.16b, v0.16b, v2.16b
+ rbit v5.16b, v5.16b
+ eor v5.16b, v5.16b, v7.16b
+ cmp w2, #16
+ bne L_aes_gcm_encrypt_final_arm64_crypto_tag_partial
+ st1 {v5.16b}, [x1]
+ b L_aes_gcm_encrypt_final_arm64_crypto_done
+L_aes_gcm_encrypt_final_arm64_crypto_tag_partial
+ st1 {v5.16b}, [x0]
+ cmp w2, #8
+ blt L_aes_gcm_encrypt_final_arm64_crypto_tag_start_dw
+ ldr x8, [x0], #8
+ sub w2, w2, #8
+ str x8, [x1], #8
+L_aes_gcm_encrypt_final_arm64_crypto_tag_start_dw
+ cmp w2, #4
+ blt L_aes_gcm_encrypt_final_arm64_crypto_tag_start_sw
+ ldr w8, [x0], #4
+ sub w2, w2, #4
+ str w8, [x1], #4
+L_aes_gcm_encrypt_final_arm64_crypto_tag_start_sw
+ cmp w2, #2
+ blt L_aes_gcm_encrypt_final_arm64_crypto_tag_start_byte
+ ldrh w8, [x0], #2
+ sub w2, w2, #2
+ strh w8, [x1], #2
+L_aes_gcm_encrypt_final_arm64_crypto_tag_start_byte
+ cbz w2, L_aes_gcm_encrypt_final_arm64_crypto_tag_end_bytes
+ ldrb w8, [x0], #1
+ subs w2, w2, #1
+ strb w8, [x1], #1
+ bne L_aes_gcm_encrypt_final_arm64_crypto_tag_start_byte
+L_aes_gcm_encrypt_final_arm64_crypto_tag_end_bytes
+L_aes_gcm_encrypt_final_arm64_crypto_done
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_decrypt_update_AARCH64
+AES_GCM_decrypt_update_AARCH64 PROC
+ stp x29, x30, [sp, #-96]!
+ add x29, sp, #0
+ str x17, [x29, #24]
+ stp d8, d9, [x29, #32]
+ stp d10, d11, [x29, #48]
+ stp d12, d13, [x29, #64]
+ stp d14, d15, [x29, #80]
+ ld1 {v13.2d}, [x7]
+ movi v27.16b, #0x87
+ ld1 {v26.2d}, [x5]
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x6]
+ mov w9, v13.s[3]
+ rev w9, w9
+ cmp w4, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w4, #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w4, #0x200
+ blt L_aes_gcm_decrypt_update_arm64_crypto_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_decrypt_update_arm64_crypto_h_done
+ lsr w8, w4, #4
+ cmp x1, #12
+ blt L_aes_gcm_decrypt_update_arm64_crypto_start_128
+ bgt L_aes_gcm_decrypt_update_arm64_crypto_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w8, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_192_start_4
+L_aes_gcm_decrypt_update_arm64_crypto_192_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ mov v14.s[3], w17
+ rev w16, w16
+ mov v15.s[3], w16
+ rev w15, w15
+ mov v16.s[3], w15
+ rev w14, w14
+ mov v17.s[3], w14
+ rev w13, w13
+ mov v8.s[3], w13
+ rev w12, w12
+ mov v9.s[3], w12
+ rev w11, w11
+ mov v10.s[3], w11
+ rev w10, w9
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_decrypt_update_arm64_crypto_192_end_8
+L_aes_gcm_decrypt_update_arm64_crypto_192_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w17
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w16
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w15
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w14
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w13
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w12
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w11
+ rev w10, w9
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_decrypt_update_arm64_crypto_192_both_8
+L_aes_gcm_decrypt_update_arm64_crypto_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_192_done
+ beq L_aes_gcm_decrypt_update_arm64_crypto_192_start_1
+ cmp w8, #4
+ blt L_aes_gcm_decrypt_update_arm64_crypto_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w12, w12
+ mov v15.s[3], w12
+ rev w11, w11
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_192_end_4
+L_aes_gcm_decrypt_update_arm64_crypto_192_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w13
+ rev w12, w12
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w12
+ rev w11, w11
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ bge L_aes_gcm_decrypt_update_arm64_crypto_192_both_4
+L_aes_gcm_decrypt_update_arm64_crypto_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_decrypt_update_arm64_crypto_192_start_1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_192_done
+L_aes_gcm_decrypt_update_arm64_crypto_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w10, w9
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_decrypt_update_arm64_crypto_192_done
+L_aes_gcm_decrypt_update_arm64_crypto_192_start_1
+ ld1 {v15.16b}, [x3], #16
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.16b}, [x2], #16
+L_aes_gcm_decrypt_update_arm64_crypto_192_done
+ ENDIF
+ b L_aes_gcm_decrypt_update_arm64_crypto_done
+ ; AES_GCM_256
+L_aes_gcm_decrypt_update_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w8, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_256_start_4
+L_aes_gcm_decrypt_update_arm64_crypto_256_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ mov v14.s[3], w17
+ rev w16, w16
+ mov v15.s[3], w16
+ rev w15, w15
+ mov v16.s[3], w15
+ rev w14, w14
+ mov v17.s[3], w14
+ rev w13, w13
+ mov v8.s[3], w13
+ rev w12, w12
+ mov v9.s[3], w12
+ rev w11, w11
+ mov v10.s[3], w11
+ rev w10, w9
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_decrypt_update_arm64_crypto_256_end_8
+L_aes_gcm_decrypt_update_arm64_crypto_256_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w17
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w16
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w15
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w14
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w13
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w12
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w11
+ rev w10, w9
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_decrypt_update_arm64_crypto_256_both_8
+L_aes_gcm_decrypt_update_arm64_crypto_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0], #16
+ cmp w8, #1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_256_done
+ beq L_aes_gcm_decrypt_update_arm64_crypto_256_start_1
+ cmp w8, #4
+ blt L_aes_gcm_decrypt_update_arm64_crypto_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w12, w12
+ mov v15.s[3], w12
+ rev w11, w11
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_256_end_4
+L_aes_gcm_decrypt_update_arm64_crypto_256_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w13
+ rev w12, w12
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w12
+ rev w11, w11
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ bge L_aes_gcm_decrypt_update_arm64_crypto_256_both_4
+L_aes_gcm_decrypt_update_arm64_crypto_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_decrypt_update_arm64_crypto_256_start_1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_256_done
+L_aes_gcm_decrypt_update_arm64_crypto_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w10, w9
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_decrypt_update_arm64_crypto_256_done
+L_aes_gcm_decrypt_update_arm64_crypto_256_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x0, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_256_done
+ ENDIF
+ b L_aes_gcm_decrypt_update_arm64_crypto_done
+ ; AES_GCM_128
+L_aes_gcm_decrypt_update_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w8, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_128_start_4
+L_aes_gcm_decrypt_update_arm64_crypto_128_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ mov v14.s[3], w17
+ rev w16, w16
+ mov v15.s[3], w16
+ rev w15, w15
+ mov v16.s[3], w15
+ rev w14, w14
+ mov v17.s[3], w14
+ rev w13, w13
+ mov v8.s[3], w13
+ rev w12, w12
+ mov v9.s[3], w12
+ rev w11, w11
+ mov v10.s[3], w11
+ rev w10, w9
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_decrypt_update_arm64_crypto_128_end_8
+L_aes_gcm_decrypt_update_arm64_crypto_128_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w17
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w16
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w15
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w14
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w13
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w12
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w11
+ rev w10, w9
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_decrypt_update_arm64_crypto_128_both_8
+L_aes_gcm_decrypt_update_arm64_crypto_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d}, [x0], #32
+ ld1 {v10.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_128_done
+ beq L_aes_gcm_decrypt_update_arm64_crypto_128_start_1
+ cmp w8, #4
+ blt L_aes_gcm_decrypt_update_arm64_crypto_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w12, w12
+ mov v15.s[3], w12
+ rev w11, w11
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_128_end_4
+L_aes_gcm_decrypt_update_arm64_crypto_128_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w13
+ rev w12, w12
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w12
+ rev w11, w11
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v26.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor v31.16b, v31.16b, v29.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ eor v31.16b, v31.16b, v30.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ bge L_aes_gcm_decrypt_update_arm64_crypto_128_both_4
+L_aes_gcm_decrypt_update_arm64_crypto_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_decrypt_update_arm64_crypto_128_start_1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_128_done
+L_aes_gcm_decrypt_update_arm64_crypto_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w10, w9
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor v26.16b, v26.16b, v31.16b
+ eor v30.16b, v30.16b, v26.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_decrypt_update_arm64_crypto_128_done
+L_aes_gcm_decrypt_update_arm64_crypto_128_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x3], #16
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor v31.16b, v31.16b, v29.16b
+ eor v31.16b, v31.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_128_done
+ ENDIF
+L_aes_gcm_decrypt_update_arm64_crypto_done
+ rev w9, w9
+ mov v13.s[3], w9
+ st1 {v26.2d}, [x5]
+ st1 {v13.2d}, [x7]
+ ldr x17, [x29, #24]
+ ldp d8, d9, [x29, #32]
+ ldp d10, d11, [x29, #48]
+ ldp d12, d13, [x29, #64]
+ ldp d14, d15, [x29, #80]
+ ldp x29, x30, [sp], #0x60
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_decrypt_final_AARCH64
+AES_GCM_decrypt_final_AARCH64 PROC
+ ld1 {v5.2d}, [x0]
+ movi v6.16b, #0x87
+ ld1 {v4.2d}, [x5]
+ ushr v6.2d, v6.2d, #56
+ ld1 {v7.2d}, [x6]
+ ubfiz x4, x4, #3, #32
+ rbit x4, x4
+ mov v0.d[0], x4
+ ubfiz x3, x3, #3, #32
+ rbit x3, x3
+ mov v0.d[1], x3
+ eor v5.16b, v5.16b, v0.16b
+ pmull v0.1q, v5.1d, v4.1d
+ pmull2 v1.1q, v5.2d, v4.2d
+ ext v3.16b, v5.16b, v5.16b, #8
+ pmull v2.1q, v3.1d, v4.1d
+ pmull2 v3.1q, v3.2d, v4.2d
+ eor v2.16b, v2.16b, v3.16b
+ ; Reduce
+ ext v3.16b, v0.16b, v1.16b, #8
+ pmull2 v1.1q, v1.2d, v6.2d
+ eor v3.16b, v3.16b, v1.16b
+ eor v3.16b, v3.16b, v2.16b
+ pmull2 v2.1q, v3.2d, v6.2d
+ mov v0.d[1], v3.d[0]
+ eor v5.16b, v0.16b, v2.16b
+ rbit v5.16b, v5.16b
+ eor v5.16b, v5.16b, v7.16b
+ cmp w2, #16
+ blt L_aes_gcm_decrypt_final_arm64_crypto_part_tag
+ ld1 {v0.16b}, [x1]
+ b L_aes_gcm_decrypt_final_arm64_crypto_tag_loaded
+L_aes_gcm_decrypt_final_arm64_crypto_part_tag
+ ubfiz x2, x2, #0, #32
+ eor v0.16b, v0.16b, v0.16b
+ mov x10, x2
+ st1 {v0.2d}, [x0]
+ cmp x10, #8
+ blt L_aes_gcm_decrypt_final_arm64_crypto_tag_start_dw
+ ldr x9, [x1], #8
+ sub x10, x10, #8
+ str x9, [x0], #8
+L_aes_gcm_decrypt_final_arm64_crypto_tag_start_dw
+ cmp x10, #4
+ blt L_aes_gcm_decrypt_final_arm64_crypto_tag_start_sw
+ ldr w9, [x1], #4
+ sub x10, x10, #4
+ str w9, [x0], #4
+L_aes_gcm_decrypt_final_arm64_crypto_tag_start_sw
+ cmp x10, #2
+ blt L_aes_gcm_decrypt_final_arm64_crypto_tag_start_byte
+ ldrh w9, [x1], #2
+ sub x10, x10, #2
+ strh w9, [x0], #2
+L_aes_gcm_decrypt_final_arm64_crypto_tag_start_byte
+ cbz x10, L_aes_gcm_decrypt_final_arm64_crypto_tag_end_bytes
+ ldrb w9, [x1], #1
+ subs x10, x10, #1
+ strb w9, [x0], #1
+ bne L_aes_gcm_decrypt_final_arm64_crypto_tag_start_byte
+L_aes_gcm_decrypt_final_arm64_crypto_tag_end_bytes
+ sub x0, x0, x2
+ ld1 {v0.2d}, [x0]
+ mov x10, #16
+ st1 {v5.2d}, [x0]
+ sub x10, x10, x2
+ add x0, x0, x2
+L_aes_gcm_decrypt_final_arm64_crypto_calc_tag_byte
+ strb wzr, [x0], #1
+ subs x10, x10, #1
+ bne L_aes_gcm_decrypt_final_arm64_crypto_calc_tag_byte
+ subs x0, x0, #16
+ ld1 {v5.2d}, [x0]
+L_aes_gcm_decrypt_final_arm64_crypto_tag_loaded
+ eor v0.16b, v0.16b, v5.16b
+ mov x9, v0.d[0]
+ mov x10, v0.d[1]
+ mov w11, #-180
+ orr x9, x9, x10
+ cmp x9, #0
+ csetm x8, ne
+ and x8, x8, x11
+ add w8, w8, #0xb4
+ str w8, [x7]
+ ret
+ ENDP
+ IF :DEF:WOLFSSL_ARMASM_CRYPTO_SHA3
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_init_AARCH64_EOR3
+AES_GCM_init_AARCH64_EOR3 PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ movi v6.16b, #0x87
+ ld1 {v5.2d}, [x4]
+ ushr v6.2d, v6.2d, #56
+ ; Load Nonce
+ cmp w3, #12
+ bne L_aes_gcm_init_arm64_crypto_eor3_ghash_nonce
+ ldr x9, [x2]
+ movi v4.4s, #1, lsl 24
+ ldr w10, [x2, #8]
+ mov v4.d[0], x9
+ mov v4.s[2], w10
+ mov w8, #1
+ b L_aes_gcm_init_arm64_crypto_eor3_done_nonce
+L_aes_gcm_init_arm64_crypto_eor3_ghash_nonce
+ eor v4.16b, v4.16b, v4.16b
+ lsr w7, w3, #4
+ cbz w7, L_aes_gcm_init_arm64_crypto_eor3_done
+L_aes_gcm_init_arm64_crypto_eor3_start_1
+ ld1 {v0.16b}, [x2], #16
+ rbit v0.16b, v0.16b
+ eor v3.16b, v4.16b, v0.16b
+ ; X = C * H^1
+ pmull v7.1q, v3.1d, v5.1d
+ pmull2 v8.1q, v3.2d, v5.2d
+ ext v10.16b, v3.16b, v3.16b, #8
+ pmull v9.1q, v10.1d, v5.1d
+ pmull2 v10.1q, v10.2d, v5.2d
+ eor v9.16b, v9.16b, v10.16b
+ ; Reduce
+ ext v10.16b, v7.16b, v8.16b, #8
+ pmull2 v8.1q, v8.2d, v6.2d
+ eor3 v10.16b, v10.16b, v8.16b, v9.16b
+ pmull2 v9.1q, v10.2d, v6.2d
+ mov v7.d[1], v10.d[0]
+ eor v4.16b, v7.16b, v9.16b
+ ; Done GHASH
+ subs w7, w7, #1
+ bne L_aes_gcm_init_arm64_crypto_eor3_start_1
+L_aes_gcm_init_arm64_crypto_eor3_done
+ and w13, w3, #15
+ cbz x13, L_aes_gcm_init_arm64_crypto_eor3_partial_done
+ eor v7.16b, v7.16b, v7.16b
+ mov w12, w13
+ st1 {v7.2d}, [x6]
+ cmp w12, #8
+ blt L_aes_gcm_init_arm64_crypto_eor3_start_dw
+ ldr x11, [x2], #8
+ sub w12, w12, #8
+ str x11, [x6], #8
+L_aes_gcm_init_arm64_crypto_eor3_start_dw
+ cmp w12, #4
+ blt L_aes_gcm_init_arm64_crypto_eor3_start_sw
+ ldr w11, [x2], #4
+ sub w12, w12, #4
+ str w11, [x6], #4
+L_aes_gcm_init_arm64_crypto_eor3_start_sw
+ cmp w12, #2
+ blt L_aes_gcm_init_arm64_crypto_eor3_start_byte
+ ldrh w11, [x2], #2
+ sub w12, w12, #2
+ strh w11, [x6], #2
+L_aes_gcm_init_arm64_crypto_eor3_start_byte
+ cbz w12, L_aes_gcm_init_arm64_crypto_eor3_end_bytes
+ ldrb w11, [x2], #1
+ subs w12, w12, #1
+ strb w11, [x6], #1
+ bne L_aes_gcm_init_arm64_crypto_eor3_start_byte
+L_aes_gcm_init_arm64_crypto_eor3_end_bytes
+ sub x6, x6, x13
+ ld1 {v0.2d}, [x6]
+ rbit v0.16b, v0.16b
+ eor v3.16b, v4.16b, v0.16b
+ ; X = C * H^1
+ pmull v7.1q, v3.1d, v5.1d
+ pmull2 v8.1q, v3.2d, v5.2d
+ ext v10.16b, v3.16b, v3.16b, #8
+ pmull v9.1q, v10.1d, v5.1d
+ pmull2 v10.1q, v10.2d, v5.2d
+ eor v9.16b, v9.16b, v10.16b
+ ; Reduce
+ ext v10.16b, v7.16b, v8.16b, #8
+ pmull2 v8.1q, v8.2d, v6.2d
+ eor3 v10.16b, v10.16b, v8.16b, v9.16b
+ pmull2 v9.1q, v10.2d, v6.2d
+ mov v7.d[1], v10.d[0]
+ eor v4.16b, v7.16b, v9.16b
+ ; Done GHASH
+L_aes_gcm_init_arm64_crypto_eor3_partial_done
+ eor x7, x7, x7
+ ubfiz x13, x3, #3, #32
+ mov v7.d[0], x7
+ mov v7.d[1], x13
+ rev64 v7.16b, v7.16b
+ rbit v7.16b, v7.16b
+ eor v4.16b, v4.16b, v7.16b
+ pmull v7.1q, v4.1d, v5.1d
+ pmull2 v8.1q, v4.2d, v5.2d
+ ext v10.16b, v4.16b, v4.16b, #8
+ pmull v9.1q, v10.1d, v5.1d
+ pmull2 v10.1q, v10.2d, v5.2d
+ eor v9.16b, v9.16b, v10.16b
+ ext v10.16b, v7.16b, v8.16b, #8
+ pmull2 v8.1q, v8.2d, v6.2d
+ eor3 v10.16b, v10.16b, v8.16b, v9.16b
+ pmull2 v9.1q, v10.2d, v6.2d
+ mov v7.d[1], v10.d[0]
+ eor v4.16b, v7.16b, v9.16b
+ rbit v4.16b, v4.16b
+ mov w8, v4.s[3]
+ rev w8, w8
+L_aes_gcm_init_arm64_crypto_eor3_done_nonce
+ st1 {v4.2d}, [x5]
+ ld1 {v7.2d, v8.2d, v9.2d, v10.2d}, [x0], #0x40
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v9.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v10.16b
+ aesmc v4.16b, v4.16b
+ ld1 {v7.2d, v8.2d, v9.2d, v10.2d}, [x0], #0x40
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v9.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v10.16b
+ aesmc v4.16b, v4.16b
+ subs w1, w1, #10
+ ld1 {v7.2d, v8.2d}, [x0], #32
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ beq L_aes_gcm_init_arm64_crypto_eor3_round_done
+ ld1 {v7.2d, v8.2d}, [x0], #32
+ subs w1, w1, #2
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+ beq L_aes_gcm_init_arm64_crypto_eor3_round_done
+ ld1 {v7.2d, v8.2d}, [x0], #32
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v7.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v8.16b
+L_aes_gcm_init_arm64_crypto_eor3_round_done
+ ld1 {v7.2d}, [x0]
+ eor v4.16b, v4.16b, v7.16b
+ st1 {v4.2d}, [x6]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_ghash_block_AARCH64_EOR3
+AES_GCM_ghash_block_AARCH64_EOR3 PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ ld1 {v6.2d}, [x1]
+ movi v7.16b, #0x87
+ ld1 {v5.2d}, [x2]
+ ushr v7.2d, v7.2d, #56
+ ld1 {v4.2d}, [x0]
+ rbit v4.16b, v4.16b
+ eor v8.16b, v6.16b, v4.16b
+ ; X = C * H^1
+ pmull v0.1q, v8.1d, v5.1d
+ pmull2 v1.1q, v8.2d, v5.2d
+ ext v3.16b, v8.16b, v8.16b, #8
+ pmull v2.1q, v3.1d, v5.1d
+ pmull2 v3.1q, v3.2d, v5.2d
+ eor v2.16b, v2.16b, v3.16b
+ ; Reduce
+ ext v3.16b, v0.16b, v1.16b, #8
+ pmull2 v1.1q, v1.2d, v7.2d
+ eor3 v3.16b, v3.16b, v1.16b, v2.16b
+ pmull2 v2.1q, v3.2d, v7.2d
+ mov v0.d[1], v3.d[0]
+ eor v6.16b, v0.16b, v2.16b
+ ; Done GHASH
+ st1 {v6.2d}, [x1]
+ ldp d8, d9, [x29, #16]
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_aad_update_AARCH64_EOR3
+AES_GCM_aad_update_AARCH64_EOR3 PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ ld1 {v20.2d}, [x2]
+ movi v21.16b, #0x87
+ ld1 {v12.2d}, [x3]
+ ushr v21.2d, v21.2d, #56
+ cmp x1, #0x40
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_h_done
+ ; Square H => H^2
+ pmull2 v11.1q, v12.2d, v12.2d
+ pmull v10.1q, v12.1d, v12.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v13.16b, v10.16b, v11.16b
+ cmp x1, #0x100
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v8.1q, v12.1d, v13.1d
+ pmull2 v9.1q, v12.2d, v13.2d
+ ext v11.16b, v12.16b, v12.16b, #8
+ pmull v10.1q, v11.1d, v13.1d
+ pmull2 v11.1q, v11.2d, v13.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v14.16b, v8.16b, v10.16b
+ ; Square H^2 => H^4
+ pmull2 v11.1q, v13.2d, v13.2d
+ pmull v10.1q, v13.1d, v13.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v15.16b, v10.16b, v11.16b
+ ; Done
+ cmp x1, #0x400
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v8.1q, v12.1d, v15.1d
+ pmull2 v9.1q, v12.2d, v15.2d
+ ext v11.16b, v12.16b, v12.16b, #8
+ pmull v10.1q, v11.1d, v15.1d
+ pmull2 v11.1q, v11.2d, v15.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v16.16b, v8.16b, v10.16b
+ ; Square H^3 => H^6
+ pmull2 v11.1q, v14.2d, v14.2d
+ pmull v10.1q, v14.1d, v14.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v17.16b, v10.16b, v11.16b
+ ; Multiply H and H^6 => H^7
+ pmull v8.1q, v12.1d, v17.1d
+ pmull2 v9.1q, v12.2d, v17.2d
+ ext v11.16b, v12.16b, v12.16b, #8
+ pmull v10.1q, v11.1d, v17.1d
+ pmull2 v11.1q, v11.2d, v17.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v18.16b, v8.16b, v10.16b
+ ; Square H^4 => H^8
+ pmull2 v11.1q, v15.2d, v15.2d
+ pmull v10.1q, v15.1d, v15.1d
+ pmull2 v8.1q, v11.2d, v21.2d
+ ext v9.16b, v10.16b, v11.16b, #8
+ eor v9.16b, v9.16b, v8.16b
+ pmull2 v11.1q, v9.2d, v21.2d
+ mov v10.d[1], v9.d[0]
+ eor v19.16b, v10.16b, v11.16b
+ ; Done
+L_aes_gcm_aad_update_arm64_crypto_eor3_h_done
+ lsr x1, x1, #4
+ cmp x1, #4
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_start_1
+ cmp x1, #16
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_start_2
+ cmp x1, #0x40
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_start_4
+L_aes_gcm_aad_update_arm64_crypto_eor3_start_8
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ rbit v4.16b, v4.16b
+ rbit v5.16b, v5.16b
+ rbit v6.16b, v6.16b
+ rbit v7.16b, v7.16b
+ eor v0.16b, v0.16b, v20.16b
+ ; X = C * H^1
+ pmull v8.1q, v7.1d, v12.1d
+ pmull2 v9.1q, v7.2d, v12.2d
+ ext v11.16b, v7.16b, v7.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; X += C * H^2
+ pmull v11.1q, v13.1d, v6.1d
+ pmull2 v20.1q, v13.2d, v6.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v6.16b, v6.16b, #8
+ pmull v11.1q, v20.1d, v13.1d
+ pmull2 v20.1q, v20.2d, v13.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^3
+ pmull v11.1q, v14.1d, v5.1d
+ pmull2 v20.1q, v14.2d, v5.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v5.16b, v5.16b, #8
+ pmull v11.1q, v20.1d, v14.1d
+ pmull2 v20.1q, v20.2d, v14.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^4
+ pmull v11.1q, v15.1d, v4.1d
+ pmull2 v20.1q, v15.2d, v4.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v4.16b, v4.16b, #8
+ pmull v11.1q, v20.1d, v15.1d
+ pmull2 v20.1q, v20.2d, v15.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^5
+ pmull v11.1q, v16.1d, v3.1d
+ pmull2 v20.1q, v16.2d, v3.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v3.16b, v3.16b, #8
+ pmull v11.1q, v20.1d, v16.1d
+ pmull2 v20.1q, v20.2d, v16.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^6
+ pmull v11.1q, v17.1d, v2.1d
+ pmull2 v20.1q, v17.2d, v2.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v2.16b, v2.16b, #8
+ pmull v11.1q, v20.1d, v17.1d
+ pmull2 v20.1q, v20.2d, v17.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^7
+ pmull v11.1q, v18.1d, v1.1d
+ pmull2 v20.1q, v18.2d, v1.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v1.16b, v1.16b, #8
+ pmull v11.1q, v20.1d, v18.1d
+ pmull2 v20.1q, v20.2d, v18.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^8
+ pmull v11.1q, v19.1d, v0.1d
+ pmull2 v20.1q, v19.2d, v0.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v0.16b, v0.16b, #8
+ pmull v11.1q, v20.1d, v19.1d
+ pmull2 v20.1q, v20.2d, v19.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ sub x1, x1, #8
+ cmp x1, #8
+ bge L_aes_gcm_aad_update_arm64_crypto_eor3_start_8
+ cmp x1, #1
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_done
+ beq L_aes_gcm_aad_update_arm64_crypto_eor3_start_1
+ cmp x1, #16
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_start_2
+L_aes_gcm_aad_update_arm64_crypto_eor3_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v0.16b, v0.16b, v20.16b
+ ; X = C * H^1
+ pmull v8.1q, v3.1d, v12.1d
+ pmull2 v9.1q, v3.2d, v12.2d
+ ext v11.16b, v3.16b, v3.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; X += C * H^2
+ pmull v11.1q, v13.1d, v2.1d
+ pmull2 v20.1q, v13.2d, v2.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v2.16b, v2.16b, #8
+ pmull v11.1q, v20.1d, v13.1d
+ pmull2 v20.1q, v20.2d, v13.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^3
+ pmull v11.1q, v14.1d, v1.1d
+ pmull2 v20.1q, v14.2d, v1.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v1.16b, v1.16b, #8
+ pmull v11.1q, v20.1d, v14.1d
+ pmull2 v20.1q, v20.2d, v14.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; X += C * H^4
+ pmull v11.1q, v15.1d, v0.1d
+ pmull2 v20.1q, v15.2d, v0.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v0.16b, v0.16b, #8
+ pmull v11.1q, v20.1d, v15.1d
+ pmull2 v20.1q, v20.2d, v15.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ sub x1, x1, #4
+ cmp x1, #4
+ bge L_aes_gcm_aad_update_arm64_crypto_eor3_start_4
+ cmp x1, #1
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_done
+ beq L_aes_gcm_aad_update_arm64_crypto_eor3_start_1
+L_aes_gcm_aad_update_arm64_crypto_eor3_start_2
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ eor v3.16b, v20.16b, v0.16b
+ ; X = C * H^1
+ pmull v8.1q, v1.1d, v12.1d
+ pmull2 v9.1q, v1.2d, v12.2d
+ ext v11.16b, v1.16b, v1.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; X += C * H^2
+ pmull v11.1q, v13.1d, v3.1d
+ pmull2 v20.1q, v13.2d, v3.2d
+ eor v8.16b, v8.16b, v11.16b
+ eor v9.16b, v9.16b, v20.16b
+ ext v20.16b, v3.16b, v3.16b, #8
+ pmull v11.1q, v20.1d, v13.1d
+ pmull2 v20.1q, v20.2d, v13.2d
+ eor3 v10.16b, v10.16b, v20.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ sub x1, x1, #2
+ cmp x1, #1
+ bgt L_aes_gcm_aad_update_arm64_crypto_eor3_start_2
+ blt L_aes_gcm_aad_update_arm64_crypto_eor3_done
+L_aes_gcm_aad_update_arm64_crypto_eor3_start_1
+ cbz x1, L_aes_gcm_aad_update_arm64_crypto_eor3_done
+L_aes_gcm_aad_update_arm64_crypto_eor3_both_1
+ ld1 {v0.16b}, [x0], #16
+ rbit v0.16b, v0.16b
+ eor v3.16b, v20.16b, v0.16b
+ ; X = C * H^1
+ pmull v8.1q, v3.1d, v12.1d
+ pmull2 v9.1q, v3.2d, v12.2d
+ ext v11.16b, v3.16b, v3.16b, #8
+ pmull v10.1q, v11.1d, v12.1d
+ pmull2 v11.1q, v11.2d, v12.2d
+ eor v10.16b, v10.16b, v11.16b
+ ; Reduce
+ ext v11.16b, v8.16b, v9.16b, #8
+ pmull2 v9.1q, v9.2d, v21.2d
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b
+ pmull2 v10.1q, v11.2d, v21.2d
+ mov v8.d[1], v11.d[0]
+ eor v20.16b, v8.16b, v10.16b
+ ; Done GHASH
+ subs x1, x1, #1
+ bne L_aes_gcm_aad_update_arm64_crypto_eor3_both_1
+L_aes_gcm_aad_update_arm64_crypto_eor3_done
+ st1 {v20.2d}, [x2]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_block_AARCH64_EOR3
+AES_GCM_encrypt_block_AARCH64_EOR3 PROC
+ ld1 {v5.2d}, [x4]
+ ld1 {v4.2d}, [x3]
+ mov w5, v5.s[3]
+ rev w5, w5
+ add w5, w5, #1
+ rev w5, w5
+ mov v5.s[3], w5
+ st1 {v5.2d}, [x4]
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v2.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v3.16b
+ aesmc v5.16b, v5.16b
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v2.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v3.16b
+ aesmc v5.16b, v5.16b
+ subs w1, w1, #10
+ ld1 {v0.2d, v1.2d}, [x0], #32
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ beq L_aes_gcm_encrypt_block_arm64_crypto_eor3_round_done
+ ld1 {v0.2d, v1.2d}, [x0], #32
+ subs w1, w1, #2
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+ beq L_aes_gcm_encrypt_block_arm64_crypto_eor3_round_done
+ ld1 {v0.2d, v1.2d}, [x0], #32
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v0.16b
+ aesmc v5.16b, v5.16b
+ aese v5.16b, v1.16b
+L_aes_gcm_encrypt_block_arm64_crypto_eor3_round_done
+ ld1 {v0.2d}, [x0]
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v5.16b
+ st1 {v4.2d}, [x2]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_update_AARCH64_EOR3
+AES_GCM_encrypt_update_AARCH64_EOR3 PROC
+ stp x29, x30, [sp, #-96]!
+ add x29, sp, #0
+ str x17, [x29, #24]
+ stp d8, d9, [x29, #32]
+ stp d10, d11, [x29, #48]
+ stp d12, d13, [x29, #64]
+ stp d14, d15, [x29, #80]
+ ld1 {v13.2d}, [x7]
+ movi v27.16b, #0x87
+ ld1 {v26.2d}, [x5]
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x6]
+ mov w9, v13.s[3]
+ rev w9, w9
+ cmp w4, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w4, #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w4, #0x200
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_h_done
+ lsr w8, w4, #4
+ cmp x1, #12
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_start_128
+ bgt L_aes_gcm_encrypt_update_arm64_crypto_eor3_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w8, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ rev w16, w16
+ rev w15, w15
+ rev w14, w14
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_end_8
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_both_8
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_done
+ beq L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_1
+ cmp w8, #4
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_end_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rbit v19.16b, v19.16b
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ bge L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_both_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_done
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_done
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_192_done
+ ENDIF
+ b L_aes_gcm_encrypt_update_arm64_crypto_eor3_done
+ ; AES_GCM_256
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w8, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ rev w16, w16
+ rev w15, w15
+ rev w14, w14
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_end_8
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_both_8
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0], #16
+ cmp w8, #1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_done
+ beq L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_1
+ cmp w8, #4
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_end_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rbit v19.16b, v19.16b
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ bge L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_both_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_done
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_done
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x0, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_256_done
+ ENDIF
+ b L_aes_gcm_encrypt_update_arm64_crypto_eor3_done
+ ; AES_GCM_128
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w8, #32
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ rev w16, w16
+ rev w15, w15
+ rev w14, w14
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_end_8
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ rev w10, w9
+ mov v14.s[3], w17
+ mov v15.s[3], w16
+ mov v16.s[3], w15
+ mov v17.s[3], w14
+ mov v8.s[3], w13
+ mov v9.s[3], w12
+ mov v10.s[3], w11
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ mov v28.d[1], v31.d[0]
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ; Done GHASH
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_both_8
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d}, [x0], #32
+ ld1 {v10.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_done
+ beq L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_1
+ cmp w8, #4
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_end_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rev w12, w12
+ rev w11, w11
+ rbit v19.16b, v19.16b
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w12
+ mov v16.s[3], w11
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ rbit v20.16b, v20.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ rbit v21.16b, v21.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ eor v20.16b, v20.16b, v16.16b
+ eor v21.16b, v21.16b, v17.16b
+ cmp w8, #4
+ st1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x2], #0x40
+ bge L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_both_4
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_1
+ blt L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_done
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ rev w10, w9
+ mov v14.s[3], w13
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v18.16b, v18.16b, v14.16b
+ eor v19.16b, v19.16b, v15.16b
+ st1 {v18.16b, v19.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_done
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x3], #16
+ eor v18.16b, v18.16b, v14.16b
+ st1 {v18.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_128_done
+ ENDIF
+L_aes_gcm_encrypt_update_arm64_crypto_eor3_done
+ rev w9, w9
+ mov v13.s[3], w9
+ st1 {v26.2d}, [x5]
+ st1 {v13.2d}, [x7]
+ ldr x17, [x29, #24]
+ ldp d8, d9, [x29, #32]
+ ldp d10, d11, [x29, #48]
+ ldp d12, d13, [x29, #64]
+ ldp d14, d15, [x29, #80]
+ ldp x29, x30, [sp], #0x60
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_final_AARCH64_EOR3
+AES_GCM_encrypt_final_AARCH64_EOR3 PROC
+ ld1 {v5.2d}, [x0]
+ movi v6.16b, #0x87
+ ld1 {v4.2d}, [x5]
+ ushr v6.2d, v6.2d, #56
+ ld1 {v7.2d}, [x6]
+ ubfiz x4, x4, #3, #32
+ rbit x4, x4
+ mov v0.d[0], x4
+ ubfiz x3, x3, #3, #32
+ rbit x3, x3
+ mov v0.d[1], x3
+ eor v5.16b, v5.16b, v0.16b
+ pmull v0.1q, v5.1d, v4.1d
+ pmull2 v1.1q, v5.2d, v4.2d
+ ext v3.16b, v5.16b, v5.16b, #8
+ pmull v2.1q, v3.1d, v4.1d
+ pmull2 v3.1q, v3.2d, v4.2d
+ eor v2.16b, v2.16b, v3.16b
+ ; Reduce
+ ext v3.16b, v0.16b, v1.16b, #8
+ pmull2 v1.1q, v1.2d, v6.2d
+ eor3 v3.16b, v3.16b, v1.16b, v2.16b
+ pmull2 v2.1q, v3.2d, v6.2d
+ mov v0.d[1], v3.d[0]
+ eor v5.16b, v0.16b, v2.16b
+ rbit v5.16b, v5.16b
+ eor v5.16b, v5.16b, v7.16b
+ cmp w2, #16
+ bne L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_partial
+ st1 {v5.16b}, [x1]
+ b L_aes_gcm_encrypt_final_arm64_crypto_eor3_done
+L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_partial
+ st1 {v5.16b}, [x0]
+ cmp w2, #8
+ blt L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_start_dw
+ ldr x8, [x0], #8
+ sub w2, w2, #8
+ str x8, [x1], #8
+L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_start_dw
+ cmp w2, #4
+ blt L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_start_sw
+ ldr w8, [x0], #4
+ sub w2, w2, #4
+ str w8, [x1], #4
+L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_start_sw
+ cmp w2, #2
+ blt L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_start_byte
+ ldrh w8, [x0], #2
+ sub w2, w2, #2
+ strh w8, [x1], #2
+L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_start_byte
+ cbz w2, L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_end_bytes
+ ldrb w8, [x0], #1
+ subs w2, w2, #1
+ strb w8, [x1], #1
+ bne L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_start_byte
+L_aes_gcm_encrypt_final_arm64_crypto_eor3_tag_end_bytes
+L_aes_gcm_encrypt_final_arm64_crypto_eor3_done
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_decrypt_update_AARCH64_EOR3
+AES_GCM_decrypt_update_AARCH64_EOR3 PROC
+ stp x29, x30, [sp, #-96]!
+ add x29, sp, #0
+ str x17, [x29, #24]
+ stp d8, d9, [x29, #32]
+ stp d10, d11, [x29, #48]
+ stp d12, d13, [x29, #64]
+ stp d14, d15, [x29, #80]
+ ld1 {v13.2d}, [x7]
+ movi v27.16b, #0x87
+ ld1 {v26.2d}, [x5]
+ ushr v27.2d, v27.2d, #56
+ ld1 {v22.2d}, [x6]
+ mov w9, v13.s[3]
+ rev w9, w9
+ cmp w4, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_h_done
+ ; Square H => H^2
+ pmull2 v31.1q, v22.2d, v22.2d
+ pmull v30.1q, v22.1d, v22.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v23.16b, v30.16b, v31.16b
+ cmp w4, #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_h_done
+ ; Multiply H and H^2 => H^3
+ pmull v28.1q, v22.1d, v23.1d
+ pmull2 v29.1q, v22.2d, v23.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v23.1d
+ pmull2 v31.1q, v31.2d, v23.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v24.16b, v28.16b, v30.16b
+ ; Square H^2 => H^4
+ pmull2 v31.1q, v23.2d, v23.2d
+ pmull v30.1q, v23.1d, v23.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v25.16b, v30.16b, v31.16b
+ ; Done
+ cmp w4, #0x200
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_h_done
+ ; Multiply H and H^4 => H^5
+ pmull v28.1q, v22.1d, v25.1d
+ pmull2 v29.1q, v22.2d, v25.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v25.1d
+ pmull2 v31.1q, v31.2d, v25.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v4.16b, v28.16b, v30.16b
+ ; Square H^3 => H^6
+ pmull2 v31.1q, v24.2d, v24.2d
+ pmull v30.1q, v24.1d, v24.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v5.16b, v30.16b, v31.16b
+ ; Multiply H and H^6 => H^7
+ pmull v28.1q, v22.1d, v5.1d
+ pmull2 v29.1q, v22.2d, v5.2d
+ ext v31.16b, v22.16b, v22.16b, #8
+ pmull v30.1q, v31.1d, v5.1d
+ pmull2 v31.1q, v31.2d, v5.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v6.16b, v28.16b, v30.16b
+ ; Square H^4 => H^8
+ pmull2 v31.1q, v25.2d, v25.2d
+ pmull v30.1q, v25.1d, v25.1d
+ pmull2 v28.1q, v31.2d, v27.2d
+ ext v29.16b, v30.16b, v31.16b, #8
+ eor v29.16b, v29.16b, v28.16b
+ pmull2 v31.1q, v29.2d, v27.2d
+ mov v30.d[1], v29.d[0]
+ eor v7.16b, v30.16b, v31.16b
+ ; Done
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_h_done
+ lsr w8, w4, #4
+ cmp x1, #12
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_start_128
+ bgt L_aes_gcm_decrypt_update_arm64_crypto_eor3_start_256
+ ; AES_GCM_192
+ IF :LNOT::DEF:NO_AES_192
+ cmp w8, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ mov v14.s[3], w17
+ rev w16, w16
+ mov v15.s[3], w16
+ rev w15, w15
+ mov v16.s[3], w15
+ rev w14, w14
+ mov v17.s[3], w14
+ rev w13, w13
+ mov v8.s[3], w13
+ rev w12, w12
+ mov v9.s[3], w12
+ rev w11, w11
+ mov v10.s[3], w11
+ rev w10, w9
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_end_8
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w17
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w16
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w15
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w14
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w13
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w12
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w11
+ rev w10, w9
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_both_8
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_done
+ beq L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_1
+ cmp w8, #4
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w12, w12
+ mov v15.s[3], w12
+ rev w11, w11
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_end_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w13
+ rev w12, w12
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w12
+ rev w11, w11
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v11.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v11.16b
+ eor v17.16b, v17.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ bge L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_both_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_done
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w10, w9
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v11.16b
+ eor v15.16b, v15.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_done
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_start_1
+ ld1 {v15.16b}, [x3], #16
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rbit v15.16b, v15.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v16.16b, v26.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v16.1d, v22.1d
+ pmull2 v29.1q, v16.2d, v22.2d
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ ext v31.16b, v16.16b, v16.16b, #8
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v14.16b, v11.16b
+ eor v14.16b, v14.16b, v12.16b
+ ; Done GHASH
+ rbit v15.16b, v15.16b
+ eor v14.16b, v14.16b, v15.16b
+ st1 {v14.16b}, [x2], #16
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_192_done
+ ENDIF
+ b L_aes_gcm_decrypt_update_arm64_crypto_eor3_done
+ ; AES_GCM_256
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_start_256
+ IF :LNOT::DEF:NO_AES_256
+ cmp w8, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ mov v14.s[3], w17
+ rev w16, w16
+ mov v15.s[3], w16
+ rev w15, w15
+ mov v16.s[3], w15
+ rev w14, w14
+ mov v17.s[3], w14
+ rev w13, w13
+ mov v8.s[3], w13
+ rev w12, w12
+ mov v9.s[3], w12
+ rev w11, w11
+ mov v10.s[3], w11
+ rev w10, w9
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_end_8
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w17
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w16
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w15
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w14
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w13
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w12
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w11
+ rev w10, w9
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #176]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #192]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #208]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #224]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_both_8
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x0], #0x40
+ ld1 {v12.2d}, [x0], #16
+ cmp w8, #1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_done
+ beq L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_1
+ cmp w8, #4
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w12, w12
+ mov v15.s[3], w12
+ rev w11, w11
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_end_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w13
+ rev w12, w12
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w12
+ rev w11, w11
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v9.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v9.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v10.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v10.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v11.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v11.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ aese v16.16b, v29.16b
+ eor v16.16b, v16.16b, v30.16b
+ aese v17.16b, v29.16b
+ eor v17.16b, v17.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ bge L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_both_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_done
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w10, w9
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v10.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v11.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v29.2d, v30.2d}, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ aese v15.16b, v29.16b
+ eor v15.16b, v15.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_done
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v10.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v14.16b, v11.16b
+ aesmc v14.16b, v14.16b
+ ldr q29, [x0]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ldr q30, [x0, #16]
+ aese v14.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_256_done
+ ENDIF
+ b L_aes_gcm_decrypt_update_arm64_crypto_eor3_done
+ ; AES_GCM_128
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_start_128
+ IF :LNOT::DEF:NO_AES_128
+ cmp w8, #32
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rev w17, w17
+ mov v14.s[3], w17
+ rev w16, w16
+ mov v15.s[3], w16
+ rev w15, w15
+ mov v16.s[3], w15
+ rev w14, w14
+ mov v17.s[3], w14
+ rev w13, w13
+ mov v8.s[3], w13
+ rev w12, w12
+ mov v9.s[3], w12
+ rev w11, w11
+ mov v10.s[3], w11
+ rev w10, w9
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ ld1 {v13.2d}, [x7]
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_end_8
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_both_8
+ ldr q12, [x0]
+ add w17, w9, #1
+ mov v14.16b, v13.16b
+ add w16, w9, #2
+ mov v15.16b, v13.16b
+ add w15, w9, #3
+ mov v16.16b, v13.16b
+ add w14, w9, #4
+ mov v17.16b, v13.16b
+ add w13, w9, #5
+ mov v8.16b, v13.16b
+ add w12, w9, #6
+ mov v9.16b, v13.16b
+ add w11, w9, #7
+ mov v10.16b, v13.16b
+ add w9, w9, #8
+ mov v11.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w17, w17
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w17
+ rev w16, w16
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w16
+ rev w15, w15
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w15
+ rev w14, w14
+ rbit v0.16b, v0.16b
+ mov v17.s[3], w14
+ rev w13, w13
+ rbit v1.16b, v1.16b
+ mov v8.s[3], w13
+ rev w12, w12
+ rbit v2.16b, v2.16b
+ mov v9.s[3], w12
+ rev w11, w11
+ rbit v3.16b, v3.16b
+ mov v10.s[3], w11
+ rev w10, w9
+ eor v18.16b, v18.16b, v26.16b
+ mov v11.s[3], w10
+ ldr q13, [x0, #16]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ext v31.16b, v3.16b, v3.16b, #8
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #32]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #48]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #64]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #80]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #96]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #112]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ subs w8, w8, #8
+ ldr q12, [x0, #128]
+ aese v14.16b, v13.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v15.16b, v13.16b
+ aesmc v15.16b, v15.16b
+ mov v28.d[1], v31.d[0]
+ aese v16.16b, v13.16b
+ aesmc v16.16b, v16.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v17.16b, v13.16b
+ aesmc v17.16b, v17.16b
+ ; Done GHASH
+ aese v8.16b, v13.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v9.16b, v13.16b
+ aesmc v9.16b, v9.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v10.16b, v13.16b
+ aesmc v10.16b, v10.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v11.16b, v13.16b
+ aesmc v11.16b, v11.16b
+ ldr q13, [x0, #144]
+ aese v14.16b, v12.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v15.16b, v12.16b
+ aesmc v15.16b, v15.16b
+ ld1 {v0.16b}, [x3], #16
+ aese v16.16b, v12.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v1.16b}, [x3], #16
+ aese v17.16b, v12.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v2.16b}, [x3], #16
+ aese v8.16b, v12.16b
+ aesmc v8.16b, v8.16b
+ ld1 {v3.16b}, [x3], #16
+ aese v9.16b, v12.16b
+ aesmc v9.16b, v9.16b
+ aese v10.16b, v12.16b
+ aesmc v10.16b, v10.16b
+ aese v11.16b, v12.16b
+ aesmc v11.16b, v11.16b
+ ldr q12, [x0, #160]
+ aese v14.16b, v13.16b
+ eor v14.16b, v14.16b, v12.16b
+ aese v15.16b, v13.16b
+ eor v15.16b, v15.16b, v12.16b
+ aese v16.16b, v13.16b
+ eor v16.16b, v16.16b, v12.16b
+ aese v17.16b, v13.16b
+ eor v17.16b, v17.16b, v12.16b
+ aese v8.16b, v13.16b
+ eor v8.16b, v8.16b, v12.16b
+ aese v9.16b, v13.16b
+ eor v9.16b, v9.16b, v12.16b
+ aese v10.16b, v13.16b
+ eor v10.16b, v10.16b, v12.16b
+ aese v11.16b, v13.16b
+ eor v11.16b, v11.16b, v12.16b
+ ld1 {v13.2d}, [x7]
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ st1 {v8.16b, v9.16b, v10.16b, v11.16b}, [x2], #0x40
+ cmp w8, #8
+ bge L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_both_8
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_end_8
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ rbit v0.16b, v0.16b
+ rbit v1.16b, v1.16b
+ rbit v2.16b, v2.16b
+ rbit v3.16b, v3.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v3.1d, v22.1d
+ pmull2 v29.1q, v3.2d, v22.2d
+ ext v31.16b, v3.16b, v3.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v2.1d
+ pmull2 v26.1q, v23.2d, v2.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v2.16b, v2.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v1.1d
+ pmull2 v26.1q, v24.2d, v1.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v1.16b, v1.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v0.1d
+ pmull2 v26.1q, v25.2d, v0.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v0.16b, v0.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^5
+ pmull v31.1q, v4.1d, v21.1d
+ pmull2 v26.1q, v4.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v4.1d
+ pmull2 v26.1q, v26.2d, v4.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^6
+ pmull v31.1q, v5.1d, v20.1d
+ pmull2 v26.1q, v5.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v5.1d
+ pmull2 v26.1q, v26.2d, v5.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^7
+ pmull v31.1q, v6.1d, v19.1d
+ pmull2 v26.1q, v6.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v6.1d
+ pmull2 v26.1q, v26.2d, v6.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^8
+ pmull v31.1q, v7.1d, v18.1d
+ pmull2 v26.1q, v7.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v7.1d
+ pmull2 v26.1q, v26.2d, v7.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_4
+ ld1 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0], #0x40
+ ld1 {v4.2d, v5.2d, v6.2d, v7.2d}, [x0], #0x40
+ ld1 {v8.2d, v9.2d}, [x0], #32
+ ld1 {v10.2d}, [x0]
+ cmp w8, #1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_done
+ beq L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_1
+ cmp w8, #4
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w12, w12
+ mov v15.s[3], w12
+ rev w11, w11
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ ld1 {v20.16b}, [x3], #16
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ ld1 {v21.16b}, [x3], #16
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_end_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_both_4
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w12, w9, #2
+ mov v15.16b, v13.16b
+ add w11, w9, #3
+ mov v16.16b, v13.16b
+ add w9, w9, #4
+ mov v17.16b, v13.16b
+ rbit v18.16b, v18.16b
+ rev w13, w13
+ rbit v19.16b, v19.16b
+ mov v14.s[3], w13
+ rev w12, w12
+ rbit v20.16b, v20.16b
+ mov v15.s[3], w12
+ rev w11, w11
+ rbit v21.16b, v21.16b
+ mov v16.s[3], w11
+ rev w10, w9
+ mov v17.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ eor v18.16b, v18.16b, v26.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ aese v16.16b, v0.16b
+ aesmc v16.16b, v16.16b
+ ext v31.16b, v21.16b, v21.16b, #8
+ aese v17.16b, v0.16b
+ aesmc v17.16b, v17.16b
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ eor v30.16b, v30.16b, v31.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ aese v16.16b, v1.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v1.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v2.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v2.16b
+ aesmc v17.16b, v17.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ aese v16.16b, v3.16b
+ aesmc v16.16b, v16.16b
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ aese v17.16b, v3.16b
+ aesmc v17.16b, v17.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ aese v16.16b, v4.16b
+ aesmc v16.16b, v16.16b
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ aese v17.16b, v4.16b
+ aesmc v17.16b, v17.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ aese v16.16b, v5.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v5.16b
+ aesmc v17.16b, v17.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ pmull2 v29.1q, v29.2d, v27.2d
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ aese v16.16b, v6.16b
+ aesmc v16.16b, v16.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ aese v17.16b, v6.16b
+ aesmc v17.16b, v17.16b
+ subs w8, w8, #4
+ mov v28.d[1], v31.d[0]
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ eor v26.16b, v28.16b, v30.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ ; Done GHASH
+ aese v16.16b, v7.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v7.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x3], #0x40
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v16.16b, v8.16b
+ aesmc v16.16b, v16.16b
+ aese v17.16b, v8.16b
+ aesmc v17.16b, v17.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ aese v16.16b, v9.16b
+ eor v16.16b, v16.16b, v10.16b
+ aese v17.16b, v9.16b
+ eor v17.16b, v17.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ eor v16.16b, v16.16b, v20.16b
+ eor v17.16b, v17.16b, v21.16b
+ cmp w8, #4
+ st1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x2], #0x40
+ bge L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_both_4
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_end_4
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ rbit v20.16b, v20.16b
+ rbit v21.16b, v21.16b
+ eor v18.16b, v18.16b, v26.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v20.1d
+ pmull2 v26.1q, v23.2d, v20.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v20.16b, v20.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^3
+ pmull v31.1q, v24.1d, v19.1d
+ pmull2 v26.1q, v24.2d, v19.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v19.16b, v19.16b, #8
+ pmull v31.1q, v26.1d, v24.1d
+ pmull2 v26.1q, v26.2d, v24.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; X += C * H^4
+ pmull v31.1q, v25.1d, v18.1d
+ pmull2 v26.1q, v25.2d, v18.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v18.16b, v18.16b, #8
+ pmull v31.1q, v26.1d, v25.1d
+ pmull2 v26.1q, v26.2d, v25.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cmp w8, #1
+ beq L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_1
+ blt L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_done
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_2
+ add w13, w9, #1
+ mov v14.16b, v13.16b
+ add w9, w9, #2
+ mov v15.16b, v13.16b
+ rev w13, w13
+ mov v14.s[3], w13
+ rev w10, w9
+ mov v15.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v0.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v1.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v2.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v3.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v4.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v5.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v6.16b
+ aesmc v15.16b, v15.16b
+ subs w8, w8, #2
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v15.16b, v7.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ ld1 {v18.16b}, [x3], #16
+ aese v15.16b, v8.16b
+ aesmc v15.16b, v15.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v19.16b}, [x3], #16
+ aese v15.16b, v9.16b
+ eor v15.16b, v15.16b, v10.16b
+ eor v14.16b, v14.16b, v18.16b
+ eor v15.16b, v15.16b, v19.16b
+ st1 {v14.16b, v15.16b}, [x2], #32
+ rbit v18.16b, v18.16b
+ rbit v19.16b, v19.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v19.1d, v22.1d
+ pmull2 v29.1q, v19.2d, v22.2d
+ ext v31.16b, v19.16b, v19.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; X += C * H^2
+ pmull v31.1q, v23.1d, v21.1d
+ pmull2 v26.1q, v23.2d, v21.2d
+ eor v28.16b, v28.16b, v31.16b
+ eor v29.16b, v29.16b, v26.16b
+ ext v26.16b, v21.16b, v21.16b, #8
+ pmull v31.1q, v26.1d, v23.1d
+ pmull2 v26.1q, v26.2d, v23.2d
+ eor3 v30.16b, v30.16b, v26.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+ cbz w8, L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_done
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_start_1
+ add w9, w9, #1
+ mov v14.16b, v13.16b
+ rev w10, w9
+ mov v14.s[3], w10
+ aese v14.16b, v0.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v1.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v2.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v3.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v4.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v5.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v6.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v7.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v8.16b
+ aesmc v14.16b, v14.16b
+ aese v14.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ ld1 {v18.16b}, [x3], #16
+ eor v14.16b, v14.16b, v18.16b
+ st1 {v14.16b}, [x2], #16
+ rbit v18.16b, v18.16b
+ eor v21.16b, v26.16b, v18.16b
+ ; X = C * H^1
+ pmull v28.1q, v21.1d, v22.1d
+ pmull2 v29.1q, v21.2d, v22.2d
+ ext v31.16b, v21.16b, v21.16b, #8
+ pmull v30.1q, v31.1d, v22.1d
+ pmull2 v31.1q, v31.2d, v22.2d
+ eor v30.16b, v30.16b, v31.16b
+ ; Reduce
+ ext v31.16b, v28.16b, v29.16b, #8
+ pmull2 v29.1q, v29.2d, v27.2d
+ eor3 v31.16b, v31.16b, v29.16b, v30.16b
+ pmull2 v30.1q, v31.2d, v27.2d
+ mov v28.d[1], v31.d[0]
+ eor v26.16b, v28.16b, v30.16b
+ ; Done GHASH
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_128_done
+ ENDIF
+L_aes_gcm_decrypt_update_arm64_crypto_eor3_done
+ rev w9, w9
+ mov v13.s[3], w9
+ st1 {v26.2d}, [x5]
+ st1 {v13.2d}, [x7]
+ ldr x17, [x29, #24]
+ ldp d8, d9, [x29, #32]
+ ldp d10, d11, [x29, #48]
+ ldp d12, d13, [x29, #64]
+ ldp d14, d15, [x29, #80]
+ ldp x29, x30, [sp], #0x60
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_decrypt_final_AARCH64_EOR3
+AES_GCM_decrypt_final_AARCH64_EOR3 PROC
+ ld1 {v5.2d}, [x0]
+ movi v6.16b, #0x87
+ ld1 {v4.2d}, [x5]
+ ushr v6.2d, v6.2d, #56
+ ld1 {v7.2d}, [x6]
+ ubfiz x4, x4, #3, #32
+ rbit x4, x4
+ mov v0.d[0], x4
+ ubfiz x3, x3, #3, #32
+ rbit x3, x3
+ mov v0.d[1], x3
+ eor v5.16b, v5.16b, v0.16b
+ pmull v0.1q, v5.1d, v4.1d
+ pmull2 v1.1q, v5.2d, v4.2d
+ ext v3.16b, v5.16b, v5.16b, #8
+ pmull v2.1q, v3.1d, v4.1d
+ pmull2 v3.1q, v3.2d, v4.2d
+ eor v2.16b, v2.16b, v3.16b
+ ; Reduce
+ ext v3.16b, v0.16b, v1.16b, #8
+ pmull2 v1.1q, v1.2d, v6.2d
+ eor3 v3.16b, v3.16b, v1.16b, v2.16b
+ pmull2 v2.1q, v3.2d, v6.2d
+ mov v0.d[1], v3.d[0]
+ eor v5.16b, v0.16b, v2.16b
+ rbit v5.16b, v5.16b
+ eor v5.16b, v5.16b, v7.16b
+ cmp w2, #16
+ blt L_aes_gcm_decrypt_final_arm64_crypto_eor3_part_tag
+ ld1 {v0.16b}, [x1]
+ b L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_loaded
+L_aes_gcm_decrypt_final_arm64_crypto_eor3_part_tag
+ ubfiz x2, x2, #0, #32
+ eor v0.16b, v0.16b, v0.16b
+ mov x10, x2
+ st1 {v0.2d}, [x0]
+ cmp x10, #8
+ blt L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_start_dw
+ ldr x9, [x1], #8
+ sub x10, x10, #8
+ str x9, [x0], #8
+L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_start_dw
+ cmp x10, #4
+ blt L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_start_sw
+ ldr w9, [x1], #4
+ sub x10, x10, #4
+ str w9, [x0], #4
+L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_start_sw
+ cmp x10, #2
+ blt L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_start_byte
+ ldrh w9, [x1], #2
+ sub x10, x10, #2
+ strh w9, [x0], #2
+L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_start_byte
+ cbz x10, L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_end_bytes
+ ldrb w9, [x1], #1
+ subs x10, x10, #1
+ strb w9, [x0], #1
+ bne L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_start_byte
+L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_end_bytes
+ sub x0, x0, x2
+ ld1 {v0.2d}, [x0]
+ mov x10, #16
+ st1 {v5.2d}, [x0]
+ sub x10, x10, x2
+ add x0, x0, x2
+L_aes_gcm_decrypt_final_arm64_crypto_eor3_calc_tag_byte
+ strb wzr, [x0], #1
+ subs x10, x10, #1
+ bne L_aes_gcm_decrypt_final_arm64_crypto_eor3_calc_tag_byte
+ subs x0, x0, #16
+ ld1 {v5.2d}, [x0]
+L_aes_gcm_decrypt_final_arm64_crypto_eor3_tag_loaded
+ eor v0.16b, v0.16b, v5.16b
+ mov x9, v0.d[0]
+ mov x10, v0.d[1]
+ mov w11, #-180
+ orr x9, x9, x10
+ cmp x9, #0
+ csetm x8, ne
+ and x8, x8, x11
+ add w8, w8, #0xb4
+ str w8, [x7]
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ ENDIF
+ IF :DEF:WOLFSSL_AES_XTS
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_XTS_encrypt_AARCH64
+AES_XTS_encrypt_AARCH64 PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x5], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x5], #0x40
+ ld1 {v4.16b}, [x3]
+ lsr w8, w2, #4
+ and w2, w2, #15
+ mov x19, #0x87
+ cmp x7, #12
+ blt L_aes_xts_encrypt_arm64_crypto_start_128
+ bgt L_aes_xts_encrypt_arm64_crypto_start_256
+ ; AES_XTS_192
+ IF :LNOT::DEF:NO_AES_192
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x5], #0x40
+ ld1 {v28.2d}, [x5]
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v25.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v26.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v27.16b
+ eor v4.16b, v4.16b, v28.16b
+ mov x10, v4.d[0]
+ mov x11, v4.d[1]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+ ld1 {v28.2d}, [x4]
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ and x9, x19, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x9, x12, lsl 1
+ and x9, x19, x15, asr 63
+ extr x17, x15, x14, #63
+ eor x16, x9, x14, lsl 1
+ cmp w8, #4
+ blt L_aes_xts_encrypt_arm64_crypto_192_start_2
+L_aes_xts_encrypt_arm64_crypto_192_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ mov v6.d[0], x14
+ mov v6.d[1], x15
+ mov v7.d[0], x16
+ mov v7.d[1], x17
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x17, asr 63
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ extr x11, x17, x16, #63
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x16, lsl 1
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ and x9, x19, x11, asr 63
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ eor x12, x9, x10, lsl 1
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ extr x15, x13, x12, #63
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ eor x14, x9, x12, lsl 1
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ and x9, x19, x15, asr 63
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ extr x17, x15, x14, #63
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ eor x16, x9, x14, lsl 1
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v25.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v25.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v26.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v26.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aese v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ aese v2.16b, v27.16b
+ eor v2.16b, v2.16b, v28.16b
+ aese v3.16b, v27.16b
+ eor v3.16b, v3.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w8, #4
+ bge L_aes_xts_encrypt_arm64_crypto_192_start_4
+L_aes_xts_encrypt_arm64_crypto_192_start_2
+ cmp w8, #2
+ blt L_aes_xts_encrypt_arm64_crypto_192_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ extr x11, x13, x12, #63
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x12, lsl 1
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ eor x12, x9, x10, lsl 1
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aese v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_xts_encrypt_arm64_crypto_192_start_1
+ cbz w8, L_aes_xts_encrypt_arm64_crypto_192_done
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ extr x11, x11, x10, #63
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x10, lsl 1
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ st1 {v0.16b}, [x1], #16
+L_aes_xts_encrypt_arm64_crypto_192_done
+ cbz w2, L_aes_xts_encrypt_arm64_crypto_192_partial_done
+ sub x1, x1, #16
+ ld1 {v0.16b}, [x1], #16
+ st1 {v0.2d}, [x6]
+ mov w9, w2
+L_aes_xts_encrypt_arm64_crypto_192_start_byte
+ ldrb w12, [x6]
+ ldrb w13, [x0], #1
+ strb w12, [x1], #1
+ strb w13, [x6], #1
+ subs w9, w9, #1
+ bgt L_aes_xts_encrypt_arm64_crypto_192_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ld1 {v0.2d}, [x6]
+ eor v0.16b, v0.16b, v4.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1]
+L_aes_xts_encrypt_arm64_crypto_192_partial_done
+ ENDIF
+ b L_aes_xts_encrypt_arm64_crypto_done
+ ; AES_XTS_256
+L_aes_xts_encrypt_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x5], #0x40
+ ld1 {v28.2d, v29.2d}, [x5], #32
+ ld1 {v30.2d}, [x5]
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v25.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v26.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v27.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v28.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v29.16b
+ eor v4.16b, v4.16b, v30.16b
+ mov x10, v4.d[0]
+ mov x11, v4.d[1]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+ ld1 {v28.2d, v29.2d}, [x4], #32
+ ld1 {v30.2d}, [x4]
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ and x9, x19, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x9, x12, lsl 1
+ and x9, x19, x15, asr 63
+ extr x17, x15, x14, #63
+ eor x16, x9, x14, lsl 1
+ cmp w8, #4
+ blt L_aes_xts_encrypt_arm64_crypto_256_start_2
+L_aes_xts_encrypt_arm64_crypto_256_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ mov v6.d[0], x14
+ mov v6.d[1], x15
+ mov v7.d[0], x16
+ mov v7.d[1], x17
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x17, asr 63
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ extr x11, x17, x16, #63
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x16, lsl 1
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ and x9, x19, x11, asr 63
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ eor x12, x9, x10, lsl 1
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ extr x15, x13, x12, #63
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ eor x14, x9, x12, lsl 1
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ and x9, x19, x15, asr 63
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ extr x17, x15, x14, #63
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ eor x16, x9, x14, lsl 1
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v25.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v25.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v26.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v26.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v27.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v27.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v27.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v28.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v28.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v28.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aese v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ aese v2.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ aese v3.16b, v29.16b
+ eor v3.16b, v3.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w8, #4
+ bge L_aes_xts_encrypt_arm64_crypto_256_start_4
+L_aes_xts_encrypt_arm64_crypto_256_start_2
+ cmp w8, #2
+ blt L_aes_xts_encrypt_arm64_crypto_256_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ extr x11, x13, x12, #63
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x12, lsl 1
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ eor x12, x9, x10, lsl 1
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v25.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v26.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v27.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v28.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aese v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_xts_encrypt_arm64_crypto_256_start_1
+ cbz w8, L_aes_xts_encrypt_arm64_crypto_256_done
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ extr x11, x11, x10, #63
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x10, lsl 1
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ st1 {v0.16b}, [x1], #16
+L_aes_xts_encrypt_arm64_crypto_256_done
+ cbz w2, L_aes_xts_encrypt_arm64_crypto_256_partial_done
+ sub x1, x1, #16
+ ld1 {v0.16b}, [x1], #16
+ st1 {v0.2d}, [x6]
+ mov w9, w2
+L_aes_xts_encrypt_arm64_crypto_256_start_byte
+ ldrb w12, [x6]
+ ldrb w13, [x0], #1
+ strb w12, [x1], #1
+ strb w13, [x6], #1
+ subs w9, w9, #1
+ bgt L_aes_xts_encrypt_arm64_crypto_256_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ld1 {v0.2d}, [x6]
+ eor v0.16b, v0.16b, v4.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v26.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v27.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v28.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1]
+L_aes_xts_encrypt_arm64_crypto_256_partial_done
+ ENDIF
+ b L_aes_xts_encrypt_arm64_crypto_done
+ ; AES_XTS_128
+L_aes_xts_encrypt_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ ld1 {v24.2d, v25.2d}, [x5], #32
+ ld1 {v26.2d}, [x5]
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v25.16b
+ eor v4.16b, v4.16b, v26.16b
+ mov x10, v4.d[0]
+ mov x11, v4.d[1]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v24.2d, v25.2d}, [x4], #32
+ ld1 {v26.2d}, [x4]
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ and x9, x19, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x9, x12, lsl 1
+ and x9, x19, x15, asr 63
+ extr x17, x15, x14, #63
+ eor x16, x9, x14, lsl 1
+ cmp w8, #4
+ blt L_aes_xts_encrypt_arm64_crypto_128_start_2
+L_aes_xts_encrypt_arm64_crypto_128_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ mov v6.d[0], x14
+ mov v6.d[1], x15
+ mov v7.d[0], x16
+ mov v7.d[1], x17
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x17, asr 63
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v16.16b
+ aesmc v2.16b, v2.16b
+ extr x11, x17, x16, #63
+ aese v3.16b, v16.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x16, lsl 1
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v17.16b
+ aesmc v2.16b, v2.16b
+ and x9, x19, x11, asr 63
+ aese v3.16b, v17.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v18.16b
+ aesmc v2.16b, v2.16b
+ eor x12, x9, x10, lsl 1
+ aese v3.16b, v18.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v19.16b
+ aesmc v2.16b, v2.16b
+ extr x15, x13, x12, #63
+ aese v3.16b, v19.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ eor x14, x9, x12, lsl 1
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v20.16b
+ aesmc v2.16b, v2.16b
+ and x9, x19, x15, asr 63
+ aese v3.16b, v20.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ extr x17, x15, x14, #63
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v21.16b
+ aesmc v2.16b, v2.16b
+ eor x16, x9, x14, lsl 1
+ aese v3.16b, v21.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v22.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v22.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v23.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v23.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v2.16b, v24.16b
+ aesmc v2.16b, v2.16b
+ aese v3.16b, v24.16b
+ aesmc v3.16b, v3.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aese v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ aese v2.16b, v25.16b
+ eor v2.16b, v2.16b, v26.16b
+ aese v3.16b, v25.16b
+ eor v3.16b, v3.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w8, #4
+ bge L_aes_xts_encrypt_arm64_crypto_128_start_4
+L_aes_xts_encrypt_arm64_crypto_128_start_2
+ cmp w8, #2
+ blt L_aes_xts_encrypt_arm64_crypto_128_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aese v1.16b, v16.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ extr x11, x13, x12, #63
+ aese v1.16b, v17.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x12, lsl 1
+ aese v1.16b, v18.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aese v1.16b, v19.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aese v1.16b, v20.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ eor x12, x9, x10, lsl 1
+ aese v1.16b, v21.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v22.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v23.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v1.16b, v24.16b
+ aesmc v1.16b, v1.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aese v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_xts_encrypt_arm64_crypto_128_start_1
+ cbz w8, L_aes_xts_encrypt_arm64_crypto_128_done
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ extr x11, x11, x10, #63
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ eor x10, x9, x10, lsl 1
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ st1 {v0.16b}, [x1], #16
+L_aes_xts_encrypt_arm64_crypto_128_done
+ cbz w2, L_aes_xts_encrypt_arm64_crypto_128_partial_done
+ sub x1, x1, #16
+ ld1 {v0.16b}, [x1], #16
+ st1 {v0.2d}, [x6]
+ mov w9, w2
+L_aes_xts_encrypt_arm64_crypto_128_start_byte
+ ldrb w12, [x6]
+ ldrb w13, [x0], #1
+ strb w12, [x1], #1
+ strb w13, [x6], #1
+ subs w9, w9, #1
+ bgt L_aes_xts_encrypt_arm64_crypto_128_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ld1 {v0.2d}, [x6]
+ eor v0.16b, v0.16b, v4.16b
+ aese v0.16b, v16.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v17.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v18.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v19.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v20.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v21.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v22.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v23.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v24.16b
+ aesmc v0.16b, v0.16b
+ aese v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1]
+L_aes_xts_encrypt_arm64_crypto_128_partial_done
+ ENDIF
+L_aes_xts_encrypt_arm64_crypto_done
+ ldp x17, x19, [x29, #24]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_XTS_decrypt_AARCH64
+AES_XTS_decrypt_AARCH64 PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x5], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x5], #0x40
+ ld1 {v4.16b}, [x3]
+ lsr w8, w2, #4
+ ands w2, w2, #15
+ mov x19, #0x87
+ cset w9, ne
+ sub w8, w8, w9
+ cmp x7, #12
+ blt L_aes_xts_decrypt_arm64_crypto_start_128
+ bgt L_aes_xts_decrypt_arm64_crypto_start_256
+ ; AES_XTS_192
+ IF :LNOT::DEF:NO_AES_192
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x5], #0x40
+ ld1 {v28.2d}, [x5]
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v25.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v26.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v27.16b
+ eor v4.16b, v4.16b, v28.16b
+ mov x10, v4.d[0]
+ mov x11, v4.d[1]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+ ld1 {v28.2d}, [x4]
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ and x9, x19, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x9, x12, lsl 1
+ and x9, x19, x15, asr 63
+ extr x17, x15, x14, #63
+ eor x16, x9, x14, lsl 1
+ cmp w8, #4
+ blt L_aes_xts_decrypt_arm64_crypto_192_start_2
+L_aes_xts_decrypt_arm64_crypto_192_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ mov v6.d[0], x14
+ mov v6.d[1], x15
+ mov v7.d[0], x16
+ mov v7.d[1], x17
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x17, asr 63
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ extr x11, x17, x16, #63
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x16, lsl 1
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ and x9, x19, x11, asr 63
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ eor x12, x9, x10, lsl 1
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ extr x15, x13, x12, #63
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ eor x14, x9, x12, lsl 1
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ and x9, x19, x15, asr 63
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ extr x17, x15, x14, #63
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ eor x16, x9, x14, lsl 1
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v25.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v25.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v26.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v26.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aesd v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ aesd v2.16b, v27.16b
+ eor v2.16b, v2.16b, v28.16b
+ aesd v3.16b, v27.16b
+ eor v3.16b, v3.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w8, #4
+ bge L_aes_xts_decrypt_arm64_crypto_192_start_4
+L_aes_xts_decrypt_arm64_crypto_192_start_2
+ cmp w8, #2
+ blt L_aes_xts_decrypt_arm64_crypto_192_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ extr x11, x13, x12, #63
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x12, lsl 1
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ eor x12, x9, x10, lsl 1
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ aesd v1.16b, v27.16b
+ eor v1.16b, v1.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_xts_decrypt_arm64_crypto_192_start_1
+ cbz w8, L_aes_xts_decrypt_arm64_crypto_192_done
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ extr x11, x11, x10, #63
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x10, lsl 1
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ st1 {v0.16b}, [x1], #16
+L_aes_xts_decrypt_arm64_crypto_192_done
+ cbz w2, L_aes_xts_decrypt_arm64_crypto_192_partial_done
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v5.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ eor v0.16b, v0.16b, v5.16b
+ st1 {v0.2d}, [x6]
+ add x1, x1, #16
+ mov w9, w2
+L_aes_xts_decrypt_arm64_crypto_192_start_byte
+ ldrb w12, [x6]
+ ldrb w13, [x0], #1
+ strb w12, [x1], #1
+ strb w13, [x6], #1
+ subs w9, w9, #1
+ bgt L_aes_xts_decrypt_arm64_crypto_192_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ld1 {v0.2d}, [x6]
+ eor v0.16b, v0.16b, v4.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ eor v0.16b, v0.16b, v28.16b
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1]
+L_aes_xts_decrypt_arm64_crypto_192_partial_done
+ ENDIF
+ b L_aes_xts_decrypt_arm64_crypto_done
+ ; AES_XTS_256
+L_aes_xts_decrypt_arm64_crypto_start_256
+ IF :LNOT::DEF:NO_AES_256
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x5], #0x40
+ ld1 {v28.2d, v29.2d}, [x5], #32
+ ld1 {v30.2d}, [x5]
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v25.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v26.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v27.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v28.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v29.16b
+ eor v4.16b, v4.16b, v30.16b
+ mov x10, v4.d[0]
+ mov x11, v4.d[1]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x4], #0x40
+ ld1 {v28.2d, v29.2d}, [x4], #32
+ ld1 {v30.2d}, [x4]
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ and x9, x19, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x9, x12, lsl 1
+ and x9, x19, x15, asr 63
+ extr x17, x15, x14, #63
+ eor x16, x9, x14, lsl 1
+ cmp w8, #4
+ blt L_aes_xts_decrypt_arm64_crypto_256_start_2
+L_aes_xts_decrypt_arm64_crypto_256_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ mov v6.d[0], x14
+ mov v6.d[1], x15
+ mov v7.d[0], x16
+ mov v7.d[1], x17
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x17, asr 63
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ extr x11, x17, x16, #63
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x16, lsl 1
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ and x9, x19, x11, asr 63
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ eor x12, x9, x10, lsl 1
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ extr x15, x13, x12, #63
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ eor x14, x9, x12, lsl 1
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ and x9, x19, x15, asr 63
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ extr x17, x15, x14, #63
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ eor x16, x9, x14, lsl 1
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v25.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v25.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v26.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v26.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v27.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v27.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v27.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v28.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v28.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v28.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aesd v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ aesd v2.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ aesd v3.16b, v29.16b
+ eor v3.16b, v3.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w8, #4
+ bge L_aes_xts_decrypt_arm64_crypto_256_start_4
+L_aes_xts_decrypt_arm64_crypto_256_start_2
+ cmp w8, #2
+ blt L_aes_xts_decrypt_arm64_crypto_256_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ extr x11, x13, x12, #63
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x12, lsl 1
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ eor x12, x9, x10, lsl 1
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v25.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v26.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v27.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v28.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ aesd v1.16b, v29.16b
+ eor v1.16b, v1.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_xts_decrypt_arm64_crypto_256_start_1
+ cbz w8, L_aes_xts_decrypt_arm64_crypto_256_done
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ extr x11, x11, x10, #63
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x10, lsl 1
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ st1 {v0.16b}, [x1], #16
+L_aes_xts_decrypt_arm64_crypto_256_done
+ cbz w2, L_aes_xts_decrypt_arm64_crypto_256_partial_done
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v5.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ eor v0.16b, v0.16b, v5.16b
+ st1 {v0.2d}, [x6]
+ add x1, x1, #16
+ mov w9, w2
+L_aes_xts_decrypt_arm64_crypto_256_start_byte
+ ldrb w12, [x6]
+ ldrb w13, [x0], #1
+ strb w12, [x1], #1
+ strb w13, [x6], #1
+ subs w9, w9, #1
+ bgt L_aes_xts_decrypt_arm64_crypto_256_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ld1 {v0.2d}, [x6]
+ eor v0.16b, v0.16b, v4.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v26.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v27.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v28.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v29.16b
+ eor v0.16b, v0.16b, v30.16b
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1]
+L_aes_xts_decrypt_arm64_crypto_256_partial_done
+ ENDIF
+ b L_aes_xts_decrypt_arm64_crypto_done
+ ; AES_XTS_128
+L_aes_xts_decrypt_arm64_crypto_start_128
+ IF :LNOT::DEF:NO_AES_128
+ ld1 {v24.2d, v25.2d}, [x5], #32
+ ld1 {v26.2d}, [x5]
+ aese v4.16b, v16.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v17.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v18.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v19.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v20.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v21.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v22.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v23.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v24.16b
+ aesmc v4.16b, v4.16b
+ aese v4.16b, v25.16b
+ eor v4.16b, v4.16b, v26.16b
+ mov x10, v4.d[0]
+ mov x11, v4.d[1]
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x4], #0x40
+ ld1 {v20.2d, v21.2d, v22.2d, v23.2d}, [x4], #0x40
+ ld1 {v24.2d, v25.2d}, [x4], #32
+ ld1 {v26.2d}, [x4]
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ and x9, x19, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x9, x12, lsl 1
+ and x9, x19, x15, asr 63
+ extr x17, x15, x14, #63
+ eor x16, x9, x14, lsl 1
+ cmp w8, #4
+ blt L_aes_xts_decrypt_arm64_crypto_128_start_2
+L_aes_xts_decrypt_arm64_crypto_128_start_4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ mov v6.d[0], x14
+ mov v6.d[1], x15
+ mov v7.d[0], x16
+ mov v7.d[1], x17
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x17, asr 63
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v16.16b
+ aesimc v2.16b, v2.16b
+ extr x11, x17, x16, #63
+ aesd v3.16b, v16.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x16, lsl 1
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v17.16b
+ aesimc v2.16b, v2.16b
+ and x9, x19, x11, asr 63
+ aesd v3.16b, v17.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v18.16b
+ aesimc v2.16b, v2.16b
+ eor x12, x9, x10, lsl 1
+ aesd v3.16b, v18.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v19.16b
+ aesimc v2.16b, v2.16b
+ extr x15, x13, x12, #63
+ aesd v3.16b, v19.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ eor x14, x9, x12, lsl 1
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v20.16b
+ aesimc v2.16b, v2.16b
+ and x9, x19, x15, asr 63
+ aesd v3.16b, v20.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ extr x17, x15, x14, #63
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v21.16b
+ aesimc v2.16b, v2.16b
+ eor x16, x9, x14, lsl 1
+ aesd v3.16b, v21.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v22.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v22.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v23.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v23.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v2.16b, v24.16b
+ aesimc v2.16b, v2.16b
+ aesd v3.16b, v24.16b
+ aesimc v3.16b, v3.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aesd v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ aesd v2.16b, v25.16b
+ eor v2.16b, v2.16b, v26.16b
+ aesd v3.16b, v25.16b
+ eor v3.16b, v3.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #4
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ cmp w8, #4
+ bge L_aes_xts_decrypt_arm64_crypto_128_start_4
+L_aes_xts_decrypt_arm64_crypto_128_start_2
+ cmp w8, #2
+ blt L_aes_xts_decrypt_arm64_crypto_128_start_1
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x13, asr 63
+ aesd v1.16b, v16.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ extr x11, x13, x12, #63
+ aesd v1.16b, v17.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x12, lsl 1
+ aesd v1.16b, v18.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aesd v1.16b, v19.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ extr x13, x11, x10, #63
+ aesd v1.16b, v20.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ eor x12, x9, x10, lsl 1
+ aesd v1.16b, v21.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v22.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v23.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v1.16b, v24.16b
+ aesimc v1.16b, v1.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ aesd v1.16b, v25.16b
+ eor v1.16b, v1.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ sub w8, w8, #2
+ st1 {v0.16b, v1.16b}, [x1], #32
+L_aes_xts_decrypt_arm64_crypto_128_start_1
+ cbz w8, L_aes_xts_decrypt_arm64_crypto_128_done
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ and x9, x19, x11, asr 63
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ extr x11, x11, x10, #63
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ eor x10, x9, x10, lsl 1
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ mov v4.d[0], x10
+ mov v4.d[1], x11
+ st1 {v0.16b}, [x1], #16
+L_aes_xts_decrypt_arm64_crypto_128_done
+ cbz w2, L_aes_xts_decrypt_arm64_crypto_128_partial_done
+ and x9, x19, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x9, x10, lsl 1
+ mov v5.d[0], x12
+ mov v5.d[1], x13
+ ld1 {v0.16b}, [x0], #16
+ eor v0.16b, v0.16b, v5.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ eor v0.16b, v0.16b, v5.16b
+ st1 {v0.2d}, [x6]
+ add x1, x1, #16
+ mov w9, w2
+L_aes_xts_decrypt_arm64_crypto_128_start_byte
+ ldrb w12, [x6]
+ ldrb w13, [x0], #1
+ strb w12, [x1], #1
+ strb w13, [x6], #1
+ subs w9, w9, #1
+ bgt L_aes_xts_decrypt_arm64_crypto_128_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ld1 {v0.2d}, [x6]
+ eor v0.16b, v0.16b, v4.16b
+ aesd v0.16b, v16.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v17.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v18.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v19.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v20.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v21.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v22.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v23.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v24.16b
+ aesimc v0.16b, v0.16b
+ aesd v0.16b, v25.16b
+ eor v0.16b, v0.16b, v26.16b
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1]
+L_aes_xts_decrypt_arm64_crypto_128_partial_done
+ ENDIF
+L_aes_xts_decrypt_arm64_crypto_done
+ ldp x17, x19, [x29, #24]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ ENDIF
+ IF :LNOT::DEF:WOLFSSL_ARMASM_NO_NEON
+ IF :DEF:HAVE_AES_DECRYPT :LOR: :DEF:HAVE_AES_CBC :LOR: :DEF:HAVE_AESCCM :LOR: :DEF:HAVE_AESGCM :LOR: :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_NEON_te
+ DCB 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
+ DCB 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
+ DCB 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
+ DCB 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
+ DCB 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
+ DCB 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
+ DCB 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
+ DCB 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
+ DCB 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
+ DCB 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
+ DCB 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
+ DCB 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
+ DCB 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
+ DCB 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
+ DCB 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
+ DCB 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
+ DCB 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
+ DCB 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
+ DCB 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
+ DCB 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
+ DCB 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
+ DCB 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
+ DCB 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
+ DCB 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
+ DCB 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
+ DCB 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
+ DCB 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
+ DCB 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
+ DCB 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
+ DCB 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
+ DCB 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
+ DCB 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_NEON_shift_rows_shuffle
+ DCB 0x0c, 0x09, 0x06, 0x03, 0x00, 0x0d, 0x0a, 0x07
+ DCB 0x04, 0x01, 0x0e, 0x0b, 0x08, 0x05, 0x02, 0x0f
+ ENDIF
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_invert_key_NEON
+AES_invert_key_NEON PROC
+ add x3, x0, x1, lsl 4
+ mov x2, x0
+ mov w4, w1
+L_AES_invert_key_NEON_loop
+ ld1 {v0.2d}, [x2]
+ ld1 {v1.2d}, [x3]
+ st1 {v0.2d}, [x3]
+ st1 {v1.2d}, [x2], #16
+ subs w4, w4, #2
+ sub x3, x3, #16
+ bne L_AES_invert_key_NEON_loop
+ movi v2.16b, #27
+ add x2, x0, #16
+ sub w4, w1, #1
+L_AES_invert_key_NEON_mix_loop
+ ld1 {v0.2d}, [x2]
+ sshr v5.16b, v0.16b, #7
+ ushr v6.16b, v0.16b, #6
+ ushr v3.16b, v0.16b, #5
+ and v5.16b, v5.16b, v2.16b
+ pmul v6.16b, v6.16b, v2.16b
+ pmul v3.16b, v3.16b, v2.16b
+ shl v4.16b, v0.16b, #1
+ eor v5.16b, v5.16b, v4.16b
+ shl v4.16b, v0.16b, #3
+ eor v3.16b, v3.16b, v4.16b
+ shl v4.16b, v0.16b, #2
+ eor v6.16b, v6.16b, v4.16b
+ eor v4.16b, v5.16b, v3.16b
+ eor v3.16b, v3.16b, v0.16b
+ eor v5.16b, v6.16b, v3.16b
+ eor v6.16b, v6.16b, v4.16b
+ eor v4.16b, v4.16b, v0.16b
+ shl v0.4s, v4.4s, #8
+ rev32 v5.8h, v5.8h
+ sri v0.4s, v4.4s, #24
+ eor v0.16b, v0.16b, v6.16b
+ shl v4.4s, v3.4s, #24
+ eor v0.16b, v0.16b, v5.16b
+ sri v4.4s, v3.4s, #8
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.2d}, [x2], #16
+ subs w4, w4, #1
+ bne L_AES_invert_key_NEON_mix_loop
+ ret
+ ENDP
+ ENDIF
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_NEON_rcon
+ DCD 0x01000000, 0x02000000, 0x04000000, 0x08000000
+ DCD 0x10000000, 0x20000000, 0x40000000, 0x80000000
+ DCD 0x1b000000, 0x36000000
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_set_encrypt_key_NEON
+AES_set_encrypt_key_NEON PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x4, L_AES_ARM64_NEON_rcon
+ add x4, x4, L_AES_ARM64_NEON_rcon
+ adrp x5, L_AES_ARM64_NEON_te
+ add x5, x5, L_AES_ARM64_NEON_te
+ ld1 {v6.16b, v7.16b, v8.16b, v9.16b}, [x5], #0x40
+ ld1 {v10.16b, v11.16b, v12.16b, v13.16b}, [x5], #0x40
+ ld1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x5], #0x40
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x5]
+ movi v2.16b, #0x40
+ movi v3.16b, #0x80
+ movi v4.16b, #0xc0
+ movi v5.16b, #27
+ eor v26.16b, v26.16b, v26.16b
+ cmp x1, #0x80
+ beq L_AES_set_encrypt_key_NEON_start_128
+ cmp x1, #0xc0
+ beq L_AES_set_encrypt_key_NEON_start_192
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v1.16b}, [x0]
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ st1 {v0.2d}, [x2], #16
+ st1 {v1.2d}, [x2], #16
+ mov x3, #6
+L_AES_set_encrypt_key_NEON_loop_256
+ eor v22.16b, v1.16b, v2.16b
+ eor v23.16b, v1.16b, v3.16b
+ eor v24.16b, v1.16b, v4.16b
+ tbl v25.16b, {v6.16b, v7.16b, v8.16b, v9.16b}, v1.16b
+ tbl v22.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v22.16b
+ tbl v23.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v23.16b
+ tbl v24.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v24.16b
+ orr v25.16b, v25.16b, v22.16b
+ orr v23.16b, v23.16b, v24.16b
+ orr v25.16b, v25.16b, v23.16b
+ ext v25.16b, v25.16b, v26.16b, #12
+ shl v22.4s, v25.4s, #8
+ sri v22.4s, v25.4s, #24
+ eor v0.16b, v0.16b, v22.16b
+ ld1r {v25.4s}, [x4], #4
+ dup v22.4s, v0.s[0]
+ dup v23.2s, v0.s[1]
+ dup v24.2s, v0.s[2]
+ ext v22.16b, v26.16b, v22.16b, #12
+ ext v23.16b, v26.16b, v23.16b, #8
+ eor v0.16b, v0.16b, v22.16b
+ ext v24.16b, v26.16b, v24.16b, #4
+ eor v0.16b, v0.16b, v23.16b
+ eor v0.16b, v0.16b, v24.16b
+ eor v0.16b, v0.16b, v25.16b
+ st1 {v0.2d}, [x2], #16
+ eor v22.16b, v0.16b, v2.16b
+ eor v23.16b, v0.16b, v3.16b
+ eor v24.16b, v0.16b, v4.16b
+ tbl v25.16b, {v6.16b, v7.16b, v8.16b, v9.16b}, v0.16b
+ tbl v22.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v22.16b
+ tbl v23.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v23.16b
+ tbl v24.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v24.16b
+ orr v25.16b, v25.16b, v22.16b
+ orr v23.16b, v23.16b, v24.16b
+ orr v25.16b, v25.16b, v23.16b
+ ext v25.16b, v25.16b, v26.16b, #12
+ eor v1.16b, v1.16b, v25.16b
+ dup v22.4s, v1.s[0]
+ dup v23.2s, v1.s[1]
+ dup v24.2s, v1.s[2]
+ ext v22.16b, v26.16b, v22.16b, #12
+ ext v23.16b, v26.16b, v23.16b, #8
+ eor v1.16b, v1.16b, v22.16b
+ ext v24.16b, v26.16b, v24.16b, #4
+ eor v1.16b, v1.16b, v23.16b
+ eor v1.16b, v1.16b, v24.16b
+ st1 {v1.2d}, [x2], #16
+ subs x3, x3, #1
+ bne L_AES_set_encrypt_key_NEON_loop_256
+ eor v22.16b, v1.16b, v2.16b
+ eor v23.16b, v1.16b, v3.16b
+ eor v24.16b, v1.16b, v4.16b
+ tbl v25.16b, {v6.16b, v7.16b, v8.16b, v9.16b}, v1.16b
+ tbl v22.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v22.16b
+ tbl v23.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v23.16b
+ tbl v24.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v24.16b
+ orr v25.16b, v25.16b, v22.16b
+ orr v23.16b, v23.16b, v24.16b
+ orr v25.16b, v25.16b, v23.16b
+ ext v25.16b, v25.16b, v26.16b, #12
+ shl v22.4s, v25.4s, #8
+ sri v22.4s, v25.4s, #24
+ eor v0.16b, v0.16b, v22.16b
+ ld1r {v25.4s}, [x4], #4
+ dup v22.4s, v0.s[0]
+ dup v23.2s, v0.s[1]
+ dup v24.2s, v0.s[2]
+ ext v22.16b, v26.16b, v22.16b, #12
+ ext v23.16b, v26.16b, v23.16b, #8
+ eor v0.16b, v0.16b, v22.16b
+ ext v24.16b, v26.16b, v24.16b, #4
+ eor v0.16b, v0.16b, v23.16b
+ eor v0.16b, v0.16b, v24.16b
+ eor v0.16b, v0.16b, v25.16b
+ st1 {v0.2d}, [x2], #16
+ b L_AES_set_encrypt_key_NEON_end
+L_AES_set_encrypt_key_NEON_start_192
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v1.8b}, [x0]
+ rev32 v0.16b, v0.16b
+ rev32 v1.8b, v1.8b
+ st1 {v0.16b}, [x2], #16
+ st1 {v1.8b}, [x2], #8
+ ext v1.16b, v1.16b, v1.16b, #8
+ mov x3, #7
+L_AES_set_encrypt_key_NEON_loop_192
+ eor v22.16b, v1.16b, v2.16b
+ eor v23.16b, v1.16b, v3.16b
+ eor v24.16b, v1.16b, v4.16b
+ tbl v25.16b, {v6.16b, v7.16b, v8.16b, v9.16b}, v1.16b
+ tbl v22.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v22.16b
+ tbl v23.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v23.16b
+ tbl v24.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v24.16b
+ orr v25.16b, v25.16b, v22.16b
+ orr v23.16b, v23.16b, v24.16b
+ orr v25.16b, v25.16b, v23.16b
+ ext v25.16b, v25.16b, v26.16b, #12
+ shl v22.4s, v25.4s, #8
+ sri v22.4s, v25.4s, #24
+ eor v0.16b, v0.16b, v22.16b
+ ld1r {v25.4s}, [x4], #4
+ dup v22.4s, v0.s[0]
+ dup v23.2s, v0.s[1]
+ dup v24.2s, v0.s[2]
+ ext v22.16b, v26.16b, v22.16b, #12
+ ext v23.16b, v26.16b, v23.16b, #8
+ eor v0.16b, v0.16b, v22.16b
+ ext v24.16b, v26.16b, v24.16b, #4
+ eor v0.16b, v0.16b, v23.16b
+ eor v0.16b, v0.16b, v24.16b
+ eor v0.16b, v0.16b, v25.16b
+ st1 {v0.2d}, [x2], #16
+ mov v23.16b, v26.16b
+ mov v23.s[2], v0.s[3]
+ eor v1.16b, v1.16b, v23.16b
+ mov v23.16b, v26.16b
+ mov v23.s[3], v1.s[2]
+ eor v1.16b, v1.16b, v23.16b
+ st1 {v1.d}[1], [x2], #8
+ subs x3, x3, #1
+ bne L_AES_set_encrypt_key_NEON_loop_192
+ eor v22.16b, v1.16b, v2.16b
+ eor v23.16b, v1.16b, v3.16b
+ eor v24.16b, v1.16b, v4.16b
+ tbl v25.16b, {v6.16b, v7.16b, v8.16b, v9.16b}, v1.16b
+ tbl v22.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v22.16b
+ tbl v23.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v23.16b
+ tbl v24.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v24.16b
+ orr v25.16b, v25.16b, v22.16b
+ orr v23.16b, v23.16b, v24.16b
+ orr v25.16b, v25.16b, v23.16b
+ ext v25.16b, v25.16b, v26.16b, #12
+ shl v22.4s, v25.4s, #8
+ sri v22.4s, v25.4s, #24
+ eor v0.16b, v0.16b, v22.16b
+ ld1r {v25.4s}, [x4], #4
+ dup v22.4s, v0.s[0]
+ dup v23.2s, v0.s[1]
+ dup v24.2s, v0.s[2]
+ ext v22.16b, v26.16b, v22.16b, #12
+ ext v23.16b, v26.16b, v23.16b, #8
+ eor v0.16b, v0.16b, v22.16b
+ ext v24.16b, v26.16b, v24.16b, #4
+ eor v0.16b, v0.16b, v23.16b
+ eor v0.16b, v0.16b, v24.16b
+ eor v0.16b, v0.16b, v25.16b
+ st1 {v0.2d}, [x2], #16
+ b L_AES_set_encrypt_key_NEON_end
+L_AES_set_encrypt_key_NEON_start_128
+ ld1 {v0.16b}, [x0]
+ rev32 v0.16b, v0.16b
+ st1 {v0.2d}, [x2], #16
+ mov x3, #10
+L_AES_set_encrypt_key_NEON_loop_128
+ eor v22.16b, v0.16b, v2.16b
+ eor v23.16b, v0.16b, v3.16b
+ eor v24.16b, v0.16b, v4.16b
+ tbl v25.16b, {v6.16b, v7.16b, v8.16b, v9.16b}, v0.16b
+ tbl v22.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v22.16b
+ tbl v23.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v23.16b
+ tbl v24.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v24.16b
+ orr v25.16b, v25.16b, v22.16b
+ orr v23.16b, v23.16b, v24.16b
+ orr v25.16b, v25.16b, v23.16b
+ ext v25.16b, v25.16b, v26.16b, #12
+ shl v22.4s, v25.4s, #8
+ sri v22.4s, v25.4s, #24
+ eor v0.16b, v0.16b, v22.16b
+ ld1r {v25.4s}, [x4], #4
+ dup v22.4s, v0.s[0]
+ dup v23.2s, v0.s[1]
+ dup v24.2s, v0.s[2]
+ ext v22.16b, v26.16b, v22.16b, #12
+ ext v23.16b, v26.16b, v23.16b, #8
+ eor v0.16b, v0.16b, v22.16b
+ ext v24.16b, v26.16b, v24.16b, #4
+ eor v0.16b, v0.16b, v23.16b
+ eor v0.16b, v0.16b, v24.16b
+ eor v0.16b, v0.16b, v25.16b
+ st1 {v0.2d}, [x2], #16
+ subs x3, x3, #1
+ bne L_AES_set_encrypt_key_NEON_loop_128
+L_AES_set_encrypt_key_NEON_end
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ IF :DEF:HAVE_AESCCM :LOR: :DEF:HAVE_AESGCM :LOR: :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER :LOR: :DEF:HAVE_AES_ECB
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_ECB_encrypt_NEON
+AES_ECB_encrypt_NEON PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x5, L_AES_ARM64_NEON_te
+ add x5, x5, L_AES_ARM64_NEON_te
+ adrp x6, L_AES_ARM64_NEON_shift_rows_shuffle
+ add x6, x6, L_AES_ARM64_NEON_shift_rows_shuffle
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x5], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x5], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x5], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x5]
+ cmp x2, #0x40
+ blt L_AES_ECB_encrypt_NEON_start_2
+L_AES_ECB_encrypt_NEON_loop_4
+ mov x8, x3
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.2d}, [x8], #16
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ sub w7, w4, #2
+L_AES_ECB_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ sshr v10.16b, v2.16b, #7
+ sshr v11.16b, v3.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ shl v14.16b, v2.16b, #1
+ shl v15.16b, v3.16b, #1
+ movi v4.16b, #27
+ and v8.16b, v8.16b, v4.16b
+ and v9.16b, v9.16b, v4.16b
+ and v10.16b, v10.16b, v4.16b
+ and v11.16b, v11.16b, v4.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ eor v6.16b, v10.16b, v2.16b
+ eor v7.16b, v11.16b, v3.16b
+ shl v12.4s, v4.4s, #8
+ shl v13.4s, v5.4s, #8
+ shl v14.4s, v6.4s, #8
+ shl v15.4s, v7.4s, #8
+ sri v12.4s, v4.4s, #24
+ sri v13.4s, v5.4s, #24
+ sri v14.4s, v6.4s, #24
+ sri v15.4s, v7.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ shl v6.4s, v2.4s, #24
+ shl v7.4s, v3.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ sri v6.4s, v2.4s, #8
+ sri v7.4s, v3.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ rev32 v2.8h, v2.8h
+ rev32 v3.8h, v3.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ ; Round Done
+ subs w7, w7, #2
+ bne L_AES_ECB_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ sub x2, x2, #0x40
+ cmp x2, #0x40
+ bge L_AES_ECB_encrypt_NEON_loop_4
+L_AES_ECB_encrypt_NEON_start_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+ cmp x2, #16
+ beq L_AES_ECB_encrypt_NEON_start_1
+ blt L_AES_ECB_encrypt_NEON_data_done
+L_AES_ECB_encrypt_NEON_loop_2
+ mov x8, x3
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ ld1 {v4.2d}, [x8], #16
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ sub w7, w4, #2
+L_AES_ECB_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ shl v10.16b, v0.16b, #1
+ shl v11.16b, v1.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ shl v10.4s, v4.4s, #8
+ shl v11.4s, v5.4s, #8
+ sri v10.4s, v4.4s, #24
+ sri v11.4s, v5.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ ; Round Done
+ subs w7, w7, #2
+ bne L_AES_ECB_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ st1 {v0.16b, v1.16b}, [x1], #32
+ sub x2, x2, #32
+ cmp x2, #0
+ beq L_AES_ECB_encrypt_NEON_data_done
+L_AES_ECB_encrypt_NEON_start_1
+ ld1 {v3.2d}, [x6]
+ mov x8, x3
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v4.2d}, [x8], #16
+ rev32 v0.16b, v0.16b
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v0.16b, v4.16b
+ sub w7, w4, #2
+L_AES_ECB_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x8], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x8], #16
+ sshr v10.16b, v0.16b, #7
+ shl v9.16b, v0.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v0.8h
+ eor v11.16b, v10.16b, v0.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v0.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v4.16b
+ sri v9.4s, v0.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v0.16b, v10.16b, v9.16b
+ eor v0.16b, v0.16b, v8.16b
+ subs w7, w7, #2
+ bne L_AES_ECB_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x8], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x8], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ st1 {v0.16b}, [x1], #16
+L_AES_ECB_encrypt_NEON_data_done
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:HAVE_AES_CBC
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CBC_encrypt_NEON
+AES_CBC_encrypt_NEON PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x6, L_AES_ARM64_NEON_te
+ add x6, x6, L_AES_ARM64_NEON_te
+ adrp x7, L_AES_ARM64_NEON_shift_rows_shuffle
+ add x7, x7, L_AES_ARM64_NEON_shift_rows_shuffle
+ ld1 {v10.16b, v11.16b, v12.16b, v13.16b}, [x6], #0x40
+ ld1 {v14.16b, v15.16b, v16.16b, v17.16b}, [x6], #0x40
+ ld1 {v18.16b, v19.16b, v20.16b, v21.16b}, [x6], #0x40
+ ld1 {v22.16b, v23.16b, v24.16b, v25.16b}, [x6]
+ movi v6.16b, #0x40
+ movi v7.16b, #0x80
+ movi v8.16b, #0xc0
+ movi v9.16b, #27
+ ld1 {v0.2d}, [x5]
+ ld1 {v26.2d}, [x7]
+L_AES_CBC_encrypt_NEON_loop_block
+ add x9, x3, #16
+ ld1 {v1.16b}, [x0], #16
+ ld1 {v2.16b}, [x3]
+ eor v0.16b, v0.16b, v1.16b
+ rev32 v0.16b, v0.16b
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v0.16b, v2.16b
+ sub w8, w4, #2
+L_AES_CBC_encrypt_NEON_loop_nr
+ eor v2.16b, v0.16b, v6.16b
+ eor v3.16b, v0.16b, v7.16b
+ eor v4.16b, v0.16b, v8.16b
+ tbl v1.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v0.16b
+ tbl v2.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v2.16b
+ tbl v3.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v3.16b
+ tbl v4.16b, {v22.16b, v23.16b, v24.16b, v25.16b}, v4.16b
+ orr v1.16b, v1.16b, v2.16b
+ orr v3.16b, v3.16b, v4.16b
+ orr v1.16b, v1.16b, v3.16b
+ tbl v1.16b, {v1.16b}, v26.16b
+ ld1 {v0.2d}, [x9], #16
+ sshr v4.16b, v1.16b, #7
+ shl v3.16b, v1.16b, #1
+ and v4.16b, v4.16b, v9.16b
+ eor v4.16b, v4.16b, v3.16b
+ rev32 v2.8h, v1.8h
+ eor v5.16b, v4.16b, v1.16b
+ eor v4.16b, v4.16b, v2.16b
+ shl v3.4s, v1.4s, #24
+ shl v2.4s, v5.4s, #8
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ sri v3.4s, v1.4s, #8
+ sri v2.4s, v5.4s, #24
+ eor v1.16b, v4.16b, v3.16b
+ eor v1.16b, v1.16b, v2.16b
+ eor v2.16b, v1.16b, v6.16b
+ eor v3.16b, v1.16b, v7.16b
+ eor v4.16b, v1.16b, v8.16b
+ tbl v0.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v1.16b
+ tbl v2.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v2.16b
+ tbl v3.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v3.16b
+ tbl v4.16b, {v22.16b, v23.16b, v24.16b, v25.16b}, v4.16b
+ orr v0.16b, v0.16b, v2.16b
+ orr v3.16b, v3.16b, v4.16b
+ orr v0.16b, v0.16b, v3.16b
+ tbl v0.16b, {v0.16b}, v26.16b
+ ld1 {v1.2d}, [x9], #16
+ sshr v4.16b, v0.16b, #7
+ shl v3.16b, v0.16b, #1
+ and v4.16b, v4.16b, v9.16b
+ eor v4.16b, v4.16b, v3.16b
+ rev32 v2.8h, v0.8h
+ eor v5.16b, v4.16b, v0.16b
+ eor v4.16b, v4.16b, v2.16b
+ shl v3.4s, v0.4s, #24
+ shl v2.4s, v5.4s, #8
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v1.16b
+ sri v3.4s, v0.4s, #8
+ sri v2.4s, v5.4s, #24
+ eor v0.16b, v4.16b, v3.16b
+ eor v0.16b, v0.16b, v2.16b
+ subs w8, w8, #2
+ bne L_AES_CBC_encrypt_NEON_loop_nr
+ eor v2.16b, v0.16b, v6.16b
+ eor v3.16b, v0.16b, v7.16b
+ eor v4.16b, v0.16b, v8.16b
+ tbl v1.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v0.16b
+ tbl v2.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v2.16b
+ tbl v3.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v3.16b
+ tbl v4.16b, {v22.16b, v23.16b, v24.16b, v25.16b}, v4.16b
+ orr v1.16b, v1.16b, v2.16b
+ orr v3.16b, v3.16b, v4.16b
+ orr v1.16b, v1.16b, v3.16b
+ tbl v1.16b, {v1.16b}, v26.16b
+ ld1 {v0.2d}, [x9], #16
+ sshr v4.16b, v1.16b, #7
+ shl v3.16b, v1.16b, #1
+ and v4.16b, v4.16b, v9.16b
+ eor v4.16b, v4.16b, v3.16b
+ rev32 v2.8h, v1.8h
+ eor v5.16b, v4.16b, v1.16b
+ eor v4.16b, v4.16b, v2.16b
+ shl v3.4s, v1.4s, #24
+ shl v2.4s, v5.4s, #8
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ sri v3.4s, v1.4s, #8
+ sri v2.4s, v5.4s, #24
+ eor v1.16b, v4.16b, v3.16b
+ eor v1.16b, v1.16b, v2.16b
+ eor v2.16b, v1.16b, v6.16b
+ eor v3.16b, v1.16b, v7.16b
+ eor v4.16b, v1.16b, v8.16b
+ tbl v0.16b, {v10.16b, v11.16b, v12.16b, v13.16b}, v1.16b
+ tbl v2.16b, {v14.16b, v15.16b, v16.16b, v17.16b}, v2.16b
+ tbl v3.16b, {v18.16b, v19.16b, v20.16b, v21.16b}, v3.16b
+ tbl v4.16b, {v22.16b, v23.16b, v24.16b, v25.16b}, v4.16b
+ orr v0.16b, v0.16b, v2.16b
+ orr v3.16b, v3.16b, v4.16b
+ orr v0.16b, v0.16b, v3.16b
+ tbl v0.16b, {v0.16b}, v26.16b
+ ld1 {v1.2d}, [x9], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v1.16b
+ rev32 v0.16b, v0.16b
+ st1 {v0.16b}, [x1], #16
+ subs x2, x2, #16
+ bne L_AES_CBC_encrypt_NEON_loop_block
+ st1 {v0.2d}, [x5]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:WOLFSSL_AES_COUNTER
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CTR_encrypt_NEON
+AES_CTR_encrypt_NEON PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x6, L_AES_ARM64_NEON_te
+ add x6, x6, L_AES_ARM64_NEON_te
+ adrp x7, L_AES_ARM64_NEON_shift_rows_shuffle
+ add x7, x7, L_AES_ARM64_NEON_shift_rows_shuffle
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x6], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x6], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x6], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x6]
+ ld1 {v2.2d}, [x5]
+ rev64 v8.16b, v2.16b
+ rev32 v2.16b, v2.16b
+ mov x10, v8.d[1]
+ mov x11, v8.d[0]
+ cmp x2, #0x40
+ blt L_AES_CTR_encrypt_NEON_start_2
+L_AES_CTR_encrypt_NEON_loop_4
+ mov x9, x3
+ ld1 {v4.2d}, [x9], #16
+ mov v8.d[1], x10
+ mov v8.d[0], x11
+ rev64 v8.4s, v8.4s
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v8.16b, v4.16b
+ adds x10, x10, #1
+ adc x11, x11, xzr
+ mov v8.d[1], x10
+ mov v8.d[0], x11
+ rev64 v8.4s, v8.4s
+ eor v1.16b, v8.16b, v4.16b
+ adds x10, x10, #1
+ adc x11, x11, xzr
+ mov v8.d[1], x10
+ mov v8.d[0], x11
+ rev64 v8.4s, v8.4s
+ eor v2.16b, v8.16b, v4.16b
+ adds x10, x10, #1
+ adc x11, x11, xzr
+ mov v8.d[1], x10
+ mov v8.d[0], x11
+ rev64 v8.4s, v8.4s
+ eor v3.16b, v8.16b, v4.16b
+ adds x10, x10, #1
+ adc x11, x11, xzr
+ mov v8.d[1], x10
+ mov v8.d[0], x11
+ rev64 v8.4s, v8.4s
+ sub w8, w4, #2
+L_AES_CTR_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x7]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ sshr v10.16b, v2.16b, #7
+ sshr v11.16b, v3.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ shl v14.16b, v2.16b, #1
+ shl v15.16b, v3.16b, #1
+ movi v4.16b, #27
+ and v8.16b, v8.16b, v4.16b
+ and v9.16b, v9.16b, v4.16b
+ and v10.16b, v10.16b, v4.16b
+ and v11.16b, v11.16b, v4.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ eor v6.16b, v10.16b, v2.16b
+ eor v7.16b, v11.16b, v3.16b
+ shl v12.4s, v4.4s, #8
+ shl v13.4s, v5.4s, #8
+ shl v14.4s, v6.4s, #8
+ shl v15.4s, v7.4s, #8
+ sri v12.4s, v4.4s, #24
+ sri v13.4s, v5.4s, #24
+ sri v14.4s, v6.4s, #24
+ sri v15.4s, v7.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ shl v6.4s, v2.4s, #24
+ shl v7.4s, v3.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ sri v6.4s, v2.4s, #8
+ sri v7.4s, v3.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ rev32 v2.8h, v2.8h
+ rev32 v3.8h, v3.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ ; Round Done
+ subs w8, w8, #2
+ bne L_AES_CTR_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x7]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ sub x2, x2, #0x40
+ cmp x2, #0x40
+ bge L_AES_CTR_encrypt_NEON_loop_4
+ mov v2.d[1], x10
+ mov v2.d[0], x11
+ rev64 v2.4s, v2.4s
+L_AES_CTR_encrypt_NEON_start_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+ cmp x2, #16
+ beq L_AES_CTR_encrypt_NEON_start_1
+ blt L_AES_CTR_encrypt_NEON_data_done
+L_AES_CTR_encrypt_NEON_loop_2
+ mov x9, x3
+ ld1 {v4.2d}, [x9], #16
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v2.16b, v4.16b
+ adds x10, x10, #1
+ adc x11, x11, xzr
+ mov v2.d[1], x10
+ mov v2.d[0], x11
+ rev64 v2.4s, v2.4s
+ eor v1.16b, v2.16b, v4.16b
+ adds x10, x10, #1
+ adc x11, x11, xzr
+ mov v2.d[1], x10
+ mov v2.d[0], x11
+ rev64 v2.4s, v2.4s
+ sub w8, w4, #2
+L_AES_CTR_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x7]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ shl v10.16b, v0.16b, #1
+ shl v11.16b, v1.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ shl v10.4s, v4.4s, #8
+ shl v11.4s, v5.4s, #8
+ sri v10.4s, v4.4s, #24
+ sri v11.4s, v5.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ ; Round Done
+ subs w8, w8, #2
+ bne L_AES_CTR_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x7]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ ld1 {v4.16b, v5.16b}, [x0], #32
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ st1 {v0.16b, v1.16b}, [x1], #32
+ sub x2, x2, #32
+ cmp x2, #0
+ beq L_AES_CTR_encrypt_NEON_data_done
+L_AES_CTR_encrypt_NEON_start_1
+ ld1 {v3.2d}, [x7]
+ mov x9, x3
+ ld1 {v4.2d}, [x9], #16
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v2.16b, v4.16b
+ sub w8, w4, #2
+L_AES_CTR_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x9], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x9], #16
+ sshr v10.16b, v0.16b, #7
+ shl v9.16b, v0.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v0.8h
+ eor v11.16b, v10.16b, v0.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v0.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v4.16b
+ sri v9.4s, v0.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v0.16b, v10.16b, v9.16b
+ eor v0.16b, v0.16b, v8.16b
+ subs w8, w8, #2
+ bne L_AES_CTR_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x9], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x9], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ ld1 {v4.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1], #16
+ adds x10, x10, #1
+ adc x11, x11, xzr
+ mov v2.d[1], x10
+ mov v2.d[0], x11
+ rev64 v2.4s, v2.4s
+L_AES_CTR_encrypt_NEON_data_done
+ rev32 v2.16b, v2.16b
+ st1 {v2.2d}, [x5]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:HAVE_AES_DECRYPT
+ IF :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER :LOR: :DEF:HAVE_AES_CBC :LOR: :DEF:HAVE_AES_ECB
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_NEON_td
+ DCB 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
+ DCB 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
+ DCB 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
+ DCB 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
+ DCB 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
+ DCB 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
+ DCB 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
+ DCB 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
+ DCB 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
+ DCB 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
+ DCB 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
+ DCB 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
+ DCB 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
+ DCB 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
+ DCB 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
+ DCB 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
+ DCB 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
+ DCB 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
+ DCB 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
+ DCB 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
+ DCB 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
+ DCB 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
+ DCB 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
+ DCB 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
+ DCB 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
+ DCB 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
+ DCB 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
+ DCB 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
+ DCB 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
+ DCB 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
+ DCB 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
+ DCB 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_NEON_shift_rows_invshuffle
+ DCB 0x04, 0x09, 0x0e, 0x03, 0x08, 0x0d, 0x02, 0x07
+ DCB 0x0c, 0x01, 0x06, 0x0b, 0x00, 0x05, 0x0a, 0x0f
+ IF :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER :LOR: :DEF:HAVE_AES_ECB
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_ECB_decrypt_NEON
+AES_ECB_decrypt_NEON PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x5, L_AES_ARM64_NEON_td
+ add x5, x5, L_AES_ARM64_NEON_td
+ adrp x6, L_AES_ARM64_NEON_shift_rows_invshuffle
+ add x6, x6, L_AES_ARM64_NEON_shift_rows_invshuffle
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x5], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x5], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x5], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x5]
+ cmp x2, #0x40
+ blt L_AES_ECB_decrypt_NEON_start_2
+L_AES_ECB_decrypt_NEON_loop_4
+ mov x8, x3
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.2d}, [x8], #16
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ sub w7, w4, #2
+L_AES_ECB_decrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ movi v28.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ and v8.16b, v8.16b, v28.16b
+ and v9.16b, v9.16b, v28.16b
+ and v10.16b, v10.16b, v28.16b
+ and v11.16b, v11.16b, v28.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ ushr v14.16b, v6.16b, #6
+ ushr v15.16b, v7.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ shl v2.16b, v6.16b, #2
+ shl v3.16b, v7.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ eor v14.16b, v14.16b, v2.16b
+ eor v15.16b, v15.16b, v3.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ ushr v2.16b, v6.16b, #5
+ ushr v3.16b, v7.16b, #5
+ pmul v0.16b, v0.16b, v28.16b
+ pmul v1.16b, v1.16b, v28.16b
+ pmul v2.16b, v2.16b, v28.16b
+ pmul v3.16b, v3.16b, v28.16b
+ shl v28.16b, v4.16b, #3
+ shl v29.16b, v5.16b, #3
+ shl v30.16b, v6.16b, #3
+ shl v31.16b, v7.16b, #3
+ eor v0.16b, v0.16b, v28.16b
+ eor v1.16b, v1.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ eor v3.16b, v3.16b, v31.16b
+ eor v28.16b, v8.16b, v0.16b
+ eor v29.16b, v9.16b, v1.16b
+ eor v30.16b, v10.16b, v2.16b
+ eor v31.16b, v11.16b, v3.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v10.16b, v14.16b, v2.16b
+ eor v11.16b, v15.16b, v3.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v4.16b
+ eor v29.16b, v29.16b, v5.16b
+ eor v30.16b, v30.16b, v6.16b
+ eor v31.16b, v31.16b, v7.16b
+ shl v4.4s, v28.4s, #8
+ shl v5.4s, v29.4s, #8
+ shl v6.4s, v30.4s, #8
+ shl v7.4s, v31.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ rev32 v10.8h, v10.8h
+ rev32 v11.8h, v11.8h
+ sri v4.4s, v28.4s, #24
+ sri v5.4s, v29.4s, #24
+ sri v6.4s, v30.4s, #24
+ sri v7.4s, v31.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ shl v28.4s, v0.4s, #24
+ shl v29.4s, v1.4s, #24
+ shl v30.4s, v2.4s, #24
+ shl v31.4s, v3.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ sri v28.4s, v0.4s, #8
+ sri v29.4s, v1.4s, #8
+ sri v30.4s, v2.4s, #8
+ sri v31.4s, v3.4s, #8
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x5]
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ movi v28.16b, #27
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ sshr v10.16b, v2.16b, #7
+ sshr v11.16b, v3.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ shl v14.16b, v2.16b, #1
+ shl v15.16b, v3.16b, #1
+ and v8.16b, v8.16b, v28.16b
+ and v9.16b, v9.16b, v28.16b
+ and v10.16b, v10.16b, v28.16b
+ and v11.16b, v11.16b, v28.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ ushr v12.16b, v0.16b, #6
+ ushr v13.16b, v1.16b, #6
+ ushr v14.16b, v2.16b, #6
+ ushr v15.16b, v3.16b, #6
+ shl v4.16b, v0.16b, #2
+ shl v5.16b, v1.16b, #2
+ shl v6.16b, v2.16b, #2
+ shl v7.16b, v3.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ eor v14.16b, v14.16b, v6.16b
+ eor v15.16b, v15.16b, v7.16b
+ ushr v4.16b, v0.16b, #5
+ ushr v5.16b, v1.16b, #5
+ ushr v6.16b, v2.16b, #5
+ ushr v7.16b, v3.16b, #5
+ pmul v4.16b, v4.16b, v28.16b
+ pmul v5.16b, v5.16b, v28.16b
+ pmul v6.16b, v6.16b, v28.16b
+ pmul v7.16b, v7.16b, v28.16b
+ shl v28.16b, v0.16b, #3
+ shl v29.16b, v1.16b, #3
+ shl v30.16b, v2.16b, #3
+ shl v31.16b, v3.16b, #3
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ eor v28.16b, v8.16b, v4.16b
+ eor v29.16b, v9.16b, v5.16b
+ eor v30.16b, v10.16b, v6.16b
+ eor v31.16b, v11.16b, v7.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ eor v8.16b, v12.16b, v4.16b
+ eor v9.16b, v13.16b, v5.16b
+ eor v10.16b, v14.16b, v6.16b
+ eor v11.16b, v15.16b, v7.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v0.16b
+ eor v29.16b, v29.16b, v1.16b
+ eor v30.16b, v30.16b, v2.16b
+ eor v31.16b, v31.16b, v3.16b
+ shl v0.4s, v28.4s, #8
+ shl v1.4s, v29.4s, #8
+ shl v2.4s, v30.4s, #8
+ shl v3.4s, v31.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ rev32 v10.8h, v10.8h
+ rev32 v11.8h, v11.8h
+ sri v0.4s, v28.4s, #24
+ sri v1.4s, v29.4s, #24
+ sri v2.4s, v30.4s, #24
+ sri v3.4s, v31.4s, #24
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ shl v28.4s, v4.4s, #24
+ shl v29.4s, v5.4s, #24
+ shl v30.4s, v6.4s, #24
+ shl v31.4s, v7.4s, #24
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ sri v28.4s, v4.4s, #8
+ sri v29.4s, v5.4s, #8
+ sri v30.4s, v6.4s, #8
+ sri v31.4s, v7.4s, #8
+ eor v0.16b, v0.16b, v28.16b
+ eor v1.16b, v1.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ eor v3.16b, v3.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x5]
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ subs w7, w7, #2
+ bne L_AES_ECB_decrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ movi v28.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ and v8.16b, v8.16b, v28.16b
+ and v9.16b, v9.16b, v28.16b
+ and v10.16b, v10.16b, v28.16b
+ and v11.16b, v11.16b, v28.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ ushr v14.16b, v6.16b, #6
+ ushr v15.16b, v7.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ shl v2.16b, v6.16b, #2
+ shl v3.16b, v7.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ eor v14.16b, v14.16b, v2.16b
+ eor v15.16b, v15.16b, v3.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ ushr v2.16b, v6.16b, #5
+ ushr v3.16b, v7.16b, #5
+ pmul v0.16b, v0.16b, v28.16b
+ pmul v1.16b, v1.16b, v28.16b
+ pmul v2.16b, v2.16b, v28.16b
+ pmul v3.16b, v3.16b, v28.16b
+ shl v28.16b, v4.16b, #3
+ shl v29.16b, v5.16b, #3
+ shl v30.16b, v6.16b, #3
+ shl v31.16b, v7.16b, #3
+ eor v0.16b, v0.16b, v28.16b
+ eor v1.16b, v1.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ eor v3.16b, v3.16b, v31.16b
+ eor v28.16b, v8.16b, v0.16b
+ eor v29.16b, v9.16b, v1.16b
+ eor v30.16b, v10.16b, v2.16b
+ eor v31.16b, v11.16b, v3.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v10.16b, v14.16b, v2.16b
+ eor v11.16b, v15.16b, v3.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v4.16b
+ eor v29.16b, v29.16b, v5.16b
+ eor v30.16b, v30.16b, v6.16b
+ eor v31.16b, v31.16b, v7.16b
+ shl v4.4s, v28.4s, #8
+ shl v5.4s, v29.4s, #8
+ shl v6.4s, v30.4s, #8
+ shl v7.4s, v31.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ rev32 v10.8h, v10.8h
+ rev32 v11.8h, v11.8h
+ sri v4.4s, v28.4s, #24
+ sri v5.4s, v29.4s, #24
+ sri v6.4s, v30.4s, #24
+ sri v7.4s, v31.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ shl v28.4s, v0.4s, #24
+ shl v29.4s, v1.4s, #24
+ shl v30.4s, v2.4s, #24
+ shl v31.4s, v3.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ sri v28.4s, v0.4s, #8
+ sri v29.4s, v1.4s, #8
+ sri v30.4s, v2.4s, #8
+ sri v31.4s, v3.4s, #8
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x5]
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ sub x2, x2, #0x40
+ cmp x2, #0x40
+ bge L_AES_ECB_decrypt_NEON_loop_4
+L_AES_ECB_decrypt_NEON_start_2
+ cmp x2, #16
+ beq L_AES_ECB_decrypt_NEON_start_1
+ blt L_AES_ECB_decrypt_NEON_data_done
+L_AES_ECB_decrypt_NEON_loop_2
+ mov x8, x3
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ ld1 {v4.2d}, [x8], #16
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ sub w7, w4, #2
+L_AES_ECB_decrypt_NEON_loop_nr_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ movi v10.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ and v8.16b, v8.16b, v10.16b
+ and v9.16b, v9.16b, v10.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ pmul v12.16b, v12.16b, v10.16b
+ pmul v13.16b, v13.16b, v10.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ pmul v0.16b, v0.16b, v10.16b
+ pmul v1.16b, v1.16b, v10.16b
+ shl v10.16b, v4.16b, #3
+ shl v11.16b, v5.16b, #3
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ eor v10.16b, v8.16b, v0.16b
+ eor v11.16b, v9.16b, v1.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v12.16b, v12.16b, v10.16b
+ eor v13.16b, v13.16b, v11.16b
+ eor v10.16b, v10.16b, v4.16b
+ eor v11.16b, v11.16b, v5.16b
+ shl v4.4s, v10.4s, #8
+ shl v5.4s, v11.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ sri v4.4s, v10.4s, #24
+ sri v5.4s, v11.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ shl v10.4s, v0.4s, #24
+ shl v11.4s, v1.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ sri v10.4s, v0.4s, #8
+ sri v11.4s, v1.4s, #8
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ ; Round Done
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ movi v10.16b, #27
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ and v8.16b, v8.16b, v10.16b
+ and v9.16b, v9.16b, v10.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ ushr v12.16b, v0.16b, #6
+ ushr v13.16b, v1.16b, #6
+ shl v4.16b, v0.16b, #2
+ shl v5.16b, v1.16b, #2
+ pmul v12.16b, v12.16b, v10.16b
+ pmul v13.16b, v13.16b, v10.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ ushr v4.16b, v0.16b, #5
+ ushr v5.16b, v1.16b, #5
+ pmul v4.16b, v4.16b, v10.16b
+ pmul v5.16b, v5.16b, v10.16b
+ shl v10.16b, v0.16b, #3
+ shl v11.16b, v1.16b, #3
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ eor v10.16b, v8.16b, v4.16b
+ eor v11.16b, v9.16b, v5.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v8.16b, v12.16b, v4.16b
+ eor v9.16b, v13.16b, v5.16b
+ eor v12.16b, v12.16b, v10.16b
+ eor v13.16b, v13.16b, v11.16b
+ eor v10.16b, v10.16b, v0.16b
+ eor v11.16b, v11.16b, v1.16b
+ shl v0.4s, v10.4s, #8
+ shl v1.4s, v11.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ sri v0.4s, v10.4s, #24
+ sri v1.4s, v11.4s, #24
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ shl v10.4s, v4.4s, #24
+ shl v11.4s, v5.4s, #24
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ sri v10.4s, v4.4s, #8
+ sri v11.4s, v5.4s, #8
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ subs w7, w7, #2
+ bne L_AES_ECB_decrypt_NEON_loop_nr_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x6]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ movi v10.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ and v8.16b, v8.16b, v10.16b
+ and v9.16b, v9.16b, v10.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ pmul v12.16b, v12.16b, v10.16b
+ pmul v13.16b, v13.16b, v10.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ pmul v0.16b, v0.16b, v10.16b
+ pmul v1.16b, v1.16b, v10.16b
+ shl v10.16b, v4.16b, #3
+ shl v11.16b, v5.16b, #3
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ eor v10.16b, v8.16b, v0.16b
+ eor v11.16b, v9.16b, v1.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v12.16b, v12.16b, v10.16b
+ eor v13.16b, v13.16b, v11.16b
+ eor v10.16b, v10.16b, v4.16b
+ eor v11.16b, v11.16b, v5.16b
+ shl v4.4s, v10.4s, #8
+ shl v5.4s, v11.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ sri v4.4s, v10.4s, #24
+ sri v5.4s, v11.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ shl v10.4s, v0.4s, #24
+ shl v11.4s, v1.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ sri v10.4s, v0.4s, #8
+ sri v11.4s, v1.4s, #8
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x8], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ ; Round Done
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x6]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x8], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ st1 {v0.16b, v1.16b}, [x1], #32
+ sub x2, x2, #32
+ cmp x2, #0
+ beq L_AES_ECB_decrypt_NEON_data_done
+L_AES_ECB_decrypt_NEON_start_1
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+ ld1 {v3.2d}, [x6]
+ mov x8, x3
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v4.2d}, [x8], #16
+ rev32 v0.16b, v0.16b
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v0.16b, v4.16b
+ sub w7, w4, #2
+L_AES_ECB_decrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x8], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ sshr v10.16b, v0.16b, #7
+ ushr v11.16b, v0.16b, #6
+ ushr v8.16b, v0.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v0.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v0.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v0.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v0.16b
+ shl v0.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v0.4s, v9.4s, #24
+ eor v0.16b, v0.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v0.16b, v0.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v0.16b, v0.16b, v9.16b
+ ld1 {v4.2d}, [x8], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ subs w7, w7, #2
+ bne L_AES_ECB_decrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x8], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x8], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ st1 {v0.16b}, [x1], #16
+L_AES_ECB_decrypt_NEON_data_done
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:HAVE_AES_CBC
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CBC_decrypt_NEON
+AES_CBC_decrypt_NEON PROC
+ stp x29, x30, [sp, #-160]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #96]
+ stp d10, d11, [x29, #112]
+ stp d12, d13, [x29, #128]
+ stp d14, d15, [x29, #144]
+ adrp x6, L_AES_ARM64_NEON_td
+ add x6, x6, L_AES_ARM64_NEON_td
+ adrp x7, L_AES_ARM64_NEON_shift_rows_invshuffle
+ add x7, x7, L_AES_ARM64_NEON_shift_rows_invshuffle
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x6], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x6], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x6], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x6]
+ ld1 {v3.2d}, [x5]
+ add x10, x29, #16
+ cmp x2, #0x40
+ blt L_AES_CBC_decrypt_NEON_start_2
+L_AES_CBC_decrypt_NEON_loop_4
+ mov x9, x3
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ st1 {v3.2d, v4.2d, v5.2d, v6.2d}, [x10]
+ str q7, [x10, #64]
+ ld1 {v8.2d}, [x9], #16
+ rev32 v4.16b, v4.16b
+ rev32 v5.16b, v5.16b
+ rev32 v6.16b, v6.16b
+ rev32 v7.16b, v7.16b
+ ; Round: 0 - XOR in key schedule
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v8.16b
+ eor v6.16b, v6.16b, v8.16b
+ eor v7.16b, v7.16b, v8.16b
+ sub w8, w4, #2
+L_AES_CBC_decrypt_NEON_loop_nr_4
+ tbl v8.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v9.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v10.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v11.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v4.16b, v12.16b
+ eor v1.16b, v5.16b, v12.16b
+ eor v2.16b, v6.16b, v12.16b
+ eor v3.16b, v7.16b, v12.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ tbl v2.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v2.16b
+ tbl v3.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ eor v0.16b, v4.16b, v13.16b
+ eor v1.16b, v5.16b, v13.16b
+ eor v2.16b, v6.16b, v13.16b
+ eor v3.16b, v7.16b, v13.16b
+ tbl v0.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ eor v0.16b, v4.16b, v14.16b
+ eor v1.16b, v5.16b, v14.16b
+ eor v2.16b, v6.16b, v14.16b
+ eor v3.16b, v7.16b, v14.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ tbl v3.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld1 {v4.16b}, [x7]
+ tbl v8.16b, {v8.16b}, v4.16b
+ tbl v9.16b, {v9.16b}, v4.16b
+ tbl v10.16b, {v10.16b}, v4.16b
+ tbl v11.16b, {v11.16b}, v4.16b
+ movi v28.16b, #27
+ sshr v0.16b, v8.16b, #7
+ sshr v1.16b, v9.16b, #7
+ sshr v2.16b, v10.16b, #7
+ sshr v3.16b, v11.16b, #7
+ shl v12.16b, v8.16b, #1
+ shl v13.16b, v9.16b, #1
+ shl v14.16b, v10.16b, #1
+ shl v15.16b, v11.16b, #1
+ and v0.16b, v0.16b, v28.16b
+ and v1.16b, v1.16b, v28.16b
+ and v2.16b, v2.16b, v28.16b
+ and v3.16b, v3.16b, v28.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ ushr v12.16b, v8.16b, #6
+ ushr v13.16b, v9.16b, #6
+ ushr v14.16b, v10.16b, #6
+ ushr v15.16b, v11.16b, #6
+ shl v4.16b, v8.16b, #2
+ shl v5.16b, v9.16b, #2
+ shl v6.16b, v10.16b, #2
+ shl v7.16b, v11.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ eor v14.16b, v14.16b, v6.16b
+ eor v15.16b, v15.16b, v7.16b
+ ushr v4.16b, v8.16b, #5
+ ushr v5.16b, v9.16b, #5
+ ushr v6.16b, v10.16b, #5
+ ushr v7.16b, v11.16b, #5
+ pmul v4.16b, v4.16b, v28.16b
+ pmul v5.16b, v5.16b, v28.16b
+ pmul v6.16b, v6.16b, v28.16b
+ pmul v7.16b, v7.16b, v28.16b
+ shl v28.16b, v8.16b, #3
+ shl v29.16b, v9.16b, #3
+ shl v30.16b, v10.16b, #3
+ shl v31.16b, v11.16b, #3
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ eor v28.16b, v0.16b, v4.16b
+ eor v29.16b, v1.16b, v5.16b
+ eor v30.16b, v2.16b, v6.16b
+ eor v31.16b, v3.16b, v7.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v0.16b, v12.16b, v4.16b
+ eor v1.16b, v13.16b, v5.16b
+ eor v2.16b, v14.16b, v6.16b
+ eor v3.16b, v15.16b, v7.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v8.16b
+ eor v29.16b, v29.16b, v9.16b
+ eor v30.16b, v30.16b, v10.16b
+ eor v31.16b, v31.16b, v11.16b
+ shl v8.4s, v28.4s, #8
+ shl v9.4s, v29.4s, #8
+ shl v10.4s, v30.4s, #8
+ shl v11.4s, v31.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ rev32 v2.8h, v2.8h
+ rev32 v3.8h, v3.8h
+ sri v8.4s, v28.4s, #24
+ sri v9.4s, v29.4s, #24
+ sri v10.4s, v30.4s, #24
+ sri v11.4s, v31.4s, #24
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ shl v28.4s, v4.4s, #24
+ shl v29.4s, v5.4s, #24
+ shl v30.4s, v6.4s, #24
+ shl v31.4s, v7.4s, #24
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ sri v28.4s, v4.4s, #8
+ sri v29.4s, v5.4s, #8
+ sri v30.4s, v6.4s, #8
+ sri v31.4s, v7.4s, #8
+ eor v8.16b, v8.16b, v28.16b
+ eor v9.16b, v9.16b, v29.16b
+ eor v10.16b, v10.16b, v30.16b
+ eor v11.16b, v11.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x6]
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v8.16b, v8.16b, v4.16b
+ eor v9.16b, v9.16b, v4.16b
+ eor v10.16b, v10.16b, v4.16b
+ eor v11.16b, v11.16b, v4.16b
+ ; Round Done
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v8.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v9.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v10.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v11.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v8.16b, v12.16b
+ eor v1.16b, v9.16b, v12.16b
+ eor v2.16b, v10.16b, v12.16b
+ eor v3.16b, v11.16b, v12.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ tbl v2.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v2.16b
+ tbl v3.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ orr v6.16b, v6.16b, v2.16b
+ orr v7.16b, v7.16b, v3.16b
+ eor v0.16b, v8.16b, v13.16b
+ eor v1.16b, v9.16b, v13.16b
+ eor v2.16b, v10.16b, v13.16b
+ eor v3.16b, v11.16b, v13.16b
+ tbl v0.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ orr v6.16b, v6.16b, v2.16b
+ orr v7.16b, v7.16b, v3.16b
+ eor v0.16b, v8.16b, v14.16b
+ eor v1.16b, v9.16b, v14.16b
+ eor v2.16b, v10.16b, v14.16b
+ eor v3.16b, v11.16b, v14.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ tbl v3.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ orr v6.16b, v6.16b, v2.16b
+ orr v7.16b, v7.16b, v3.16b
+ ld1 {v8.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v8.16b
+ tbl v5.16b, {v5.16b}, v8.16b
+ tbl v6.16b, {v6.16b}, v8.16b
+ tbl v7.16b, {v7.16b}, v8.16b
+ movi v28.16b, #27
+ sshr v0.16b, v4.16b, #7
+ sshr v1.16b, v5.16b, #7
+ sshr v2.16b, v6.16b, #7
+ sshr v3.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ and v0.16b, v0.16b, v28.16b
+ and v1.16b, v1.16b, v28.16b
+ and v2.16b, v2.16b, v28.16b
+ and v3.16b, v3.16b, v28.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ ushr v14.16b, v6.16b, #6
+ ushr v15.16b, v7.16b, #6
+ shl v8.16b, v4.16b, #2
+ shl v9.16b, v5.16b, #2
+ shl v10.16b, v6.16b, #2
+ shl v11.16b, v7.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v8.16b
+ eor v13.16b, v13.16b, v9.16b
+ eor v14.16b, v14.16b, v10.16b
+ eor v15.16b, v15.16b, v11.16b
+ ushr v8.16b, v4.16b, #5
+ ushr v9.16b, v5.16b, #5
+ ushr v10.16b, v6.16b, #5
+ ushr v11.16b, v7.16b, #5
+ pmul v8.16b, v8.16b, v28.16b
+ pmul v9.16b, v9.16b, v28.16b
+ pmul v10.16b, v10.16b, v28.16b
+ pmul v11.16b, v11.16b, v28.16b
+ shl v28.16b, v4.16b, #3
+ shl v29.16b, v5.16b, #3
+ shl v30.16b, v6.16b, #3
+ shl v31.16b, v7.16b, #3
+ eor v8.16b, v8.16b, v28.16b
+ eor v9.16b, v9.16b, v29.16b
+ eor v10.16b, v10.16b, v30.16b
+ eor v11.16b, v11.16b, v31.16b
+ eor v28.16b, v0.16b, v8.16b
+ eor v29.16b, v1.16b, v9.16b
+ eor v30.16b, v2.16b, v10.16b
+ eor v31.16b, v3.16b, v11.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v9.16b, v9.16b, v5.16b
+ eor v10.16b, v10.16b, v6.16b
+ eor v11.16b, v11.16b, v7.16b
+ eor v0.16b, v12.16b, v8.16b
+ eor v1.16b, v13.16b, v9.16b
+ eor v2.16b, v14.16b, v10.16b
+ eor v3.16b, v15.16b, v11.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v4.16b
+ eor v29.16b, v29.16b, v5.16b
+ eor v30.16b, v30.16b, v6.16b
+ eor v31.16b, v31.16b, v7.16b
+ shl v4.4s, v28.4s, #8
+ shl v5.4s, v29.4s, #8
+ shl v6.4s, v30.4s, #8
+ shl v7.4s, v31.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ rev32 v2.8h, v2.8h
+ rev32 v3.8h, v3.8h
+ sri v4.4s, v28.4s, #24
+ sri v5.4s, v29.4s, #24
+ sri v6.4s, v30.4s, #24
+ sri v7.4s, v31.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ shl v28.4s, v8.4s, #24
+ shl v29.4s, v9.4s, #24
+ shl v30.4s, v10.4s, #24
+ shl v31.4s, v11.4s, #24
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ sri v28.4s, v8.4s, #8
+ sri v29.4s, v9.4s, #8
+ sri v30.4s, v10.4s, #8
+ sri v31.4s, v11.4s, #8
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x6]
+ ; XOR in Key Schedule
+ ld1 {v8.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v8.16b
+ eor v6.16b, v6.16b, v8.16b
+ eor v7.16b, v7.16b, v8.16b
+ ; Round Done
+ subs w8, w8, #2
+ bne L_AES_CBC_decrypt_NEON_loop_nr_4
+ tbl v8.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v9.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v10.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v11.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v4.16b, v12.16b
+ eor v1.16b, v5.16b, v12.16b
+ eor v2.16b, v6.16b, v12.16b
+ eor v3.16b, v7.16b, v12.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ tbl v2.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v2.16b
+ tbl v3.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ eor v0.16b, v4.16b, v13.16b
+ eor v1.16b, v5.16b, v13.16b
+ eor v2.16b, v6.16b, v13.16b
+ eor v3.16b, v7.16b, v13.16b
+ tbl v0.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ eor v0.16b, v4.16b, v14.16b
+ eor v1.16b, v5.16b, v14.16b
+ eor v2.16b, v6.16b, v14.16b
+ eor v3.16b, v7.16b, v14.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ tbl v3.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld1 {v4.16b}, [x7]
+ tbl v8.16b, {v8.16b}, v4.16b
+ tbl v9.16b, {v9.16b}, v4.16b
+ tbl v10.16b, {v10.16b}, v4.16b
+ tbl v11.16b, {v11.16b}, v4.16b
+ movi v28.16b, #27
+ sshr v0.16b, v8.16b, #7
+ sshr v1.16b, v9.16b, #7
+ sshr v2.16b, v10.16b, #7
+ sshr v3.16b, v11.16b, #7
+ shl v12.16b, v8.16b, #1
+ shl v13.16b, v9.16b, #1
+ shl v14.16b, v10.16b, #1
+ shl v15.16b, v11.16b, #1
+ and v0.16b, v0.16b, v28.16b
+ and v1.16b, v1.16b, v28.16b
+ and v2.16b, v2.16b, v28.16b
+ and v3.16b, v3.16b, v28.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ ushr v12.16b, v8.16b, #6
+ ushr v13.16b, v9.16b, #6
+ ushr v14.16b, v10.16b, #6
+ ushr v15.16b, v11.16b, #6
+ shl v4.16b, v8.16b, #2
+ shl v5.16b, v9.16b, #2
+ shl v6.16b, v10.16b, #2
+ shl v7.16b, v11.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ eor v14.16b, v14.16b, v6.16b
+ eor v15.16b, v15.16b, v7.16b
+ ushr v4.16b, v8.16b, #5
+ ushr v5.16b, v9.16b, #5
+ ushr v6.16b, v10.16b, #5
+ ushr v7.16b, v11.16b, #5
+ pmul v4.16b, v4.16b, v28.16b
+ pmul v5.16b, v5.16b, v28.16b
+ pmul v6.16b, v6.16b, v28.16b
+ pmul v7.16b, v7.16b, v28.16b
+ shl v28.16b, v8.16b, #3
+ shl v29.16b, v9.16b, #3
+ shl v30.16b, v10.16b, #3
+ shl v31.16b, v11.16b, #3
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ eor v28.16b, v0.16b, v4.16b
+ eor v29.16b, v1.16b, v5.16b
+ eor v30.16b, v2.16b, v6.16b
+ eor v31.16b, v3.16b, v7.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v0.16b, v12.16b, v4.16b
+ eor v1.16b, v13.16b, v5.16b
+ eor v2.16b, v14.16b, v6.16b
+ eor v3.16b, v15.16b, v7.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v8.16b
+ eor v29.16b, v29.16b, v9.16b
+ eor v30.16b, v30.16b, v10.16b
+ eor v31.16b, v31.16b, v11.16b
+ shl v8.4s, v28.4s, #8
+ shl v9.4s, v29.4s, #8
+ shl v10.4s, v30.4s, #8
+ shl v11.4s, v31.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ rev32 v2.8h, v2.8h
+ rev32 v3.8h, v3.8h
+ sri v8.4s, v28.4s, #24
+ sri v9.4s, v29.4s, #24
+ sri v10.4s, v30.4s, #24
+ sri v11.4s, v31.4s, #24
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ shl v28.4s, v4.4s, #24
+ shl v29.4s, v5.4s, #24
+ shl v30.4s, v6.4s, #24
+ shl v31.4s, v7.4s, #24
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ eor v10.16b, v10.16b, v2.16b
+ eor v11.16b, v11.16b, v3.16b
+ sri v28.4s, v4.4s, #8
+ sri v29.4s, v5.4s, #8
+ sri v30.4s, v6.4s, #8
+ sri v31.4s, v7.4s, #8
+ eor v8.16b, v8.16b, v28.16b
+ eor v9.16b, v9.16b, v29.16b
+ eor v10.16b, v10.16b, v30.16b
+ eor v11.16b, v11.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x6]
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v8.16b, v8.16b, v4.16b
+ eor v9.16b, v9.16b, v4.16b
+ eor v10.16b, v10.16b, v4.16b
+ eor v11.16b, v11.16b, v4.16b
+ ; Round Done
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v8.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v9.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v10.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v11.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v8.16b, v12.16b
+ eor v1.16b, v9.16b, v12.16b
+ eor v2.16b, v10.16b, v12.16b
+ eor v3.16b, v11.16b, v12.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ tbl v2.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v2.16b
+ tbl v3.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ orr v6.16b, v6.16b, v2.16b
+ orr v7.16b, v7.16b, v3.16b
+ eor v0.16b, v8.16b, v13.16b
+ eor v1.16b, v9.16b, v13.16b
+ eor v2.16b, v10.16b, v13.16b
+ eor v3.16b, v11.16b, v13.16b
+ tbl v0.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ orr v6.16b, v6.16b, v2.16b
+ orr v7.16b, v7.16b, v3.16b
+ eor v0.16b, v8.16b, v14.16b
+ eor v1.16b, v9.16b, v14.16b
+ eor v2.16b, v10.16b, v14.16b
+ eor v3.16b, v11.16b, v14.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ tbl v3.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ orr v6.16b, v6.16b, v2.16b
+ orr v7.16b, v7.16b, v3.16b
+ ld1 {v8.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v8.16b
+ tbl v5.16b, {v5.16b}, v8.16b
+ tbl v6.16b, {v6.16b}, v8.16b
+ tbl v7.16b, {v7.16b}, v8.16b
+ ; XOR in Key Schedule
+ ld1 {v8.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v8.16b
+ eor v6.16b, v6.16b, v8.16b
+ eor v7.16b, v7.16b, v8.16b
+ ; Round Done
+ rev32 v4.16b, v4.16b
+ rev32 v5.16b, v5.16b
+ rev32 v6.16b, v6.16b
+ rev32 v7.16b, v7.16b
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x10]
+ ldr q3, [x10, #64]
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ st1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ sub x2, x2, #0x40
+ cmp x2, #0x40
+ bge L_AES_CBC_decrypt_NEON_loop_4
+L_AES_CBC_decrypt_NEON_start_2
+ cmp x2, #16
+ beq L_AES_CBC_decrypt_NEON_start_1
+ blt L_AES_CBC_decrypt_NEON_data_done
+L_AES_CBC_decrypt_NEON_loop_2
+ mov x9, x3
+ ld1 {v4.16b, v5.16b}, [x0], #32
+ st1 {v3.2d, v4.2d, v5.2d}, [x10]
+ ld1 {v8.2d}, [x9], #16
+ rev32 v4.16b, v4.16b
+ rev32 v5.16b, v5.16b
+ ; Round: 0 - XOR in key schedule
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v8.16b
+ sub w8, w4, #2
+L_AES_CBC_decrypt_NEON_loop_nr_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v4.16b, v12.16b
+ eor v1.16b, v5.16b, v12.16b
+ tbl v8.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v9.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ eor v2.16b, v4.16b, v13.16b
+ eor v3.16b, v5.16b, v13.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ eor v0.16b, v4.16b, v14.16b
+ eor v1.16b, v5.16b, v14.16b
+ orr v8.16b, v8.16b, v2.16b
+ orr v9.16b, v9.16b, v3.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ ld1 {v4.16b}, [x7]
+ tbl v8.16b, {v8.16b}, v4.16b
+ tbl v9.16b, {v9.16b}, v4.16b
+ movi v2.16b, #27
+ sshr v0.16b, v8.16b, #7
+ sshr v1.16b, v9.16b, #7
+ shl v12.16b, v8.16b, #1
+ shl v13.16b, v9.16b, #1
+ and v0.16b, v0.16b, v2.16b
+ and v1.16b, v1.16b, v2.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ ushr v12.16b, v8.16b, #6
+ ushr v13.16b, v9.16b, #6
+ shl v4.16b, v8.16b, #2
+ shl v5.16b, v9.16b, #2
+ pmul v12.16b, v12.16b, v2.16b
+ pmul v13.16b, v13.16b, v2.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ ushr v4.16b, v8.16b, #5
+ ushr v5.16b, v9.16b, #5
+ pmul v4.16b, v4.16b, v2.16b
+ pmul v5.16b, v5.16b, v2.16b
+ shl v2.16b, v8.16b, #3
+ shl v3.16b, v9.16b, #3
+ eor v4.16b, v4.16b, v2.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v2.16b, v0.16b, v4.16b
+ eor v3.16b, v1.16b, v5.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v0.16b, v12.16b, v4.16b
+ eor v1.16b, v13.16b, v5.16b
+ eor v12.16b, v12.16b, v2.16b
+ eor v13.16b, v13.16b, v3.16b
+ eor v2.16b, v2.16b, v8.16b
+ eor v3.16b, v3.16b, v9.16b
+ shl v8.4s, v2.4s, #8
+ shl v9.4s, v3.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ sri v8.4s, v2.4s, #24
+ sri v9.4s, v3.4s, #24
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ shl v2.4s, v4.4s, #24
+ shl v3.4s, v5.4s, #24
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ sri v2.4s, v4.4s, #8
+ sri v3.4s, v5.4s, #8
+ eor v8.16b, v8.16b, v2.16b
+ eor v9.16b, v9.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v8.16b, v8.16b, v4.16b
+ eor v9.16b, v9.16b, v4.16b
+ ; Round Done
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v8.16b, v12.16b
+ eor v1.16b, v9.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v8.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v9.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ eor v2.16b, v8.16b, v13.16b
+ eor v3.16b, v9.16b, v13.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ eor v0.16b, v8.16b, v14.16b
+ eor v1.16b, v9.16b, v14.16b
+ orr v4.16b, v4.16b, v2.16b
+ orr v5.16b, v5.16b, v3.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ ld1 {v8.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v8.16b
+ tbl v5.16b, {v5.16b}, v8.16b
+ movi v2.16b, #27
+ sshr v0.16b, v4.16b, #7
+ sshr v1.16b, v5.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ and v0.16b, v0.16b, v2.16b
+ and v1.16b, v1.16b, v2.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ shl v8.16b, v4.16b, #2
+ shl v9.16b, v5.16b, #2
+ pmul v12.16b, v12.16b, v2.16b
+ pmul v13.16b, v13.16b, v2.16b
+ eor v12.16b, v12.16b, v8.16b
+ eor v13.16b, v13.16b, v9.16b
+ ushr v8.16b, v4.16b, #5
+ ushr v9.16b, v5.16b, #5
+ pmul v8.16b, v8.16b, v2.16b
+ pmul v9.16b, v9.16b, v2.16b
+ shl v2.16b, v4.16b, #3
+ shl v3.16b, v5.16b, #3
+ eor v8.16b, v8.16b, v2.16b
+ eor v9.16b, v9.16b, v3.16b
+ eor v2.16b, v0.16b, v8.16b
+ eor v3.16b, v1.16b, v9.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v9.16b, v9.16b, v5.16b
+ eor v0.16b, v12.16b, v8.16b
+ eor v1.16b, v13.16b, v9.16b
+ eor v12.16b, v12.16b, v2.16b
+ eor v13.16b, v13.16b, v3.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v5.16b
+ shl v4.4s, v2.4s, #8
+ shl v5.4s, v3.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ sri v4.4s, v2.4s, #24
+ sri v5.4s, v3.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ shl v2.4s, v8.4s, #24
+ shl v3.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ sri v2.4s, v8.4s, #8
+ sri v3.4s, v9.4s, #8
+ eor v4.16b, v4.16b, v2.16b
+ eor v5.16b, v5.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v8.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v8.16b
+ ; Round Done
+ subs w8, w8, #2
+ bne L_AES_CBC_decrypt_NEON_loop_nr_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v4.16b, v12.16b
+ eor v1.16b, v5.16b, v12.16b
+ tbl v8.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v9.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ eor v2.16b, v4.16b, v13.16b
+ eor v3.16b, v5.16b, v13.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ eor v0.16b, v4.16b, v14.16b
+ eor v1.16b, v5.16b, v14.16b
+ orr v8.16b, v8.16b, v2.16b
+ orr v9.16b, v9.16b, v3.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ ld1 {v4.16b}, [x7]
+ tbl v8.16b, {v8.16b}, v4.16b
+ tbl v9.16b, {v9.16b}, v4.16b
+ movi v2.16b, #27
+ sshr v0.16b, v8.16b, #7
+ sshr v1.16b, v9.16b, #7
+ shl v12.16b, v8.16b, #1
+ shl v13.16b, v9.16b, #1
+ and v0.16b, v0.16b, v2.16b
+ and v1.16b, v1.16b, v2.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ ushr v12.16b, v8.16b, #6
+ ushr v13.16b, v9.16b, #6
+ shl v4.16b, v8.16b, #2
+ shl v5.16b, v9.16b, #2
+ pmul v12.16b, v12.16b, v2.16b
+ pmul v13.16b, v13.16b, v2.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ ushr v4.16b, v8.16b, #5
+ ushr v5.16b, v9.16b, #5
+ pmul v4.16b, v4.16b, v2.16b
+ pmul v5.16b, v5.16b, v2.16b
+ shl v2.16b, v8.16b, #3
+ shl v3.16b, v9.16b, #3
+ eor v4.16b, v4.16b, v2.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v2.16b, v0.16b, v4.16b
+ eor v3.16b, v1.16b, v5.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v0.16b, v12.16b, v4.16b
+ eor v1.16b, v13.16b, v5.16b
+ eor v12.16b, v12.16b, v2.16b
+ eor v13.16b, v13.16b, v3.16b
+ eor v2.16b, v2.16b, v8.16b
+ eor v3.16b, v3.16b, v9.16b
+ shl v8.4s, v2.4s, #8
+ shl v9.4s, v3.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ sri v8.4s, v2.4s, #24
+ sri v9.4s, v3.4s, #24
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ shl v2.4s, v4.4s, #24
+ shl v3.4s, v5.4s, #24
+ eor v8.16b, v8.16b, v0.16b
+ eor v9.16b, v9.16b, v1.16b
+ sri v2.4s, v4.4s, #8
+ sri v3.4s, v5.4s, #8
+ eor v8.16b, v8.16b, v2.16b
+ eor v9.16b, v9.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x9], #16
+ eor v8.16b, v8.16b, v4.16b
+ eor v9.16b, v9.16b, v4.16b
+ ; Round Done
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v0.16b, v8.16b, v12.16b
+ eor v1.16b, v9.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v8.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v9.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v1.16b
+ eor v2.16b, v8.16b, v13.16b
+ eor v3.16b, v9.16b, v13.16b
+ tbl v2.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v2.16b
+ tbl v3.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v3.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ eor v0.16b, v8.16b, v14.16b
+ eor v1.16b, v9.16b, v14.16b
+ orr v4.16b, v4.16b, v2.16b
+ orr v5.16b, v5.16b, v3.16b
+ tbl v0.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v0.16b
+ tbl v1.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v1.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v5.16b, v5.16b, v1.16b
+ ld1 {v8.16b}, [x7]
+ tbl v4.16b, {v4.16b}, v8.16b
+ tbl v5.16b, {v5.16b}, v8.16b
+ ; XOR in Key Schedule
+ ld1 {v8.2d}, [x9], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v8.16b
+ ; Round Done
+ rev32 v4.16b, v4.16b
+ rev32 v5.16b, v5.16b
+ ld1 {v1.16b, v2.16b, v3.16b}, [x10]
+ eor v4.16b, v4.16b, v1.16b
+ eor v5.16b, v5.16b, v2.16b
+ st1 {v4.16b, v5.16b}, [x1], #32
+ sub x2, x2, #32
+ cmp x2, #32
+ bge L_AES_CBC_decrypt_NEON_loop_2
+ cmp x2, #0
+ beq L_AES_CBC_decrypt_NEON_data_done
+L_AES_CBC_decrypt_NEON_start_1
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+ ld1 {v7.2d}, [x7]
+ mov x9, x3
+ ld1 {v4.16b}, [x0], #16
+ mov v10.16b, v3.16b
+ mov v11.16b, v4.16b
+ ld1 {v8.16b}, [x9], #16
+ rev32 v4.16b, v4.16b
+ ; Round: 0 - XOR in key schedule
+ eor v4.16b, v4.16b, v8.16b
+ sub w8, w4, #2
+L_AES_CBC_decrypt_NEON_loop_nr_1
+ eor v0.16b, v4.16b, v12.16b
+ eor v1.16b, v4.16b, v13.16b
+ eor v2.16b, v4.16b, v14.16b
+ tbl v8.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v1.16b, v1.16b, v2.16b
+ orr v8.16b, v8.16b, v1.16b
+ tbl v8.16b, {v8.16b}, v7.16b
+ sshr v2.16b, v8.16b, #7
+ ushr v3.16b, v8.16b, #6
+ ushr v0.16b, v8.16b, #5
+ and v2.16b, v2.16b, v15.16b
+ pmul v3.16b, v3.16b, v15.16b
+ pmul v0.16b, v0.16b, v15.16b
+ shl v1.16b, v8.16b, #1
+ eor v2.16b, v2.16b, v1.16b
+ shl v1.16b, v8.16b, #3
+ eor v0.16b, v0.16b, v1.16b
+ shl v1.16b, v8.16b, #2
+ eor v3.16b, v3.16b, v1.16b
+ eor v1.16b, v2.16b, v0.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v2.16b, v3.16b, v0.16b
+ eor v3.16b, v3.16b, v1.16b
+ eor v1.16b, v1.16b, v8.16b
+ shl v8.4s, v1.4s, #8
+ rev32 v2.8h, v2.8h
+ sri v8.4s, v1.4s, #24
+ eor v8.16b, v8.16b, v3.16b
+ shl v1.4s, v0.4s, #24
+ eor v8.16b, v8.16b, v2.16b
+ sri v1.4s, v0.4s, #8
+ eor v8.16b, v8.16b, v1.16b
+ ld1 {v4.2d}, [x9], #16
+ ; XOR in Key Schedule
+ eor v8.16b, v8.16b, v4.16b
+ eor v0.16b, v8.16b, v12.16b
+ eor v1.16b, v8.16b, v13.16b
+ eor v2.16b, v8.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v8.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v1.16b, v1.16b, v2.16b
+ orr v4.16b, v4.16b, v1.16b
+ tbl v4.16b, {v4.16b}, v7.16b
+ sshr v2.16b, v4.16b, #7
+ ushr v3.16b, v4.16b, #6
+ ushr v0.16b, v4.16b, #5
+ and v2.16b, v2.16b, v15.16b
+ pmul v3.16b, v3.16b, v15.16b
+ pmul v0.16b, v0.16b, v15.16b
+ shl v1.16b, v4.16b, #1
+ eor v2.16b, v2.16b, v1.16b
+ shl v1.16b, v4.16b, #3
+ eor v0.16b, v0.16b, v1.16b
+ shl v1.16b, v4.16b, #2
+ eor v3.16b, v3.16b, v1.16b
+ eor v1.16b, v2.16b, v0.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v2.16b, v3.16b, v0.16b
+ eor v3.16b, v3.16b, v1.16b
+ eor v1.16b, v1.16b, v4.16b
+ shl v4.4s, v1.4s, #8
+ rev32 v2.8h, v2.8h
+ sri v4.4s, v1.4s, #24
+ eor v4.16b, v4.16b, v3.16b
+ shl v1.4s, v0.4s, #24
+ eor v4.16b, v4.16b, v2.16b
+ sri v1.4s, v0.4s, #8
+ eor v4.16b, v4.16b, v1.16b
+ ld1 {v8.2d}, [x9], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v8.16b
+ subs w8, w8, #2
+ bne L_AES_CBC_decrypt_NEON_loop_nr_1
+ eor v0.16b, v4.16b, v12.16b
+ eor v1.16b, v4.16b, v13.16b
+ eor v2.16b, v4.16b, v14.16b
+ tbl v8.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v1.16b, v1.16b, v2.16b
+ orr v8.16b, v8.16b, v1.16b
+ tbl v8.16b, {v8.16b}, v7.16b
+ sshr v2.16b, v8.16b, #7
+ ushr v3.16b, v8.16b, #6
+ ushr v0.16b, v8.16b, #5
+ and v2.16b, v2.16b, v15.16b
+ pmul v3.16b, v3.16b, v15.16b
+ pmul v0.16b, v0.16b, v15.16b
+ shl v1.16b, v8.16b, #1
+ eor v2.16b, v2.16b, v1.16b
+ shl v1.16b, v8.16b, #3
+ eor v0.16b, v0.16b, v1.16b
+ shl v1.16b, v8.16b, #2
+ eor v3.16b, v3.16b, v1.16b
+ eor v1.16b, v2.16b, v0.16b
+ eor v0.16b, v0.16b, v8.16b
+ eor v2.16b, v3.16b, v0.16b
+ eor v3.16b, v3.16b, v1.16b
+ eor v1.16b, v1.16b, v8.16b
+ shl v8.4s, v1.4s, #8
+ rev32 v2.8h, v2.8h
+ sri v8.4s, v1.4s, #24
+ eor v8.16b, v8.16b, v3.16b
+ shl v1.4s, v0.4s, #24
+ eor v8.16b, v8.16b, v2.16b
+ sri v1.4s, v0.4s, #8
+ eor v8.16b, v8.16b, v1.16b
+ ld1 {v4.2d}, [x9], #16
+ ; XOR in Key Schedule
+ eor v8.16b, v8.16b, v4.16b
+ eor v0.16b, v8.16b, v12.16b
+ eor v1.16b, v8.16b, v13.16b
+ eor v2.16b, v8.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v8.16b
+ tbl v0.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v0.16b
+ tbl v1.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v1.16b
+ tbl v2.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v2.16b
+ orr v4.16b, v4.16b, v0.16b
+ orr v1.16b, v1.16b, v2.16b
+ orr v4.16b, v4.16b, v1.16b
+ tbl v4.16b, {v4.16b}, v7.16b
+ ld1 {v8.2d}, [x9], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v8.16b
+ rev32 v4.16b, v4.16b
+ mov v3.16b, v11.16b
+ eor v4.16b, v4.16b, v10.16b
+ st1 {v4.16b}, [x1], #16
+L_AES_CBC_decrypt_NEON_data_done
+ st1 {v3.2d}, [x5]
+ ldp d8, d9, [x29, #96]
+ ldp d10, d11, [x29, #112]
+ ldp d12, d13, [x29, #128]
+ ldp d14, d15, [x29, #144]
+ ldp x29, x30, [sp], #0xa0
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ ENDIF
+ IF :DEF:HAVE_AESGCM
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT GCM_gmult_len_NEON
+GCM_gmult_len_NEON PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ ld1 {v18.2d}, [x0]
+ ld1 {v10.2d}, [x1]
+ movi v19.16b, #15
+ eor v20.16b, v20.16b, v20.16b
+ rbit v18.16b, v18.16b
+ rbit v10.16b, v10.16b
+ and v12.16b, v10.16b, v19.16b
+ ushr v13.16b, v10.16b, #4
+ eor v14.16b, v12.16b, v13.16b
+L_GCM_gmult_len_NEON_start_block
+ ld1 {v0.16b}, [x2], #16
+ rbit v0.16b, v0.16b
+ eor v18.16b, v18.16b, v0.16b
+ ; Mul 128x128
+ and v15.16b, v18.16b, v19.16b
+ ushr v16.16b, v18.16b, #4
+ eor v17.16b, v15.16b, v16.16b
+ dup v0.16b, v12.b[0]
+ dup v2.16b, v14.b[0]
+ dup v1.16b, v13.b[0]
+ pmul v8.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v8.16b
+ eor v5.16b, v5.16b, v4.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v8.16b, v8.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ dup v0.16b, v12.b[1]
+ dup v2.16b, v14.b[1]
+ dup v1.16b, v13.b[1]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v6.16b, v20.16b, v3.16b, #15
+ ext v9.16b, v3.16b, v20.16b, #15
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[2]
+ dup v2.16b, v14.b[2]
+ dup v1.16b, v13.b[2]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #14
+ ext v6.16b, v20.16b, v3.16b, #14
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[3]
+ dup v2.16b, v14.b[3]
+ dup v1.16b, v13.b[3]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #13
+ ext v6.16b, v20.16b, v3.16b, #13
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[4]
+ dup v2.16b, v14.b[4]
+ dup v1.16b, v13.b[4]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #12
+ ext v6.16b, v20.16b, v3.16b, #12
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[5]
+ dup v2.16b, v14.b[5]
+ dup v1.16b, v13.b[5]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #11
+ ext v6.16b, v20.16b, v3.16b, #11
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[6]
+ dup v2.16b, v14.b[6]
+ dup v1.16b, v13.b[6]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #10
+ ext v6.16b, v20.16b, v3.16b, #10
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[7]
+ dup v2.16b, v14.b[7]
+ dup v1.16b, v13.b[7]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #9
+ ext v6.16b, v20.16b, v3.16b, #9
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[8]
+ dup v2.16b, v14.b[8]
+ dup v1.16b, v13.b[8]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #8
+ ext v6.16b, v20.16b, v3.16b, #8
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[9]
+ dup v2.16b, v14.b[9]
+ dup v1.16b, v13.b[9]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #7
+ ext v6.16b, v20.16b, v3.16b, #7
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[10]
+ dup v2.16b, v14.b[10]
+ dup v1.16b, v13.b[10]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #6
+ ext v6.16b, v20.16b, v3.16b, #6
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[11]
+ dup v2.16b, v14.b[11]
+ dup v1.16b, v13.b[11]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #5
+ ext v6.16b, v20.16b, v3.16b, #5
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[12]
+ dup v2.16b, v14.b[12]
+ dup v1.16b, v13.b[12]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #4
+ ext v6.16b, v20.16b, v3.16b, #4
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[13]
+ dup v2.16b, v14.b[13]
+ dup v1.16b, v13.b[13]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #3
+ ext v6.16b, v20.16b, v3.16b, #3
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[14]
+ dup v2.16b, v14.b[14]
+ dup v1.16b, v13.b[14]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #2
+ ext v6.16b, v20.16b, v3.16b, #2
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ dup v0.16b, v12.b[15]
+ dup v2.16b, v14.b[15]
+ dup v1.16b, v13.b[15]
+ pmul v3.16b, v15.16b, v0.16b
+ pmul v5.16b, v17.16b, v2.16b
+ pmul v4.16b, v16.16b, v1.16b
+ eor v5.16b, v5.16b, v3.16b
+ eor v5.16b, v5.16b, v4.16b
+ eor v3.16b, v3.16b, v11.16b
+ shl v6.16b, v5.16b, #4
+ ushr v7.16b, v5.16b, #4
+ eor v3.16b, v3.16b, v6.16b
+ eor v11.16b, v4.16b, v7.16b
+ ext v7.16b, v3.16b, v20.16b, #1
+ ext v6.16b, v20.16b, v3.16b, #1
+ eor v9.16b, v9.16b, v7.16b
+ eor v8.16b, v8.16b, v6.16b
+ eor v9.16b, v9.16b, v11.16b
+ ; Reduce 254-bit number
+ shl v0.16b, v9.16b, #1
+ shl v1.16b, v9.16b, #2
+ shl v2.16b, v9.16b, #7
+ ushr v3.16b, v9.16b, #7
+ ushr v4.16b, v9.16b, #6
+ ushr v5.16b, v9.16b, #1
+ eor v0.16b, v0.16b, v9.16b
+ eor v1.16b, v1.16b, v2.16b
+ eor v0.16b, v0.16b, v1.16b
+ eor v8.16b, v8.16b, v0.16b
+ ext v0.16b, v20.16b, v3.16b, #15
+ ext v1.16b, v20.16b, v4.16b, #15
+ ext v2.16b, v20.16b, v5.16b, #15
+ ext v4.16b, v4.16b, v20.16b, #15
+ ext v5.16b, v5.16b, v20.16b, #15
+ eor v0.16b, v0.16b, v1.16b
+ eor v8.16b, v8.16b, v2.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v3.16b, v4.16b, v5.16b
+ shl v0.2d, v3.2d, #1
+ shl v1.2d, v3.2d, #2
+ shl v2.2d, v3.2d, #7
+ eor v3.16b, v3.16b, v0.16b
+ eor v1.16b, v1.16b, v2.16b
+ eor v8.16b, v8.16b, v3.16b
+ eor v18.16b, v8.16b, v1.16b
+ subs x3, x3, #16
+ bne L_GCM_gmult_len_NEON_start_block
+ rbit v18.16b, v18.16b
+ st1 {v18.2d}, [x0]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt_NEON
+AES_GCM_encrypt_NEON PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x9, L_AES_ARM64_NEON_te
+ add x9, x9, L_AES_ARM64_NEON_te
+ adrp x10, L_AES_ARM64_NEON_shift_rows_shuffle
+ add x10, x10, L_AES_ARM64_NEON_shift_rows_shuffle
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x9], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x9], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x9], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x9]
+ ld1 {v2.2d}, [x5]
+ rev32 v2.16b, v2.16b
+ mov w6, v2.s[3]
+ cmp x2, #0x40
+ blt L_AES_GCM_encrypt_NEON_start_2
+ mov x7, v2.d[0]
+ mov x8, v2.d[1]
+L_AES_GCM_encrypt_NEON_loop_4
+ mov x12, x3
+ ld1 {v4.2d}, [x12], #16
+ mov v8.d[0], x7
+ mov v8.d[1], x8
+ ; Round: 0 - XOR in key schedule
+ add w6, w6, #1
+ mov v8.s[3], w6
+ eor v0.16b, v8.16b, v4.16b
+ add w6, w6, #1
+ mov v8.s[3], w6
+ eor v1.16b, v8.16b, v4.16b
+ add w6, w6, #1
+ mov v8.s[3], w6
+ eor v2.16b, v8.16b, v4.16b
+ add w6, w6, #1
+ mov v8.s[3], w6
+ eor v3.16b, v8.16b, v4.16b
+ sub w11, w4, #2
+L_AES_GCM_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x10]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x12], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x10]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ sshr v10.16b, v2.16b, #7
+ sshr v11.16b, v3.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ shl v14.16b, v2.16b, #1
+ shl v15.16b, v3.16b, #1
+ movi v4.16b, #27
+ and v8.16b, v8.16b, v4.16b
+ and v9.16b, v9.16b, v4.16b
+ and v10.16b, v10.16b, v4.16b
+ and v11.16b, v11.16b, v4.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ eor v6.16b, v10.16b, v2.16b
+ eor v7.16b, v11.16b, v3.16b
+ shl v12.4s, v4.4s, #8
+ shl v13.4s, v5.4s, #8
+ shl v14.4s, v6.4s, #8
+ shl v15.4s, v7.4s, #8
+ sri v12.4s, v4.4s, #24
+ sri v13.4s, v5.4s, #24
+ sri v14.4s, v6.4s, #24
+ sri v15.4s, v7.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ shl v6.4s, v2.4s, #24
+ shl v7.4s, v3.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ sri v6.4s, v2.4s, #8
+ sri v7.4s, v3.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ rev32 v2.8h, v2.8h
+ rev32 v3.8h, v3.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x12], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ ; Round Done
+ subs w11, w11, #2
+ bne L_AES_GCM_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x10]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x12], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x10]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x12], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x0], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ sub x2, x2, #0x40
+ cmp x2, #0x40
+ bge L_AES_GCM_encrypt_NEON_loop_4
+ mov v2.d[0], x7
+ mov v2.d[1], x8
+ mov v2.s[3], w6
+L_AES_GCM_encrypt_NEON_start_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+ cmp x2, #16
+ beq L_AES_GCM_encrypt_NEON_start_1
+ blt L_AES_GCM_encrypt_NEON_data_done
+L_AES_GCM_encrypt_NEON_loop_2
+ mov x12, x3
+ ld1 {v4.2d}, [x12], #16
+ ; Round: 0 - XOR in key schedule
+ add w6, w6, #1
+ mov v2.s[3], w6
+ eor v0.16b, v2.16b, v4.16b
+ add w6, w6, #1
+ mov v2.s[3], w6
+ eor v1.16b, v2.16b, v4.16b
+ sub w11, w4, #2
+L_AES_GCM_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x10]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x12], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x10]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ shl v10.16b, v0.16b, #1
+ shl v11.16b, v1.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ shl v10.4s, v4.4s, #8
+ shl v11.4s, v5.4s, #8
+ sri v10.4s, v4.4s, #24
+ sri v11.4s, v5.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x12], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ ; Round Done
+ subs w11, w11, #2
+ bne L_AES_GCM_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x10]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x12], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x10]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x12], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ ld1 {v4.16b, v5.16b}, [x0], #32
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ st1 {v0.16b, v1.16b}, [x1], #32
+ sub x2, x2, #32
+ cmp x2, #0
+ beq L_AES_GCM_encrypt_NEON_data_done
+L_AES_GCM_encrypt_NEON_start_1
+ ld1 {v3.2d}, [x10]
+ mov x12, x3
+ add w6, w6, #1
+ ld1 {v4.2d}, [x12], #16
+ mov v2.s[3], w6
+ ; Round: 0 - XOR in key schedule
+ eor v0.16b, v2.16b, v4.16b
+ sub w11, w4, #2
+L_AES_GCM_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x12], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x12], #16
+ sshr v10.16b, v0.16b, #7
+ shl v9.16b, v0.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v0.8h
+ eor v11.16b, v10.16b, v0.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v0.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v4.16b
+ sri v9.4s, v0.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v0.16b, v10.16b, v9.16b
+ eor v0.16b, v0.16b, v8.16b
+ subs w11, w11, #2
+ bne L_AES_GCM_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x12], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x12], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ ld1 {v4.16b}, [x0], #16
+ eor v0.16b, v0.16b, v4.16b
+ st1 {v0.16b}, [x1], #16
+L_AES_GCM_encrypt_NEON_data_done
+ rev32 v2.16b, v2.16b
+ st1 {v2.2d}, [x5]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:WOLFSSL_AES_XTS
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_XTS_encrypt_NEON
+AES_XTS_encrypt_NEON PROC
+ stp x29, x30, [sp, #-128]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ str x22, [x29, #56]
+ stp d8, d9, [x29, #64]
+ stp d10, d11, [x29, #80]
+ stp d12, d13, [x29, #96]
+ stp d14, d15, [x29, #112]
+ adrp x19, L_AES_ARM64_NEON_te
+ add x19, x19, L_AES_ARM64_NEON_te
+ adrp x20, L_AES_ARM64_NEON_shift_rows_shuffle
+ add x20, x20, L_AES_ARM64_NEON_shift_rows_shuffle
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x19], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x19], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x19], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x19]
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+ ld1 {v3.2d}, [x20]
+ mov x17, #0x87
+ ld1 {v2.2d}, [x3]
+ ld1 {v4.2d}, [x5]
+ rev32 v2.16b, v2.16b
+ add x22, x5, #16
+ ; Round: 0 - XOR in key schedule
+ eor v2.16b, v2.16b, v4.16b
+ sub w21, w7, #2
+L_AES_XTS_encrypt_NEON_loop_nr_tweak
+ eor v8.16b, v2.16b, v12.16b
+ eor v9.16b, v2.16b, v13.16b
+ eor v10.16b, v2.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v2.2d}, [x22], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v2.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v2.16b, v2.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v2.16b, v2.16b, v9.16b
+ tbl v2.16b, {v2.16b}, v3.16b
+ ld1 {v4.2d}, [x22], #16
+ sshr v10.16b, v2.16b, #7
+ shl v9.16b, v2.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v2.8h
+ eor v11.16b, v10.16b, v2.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v2.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v4.16b
+ sri v9.4s, v2.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v2.16b, v10.16b, v9.16b
+ eor v2.16b, v2.16b, v8.16b
+ subs w21, w21, #2
+ bne L_AES_XTS_encrypt_NEON_loop_nr_tweak
+ eor v8.16b, v2.16b, v12.16b
+ eor v9.16b, v2.16b, v13.16b
+ eor v10.16b, v2.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v2.2d}, [x22], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v2.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v2.16b, v2.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v2.16b, v2.16b, v9.16b
+ tbl v2.16b, {v2.16b}, v3.16b
+ ld1 {v4.2d}, [x22], #16
+ ; XOR in Key Schedule
+ eor v2.16b, v2.16b, v4.16b
+ rev32 v2.16b, v2.16b
+ mov x8, v2.d[0]
+ mov x9, v2.d[1]
+ cmp w2, #0x40
+ blt L_AES_XTS_encrypt_NEON_start_2
+L_AES_XTS_encrypt_NEON_loop_4
+ mov x22, x4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b}, [x22], #16
+ and x16, x17, x9, asr 63
+ extr x11, x9, x8, #63
+ eor x10, x16, x8, lsl 1
+ and x16, x17, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x16, x10, lsl 1
+ and x16, x17, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x16, x12, lsl 1
+ mov v8.d[0], x8
+ mov v8.d[1], x9
+ mov v9.d[0], x10
+ mov v9.d[1], x11
+ mov v10.d[0], x12
+ mov v10.d[1], x13
+ mov v11.d[0], x14
+ mov v11.d[1], x15
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ sub w21, w7, #2
+L_AES_XTS_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x20]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x22], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x20]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ sshr v10.16b, v2.16b, #7
+ sshr v11.16b, v3.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ shl v14.16b, v2.16b, #1
+ shl v15.16b, v3.16b, #1
+ movi v4.16b, #27
+ and v8.16b, v8.16b, v4.16b
+ and v9.16b, v9.16b, v4.16b
+ and v10.16b, v10.16b, v4.16b
+ and v11.16b, v11.16b, v4.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ eor v6.16b, v10.16b, v2.16b
+ eor v7.16b, v11.16b, v3.16b
+ shl v12.4s, v4.4s, #8
+ shl v13.4s, v5.4s, #8
+ shl v14.4s, v6.4s, #8
+ shl v15.4s, v7.4s, #8
+ sri v12.4s, v4.4s, #24
+ sri v13.4s, v5.4s, #24
+ sri v14.4s, v6.4s, #24
+ sri v15.4s, v7.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ shl v6.4s, v2.4s, #24
+ shl v7.4s, v3.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ sri v6.4s, v2.4s, #8
+ sri v7.4s, v3.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ rev32 v2.8h, v2.8h
+ rev32 v3.8h, v3.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x22], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ ; Round Done
+ subs w21, w21, #2
+ bne L_AES_XTS_encrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x20]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ movi v0.16b, #27
+ and v8.16b, v8.16b, v0.16b
+ and v9.16b, v9.16b, v0.16b
+ and v10.16b, v10.16b, v0.16b
+ and v11.16b, v11.16b, v0.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ eor v2.16b, v10.16b, v6.16b
+ eor v3.16b, v11.16b, v7.16b
+ shl v12.4s, v0.4s, #8
+ shl v13.4s, v1.4s, #8
+ shl v14.4s, v2.4s, #8
+ shl v15.4s, v3.4s, #8
+ sri v12.4s, v0.4s, #24
+ sri v13.4s, v1.4s, #24
+ sri v14.4s, v2.4s, #24
+ sri v15.4s, v3.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ shl v2.4s, v6.4s, #24
+ shl v3.4s, v7.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ sri v2.4s, v6.4s, #8
+ sri v3.4s, v7.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ rev32 v6.8h, v6.8h
+ rev32 v7.8h, v7.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x22], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x20]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x22], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ mov v8.d[0], x8
+ mov v8.d[1], x9
+ mov v9.d[0], x10
+ mov v9.d[1], x11
+ mov v10.d[0], x12
+ mov v10.d[1], x13
+ mov v11.d[0], x14
+ mov v11.d[1], x15
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ and x16, x17, x15, asr 63
+ extr x9, x15, x14, #63
+ eor x8, x16, x14, lsl 1
+ sub w2, w2, #0x40
+ cmp w2, #0x40
+ bge L_AES_XTS_encrypt_NEON_loop_4
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+L_AES_XTS_encrypt_NEON_start_2
+ cmp w2, #32
+ blt L_AES_XTS_encrypt_NEON_start_1
+ mov x22, x4
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ ld1 {v4.16b}, [x22], #16
+ and x16, x17, x9, asr 63
+ extr x11, x9, x8, #63
+ eor x10, x16, x8, lsl 1
+ and x16, x17, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x16, x10, lsl 1
+ mov v2.d[0], x8
+ mov v2.d[1], x9
+ mov v3.d[0], x10
+ mov v3.d[1], x11
+ eor v0.16b, v0.16b, v2.16b
+ eor v1.16b, v1.16b, v3.16b
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ sub w21, w7, #2
+L_AES_XTS_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x20]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x22], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x20]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ shl v10.16b, v0.16b, #1
+ shl v11.16b, v1.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v4.16b, v8.16b, v0.16b
+ eor v5.16b, v9.16b, v1.16b
+ shl v10.4s, v4.4s, #8
+ shl v11.4s, v5.4s, #8
+ sri v10.4s, v4.4s, #24
+ sri v11.4s, v5.4s, #24
+ shl v4.4s, v0.4s, #24
+ shl v5.4s, v1.4s, #24
+ sri v4.4s, v0.4s, #8
+ sri v5.4s, v1.4s, #8
+ rev32 v0.8h, v0.8h
+ rev32 v1.8h, v1.8h
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x22], #16
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ ; Round Done
+ subs w21, w21, #2
+ bne L_AES_XTS_encrypt_NEON_loop_nr_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x20]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v10.16b, v4.16b, #1
+ shl v11.16b, v5.16b, #1
+ and v8.16b, v8.16b, v15.16b
+ and v9.16b, v9.16b, v15.16b
+ eor v8.16b, v8.16b, v10.16b
+ eor v9.16b, v9.16b, v11.16b
+ eor v0.16b, v8.16b, v4.16b
+ eor v1.16b, v9.16b, v5.16b
+ shl v10.4s, v0.4s, #8
+ shl v11.4s, v1.4s, #8
+ sri v10.4s, v0.4s, #24
+ sri v11.4s, v1.4s, #24
+ shl v0.4s, v4.4s, #24
+ shl v1.4s, v5.4s, #24
+ sri v0.4s, v4.4s, #8
+ sri v1.4s, v5.4s, #8
+ rev32 v4.8h, v4.8h
+ rev32 v5.8h, v5.8h
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x22], #16
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; Round Done
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x20]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x22], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ eor v0.16b, v0.16b, v2.16b
+ eor v1.16b, v1.16b, v3.16b
+ st1 {v0.16b, v1.16b}, [x1], #32
+ and x16, x17, x11, asr 63
+ extr x9, x11, x10, #63
+ eor x8, x16, x10, lsl 1
+ sub w2, w2, #32
+L_AES_XTS_encrypt_NEON_start_1
+ ld1 {v3.2d}, [x20]
+ mov v2.d[0], x8
+ mov v2.d[1], x9
+ cmp w2, #16
+ blt L_AES_XTS_encrypt_NEON_start_partial
+ mov x22, x4
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v4.2d}, [x22], #16
+ eor v0.16b, v0.16b, v2.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v4.16b
+ sub w21, w7, #2
+L_AES_XTS_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x22], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x22], #16
+ sshr v10.16b, v0.16b, #7
+ shl v9.16b, v0.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v0.8h
+ eor v11.16b, v10.16b, v0.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v0.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v4.16b
+ sri v9.4s, v0.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v0.16b, v10.16b, v9.16b
+ eor v0.16b, v0.16b, v8.16b
+ subs w21, w21, #2
+ bne L_AES_XTS_encrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x22], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x22], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v2.16b
+ st1 {v0.16b}, [x1], #16
+ subs w2, w2, #16
+ beq L_AES_XTS_encrypt_NEON_data_done
+ and x16, x17, x9, asr 63
+ extr x9, x9, x8, #63
+ eor x8, x16, x8, lsl 1
+L_AES_XTS_encrypt_NEON_start_partial
+ cbz w2, L_AES_XTS_encrypt_NEON_data_done
+ mov v2.d[0], x8
+ mov v2.d[1], x9
+ mov x22, x4
+ sub x1, x1, #16
+ ld1 {v0.16b}, [x1], #16
+ st1 {v0.2d}, [x6]
+ mov w16, w2
+L_AES_XTS_encrypt_NEON_start_byte
+ ldrb w10, [x6]
+ ldrb w11, [x0], #1
+ strb w10, [x1], #1
+ strb w11, [x6], #1
+ subs w16, w16, #1
+ bgt L_AES_XTS_encrypt_NEON_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ld1 {v0.2d}, [x6]
+ ld1 {v4.2d}, [x22], #16
+ eor v0.16b, v0.16b, v2.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v4.16b
+ sub w21, w7, #2
+L_AES_XTS_encrypt_NEON_loop_nr_partial
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x22], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x22], #16
+ sshr v10.16b, v0.16b, #7
+ shl v9.16b, v0.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v0.8h
+ eor v11.16b, v10.16b, v0.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v0.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v4.16b
+ sri v9.4s, v0.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v0.16b, v10.16b, v9.16b
+ eor v0.16b, v0.16b, v8.16b
+ subs w21, w21, #2
+ bne L_AES_XTS_encrypt_NEON_loop_nr_partial
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v0.2d}, [x22], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v0.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x22], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v2.16b
+ st1 {v0.16b}, [x1]
+L_AES_XTS_encrypt_NEON_data_done
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldr x22, [x29, #56]
+ ldp d8, d9, [x29, #64]
+ ldp d10, d11, [x29, #80]
+ ldp d12, d13, [x29, #96]
+ ldp d14, d15, [x29, #112]
+ ldp x29, x30, [sp], #0x80
+ ret
+ ENDP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_XTS_decrypt_NEON
+AES_XTS_decrypt_NEON PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ stp x20, x21, [x29, #32]
+ stp x22, x23, [x29, #48]
+ stp x24, x25, [x29, #64]
+ stp d8, d9, [x29, #80]
+ stp d10, d11, [x29, #96]
+ stp d12, d13, [x29, #112]
+ stp d14, d15, [x29, #128]
+ adrp x20, L_AES_ARM64_NEON_te
+ add x20, x20, L_AES_ARM64_NEON_te
+ adrp x21, L_AES_ARM64_NEON_td
+ add x21, x21, L_AES_ARM64_NEON_td
+ adrp x22, L_AES_ARM64_NEON_shift_rows_shuffle
+ add x22, x22, L_AES_ARM64_NEON_shift_rows_shuffle
+ adrp x23, L_AES_ARM64_NEON_shift_rows_invshuffle
+ add x23, x23, L_AES_ARM64_NEON_shift_rows_invshuffle
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x20], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x20], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x20], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x20]
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+ ld1 {v3.2d}, [x22]
+ mov x17, #0x87
+ ands w19, w2, #15
+ cset w16, ne
+ sub w2, w2, w16, lsl 4
+ ld1 {v2.2d}, [x3]
+ ld1 {v4.2d}, [x5]
+ rev32 v2.16b, v2.16b
+ add x25, x5, #16
+ ; Round: 0 - XOR in key schedule
+ eor v2.16b, v2.16b, v4.16b
+ sub w24, w7, #2
+L_AES_XTS_decrypt_NEON_loop_nr_tweak
+ eor v8.16b, v2.16b, v12.16b
+ eor v9.16b, v2.16b, v13.16b
+ eor v10.16b, v2.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v2.2d}, [x25], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v2.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v2.16b, v2.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v2.16b, v2.16b, v9.16b
+ tbl v2.16b, {v2.16b}, v3.16b
+ ld1 {v4.2d}, [x25], #16
+ sshr v10.16b, v2.16b, #7
+ shl v9.16b, v2.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v2.8h
+ eor v11.16b, v10.16b, v2.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v2.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v4.16b
+ sri v9.4s, v2.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v2.16b, v10.16b, v9.16b
+ eor v2.16b, v2.16b, v8.16b
+ subs w24, w24, #2
+ bne L_AES_XTS_decrypt_NEON_loop_nr_tweak
+ eor v8.16b, v2.16b, v12.16b
+ eor v9.16b, v2.16b, v13.16b
+ eor v10.16b, v2.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ ld1 {v2.2d}, [x25], #16
+ sshr v10.16b, v4.16b, #7
+ shl v9.16b, v4.16b, #1
+ and v10.16b, v10.16b, v15.16b
+ eor v10.16b, v10.16b, v9.16b
+ rev32 v8.8h, v4.8h
+ eor v11.16b, v10.16b, v4.16b
+ eor v10.16b, v10.16b, v8.16b
+ shl v9.4s, v4.4s, #24
+ shl v8.4s, v11.4s, #8
+ ; XOR in Key Schedule
+ eor v10.16b, v10.16b, v2.16b
+ sri v9.4s, v4.4s, #8
+ sri v8.4s, v11.4s, #24
+ eor v4.16b, v10.16b, v9.16b
+ eor v4.16b, v4.16b, v8.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v2.16b, v2.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v2.16b, v2.16b, v9.16b
+ tbl v2.16b, {v2.16b}, v3.16b
+ ld1 {v4.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v2.16b, v2.16b, v4.16b
+ rev32 v2.16b, v2.16b
+ mov x8, v2.d[0]
+ mov x9, v2.d[1]
+ ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x21], #0x40
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x21], #0x40
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x21], #0x40
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x21]
+ ld1 {v3.2d}, [x23]
+ cmp w2, #0x40
+ blt L_AES_XTS_decrypt_NEON_start_2
+L_AES_XTS_decrypt_NEON_loop_4
+ mov x25, x4
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld1 {v4.16b}, [x25], #16
+ and x16, x17, x9, asr 63
+ extr x11, x9, x8, #63
+ eor x10, x16, x8, lsl 1
+ and x16, x17, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x16, x10, lsl 1
+ and x16, x17, x13, asr 63
+ extr x15, x13, x12, #63
+ eor x14, x16, x12, lsl 1
+ mov v8.d[0], x8
+ mov v8.d[1], x9
+ mov v9.d[0], x10
+ mov v9.d[1], x11
+ mov v10.d[0], x12
+ mov v10.d[1], x13
+ mov v11.d[0], x14
+ mov v11.d[1], x15
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ sub w24, w7, #2
+L_AES_XTS_decrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x23]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ movi v28.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ and v8.16b, v8.16b, v28.16b
+ and v9.16b, v9.16b, v28.16b
+ and v10.16b, v10.16b, v28.16b
+ and v11.16b, v11.16b, v28.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ ushr v14.16b, v6.16b, #6
+ ushr v15.16b, v7.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ shl v2.16b, v6.16b, #2
+ shl v3.16b, v7.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ eor v14.16b, v14.16b, v2.16b
+ eor v15.16b, v15.16b, v3.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ ushr v2.16b, v6.16b, #5
+ ushr v3.16b, v7.16b, #5
+ pmul v0.16b, v0.16b, v28.16b
+ pmul v1.16b, v1.16b, v28.16b
+ pmul v2.16b, v2.16b, v28.16b
+ pmul v3.16b, v3.16b, v28.16b
+ shl v28.16b, v4.16b, #3
+ shl v29.16b, v5.16b, #3
+ shl v30.16b, v6.16b, #3
+ shl v31.16b, v7.16b, #3
+ eor v0.16b, v0.16b, v28.16b
+ eor v1.16b, v1.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ eor v3.16b, v3.16b, v31.16b
+ eor v28.16b, v8.16b, v0.16b
+ eor v29.16b, v9.16b, v1.16b
+ eor v30.16b, v10.16b, v2.16b
+ eor v31.16b, v11.16b, v3.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v10.16b, v14.16b, v2.16b
+ eor v11.16b, v15.16b, v3.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v4.16b
+ eor v29.16b, v29.16b, v5.16b
+ eor v30.16b, v30.16b, v6.16b
+ eor v31.16b, v31.16b, v7.16b
+ shl v4.4s, v28.4s, #8
+ shl v5.4s, v29.4s, #8
+ shl v6.4s, v30.4s, #8
+ shl v7.4s, v31.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ rev32 v10.8h, v10.8h
+ rev32 v11.8h, v11.8h
+ sri v4.4s, v28.4s, #24
+ sri v5.4s, v29.4s, #24
+ sri v6.4s, v30.4s, #24
+ sri v7.4s, v31.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ shl v28.4s, v0.4s, #24
+ shl v29.4s, v1.4s, #24
+ shl v30.4s, v2.4s, #24
+ shl v31.4s, v3.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ sri v28.4s, v0.4s, #8
+ sri v29.4s, v1.4s, #8
+ sri v30.4s, v2.4s, #8
+ sri v31.4s, v3.4s, #8
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x21]
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x25], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x23]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ movi v28.16b, #27
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ sshr v10.16b, v2.16b, #7
+ sshr v11.16b, v3.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ shl v14.16b, v2.16b, #1
+ shl v15.16b, v3.16b, #1
+ and v8.16b, v8.16b, v28.16b
+ and v9.16b, v9.16b, v28.16b
+ and v10.16b, v10.16b, v28.16b
+ and v11.16b, v11.16b, v28.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ ushr v12.16b, v0.16b, #6
+ ushr v13.16b, v1.16b, #6
+ ushr v14.16b, v2.16b, #6
+ ushr v15.16b, v3.16b, #6
+ shl v4.16b, v0.16b, #2
+ shl v5.16b, v1.16b, #2
+ shl v6.16b, v2.16b, #2
+ shl v7.16b, v3.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ eor v14.16b, v14.16b, v6.16b
+ eor v15.16b, v15.16b, v7.16b
+ ushr v4.16b, v0.16b, #5
+ ushr v5.16b, v1.16b, #5
+ ushr v6.16b, v2.16b, #5
+ ushr v7.16b, v3.16b, #5
+ pmul v4.16b, v4.16b, v28.16b
+ pmul v5.16b, v5.16b, v28.16b
+ pmul v6.16b, v6.16b, v28.16b
+ pmul v7.16b, v7.16b, v28.16b
+ shl v28.16b, v0.16b, #3
+ shl v29.16b, v1.16b, #3
+ shl v30.16b, v2.16b, #3
+ shl v31.16b, v3.16b, #3
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ eor v28.16b, v8.16b, v4.16b
+ eor v29.16b, v9.16b, v5.16b
+ eor v30.16b, v10.16b, v6.16b
+ eor v31.16b, v11.16b, v7.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v6.16b, v6.16b, v2.16b
+ eor v7.16b, v7.16b, v3.16b
+ eor v8.16b, v12.16b, v4.16b
+ eor v9.16b, v13.16b, v5.16b
+ eor v10.16b, v14.16b, v6.16b
+ eor v11.16b, v15.16b, v7.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v0.16b
+ eor v29.16b, v29.16b, v1.16b
+ eor v30.16b, v30.16b, v2.16b
+ eor v31.16b, v31.16b, v3.16b
+ shl v0.4s, v28.4s, #8
+ shl v1.4s, v29.4s, #8
+ shl v2.4s, v30.4s, #8
+ shl v3.4s, v31.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ rev32 v10.8h, v10.8h
+ rev32 v11.8h, v11.8h
+ sri v0.4s, v28.4s, #24
+ sri v1.4s, v29.4s, #24
+ sri v2.4s, v30.4s, #24
+ sri v3.4s, v31.4s, #24
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ eor v2.16b, v2.16b, v14.16b
+ eor v3.16b, v3.16b, v15.16b
+ shl v28.4s, v4.4s, #24
+ shl v29.4s, v5.4s, #24
+ shl v30.4s, v6.4s, #24
+ shl v31.4s, v7.4s, #24
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ sri v28.4s, v4.4s, #8
+ sri v29.4s, v5.4s, #8
+ sri v30.4s, v6.4s, #8
+ sri v31.4s, v7.4s, #8
+ eor v0.16b, v0.16b, v28.16b
+ eor v1.16b, v1.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ eor v3.16b, v3.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x21]
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x25], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ subs w24, w24, #2
+ bne L_AES_XTS_decrypt_NEON_loop_nr_4
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v6.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v2.16b
+ tbl v7.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v3.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ eor v10.16b, v2.16b, v12.16b
+ eor v11.16b, v3.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v13.16b
+ eor v9.16b, v1.16b, v13.16b
+ eor v10.16b, v2.16b, v13.16b
+ eor v11.16b, v3.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ eor v10.16b, v2.16b, v14.16b
+ eor v11.16b, v3.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ orr v6.16b, v6.16b, v10.16b
+ orr v7.16b, v7.16b, v11.16b
+ ld1 {v0.16b}, [x23]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ tbl v6.16b, {v6.16b}, v0.16b
+ tbl v7.16b, {v7.16b}, v0.16b
+ movi v28.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ sshr v10.16b, v6.16b, #7
+ sshr v11.16b, v7.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ shl v14.16b, v6.16b, #1
+ shl v15.16b, v7.16b, #1
+ and v8.16b, v8.16b, v28.16b
+ and v9.16b, v9.16b, v28.16b
+ and v10.16b, v10.16b, v28.16b
+ and v11.16b, v11.16b, v28.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ eor v10.16b, v10.16b, v14.16b
+ eor v11.16b, v11.16b, v15.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ ushr v14.16b, v6.16b, #6
+ ushr v15.16b, v7.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ shl v2.16b, v6.16b, #2
+ shl v3.16b, v7.16b, #2
+ pmul v12.16b, v12.16b, v28.16b
+ pmul v13.16b, v13.16b, v28.16b
+ pmul v14.16b, v14.16b, v28.16b
+ pmul v15.16b, v15.16b, v28.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ eor v14.16b, v14.16b, v2.16b
+ eor v15.16b, v15.16b, v3.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ ushr v2.16b, v6.16b, #5
+ ushr v3.16b, v7.16b, #5
+ pmul v0.16b, v0.16b, v28.16b
+ pmul v1.16b, v1.16b, v28.16b
+ pmul v2.16b, v2.16b, v28.16b
+ pmul v3.16b, v3.16b, v28.16b
+ shl v28.16b, v4.16b, #3
+ shl v29.16b, v5.16b, #3
+ shl v30.16b, v6.16b, #3
+ shl v31.16b, v7.16b, #3
+ eor v0.16b, v0.16b, v28.16b
+ eor v1.16b, v1.16b, v29.16b
+ eor v2.16b, v2.16b, v30.16b
+ eor v3.16b, v3.16b, v31.16b
+ eor v28.16b, v8.16b, v0.16b
+ eor v29.16b, v9.16b, v1.16b
+ eor v30.16b, v10.16b, v2.16b
+ eor v31.16b, v11.16b, v3.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v10.16b, v14.16b, v2.16b
+ eor v11.16b, v15.16b, v3.16b
+ eor v12.16b, v12.16b, v28.16b
+ eor v13.16b, v13.16b, v29.16b
+ eor v14.16b, v14.16b, v30.16b
+ eor v15.16b, v15.16b, v31.16b
+ eor v28.16b, v28.16b, v4.16b
+ eor v29.16b, v29.16b, v5.16b
+ eor v30.16b, v30.16b, v6.16b
+ eor v31.16b, v31.16b, v7.16b
+ shl v4.4s, v28.4s, #8
+ shl v5.4s, v29.4s, #8
+ shl v6.4s, v30.4s, #8
+ shl v7.4s, v31.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ rev32 v10.8h, v10.8h
+ rev32 v11.8h, v11.8h
+ sri v4.4s, v28.4s, #24
+ sri v5.4s, v29.4s, #24
+ sri v6.4s, v30.4s, #24
+ sri v7.4s, v31.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ eor v6.16b, v6.16b, v14.16b
+ eor v7.16b, v7.16b, v15.16b
+ shl v28.4s, v0.4s, #24
+ shl v29.4s, v1.4s, #24
+ shl v30.4s, v2.4s, #24
+ shl v31.4s, v3.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ eor v6.16b, v6.16b, v10.16b
+ eor v7.16b, v7.16b, v11.16b
+ sri v28.4s, v0.4s, #8
+ sri v29.4s, v1.4s, #8
+ sri v30.4s, v2.4s, #8
+ sri v31.4s, v3.4s, #8
+ eor v4.16b, v4.16b, v28.16b
+ eor v5.16b, v5.16b, v29.16b
+ eor v6.16b, v6.16b, v30.16b
+ eor v7.16b, v7.16b, v31.16b
+ ld1 {v28.16b, v29.16b, v30.16b, v31.16b}, [x21]
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x25], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ eor v6.16b, v6.16b, v0.16b
+ eor v7.16b, v7.16b, v0.16b
+ ; Round Done
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v2.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v6.16b
+ tbl v3.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v7.16b
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ eor v10.16b, v6.16b, v12.16b
+ eor v11.16b, v7.16b, v12.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ tbl v10.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v10.16b
+ tbl v11.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v13.16b
+ eor v9.16b, v5.16b, v13.16b
+ eor v10.16b, v6.16b, v13.16b
+ eor v11.16b, v7.16b, v13.16b
+ tbl v8.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ eor v10.16b, v6.16b, v14.16b
+ eor v11.16b, v7.16b, v14.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ tbl v11.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ orr v2.16b, v2.16b, v10.16b
+ orr v3.16b, v3.16b, v11.16b
+ ld1 {v4.16b}, [x23]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ tbl v2.16b, {v2.16b}, v4.16b
+ tbl v3.16b, {v3.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x25], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ eor v2.16b, v2.16b, v4.16b
+ eor v3.16b, v3.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ rev32 v2.16b, v2.16b
+ rev32 v3.16b, v3.16b
+ mov v8.d[0], x8
+ mov v8.d[1], x9
+ mov v9.d[0], x10
+ mov v9.d[1], x11
+ mov v10.d[0], x12
+ mov v10.d[1], x13
+ mov v11.d[0], x14
+ mov v11.d[1], x15
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ eor v2.16b, v2.16b, v10.16b
+ eor v3.16b, v3.16b, v11.16b
+ st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ and x16, x17, x15, asr 63
+ extr x9, x15, x14, #63
+ eor x8, x16, x14, lsl 1
+ sub w2, w2, #0x40
+ cmp w2, #0x40
+ bge L_AES_XTS_decrypt_NEON_loop_4
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ movi v15.16b, #27
+L_AES_XTS_decrypt_NEON_start_2
+ cmp w2, #32
+ blt L_AES_XTS_decrypt_NEON_start_1
+ mov x25, x4
+ ld1 {v0.16b, v1.16b}, [x0], #32
+ ld1 {v4.16b}, [x25], #16
+ and x16, x17, x9, asr 63
+ extr x11, x9, x8, #63
+ eor x10, x16, x8, lsl 1
+ and x16, x17, x11, asr 63
+ extr x13, x11, x10, #63
+ eor x12, x16, x10, lsl 1
+ mov v2.d[0], x8
+ mov v2.d[1], x9
+ mov v3.d[0], x10
+ mov v3.d[1], x11
+ eor v0.16b, v0.16b, v2.16b
+ eor v1.16b, v1.16b, v3.16b
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ sub w24, w7, #2
+L_AES_XTS_decrypt_NEON_loop_nr_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x23]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ movi v10.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ and v8.16b, v8.16b, v10.16b
+ and v9.16b, v9.16b, v10.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ pmul v12.16b, v12.16b, v10.16b
+ pmul v13.16b, v13.16b, v10.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ pmul v0.16b, v0.16b, v10.16b
+ pmul v1.16b, v1.16b, v10.16b
+ shl v10.16b, v4.16b, #3
+ shl v11.16b, v5.16b, #3
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ eor v10.16b, v8.16b, v0.16b
+ eor v11.16b, v9.16b, v1.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v12.16b, v12.16b, v10.16b
+ eor v13.16b, v13.16b, v11.16b
+ eor v10.16b, v10.16b, v4.16b
+ eor v11.16b, v11.16b, v5.16b
+ shl v4.4s, v10.4s, #8
+ shl v5.4s, v11.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ sri v4.4s, v10.4s, #24
+ sri v5.4s, v11.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ shl v10.4s, v0.4s, #24
+ shl v11.4s, v1.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ sri v10.4s, v0.4s, #8
+ sri v11.4s, v1.4s, #8
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x25], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ ; Round Done
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x23]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ movi v10.16b, #27
+ sshr v8.16b, v0.16b, #7
+ sshr v9.16b, v1.16b, #7
+ shl v12.16b, v0.16b, #1
+ shl v13.16b, v1.16b, #1
+ and v8.16b, v8.16b, v10.16b
+ and v9.16b, v9.16b, v10.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ ushr v12.16b, v0.16b, #6
+ ushr v13.16b, v1.16b, #6
+ shl v4.16b, v0.16b, #2
+ shl v5.16b, v1.16b, #2
+ pmul v12.16b, v12.16b, v10.16b
+ pmul v13.16b, v13.16b, v10.16b
+ eor v12.16b, v12.16b, v4.16b
+ eor v13.16b, v13.16b, v5.16b
+ ushr v4.16b, v0.16b, #5
+ ushr v5.16b, v1.16b, #5
+ pmul v4.16b, v4.16b, v10.16b
+ pmul v5.16b, v5.16b, v10.16b
+ shl v10.16b, v0.16b, #3
+ shl v11.16b, v1.16b, #3
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ eor v10.16b, v8.16b, v4.16b
+ eor v11.16b, v9.16b, v5.16b
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v1.16b
+ eor v8.16b, v12.16b, v4.16b
+ eor v9.16b, v13.16b, v5.16b
+ eor v12.16b, v12.16b, v10.16b
+ eor v13.16b, v13.16b, v11.16b
+ eor v10.16b, v10.16b, v0.16b
+ eor v11.16b, v11.16b, v1.16b
+ shl v0.4s, v10.4s, #8
+ shl v1.4s, v11.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ sri v0.4s, v10.4s, #24
+ sri v1.4s, v11.4s, #24
+ eor v0.16b, v0.16b, v12.16b
+ eor v1.16b, v1.16b, v13.16b
+ shl v10.4s, v4.4s, #24
+ shl v11.4s, v5.4s, #24
+ eor v0.16b, v0.16b, v8.16b
+ eor v1.16b, v1.16b, v9.16b
+ sri v10.4s, v4.4s, #8
+ sri v11.4s, v5.4s, #8
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x25], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ subs w24, w24, #2
+ bne L_AES_XTS_decrypt_NEON_loop_nr_2
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v1.16b, v12.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v5.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v1.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v0.16b, v13.16b
+ eor v11.16b, v1.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ eor v8.16b, v0.16b, v14.16b
+ eor v9.16b, v1.16b, v14.16b
+ orr v4.16b, v4.16b, v10.16b
+ orr v5.16b, v5.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v5.16b, v5.16b, v9.16b
+ ld1 {v0.16b}, [x23]
+ tbl v4.16b, {v4.16b}, v0.16b
+ tbl v5.16b, {v5.16b}, v0.16b
+ movi v10.16b, #27
+ sshr v8.16b, v4.16b, #7
+ sshr v9.16b, v5.16b, #7
+ shl v12.16b, v4.16b, #1
+ shl v13.16b, v5.16b, #1
+ and v8.16b, v8.16b, v10.16b
+ and v9.16b, v9.16b, v10.16b
+ eor v8.16b, v8.16b, v12.16b
+ eor v9.16b, v9.16b, v13.16b
+ ushr v12.16b, v4.16b, #6
+ ushr v13.16b, v5.16b, #6
+ shl v0.16b, v4.16b, #2
+ shl v1.16b, v5.16b, #2
+ pmul v12.16b, v12.16b, v10.16b
+ pmul v13.16b, v13.16b, v10.16b
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ ushr v0.16b, v4.16b, #5
+ ushr v1.16b, v5.16b, #5
+ pmul v0.16b, v0.16b, v10.16b
+ pmul v1.16b, v1.16b, v10.16b
+ shl v10.16b, v4.16b, #3
+ shl v11.16b, v5.16b, #3
+ eor v0.16b, v0.16b, v10.16b
+ eor v1.16b, v1.16b, v11.16b
+ eor v10.16b, v8.16b, v0.16b
+ eor v11.16b, v9.16b, v1.16b
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v8.16b, v12.16b, v0.16b
+ eor v9.16b, v13.16b, v1.16b
+ eor v12.16b, v12.16b, v10.16b
+ eor v13.16b, v13.16b, v11.16b
+ eor v10.16b, v10.16b, v4.16b
+ eor v11.16b, v11.16b, v5.16b
+ shl v4.4s, v10.4s, #8
+ shl v5.4s, v11.4s, #8
+ rev32 v8.8h, v8.8h
+ rev32 v9.8h, v9.8h
+ sri v4.4s, v10.4s, #24
+ sri v5.4s, v11.4s, #24
+ eor v4.16b, v4.16b, v12.16b
+ eor v5.16b, v5.16b, v13.16b
+ shl v10.4s, v0.4s, #24
+ shl v11.4s, v1.4s, #24
+ eor v4.16b, v4.16b, v8.16b
+ eor v5.16b, v5.16b, v9.16b
+ sri v10.4s, v0.4s, #8
+ sri v11.4s, v1.4s, #8
+ eor v4.16b, v4.16b, v10.16b
+ eor v5.16b, v5.16b, v11.16b
+ ; XOR in Key Schedule
+ ld1 {v0.2d}, [x25], #16
+ eor v4.16b, v4.16b, v0.16b
+ eor v5.16b, v5.16b, v0.16b
+ ; Round Done
+ movi v12.16b, #0x40
+ movi v13.16b, #0x80
+ movi v14.16b, #0xc0
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v5.16b, v12.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v1.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v5.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v9.16b
+ eor v10.16b, v4.16b, v13.16b
+ eor v11.16b, v5.16b, v13.16b
+ tbl v10.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v10.16b
+ tbl v11.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v11.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ eor v8.16b, v4.16b, v14.16b
+ eor v9.16b, v5.16b, v14.16b
+ orr v0.16b, v0.16b, v10.16b
+ orr v1.16b, v1.16b, v11.16b
+ tbl v8.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v8.16b
+ tbl v9.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v9.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v1.16b, v1.16b, v9.16b
+ ld1 {v4.16b}, [x23]
+ tbl v0.16b, {v0.16b}, v4.16b
+ tbl v1.16b, {v1.16b}, v4.16b
+ ; XOR in Key Schedule
+ ld1 {v4.2d}, [x25], #16
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v4.16b
+ ; Round Done
+ rev32 v0.16b, v0.16b
+ rev32 v1.16b, v1.16b
+ eor v0.16b, v0.16b, v2.16b
+ eor v1.16b, v1.16b, v3.16b
+ st1 {v0.16b, v1.16b}, [x1], #32
+ and x16, x17, x11, asr 63
+ extr x9, x11, x10, #63
+ eor x8, x16, x10, lsl 1
+ sub w2, w2, #32
+L_AES_XTS_decrypt_NEON_start_1
+ ld1 {v3.2d}, [x23]
+ mov v2.d[0], x8
+ mov v2.d[1], x9
+ cmp w2, #16
+ blt L_AES_XTS_decrypt_NEON_start_partial
+ mov x25, x4
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v4.2d}, [x25], #16
+ eor v0.16b, v0.16b, v2.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v4.16b
+ sub w24, w7, #2
+L_AES_XTS_decrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ sshr v10.16b, v0.16b, #7
+ ushr v11.16b, v0.16b, #6
+ ushr v8.16b, v0.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v0.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v0.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v0.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v0.16b
+ shl v0.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v0.4s, v9.4s, #24
+ eor v0.16b, v0.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v0.16b, v0.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v0.16b, v0.16b, v9.16b
+ ld1 {v4.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ subs w24, w24, #2
+ bne L_AES_XTS_decrypt_NEON_loop_nr_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v2.16b
+ st1 {v0.16b}, [x1], #16
+ sub w2, w2, #16
+ cbz w19, L_AES_XTS_decrypt_NEON_data_done
+ and x16, x17, x9, asr 63
+ extr x9, x9, x8, #63
+ eor x8, x16, x8, lsl 1
+L_AES_XTS_decrypt_NEON_start_partial
+ mov w2, w19
+ cbz w2, L_AES_XTS_decrypt_NEON_data_done
+ mov v2.d[0], x8
+ mov v2.d[1], x9
+ and x16, x17, x9, asr 63
+ extr x11, x9, x8, #63
+ eor x10, x16, x8, lsl 1
+ mov v1.d[0], x10
+ mov v1.d[1], x11
+ mov x25, x4
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v4.2d}, [x25], #16
+ eor v0.16b, v0.16b, v1.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v4.16b
+ sub w24, w7, #2
+L_AES_XTS_decrypt_NEON_loop_nr_partial_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ sshr v10.16b, v0.16b, #7
+ ushr v11.16b, v0.16b, #6
+ ushr v8.16b, v0.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v0.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v0.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v0.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v0.16b
+ shl v0.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v0.4s, v9.4s, #24
+ eor v0.16b, v0.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v0.16b, v0.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v0.16b, v0.16b, v9.16b
+ ld1 {v4.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ subs w24, w24, #2
+ bne L_AES_XTS_decrypt_NEON_loop_nr_partial_1
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v1.16b
+ st1 {v0.2d}, [x6]
+ add x1, x1, #16
+ mov w16, w2
+L_AES_XTS_decrypt_NEON_start_byte
+ ldrb w10, [x6]
+ ldrb w11, [x0], #1
+ strb w10, [x1], #1
+ strb w11, [x6], #1
+ subs w16, w16, #1
+ bgt L_AES_XTS_decrypt_NEON_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ mov x25, x4
+ ld1 {v0.2d}, [x6]
+ ld1 {v4.2d}, [x25], #16
+ eor v0.16b, v0.16b, v2.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v4.16b
+ sub w24, w7, #2
+L_AES_XTS_decrypt_NEON_loop_nr_partial_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ sshr v10.16b, v0.16b, #7
+ ushr v11.16b, v0.16b, #6
+ ushr v8.16b, v0.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v0.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v0.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v0.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v0.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v0.16b
+ shl v0.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v0.4s, v9.4s, #24
+ eor v0.16b, v0.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v0.16b, v0.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v0.16b, v0.16b, v9.16b
+ ld1 {v4.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ subs w24, w24, #2
+ bne L_AES_XTS_decrypt_NEON_loop_nr_partial_2
+ eor v8.16b, v0.16b, v12.16b
+ eor v9.16b, v0.16b, v13.16b
+ eor v10.16b, v0.16b, v14.16b
+ tbl v4.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v0.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v4.16b, v4.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v4.16b, v4.16b, v9.16b
+ tbl v4.16b, {v4.16b}, v3.16b
+ sshr v10.16b, v4.16b, #7
+ ushr v11.16b, v4.16b, #6
+ ushr v8.16b, v4.16b, #5
+ and v10.16b, v10.16b, v15.16b
+ pmul v11.16b, v11.16b, v15.16b
+ pmul v8.16b, v8.16b, v15.16b
+ shl v9.16b, v4.16b, #1
+ eor v10.16b, v10.16b, v9.16b
+ shl v9.16b, v4.16b, #3
+ eor v8.16b, v8.16b, v9.16b
+ shl v9.16b, v4.16b, #2
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v10.16b, v8.16b
+ eor v8.16b, v8.16b, v4.16b
+ eor v10.16b, v11.16b, v8.16b
+ eor v11.16b, v11.16b, v9.16b
+ eor v9.16b, v9.16b, v4.16b
+ shl v4.4s, v9.4s, #8
+ rev32 v10.8h, v10.8h
+ sri v4.4s, v9.4s, #24
+ eor v4.16b, v4.16b, v11.16b
+ shl v9.4s, v8.4s, #24
+ eor v4.16b, v4.16b, v10.16b
+ sri v9.4s, v8.4s, #8
+ eor v4.16b, v4.16b, v9.16b
+ ld1 {v0.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v4.16b, v4.16b, v0.16b
+ eor v8.16b, v4.16b, v12.16b
+ eor v9.16b, v4.16b, v13.16b
+ eor v10.16b, v4.16b, v14.16b
+ tbl v0.16b, {v16.16b, v17.16b, v18.16b, v19.16b}, v4.16b
+ tbl v8.16b, {v20.16b, v21.16b, v22.16b, v23.16b}, v8.16b
+ tbl v9.16b, {v24.16b, v25.16b, v26.16b, v27.16b}, v9.16b
+ tbl v10.16b, {v28.16b, v29.16b, v30.16b, v31.16b}, v10.16b
+ orr v0.16b, v0.16b, v8.16b
+ orr v9.16b, v9.16b, v10.16b
+ orr v0.16b, v0.16b, v9.16b
+ tbl v0.16b, {v0.16b}, v3.16b
+ ld1 {v4.2d}, [x25], #16
+ ; XOR in Key Schedule
+ eor v0.16b, v0.16b, v4.16b
+ rev32 v0.16b, v0.16b
+ eor v0.16b, v0.16b, v2.16b
+ st1 {v0.16b}, [x1]
+L_AES_XTS_decrypt_NEON_data_done
+ ldp x17, x19, [x29, #16]
+ ldp x20, x21, [x29, #32]
+ ldp x22, x23, [x29, #48]
+ ldp x24, x25, [x29, #64]
+ ldp d8, d9, [x29, #80]
+ ldp d10, d11, [x29, #96]
+ ldp d12, d13, [x29, #112]
+ ldp d14, d15, [x29, #128]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ ENDIF
+ IF :LNOT::DEF:WOLFSSL_ARMASM_NEON_NO_TABLE_LOOKUP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_td
+ DCD 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e
+ DCD 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303
+ DCD 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c
+ DCD 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3
+ DCD 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0
+ DCD 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9
+ DCD 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259
+ DCD 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8
+ DCD 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971
+ DCD 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a
+ DCD 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f
+ DCD 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b
+ DCD 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8
+ DCD 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab
+ DCD 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708
+ DCD 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682
+ DCD 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2
+ DCD 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe
+ DCD 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb
+ DCD 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10
+ DCD 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd
+ DCD 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015
+ DCD 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e
+ DCD 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee
+ DCD 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000
+ DCD 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72
+ DCD 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39
+ DCD 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e
+ DCD 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91
+ DCD 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a
+ DCD 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17
+ DCD 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9
+ DCD 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60
+ DCD 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e
+ DCD 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1
+ DCD 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611
+ DCD 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1
+ DCD 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3
+ DCD 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964
+ DCD 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390
+ DCD 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b
+ DCD 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf
+ DCD 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46
+ DCD 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af
+ DCD 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512
+ DCD 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb
+ DCD 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a
+ DCD 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8
+ DCD 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c
+ DCD 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266
+ DCD 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8
+ DCD 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6
+ DCD 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604
+ DCD 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551
+ DCD 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41
+ DCD 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647
+ DCD 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c
+ DCD 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1
+ DCD 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737
+ DCD 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db
+ DCD 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340
+ DCD 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95
+ DCD 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1
+ DCD 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
+ ENDIF
+ IF :DEF:HAVE_AES_DECRYPT :LOR: :DEF:HAVE_AES_CBC :LOR: :DEF:HAVE_AESCCM :LOR: :DEF:HAVE_AESGCM :LOR: :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_te
+ DCD 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b
+ DCD 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5
+ DCD 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b
+ DCD 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676
+ DCD 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d
+ DCD 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0
+ DCD 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf
+ DCD 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0
+ DCD 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626
+ DCD 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc
+ DCD 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1
+ DCD 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515
+ DCD 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3
+ DCD 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a
+ DCD 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2
+ DCD 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575
+ DCD 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a
+ DCD 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0
+ DCD 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3
+ DCD 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484
+ DCD 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded
+ DCD 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b
+ DCD 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939
+ DCD 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf
+ DCD 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb
+ DCD 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585
+ DCD 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f
+ DCD 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8
+ DCD 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f
+ DCD 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5
+ DCD 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121
+ DCD 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2
+ DCD 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec
+ DCD 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717
+ DCD 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d
+ DCD 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373
+ DCD 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc
+ DCD 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888
+ DCD 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414
+ DCD 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb
+ DCD 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a
+ DCD 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c
+ DCD 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262
+ DCD 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979
+ DCD 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d
+ DCD 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9
+ DCD 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea
+ DCD 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808
+ DCD 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e
+ DCD 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6
+ DCD 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f
+ DCD 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a
+ DCD 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666
+ DCD 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e
+ DCD 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9
+ DCD 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e
+ DCD 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111
+ DCD 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494
+ DCD 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9
+ DCD 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf
+ DCD 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d
+ DCD 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868
+ DCD 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f
+ DCD 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616
+ ENDIF
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_invert_key
+AES_invert_key PROC
+ adrp x2, L_AES_ARM64_te
+ add x2, x2, L_AES_ARM64_te
+ adrp x3, L_AES_ARM64_td
+ add x3, x3, L_AES_ARM64_td
+ add x12, x0, x1, lsl 4
+ mov w13, w1
+L_AES_invert_key_loop
+ ldp w4, w5, [x0]
+ ldnp w6, w7, [x0, #8]
+ ldp w8, w9, [x12]
+ ldnp w10, w11, [x12, #8]
+ stp w4, w5, [x12]
+ stnp w6, w7, [x12, #8]
+ stp w8, w9, [x0], #8
+ stp w10, w11, [x0], #8
+ subs w13, w13, #2
+ sub x12, x12, #16
+ bne L_AES_invert_key_loop
+ sub x0, x0, x1, lsl 3
+ add x0, x0, #16
+ sub w13, w1, #1
+L_AES_invert_key_mix_loop
+ ldp w4, w5, [x0]
+ ldnp w6, w7, [x0, #8]
+ ubfx w8, w4, #0, #8
+ ubfx w9, w4, #8, #8
+ ubfx w10, w4, #16, #8
+ ubfx w11, w4, #24, #8
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ lsl w10, w10, #2
+ lsl w11, w11, #2
+ ldrb w8, [x2, x8, LSL 0]
+ ldrb w9, [x2, x9, LSL 0]
+ ldrb w10, [x2, x10, LSL 0]
+ ldrb w11, [x2, x11, LSL 0]
+ ldr w8, [x3, x8, LSL 2]
+ ldr w9, [x3, x9, LSL 2]
+ ldr w10, [x3, x10, LSL 2]
+ ldr w11, [x3, x11, LSL 2]
+ eor w10, w10, w8, ror 16
+ eor w10, w10, w9, ror 8
+ eor w10, w10, w11, ror 24
+ str w10, [x0], #4
+ ubfx w8, w5, #0, #8
+ ubfx w9, w5, #8, #8
+ ubfx w10, w5, #16, #8
+ ubfx w11, w5, #24, #8
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ lsl w10, w10, #2
+ lsl w11, w11, #2
+ ldrb w8, [x2, x8, LSL 0]
+ ldrb w9, [x2, x9, LSL 0]
+ ldrb w10, [x2, x10, LSL 0]
+ ldrb w11, [x2, x11, LSL 0]
+ ldr w8, [x3, x8, LSL 2]
+ ldr w9, [x3, x9, LSL 2]
+ ldr w10, [x3, x10, LSL 2]
+ ldr w11, [x3, x11, LSL 2]
+ eor w10, w10, w8, ror 16
+ eor w10, w10, w9, ror 8
+ eor w10, w10, w11, ror 24
+ str w10, [x0], #4
+ ubfx w8, w6, #0, #8
+ ubfx w9, w6, #8, #8
+ ubfx w10, w6, #16, #8
+ ubfx w11, w6, #24, #8
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ lsl w10, w10, #2
+ lsl w11, w11, #2
+ ldrb w8, [x2, x8, LSL 0]
+ ldrb w9, [x2, x9, LSL 0]
+ ldrb w10, [x2, x10, LSL 0]
+ ldrb w11, [x2, x11, LSL 0]
+ ldr w8, [x3, x8, LSL 2]
+ ldr w9, [x3, x9, LSL 2]
+ ldr w10, [x3, x10, LSL 2]
+ ldr w11, [x3, x11, LSL 2]
+ eor w10, w10, w8, ror 16
+ eor w10, w10, w9, ror 8
+ eor w10, w10, w11, ror 24
+ str w10, [x0], #4
+ ubfx w8, w7, #0, #8
+ ubfx w9, w7, #8, #8
+ ubfx w10, w7, #16, #8
+ ubfx w11, w7, #24, #8
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ lsl w10, w10, #2
+ lsl w11, w11, #2
+ ldrb w8, [x2, x8, LSL 0]
+ ldrb w9, [x2, x9, LSL 0]
+ ldrb w10, [x2, x10, LSL 0]
+ ldrb w11, [x2, x11, LSL 0]
+ ldr w8, [x3, x8, LSL 2]
+ ldr w9, [x3, x9, LSL 2]
+ ldr w10, [x3, x10, LSL 2]
+ ldr w11, [x3, x11, LSL 2]
+ eor w10, w10, w8, ror 16
+ eor w10, w10, w9, ror 8
+ eor w10, w10, w11, ror 24
+ str w10, [x0], #4
+ subs w13, w13, #1
+ bne L_AES_invert_key_mix_loop
+ ret
+ ENDP
+ ENDIF
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_rcon
+ DCD 0x01000000, 0x02000000, 0x04000000, 0x08000000
+ DCD 0x10000000, 0x20000000, 0x40000000, 0x80000000
+ DCD 0x1b000000, 0x36000000
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_set_encrypt_key
+AES_set_encrypt_key PROC
+ adrp x5, L_AES_ARM64_rcon
+ add x5, x5, L_AES_ARM64_rcon
+ adrp x12, L_AES_ARM64_te
+ add x12, x12, L_AES_ARM64_te
+ cmp x1, #0x80
+ beq L_AES_set_encrypt_key_start_128
+ cmp x1, #0xc0
+ beq L_AES_set_encrypt_key_start_192
+ ldr w6, [x0]
+ ldr w7, [x0, #4]
+ ldr w8, [x0, #8]
+ ldr w9, [x0, #12]
+ rev w6, w6
+ rev w7, w7
+ rev w8, w8
+ rev w9, w9
+ stp w6, w7, [x2], #8
+ stp w8, w9, [x2], #8
+ ldr w6, [x0, #16]
+ ldr w7, [x0, #20]
+ ldr w8, [x0, #24]
+ ldr w9, [x0, #28]
+ rev w6, w6
+ rev w7, w7
+ rev w8, w8
+ rev w9, w9
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ sub x2, x2, #16
+ mov x4, #6
+L_AES_set_encrypt_key_loop_256
+ ubfx w6, w9, #0, #8
+ ubfx w7, w9, #8, #8
+ ubfx w8, w9, #16, #8
+ ubfx w9, w9, #24, #8
+ lsl w6, w6, #2
+ lsl w7, w7, #2
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ ldrb w6, [x12, x6, LSL 0]
+ ldrb w7, [x12, x7, LSL 0]
+ ldrb w8, [x12, x8, LSL 0]
+ ldrb w9, [x12, x9, LSL 0]
+ eor w3, w9, w6, lsl 8
+ eor w3, w3, w7, lsl 16
+ eor w3, w3, w8, lsl 24
+ ldp w6, w7, [x2], #8
+ ldp w8, w9, [x2], #8
+ eor w6, w6, w3
+ ldr w3, [x5], #4
+ eor w6, w6, w3
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ add x2, x2, #16
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ sub x2, x2, #16
+ ubfx w6, w9, #8, #8
+ ubfx w7, w9, #16, #8
+ ubfx w8, w9, #24, #8
+ ubfx w3, w9, #0, #8
+ lsl w6, w6, #2
+ lsl w7, w7, #2
+ lsl w8, w8, #2
+ lsl w3, w3, #2
+ ldrb w6, [x12, x6, LSL 0]
+ ldrb w8, [x12, x8, LSL 0]
+ ldrb w7, [x12, x7, LSL 0]
+ ldrb w3, [x12, x3, LSL 0]
+ eor w3, w3, w6, lsl 8
+ eor w3, w3, w7, lsl 16
+ eor w3, w3, w8, lsl 24
+ ldp w6, w7, [x2], #8
+ ldp w8, w9, [x2], #8
+ eor w6, w6, w3
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ add x2, x2, #16
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ sub x2, x2, #16
+ subs x4, x4, #1
+ bne L_AES_set_encrypt_key_loop_256
+ ubfx w6, w9, #0, #8
+ ubfx w7, w9, #8, #8
+ ubfx w8, w9, #16, #8
+ ubfx w9, w9, #24, #8
+ lsl w6, w6, #2
+ lsl w7, w7, #2
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ ldrb w6, [x12, x6, LSL 0]
+ ldrb w7, [x12, x7, LSL 0]
+ ldrb w8, [x12, x8, LSL 0]
+ ldrb w9, [x12, x9, LSL 0]
+ eor w3, w9, w6, lsl 8
+ eor w3, w3, w7, lsl 16
+ eor w3, w3, w8, lsl 24
+ ldp w6, w7, [x2], #8
+ ldp w8, w9, [x2], #8
+ eor w6, w6, w3
+ ldr w3, [x5], #4
+ eor w6, w6, w3
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ add x2, x2, #16
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ sub x2, x2, #16
+ b L_AES_set_encrypt_key_end
+L_AES_set_encrypt_key_start_192
+ ldr w6, [x0]
+ ldr w7, [x0, #4]
+ ldr w8, [x0, #8]
+ ldr w9, [x0, #12]
+ ldr w10, [x0, #16]
+ ldr w11, [x0, #20]
+ rev w6, w6
+ rev w7, w7
+ rev w8, w8
+ rev w9, w9
+ rev w10, w10
+ rev w11, w11
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ stnp w10, w11, [x2, #16]
+ mov x4, #7
+L_AES_set_encrypt_key_loop_192
+ ubfx w6, w11, #0, #8
+ ubfx w7, w11, #8, #8
+ ubfx w8, w11, #16, #8
+ ubfx w11, w11, #24, #8
+ lsl w6, w6, #2
+ lsl w7, w7, #2
+ lsl w8, w8, #2
+ lsl w11, w11, #2
+ ldrb w6, [x12, x6, LSL 0]
+ ldrb w7, [x12, x7, LSL 0]
+ ldrb w8, [x12, x8, LSL 0]
+ ldrb w11, [x12, x11, LSL 0]
+ eor w3, w11, w6, lsl 8
+ eor w3, w3, w7, lsl 16
+ eor w3, w3, w8, lsl 24
+ ldp w6, w7, [x2], #8
+ ldp w8, w9, [x2], #8
+ ldp w10, w11, [x2], #8
+ eor w6, w6, w3
+ ldr w3, [x5], #4
+ eor w6, w6, w3
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ eor w10, w10, w9
+ eor w11, w11, w10
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ stnp w10, w11, [x2, #16]
+ subs x4, x4, #1
+ bne L_AES_set_encrypt_key_loop_192
+ ubfx w6, w11, #0, #8
+ ubfx w7, w11, #8, #8
+ ubfx w8, w11, #16, #8
+ ubfx w11, w11, #24, #8
+ lsl w6, w6, #2
+ lsl w7, w7, #2
+ lsl w8, w8, #2
+ lsl w11, w11, #2
+ ldrb w6, [x12, x6, LSL 0]
+ ldrb w7, [x12, x7, LSL 0]
+ ldrb w8, [x12, x8, LSL 0]
+ ldrb w11, [x12, x11, LSL 0]
+ eor w3, w11, w6, lsl 8
+ eor w3, w3, w7, lsl 16
+ eor w3, w3, w8, lsl 24
+ ldp w6, w7, [x2], #8
+ ldp w8, w9, [x2], #8
+ ldp w10, w11, [x2], #8
+ eor w6, w6, w3
+ ldr w3, [x5], #4
+ eor w6, w6, w3
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ b L_AES_set_encrypt_key_end
+L_AES_set_encrypt_key_start_128
+ ldr w6, [x0]
+ ldr w7, [x0, #4]
+ ldr w8, [x0, #8]
+ ldr w9, [x0, #12]
+ rev w6, w6
+ rev w7, w7
+ rev w8, w8
+ rev w9, w9
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ mov x4, #10
+L_AES_set_encrypt_key_loop_128
+ ubfx w6, w9, #0, #8
+ ubfx w7, w9, #8, #8
+ ubfx w8, w9, #16, #8
+ ubfx w9, w9, #24, #8
+ lsl w6, w6, #2
+ lsl w7, w7, #2
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ ldrb w6, [x12, x6, LSL 0]
+ ldrb w7, [x12, x7, LSL 0]
+ ldrb w8, [x12, x8, LSL 0]
+ ldrb w9, [x12, x9, LSL 0]
+ eor w3, w9, w6, lsl 8
+ eor w3, w3, w7, lsl 16
+ eor w3, w3, w8, lsl 24
+ ldp w6, w7, [x2], #8
+ ldp w8, w9, [x2], #8
+ eor w6, w6, w3
+ ldr w3, [x5], #4
+ eor w6, w6, w3
+ eor w7, w7, w6
+ eor w8, w8, w7
+ eor w9, w9, w8
+ stp w6, w7, [x2]
+ stnp w8, w9, [x2, #8]
+ subs x4, x4, #1
+ bne L_AES_set_encrypt_key_loop_128
+L_AES_set_encrypt_key_end
+ ret
+ ENDP
+ IF :DEF:HAVE_AESCCM :LOR: :DEF:HAVE_AESGCM :LOR: :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER :LOR: :DEF:HAVE_AES_ECB
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_ECB_encrypt
+AES_ECB_encrypt PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ str x17, [x29, #24]
+ adrp x5, L_AES_ARM64_te
+ add x5, x5, L_AES_ARM64_te
+L_AES_ECB_encrypt_loop_block_128
+ mov x17, x3
+ ldr x6, [x0]
+ ldr x7, [x0, #8]
+ rev32 x6, x6
+ rev32 x7, x7
+ ldp x10, x11, [x17], #16
+ ; Round: 0 - XOR in key schedule
+ eor x6, x6, x10
+ eor x7, x7, x11
+ sub w16, w4, #2
+L_AES_ECB_encrypt_loop_nr
+ ubfx x10, x6, #48, #8
+ ubfx x13, x6, #24, #8
+ ubfx x14, x7, #8, #8
+ ubfx x15, x7, #32, #8
+ ldr x8, [x5]
+ ldr x8, [x5, #64]
+ ldr x8, [x5, #128]
+ ldr x8, [x5, #192]
+ ldr x8, [x5, #256]
+ ldr x8, [x5, #320]
+ ldr x8, [x5, #384]
+ ldr x8, [x5, #448]
+ ldr x8, [x5, #512]
+ ldr x8, [x5, #576]
+ ldr x8, [x5, #640]
+ ldr x8, [x5, #704]
+ ldr x8, [x5, #768]
+ ldr x8, [x5, #832]
+ ldr x8, [x5, #896]
+ ldr x8, [x5, #960]
+ ldr w10, [x5, x10, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x11, x7, #16, #8
+ eor w10, w10, w13, ror 24
+ ubfx x13, x6, #56, #8
+ eor w10, w10, w14, ror 8
+ ubfx x14, x7, #40, #8
+ eor w10, w10, w15, ror 16
+ ubfx x15, x6, #0, #8
+ ldr w11, [x5, x11, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x12, x7, #48, #8
+ eor w11, w11, w13, ror 24
+ ubfx x13, x7, #24, #8
+ eor w11, w11, w14, ror 8
+ ubfx x14, x6, #8, #8
+ eor w11, w11, w15, ror 16
+ ubfx x15, x6, #32, #8
+ bfi x10, x11, #32, #32
+ ldr w12, [x5, x12, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x8, x7, #0, #8
+ eor w12, w12, w13, ror 24
+ ubfx x13, x6, #16, #8
+ eor w12, w12, w14, ror 8
+ ubfx x14, x7, #56, #8
+ eor w11, w12, w15, ror 16
+ ubfx x15, x6, #40, #8
+ ldr w8, [x5, x8, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ eor w14, w14, w8, ror 24
+ ldp x6, x7, [x17], #16
+ eor w13, w13, w14, ror 24
+ eor w13, w13, w15, ror 8
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x6
+ eor x11, x11, x7
+ ubfx x6, x10, #48, #8
+ ubfx x9, x10, #24, #8
+ ubfx x14, x11, #8, #8
+ ubfx x15, x11, #32, #8
+ ldr x12, [x5]
+ ldr x12, [x5, #64]
+ ldr x12, [x5, #128]
+ ldr x12, [x5, #192]
+ ldr x12, [x5, #256]
+ ldr x12, [x5, #320]
+ ldr x12, [x5, #384]
+ ldr x12, [x5, #448]
+ ldr x12, [x5, #512]
+ ldr x12, [x5, #576]
+ ldr x12, [x5, #640]
+ ldr x12, [x5, #704]
+ ldr x12, [x5, #768]
+ ldr x12, [x5, #832]
+ ldr x12, [x5, #896]
+ ldr x12, [x5, #960]
+ ldr w6, [x5, x6, LSL 2]
+ ldr w9, [x5, x9, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x7, x11, #16, #8
+ eor w6, w6, w9, ror 24
+ ubfx x9, x10, #56, #8
+ eor w6, w6, w14, ror 8
+ ubfx x14, x11, #40, #8
+ eor w6, w6, w15, ror 16
+ ubfx x15, x10, #0, #8
+ ldr w7, [x5, x7, LSL 2]
+ ldr w9, [x5, x9, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x8, x11, #48, #8
+ eor w7, w7, w9, ror 24
+ ubfx x9, x11, #24, #8
+ eor w7, w7, w14, ror 8
+ ubfx x14, x10, #8, #8
+ eor w7, w7, w15, ror 16
+ ubfx x15, x10, #32, #8
+ bfi x6, x7, #32, #32
+ ldr w8, [x5, x8, LSL 2]
+ ldr w9, [x5, x9, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x12, x11, #0, #8
+ eor w8, w8, w9, ror 24
+ ubfx x9, x10, #16, #8
+ eor w8, w8, w14, ror 8
+ ubfx x14, x11, #56, #8
+ eor w7, w8, w15, ror 16
+ ubfx x15, x10, #40, #8
+ ldr w12, [x5, x12, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w9, [x5, x9, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ eor w14, w14, w12, ror 24
+ ldp x10, x11, [x17], #16
+ eor w9, w9, w14, ror 24
+ eor w9, w9, w15, ror 8
+ bfi x7, x9, #32, #32
+ ; XOR in Key Schedule
+ eor x6, x6, x10
+ eor x7, x7, x11
+ subs w16, w16, #2
+ bne L_AES_ECB_encrypt_loop_nr
+ ubfx x10, x6, #48, #8
+ ubfx x13, x6, #24, #8
+ ubfx x14, x7, #8, #8
+ ubfx x15, x7, #32, #8
+ ldr x8, [x5]
+ ldr x8, [x5, #64]
+ ldr x8, [x5, #128]
+ ldr x8, [x5, #192]
+ ldr x8, [x5, #256]
+ ldr x8, [x5, #320]
+ ldr x8, [x5, #384]
+ ldr x8, [x5, #448]
+ ldr x8, [x5, #512]
+ ldr x8, [x5, #576]
+ ldr x8, [x5, #640]
+ ldr x8, [x5, #704]
+ ldr x8, [x5, #768]
+ ldr x8, [x5, #832]
+ ldr x8, [x5, #896]
+ ldr x8, [x5, #960]
+ ldr w10, [x5, x10, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x11, x7, #16, #8
+ eor w10, w10, w13, ror 24
+ ubfx x13, x6, #56, #8
+ eor w10, w10, w14, ror 8
+ ubfx x14, x7, #40, #8
+ eor w10, w10, w15, ror 16
+ ubfx x15, x6, #0, #8
+ ldr w11, [x5, x11, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x12, x7, #48, #8
+ eor w11, w11, w13, ror 24
+ ubfx x13, x7, #24, #8
+ eor w11, w11, w14, ror 8
+ ubfx x14, x6, #8, #8
+ eor w11, w11, w15, ror 16
+ ubfx x15, x6, #32, #8
+ bfi x10, x11, #32, #32
+ ldr w12, [x5, x12, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ubfx x8, x7, #0, #8
+ eor w12, w12, w13, ror 24
+ ubfx x13, x6, #16, #8
+ eor w12, w12, w14, ror 8
+ ubfx x14, x7, #56, #8
+ eor w11, w12, w15, ror 16
+ ubfx x15, x6, #40, #8
+ ldr w8, [x5, x8, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w13, [x5, x13, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ eor w14, w14, w8, ror 24
+ ldp x6, x7, [x17], #16
+ eor w13, w13, w14, ror 24
+ eor w13, w13, w15, ror 8
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x6
+ eor x11, x11, x7
+ ubfx x6, x11, #32, #8
+ ubfx x9, x11, #8, #8
+ ubfx x14, x10, #48, #8
+ ubfx x15, x10, #24, #8
+ lsl w6, w6, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldr x13, [x5]
+ ldr x13, [x5, #64]
+ ldr x13, [x5, #128]
+ ldr x13, [x5, #192]
+ ldr x13, [x5, #256]
+ ldr x13, [x5, #320]
+ ldr x13, [x5, #384]
+ ldr x13, [x5, #448]
+ ldr x13, [x5, #512]
+ ldr x13, [x5, #576]
+ ldr x13, [x5, #640]
+ ldr x13, [x5, #704]
+ ldr x13, [x5, #768]
+ ldr x13, [x5, #832]
+ ldr x13, [x5, #896]
+ ldr x13, [x5, #960]
+ ldrb w6, [x5, x6, LSL 0]
+ ldrb w9, [x5, x9, LSL 0]
+ ldrb w14, [x5, x14, LSL 0]
+ ldrb w15, [x5, x15, LSL 0]
+ ubfx x7, x10, #0, #8
+ eor w6, w6, w9, lsl 8
+ ubfx x9, x11, #40, #8
+ eor w6, w6, w14, lsl 16
+ ubfx x14, x11, #16, #8
+ eor w6, w6, w15, lsl 24
+ ubfx x15, x10, #56, #8
+ lsl w7, w7, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldrb w7, [x5, x7, LSL 0]
+ ldrb w9, [x5, x9, LSL 0]
+ ldrb w14, [x5, x14, LSL 0]
+ ldrb w15, [x5, x15, LSL 0]
+ ubfx x8, x10, #32, #8
+ eor w7, w7, w9, lsl 8
+ ubfx x9, x10, #8, #8
+ eor w7, w7, w14, lsl 16
+ ubfx x14, x11, #48, #8
+ eor w7, w7, w15, lsl 24
+ ubfx x15, x11, #24, #8
+ bfi x6, x7, #32, #32
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldrb w8, [x5, x8, LSL 0]
+ ldrb w9, [x5, x9, LSL 0]
+ ldrb w14, [x5, x14, LSL 0]
+ ldrb w15, [x5, x15, LSL 0]
+ ubfx x13, x11, #56, #8
+ eor w8, w8, w9, lsl 8
+ ubfx x9, x11, #0, #8
+ eor w8, w8, w14, lsl 16
+ ubfx x14, x10, #40, #8
+ eor w7, w8, w15, lsl 24
+ ubfx x15, x10, #16, #8
+ lsl w13, w13, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldrb w13, [x5, x13, LSL 0]
+ ldrb w9, [x5, x9, LSL 0]
+ ldrb w14, [x5, x14, LSL 0]
+ ldrb w15, [x5, x15, LSL 0]
+ eor w14, w14, w13, lsl 16
+ ldp x10, x11, [x17]
+ eor w9, w9, w14, lsl 8
+ eor w9, w9, w15, lsl 16
+ bfi x7, x9, #32, #32
+ ; XOR in Key Schedule
+ eor x6, x6, x10
+ eor x7, x7, x11
+ rev32 x6, x6
+ rev32 x7, x7
+ str x6, [x1]
+ str x7, [x1, #8]
+ subs x2, x2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ bne L_AES_ECB_encrypt_loop_block_128
+ ldr x17, [x29, #24]
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:HAVE_AES_CBC
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CBC_encrypt
+AES_CBC_encrypt PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ adrp x6, L_AES_ARM64_te
+ add x6, x6, L_AES_ARM64_te
+ ldp x7, x8, [x5]
+L_AES_CBC_encrypt_loop_block
+ mov x19, x3
+ ldr x11, [x0]
+ ldr x12, [x0, #8]
+ eor x7, x7, x11
+ eor x8, x8, x12
+ rev32 x7, x7
+ rev32 x8, x8
+ ldp x11, x12, [x19], #16
+ ; Round: 0 - XOR in key schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ sub w17, w4, #2
+L_AES_CBC_encrypt_loop_nr
+ ubfx x11, x7, #48, #8
+ ubfx x14, x7, #24, #8
+ ubfx x15, x8, #8, #8
+ ubfx x16, x8, #32, #8
+ ldr x9, [x6]
+ ldr x9, [x6, #64]
+ ldr x9, [x6, #128]
+ ldr x9, [x6, #192]
+ ldr x9, [x6, #256]
+ ldr x9, [x6, #320]
+ ldr x9, [x6, #384]
+ ldr x9, [x6, #448]
+ ldr x9, [x6, #512]
+ ldr x9, [x6, #576]
+ ldr x9, [x6, #640]
+ ldr x9, [x6, #704]
+ ldr x9, [x6, #768]
+ ldr x9, [x6, #832]
+ ldr x9, [x6, #896]
+ ldr x9, [x6, #960]
+ ldr w11, [x6, x11, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x12, x8, #16, #8
+ eor w11, w11, w14, ror 24
+ ubfx x14, x7, #56, #8
+ eor w11, w11, w15, ror 8
+ ubfx x15, x8, #40, #8
+ eor w11, w11, w16, ror 16
+ ubfx x16, x7, #0, #8
+ ldr w12, [x6, x12, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x13, x8, #48, #8
+ eor w12, w12, w14, ror 24
+ ubfx x14, x8, #24, #8
+ eor w12, w12, w15, ror 8
+ ubfx x15, x7, #8, #8
+ eor w12, w12, w16, ror 16
+ ubfx x16, x7, #32, #8
+ bfi x11, x12, #32, #32
+ ldr w13, [x6, x13, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x9, x8, #0, #8
+ eor w13, w13, w14, ror 24
+ ubfx x14, x7, #16, #8
+ eor w13, w13, w15, ror 8
+ ubfx x15, x8, #56, #8
+ eor w12, w13, w16, ror 16
+ ubfx x16, x7, #40, #8
+ ldr w9, [x6, x9, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ eor w15, w15, w9, ror 24
+ ldp x7, x8, [x19], #16
+ eor w14, w14, w15, ror 24
+ eor w14, w14, w16, ror 8
+ bfi x12, x14, #32, #32
+ ; XOR in Key Schedule
+ eor x11, x11, x7
+ eor x12, x12, x8
+ ubfx x7, x11, #48, #8
+ ubfx x10, x11, #24, #8
+ ubfx x15, x12, #8, #8
+ ubfx x16, x12, #32, #8
+ ldr x13, [x6]
+ ldr x13, [x6, #64]
+ ldr x13, [x6, #128]
+ ldr x13, [x6, #192]
+ ldr x13, [x6, #256]
+ ldr x13, [x6, #320]
+ ldr x13, [x6, #384]
+ ldr x13, [x6, #448]
+ ldr x13, [x6, #512]
+ ldr x13, [x6, #576]
+ ldr x13, [x6, #640]
+ ldr x13, [x6, #704]
+ ldr x13, [x6, #768]
+ ldr x13, [x6, #832]
+ ldr x13, [x6, #896]
+ ldr x13, [x6, #960]
+ ldr w7, [x6, x7, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x8, x12, #16, #8
+ eor w7, w7, w10, ror 24
+ ubfx x10, x11, #56, #8
+ eor w7, w7, w15, ror 8
+ ubfx x15, x12, #40, #8
+ eor w7, w7, w16, ror 16
+ ubfx x16, x11, #0, #8
+ ldr w8, [x6, x8, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x9, x12, #48, #8
+ eor w8, w8, w10, ror 24
+ ubfx x10, x12, #24, #8
+ eor w8, w8, w15, ror 8
+ ubfx x15, x11, #8, #8
+ eor w8, w8, w16, ror 16
+ ubfx x16, x11, #32, #8
+ bfi x7, x8, #32, #32
+ ldr w9, [x6, x9, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x13, x12, #0, #8
+ eor w9, w9, w10, ror 24
+ ubfx x10, x11, #16, #8
+ eor w9, w9, w15, ror 8
+ ubfx x15, x12, #56, #8
+ eor w8, w9, w16, ror 16
+ ubfx x16, x11, #40, #8
+ ldr w13, [x6, x13, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ eor w15, w15, w13, ror 24
+ ldp x11, x12, [x19], #16
+ eor w10, w10, w15, ror 24
+ eor w10, w10, w16, ror 8
+ bfi x8, x10, #32, #32
+ ; XOR in Key Schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ subs w17, w17, #2
+ bne L_AES_CBC_encrypt_loop_nr
+ ubfx x11, x7, #48, #8
+ ubfx x14, x7, #24, #8
+ ubfx x15, x8, #8, #8
+ ubfx x16, x8, #32, #8
+ ldr x9, [x6]
+ ldr x9, [x6, #64]
+ ldr x9, [x6, #128]
+ ldr x9, [x6, #192]
+ ldr x9, [x6, #256]
+ ldr x9, [x6, #320]
+ ldr x9, [x6, #384]
+ ldr x9, [x6, #448]
+ ldr x9, [x6, #512]
+ ldr x9, [x6, #576]
+ ldr x9, [x6, #640]
+ ldr x9, [x6, #704]
+ ldr x9, [x6, #768]
+ ldr x9, [x6, #832]
+ ldr x9, [x6, #896]
+ ldr x9, [x6, #960]
+ ldr w11, [x6, x11, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x12, x8, #16, #8
+ eor w11, w11, w14, ror 24
+ ubfx x14, x7, #56, #8
+ eor w11, w11, w15, ror 8
+ ubfx x15, x8, #40, #8
+ eor w11, w11, w16, ror 16
+ ubfx x16, x7, #0, #8
+ ldr w12, [x6, x12, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x13, x8, #48, #8
+ eor w12, w12, w14, ror 24
+ ubfx x14, x8, #24, #8
+ eor w12, w12, w15, ror 8
+ ubfx x15, x7, #8, #8
+ eor w12, w12, w16, ror 16
+ ubfx x16, x7, #32, #8
+ bfi x11, x12, #32, #32
+ ldr w13, [x6, x13, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ ubfx x9, x8, #0, #8
+ eor w13, w13, w14, ror 24
+ ubfx x14, x7, #16, #8
+ eor w13, w13, w15, ror 8
+ ubfx x15, x8, #56, #8
+ eor w12, w13, w16, ror 16
+ ubfx x16, x7, #40, #8
+ ldr w9, [x6, x9, LSL 2]
+ ldr w15, [x6, x15, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w16, [x6, x16, LSL 2]
+ eor w15, w15, w9, ror 24
+ ldp x7, x8, [x19], #16
+ eor w14, w14, w15, ror 24
+ eor w14, w14, w16, ror 8
+ bfi x12, x14, #32, #32
+ ; XOR in Key Schedule
+ eor x11, x11, x7
+ eor x12, x12, x8
+ ubfx x7, x12, #32, #8
+ ubfx x10, x12, #8, #8
+ ubfx x15, x11, #48, #8
+ ubfx x16, x11, #24, #8
+ lsl w7, w7, #2
+ lsl w10, w10, #2
+ lsl w15, w15, #2
+ lsl w16, w16, #2
+ ldr x14, [x6]
+ ldr x14, [x6, #64]
+ ldr x14, [x6, #128]
+ ldr x14, [x6, #192]
+ ldr x14, [x6, #256]
+ ldr x14, [x6, #320]
+ ldr x14, [x6, #384]
+ ldr x14, [x6, #448]
+ ldr x14, [x6, #512]
+ ldr x14, [x6, #576]
+ ldr x14, [x6, #640]
+ ldr x14, [x6, #704]
+ ldr x14, [x6, #768]
+ ldr x14, [x6, #832]
+ ldr x14, [x6, #896]
+ ldr x14, [x6, #960]
+ ldrb w7, [x6, x7, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x8, x11, #0, #8
+ eor w7, w7, w10, lsl 8
+ ubfx x10, x12, #40, #8
+ eor w7, w7, w15, lsl 16
+ ubfx x15, x12, #16, #8
+ eor w7, w7, w16, lsl 24
+ ubfx x16, x11, #56, #8
+ lsl w8, w8, #2
+ lsl w10, w10, #2
+ lsl w15, w15, #2
+ lsl w16, w16, #2
+ ldrb w8, [x6, x8, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x9, x11, #32, #8
+ eor w8, w8, w10, lsl 8
+ ubfx x10, x11, #8, #8
+ eor w8, w8, w15, lsl 16
+ ubfx x15, x12, #48, #8
+ eor w8, w8, w16, lsl 24
+ ubfx x16, x12, #24, #8
+ bfi x7, x8, #32, #32
+ lsl w9, w9, #2
+ lsl w10, w10, #2
+ lsl w15, w15, #2
+ lsl w16, w16, #2
+ ldrb w9, [x6, x9, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x14, x12, #56, #8
+ eor w9, w9, w10, lsl 8
+ ubfx x10, x12, #0, #8
+ eor w9, w9, w15, lsl 16
+ ubfx x15, x11, #40, #8
+ eor w8, w9, w16, lsl 24
+ ubfx x16, x11, #16, #8
+ lsl w14, w14, #2
+ lsl w10, w10, #2
+ lsl w15, w15, #2
+ lsl w16, w16, #2
+ ldrb w14, [x6, x14, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ eor w15, w15, w14, lsl 16
+ ldp x11, x12, [x19]
+ eor w10, w10, w15, lsl 8
+ eor w10, w10, w16, lsl 16
+ bfi x8, x10, #32, #32
+ ; XOR in Key Schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ rev32 x7, x7
+ rev32 x8, x8
+ str x7, [x1]
+ str x8, [x1, #8]
+ subs x2, x2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ bne L_AES_CBC_encrypt_loop_block
+ stp x7, x8, [x5]
+ ldp x17, x19, [x29, #16]
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:WOLFSSL_AES_COUNTER
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CTR_encrypt
+AES_CTR_encrypt PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ stp x20, x21, [x29, #32]
+ adrp x6, L_AES_ARM64_te
+ add x6, x6, L_AES_ARM64_te
+ ldp x15, x16, [x5]
+ rev32 x15, x15
+ rev32 x16, x16
+L_AES_CTR_encrypt_loop_block_128
+ mov x21, x3
+ ldp x11, x12, [x21], #16
+ ; Round: 0 - XOR in key schedule
+ eor x7, x15, x11
+ eor x8, x16, x12
+ sub w20, w4, #2
+L_AES_CTR_encrypt_loop_nr
+ ubfx x11, x7, #48, #8
+ ubfx x14, x7, #24, #8
+ ubfx x17, x8, #8, #8
+ ubfx x19, x8, #32, #8
+ ldr x9, [x6]
+ ldr x9, [x6, #64]
+ ldr x9, [x6, #128]
+ ldr x9, [x6, #192]
+ ldr x9, [x6, #256]
+ ldr x9, [x6, #320]
+ ldr x9, [x6, #384]
+ ldr x9, [x6, #448]
+ ldr x9, [x6, #512]
+ ldr x9, [x6, #576]
+ ldr x9, [x6, #640]
+ ldr x9, [x6, #704]
+ ldr x9, [x6, #768]
+ ldr x9, [x6, #832]
+ ldr x9, [x6, #896]
+ ldr x9, [x6, #960]
+ ldr w11, [x6, x11, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x12, x8, #16, #8
+ eor w11, w11, w14, ror 24
+ ubfx x14, x7, #56, #8
+ eor w11, w11, w17, ror 8
+ ubfx x17, x8, #40, #8
+ eor w11, w11, w19, ror 16
+ ubfx x19, x7, #0, #8
+ ldr w12, [x6, x12, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x13, x8, #48, #8
+ eor w12, w12, w14, ror 24
+ ubfx x14, x8, #24, #8
+ eor w12, w12, w17, ror 8
+ ubfx x17, x7, #8, #8
+ eor w12, w12, w19, ror 16
+ ubfx x19, x7, #32, #8
+ bfi x11, x12, #32, #32
+ ldr w13, [x6, x13, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x9, x8, #0, #8
+ eor w13, w13, w14, ror 24
+ ubfx x14, x7, #16, #8
+ eor w13, w13, w17, ror 8
+ ubfx x17, x8, #56, #8
+ eor w12, w13, w19, ror 16
+ ubfx x19, x7, #40, #8
+ ldr w9, [x6, x9, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ eor w17, w17, w9, ror 24
+ ldp x7, x8, [x21], #16
+ eor w14, w14, w17, ror 24
+ eor w14, w14, w19, ror 8
+ bfi x12, x14, #32, #32
+ ; XOR in Key Schedule
+ eor x11, x11, x7
+ eor x12, x12, x8
+ ubfx x7, x11, #48, #8
+ ubfx x10, x11, #24, #8
+ ubfx x17, x12, #8, #8
+ ubfx x19, x12, #32, #8
+ ldr x13, [x6]
+ ldr x13, [x6, #64]
+ ldr x13, [x6, #128]
+ ldr x13, [x6, #192]
+ ldr x13, [x6, #256]
+ ldr x13, [x6, #320]
+ ldr x13, [x6, #384]
+ ldr x13, [x6, #448]
+ ldr x13, [x6, #512]
+ ldr x13, [x6, #576]
+ ldr x13, [x6, #640]
+ ldr x13, [x6, #704]
+ ldr x13, [x6, #768]
+ ldr x13, [x6, #832]
+ ldr x13, [x6, #896]
+ ldr x13, [x6, #960]
+ ldr w7, [x6, x7, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x8, x12, #16, #8
+ eor w7, w7, w10, ror 24
+ ubfx x10, x11, #56, #8
+ eor w7, w7, w17, ror 8
+ ubfx x17, x12, #40, #8
+ eor w7, w7, w19, ror 16
+ ubfx x19, x11, #0, #8
+ ldr w8, [x6, x8, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x9, x12, #48, #8
+ eor w8, w8, w10, ror 24
+ ubfx x10, x12, #24, #8
+ eor w8, w8, w17, ror 8
+ ubfx x17, x11, #8, #8
+ eor w8, w8, w19, ror 16
+ ubfx x19, x11, #32, #8
+ bfi x7, x8, #32, #32
+ ldr w9, [x6, x9, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x13, x12, #0, #8
+ eor w9, w9, w10, ror 24
+ ubfx x10, x11, #16, #8
+ eor w9, w9, w17, ror 8
+ ubfx x17, x12, #56, #8
+ eor w8, w9, w19, ror 16
+ ubfx x19, x11, #40, #8
+ ldr w13, [x6, x13, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w10, [x6, x10, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ eor w17, w17, w13, ror 24
+ ldp x11, x12, [x21], #16
+ eor w10, w10, w17, ror 24
+ eor w10, w10, w19, ror 8
+ bfi x8, x10, #32, #32
+ ; XOR in Key Schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ subs w20, w20, #2
+ bne L_AES_CTR_encrypt_loop_nr
+ ubfx x11, x7, #48, #8
+ ubfx x14, x7, #24, #8
+ ubfx x17, x8, #8, #8
+ ubfx x19, x8, #32, #8
+ ldr x9, [x6]
+ ldr x9, [x6, #64]
+ ldr x9, [x6, #128]
+ ldr x9, [x6, #192]
+ ldr x9, [x6, #256]
+ ldr x9, [x6, #320]
+ ldr x9, [x6, #384]
+ ldr x9, [x6, #448]
+ ldr x9, [x6, #512]
+ ldr x9, [x6, #576]
+ ldr x9, [x6, #640]
+ ldr x9, [x6, #704]
+ ldr x9, [x6, #768]
+ ldr x9, [x6, #832]
+ ldr x9, [x6, #896]
+ ldr x9, [x6, #960]
+ ldr w11, [x6, x11, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x12, x8, #16, #8
+ eor w11, w11, w14, ror 24
+ ubfx x14, x7, #56, #8
+ eor w11, w11, w17, ror 8
+ ubfx x17, x8, #40, #8
+ eor w11, w11, w19, ror 16
+ ubfx x19, x7, #0, #8
+ ldr w12, [x6, x12, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x13, x8, #48, #8
+ eor w12, w12, w14, ror 24
+ ubfx x14, x8, #24, #8
+ eor w12, w12, w17, ror 8
+ ubfx x17, x7, #8, #8
+ eor w12, w12, w19, ror 16
+ ubfx x19, x7, #32, #8
+ bfi x11, x12, #32, #32
+ ldr w13, [x6, x13, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ ubfx x9, x8, #0, #8
+ eor w13, w13, w14, ror 24
+ ubfx x14, x7, #16, #8
+ eor w13, w13, w17, ror 8
+ ubfx x17, x8, #56, #8
+ eor w12, w13, w19, ror 16
+ ubfx x19, x7, #40, #8
+ ldr w9, [x6, x9, LSL 2]
+ ldr w17, [x6, x17, LSL 2]
+ ldr w14, [x6, x14, LSL 2]
+ ldr w19, [x6, x19, LSL 2]
+ eor w17, w17, w9, ror 24
+ ldp x7, x8, [x21], #16
+ eor w14, w14, w17, ror 24
+ eor w14, w14, w19, ror 8
+ bfi x12, x14, #32, #32
+ ; XOR in Key Schedule
+ eor x11, x11, x7
+ eor x12, x12, x8
+ ubfx x7, x12, #32, #8
+ ubfx x10, x12, #8, #8
+ ubfx x17, x11, #48, #8
+ ubfx x19, x11, #24, #8
+ lsl w7, w7, #2
+ lsl w10, w10, #2
+ lsl w17, w17, #2
+ lsl w19, w19, #2
+ ldr x14, [x6]
+ ldr x14, [x6, #64]
+ ldr x14, [x6, #128]
+ ldr x14, [x6, #192]
+ ldr x14, [x6, #256]
+ ldr x14, [x6, #320]
+ ldr x14, [x6, #384]
+ ldr x14, [x6, #448]
+ ldr x14, [x6, #512]
+ ldr x14, [x6, #576]
+ ldr x14, [x6, #640]
+ ldr x14, [x6, #704]
+ ldr x14, [x6, #768]
+ ldr x14, [x6, #832]
+ ldr x14, [x6, #896]
+ ldr x14, [x6, #960]
+ ldrb w7, [x6, x7, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w19, [x6, x19, LSL 0]
+ ubfx x8, x11, #0, #8
+ eor w7, w7, w10, lsl 8
+ ubfx x10, x12, #40, #8
+ eor w7, w7, w17, lsl 16
+ ubfx x17, x12, #16, #8
+ eor w7, w7, w19, lsl 24
+ ubfx x19, x11, #56, #8
+ lsl w8, w8, #2
+ lsl w10, w10, #2
+ lsl w17, w17, #2
+ lsl w19, w19, #2
+ ldrb w8, [x6, x8, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w19, [x6, x19, LSL 0]
+ ubfx x9, x11, #32, #8
+ eor w8, w8, w10, lsl 8
+ ubfx x10, x11, #8, #8
+ eor w8, w8, w17, lsl 16
+ ubfx x17, x12, #48, #8
+ eor w8, w8, w19, lsl 24
+ ubfx x19, x12, #24, #8
+ bfi x7, x8, #32, #32
+ lsl w9, w9, #2
+ lsl w10, w10, #2
+ lsl w17, w17, #2
+ lsl w19, w19, #2
+ ldrb w9, [x6, x9, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w19, [x6, x19, LSL 0]
+ ubfx x14, x12, #56, #8
+ eor w9, w9, w10, lsl 8
+ ubfx x10, x12, #0, #8
+ eor w9, w9, w17, lsl 16
+ ubfx x17, x11, #40, #8
+ eor w8, w9, w19, lsl 24
+ ubfx x19, x11, #16, #8
+ lsl w14, w14, #2
+ lsl w10, w10, #2
+ lsl w17, w17, #2
+ lsl w19, w19, #2
+ ldrb w14, [x6, x14, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w19, [x6, x19, LSL 0]
+ eor w17, w17, w14, lsl 16
+ ldp x11, x12, [x21]
+ eor w10, w10, w17, lsl 8
+ eor w10, w10, w19, lsl 16
+ bfi x8, x10, #32, #32
+ ; XOR in Key Schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ rev32 x7, x7
+ rev32 x8, x8
+ ldr x11, [x0]
+ ldr x12, [x0, #8]
+ eor x7, x7, x11
+ eor x8, x8, x12
+ str x7, [x1]
+ str x8, [x1, #8]
+ ror x16, x16, #32
+ ror x15, x15, #32
+ adds x16, x16, #1
+ adc x15, x15, xzr
+ ror x16, x16, #32
+ ror x15, x15, #32
+ subs x2, x2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ bne L_AES_CTR_encrypt_loop_block_128
+ rev32 x15, x15
+ rev32 x16, x16
+ stp x15, x16, [x5]
+ ldp x17, x19, [x29, #16]
+ ldp x20, x21, [x29, #32]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:HAVE_AES_DECRYPT
+ IF :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER :LOR: :DEF:HAVE_AES_CBC :LOR: :DEF:HAVE_AES_ECB
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_AES_ARM64_td4
+ DCB 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
+ DCB 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
+ DCB 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
+ DCB 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
+ DCB 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
+ DCB 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
+ DCB 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
+ DCB 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
+ DCB 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
+ DCB 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
+ DCB 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
+ DCB 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
+ DCB 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
+ DCB 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
+ DCB 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
+ DCB 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
+ DCB 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
+ DCB 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
+ DCB 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
+ DCB 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
+ DCB 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
+ DCB 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
+ DCB 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
+ DCB 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
+ DCB 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
+ DCB 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
+ DCB 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
+ DCB 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
+ DCB 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
+ DCB 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
+ DCB 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
+ DCB 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
+ IF :DEF:WOLFSSL_AES_DIRECT :LOR: :DEF:WOLFSSL_AES_COUNTER :LOR: :DEF:HAVE_AES_ECB
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_ECB_decrypt
+AES_ECB_decrypt PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ adrp x5, L_AES_ARM64_td
+ add x5, x5, L_AES_ARM64_td
+ adrp x6, L_AES_ARM64_td4
+ add x6, x6, L_AES_ARM64_td4
+L_AES_ECB_decrypt_loop_block
+ mov x19, x3
+ ldr x7, [x0]
+ ldr x8, [x0, #8]
+ rev32 x7, x7
+ rev32 x8, x8
+ ldp x11, x12, [x19], #16
+ ; Round: 0 - XOR in key schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ sub w17, w4, #2
+L_AES_ECB_decrypt_loop_nr
+ ubfx x11, x8, #48, #8
+ ubfx x14, x7, #24, #8
+ ubfx x15, x8, #8, #8
+ ubfx x16, x7, #32, #8
+ ldr x9, [x5]
+ ldr x9, [x5, #64]
+ ldr x9, [x5, #128]
+ ldr x9, [x5, #192]
+ ldr x9, [x5, #256]
+ ldr x9, [x5, #320]
+ ldr x9, [x5, #384]
+ ldr x9, [x5, #448]
+ ldr x9, [x5, #512]
+ ldr x9, [x5, #576]
+ ldr x9, [x5, #640]
+ ldr x9, [x5, #704]
+ ldr x9, [x5, #768]
+ ldr x9, [x5, #832]
+ ldr x9, [x5, #896]
+ ldr x9, [x5, #960]
+ ldr w11, [x5, x11, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x12, x7, #16, #8
+ eor w11, w11, w14, ror 24
+ ubfx x14, x7, #56, #8
+ eor w11, w11, w15, ror 8
+ ubfx x15, x8, #40, #8
+ eor w11, w11, w16, ror 16
+ ubfx x16, x8, #0, #8
+ ldr w12, [x5, x12, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x13, x7, #48, #8
+ eor w12, w12, w14, ror 24
+ ubfx x14, x8, #24, #8
+ eor w12, w12, w15, ror 8
+ ubfx x15, x7, #8, #8
+ eor w12, w12, w16, ror 16
+ ubfx x16, x8, #32, #8
+ bfi x11, x12, #32, #32
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x9, x7, #0, #8
+ eor w13, w13, w14, ror 24
+ ubfx x14, x8, #16, #8
+ eor w13, w13, w15, ror 8
+ ubfx x15, x8, #56, #8
+ eor w12, w13, w16, ror 16
+ ubfx x16, x7, #40, #8
+ ldr w9, [x5, x9, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ eor w15, w15, w9, ror 24
+ ldp x7, x8, [x19], #16
+ eor w14, w14, w16, ror 8
+ eor w14, w14, w15, ror 24
+ bfi x12, x14, #32, #32
+ ; XOR in Key Schedule
+ eor x11, x11, x7
+ eor x12, x12, x8
+ ubfx x7, x12, #48, #8
+ ubfx x10, x11, #24, #8
+ ubfx x15, x12, #8, #8
+ ubfx x16, x11, #32, #8
+ ldr x13, [x5]
+ ldr x13, [x5, #64]
+ ldr x13, [x5, #128]
+ ldr x13, [x5, #192]
+ ldr x13, [x5, #256]
+ ldr x13, [x5, #320]
+ ldr x13, [x5, #384]
+ ldr x13, [x5, #448]
+ ldr x13, [x5, #512]
+ ldr x13, [x5, #576]
+ ldr x13, [x5, #640]
+ ldr x13, [x5, #704]
+ ldr x13, [x5, #768]
+ ldr x13, [x5, #832]
+ ldr x13, [x5, #896]
+ ldr x13, [x5, #960]
+ ldr w7, [x5, x7, LSL 2]
+ ldr w10, [x5, x10, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x8, x11, #16, #8
+ eor w7, w7, w10, ror 24
+ ubfx x10, x11, #56, #8
+ eor w7, w7, w15, ror 8
+ ubfx x15, x12, #40, #8
+ eor w7, w7, w16, ror 16
+ ubfx x16, x12, #0, #8
+ ldr w8, [x5, x8, LSL 2]
+ ldr w10, [x5, x10, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x9, x11, #48, #8
+ eor w8, w8, w10, ror 24
+ ubfx x10, x12, #24, #8
+ eor w8, w8, w15, ror 8
+ ubfx x15, x11, #8, #8
+ eor w8, w8, w16, ror 16
+ ubfx x16, x12, #32, #8
+ bfi x7, x8, #32, #32
+ ldr w9, [x5, x9, LSL 2]
+ ldr w10, [x5, x10, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x13, x11, #0, #8
+ eor w9, w9, w10, ror 24
+ ubfx x10, x12, #16, #8
+ eor w9, w9, w15, ror 8
+ ubfx x15, x12, #56, #8
+ eor w8, w9, w16, ror 16
+ ubfx x16, x11, #40, #8
+ ldr w13, [x5, x13, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w10, [x5, x10, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ eor w15, w15, w13, ror 24
+ ldp x11, x12, [x19], #16
+ eor w10, w10, w16, ror 8
+ eor w10, w10, w15, ror 24
+ bfi x8, x10, #32, #32
+ ; XOR in Key Schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ subs w17, w17, #2
+ bne L_AES_ECB_decrypt_loop_nr
+ ubfx x11, x8, #48, #8
+ ubfx x14, x7, #24, #8
+ ubfx x15, x8, #8, #8
+ ubfx x16, x7, #32, #8
+ ldr x9, [x5]
+ ldr x9, [x5, #64]
+ ldr x9, [x5, #128]
+ ldr x9, [x5, #192]
+ ldr x9, [x5, #256]
+ ldr x9, [x5, #320]
+ ldr x9, [x5, #384]
+ ldr x9, [x5, #448]
+ ldr x9, [x5, #512]
+ ldr x9, [x5, #576]
+ ldr x9, [x5, #640]
+ ldr x9, [x5, #704]
+ ldr x9, [x5, #768]
+ ldr x9, [x5, #832]
+ ldr x9, [x5, #896]
+ ldr x9, [x5, #960]
+ ldr w11, [x5, x11, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x12, x7, #16, #8
+ eor w11, w11, w14, ror 24
+ ubfx x14, x7, #56, #8
+ eor w11, w11, w15, ror 8
+ ubfx x15, x8, #40, #8
+ eor w11, w11, w16, ror 16
+ ubfx x16, x8, #0, #8
+ ldr w12, [x5, x12, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x13, x7, #48, #8
+ eor w12, w12, w14, ror 24
+ ubfx x14, x8, #24, #8
+ eor w12, w12, w15, ror 8
+ ubfx x15, x7, #8, #8
+ eor w12, w12, w16, ror 16
+ ubfx x16, x8, #32, #8
+ bfi x11, x12, #32, #32
+ ldr w13, [x5, x13, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ ubfx x9, x7, #0, #8
+ eor w13, w13, w14, ror 24
+ ubfx x14, x8, #16, #8
+ eor w13, w13, w15, ror 8
+ ubfx x15, x8, #56, #8
+ eor w12, w13, w16, ror 16
+ ubfx x16, x7, #40, #8
+ ldr w9, [x5, x9, LSL 2]
+ ldr w15, [x5, x15, LSL 2]
+ ldr w14, [x5, x14, LSL 2]
+ ldr w16, [x5, x16, LSL 2]
+ eor w15, w15, w9, ror 24
+ ldp x7, x8, [x19], #16
+ eor w14, w14, w16, ror 8
+ eor w14, w14, w15, ror 24
+ bfi x12, x14, #32, #32
+ ; XOR in Key Schedule
+ eor x11, x11, x7
+ eor x12, x12, x8
+ ubfx x7, x11, #32, #8
+ ubfx x10, x12, #8, #8
+ ubfx x15, x12, #48, #8
+ ubfx x16, x11, #24, #8
+ ldr x14, [x6]
+ ldr x14, [x6, #64]
+ ldr x14, [x6, #128]
+ ldr x14, [x6, #192]
+ ldrb w7, [x6, x7, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x8, x12, #0, #8
+ eor w7, w7, w10, lsl 8
+ ubfx x10, x12, #40, #8
+ eor w7, w7, w15, lsl 16
+ ubfx x15, x11, #16, #8
+ eor w7, w7, w16, lsl 24
+ ubfx x16, x11, #56, #8
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ldrb w8, [x6, x8, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ubfx x9, x12, #32, #8
+ eor w8, w8, w10, lsl 8
+ ubfx x10, x11, #8, #8
+ eor w8, w8, w15, lsl 16
+ ubfx x15, x11, #48, #8
+ eor w8, w8, w16, lsl 24
+ ubfx x16, x12, #24, #8
+ bfi x7, x8, #32, #32
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ldrb w9, [x6, x9, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ubfx x14, x12, #56, #8
+ eor w9, w9, w10, lsl 8
+ ubfx x10, x11, #0, #8
+ eor w9, w9, w15, lsl 16
+ ubfx x15, x11, #40, #8
+ eor w8, w9, w16, lsl 24
+ ubfx x16, x12, #16, #8
+ ldrb w14, [x6, x14, LSL 0]
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ eor w15, w15, w14, lsl 16
+ ldp x11, x12, [x19]
+ eor w10, w10, w15, lsl 8
+ eor w10, w10, w16, lsl 16
+ bfi x8, x10, #32, #32
+ ; XOR in Key Schedule
+ eor x7, x7, x11
+ eor x8, x8, x12
+ rev32 x7, x7
+ rev32 x8, x8
+ str x7, [x1]
+ str x8, [x1, #8]
+ subs x2, x2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ bne L_AES_ECB_decrypt_loop_block
+ ldp x17, x19, [x29, #16]
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:HAVE_AES_CBC
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_CBC_decrypt
+AES_CBC_decrypt PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ str x20, [x29, #40]
+ adrp x6, L_AES_ARM64_td4
+ add x6, x6, L_AES_ARM64_td4
+ adrp x7, L_AES_ARM64_td
+ add x7, x7, L_AES_ARM64_td
+L_AES_CBC_decrypt_loop_block
+ mov x20, x3
+ ldr x8, [x0]
+ ldr x9, [x0, #8]
+ stnp x8, x9, [x5, #16]
+ rev32 x8, x8
+ rev32 x9, x9
+ ldp x12, x13, [x20], #16
+ ; Round: 0 - XOR in key schedule
+ eor x8, x8, x12
+ eor x9, x9, x13
+ sub w19, w4, #2
+L_AES_CBC_decrypt_loop_nr_even
+ ubfx x12, x9, #48, #8
+ ubfx x15, x8, #24, #8
+ ubfx x16, x9, #8, #8
+ ubfx x17, x8, #32, #8
+ ldr x10, [x7]
+ ldr x10, [x7, #64]
+ ldr x10, [x7, #128]
+ ldr x10, [x7, #192]
+ ldr x10, [x7, #256]
+ ldr x10, [x7, #320]
+ ldr x10, [x7, #384]
+ ldr x10, [x7, #448]
+ ldr x10, [x7, #512]
+ ldr x10, [x7, #576]
+ ldr x10, [x7, #640]
+ ldr x10, [x7, #704]
+ ldr x10, [x7, #768]
+ ldr x10, [x7, #832]
+ ldr x10, [x7, #896]
+ ldr x10, [x7, #960]
+ ldr w12, [x7, x12, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x13, x8, #16, #8
+ eor w12, w12, w15, ror 24
+ ubfx x15, x8, #56, #8
+ eor w12, w12, w16, ror 8
+ ubfx x16, x9, #40, #8
+ eor w12, w12, w17, ror 16
+ ubfx x17, x9, #0, #8
+ ldr w13, [x7, x13, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x14, x8, #48, #8
+ eor w13, w13, w15, ror 24
+ ubfx x15, x9, #24, #8
+ eor w13, w13, w16, ror 8
+ ubfx x16, x8, #8, #8
+ eor w13, w13, w17, ror 16
+ ubfx x17, x9, #32, #8
+ bfi x12, x13, #32, #32
+ ldr w14, [x7, x14, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x10, x8, #0, #8
+ eor w14, w14, w15, ror 24
+ ubfx x15, x9, #16, #8
+ eor w14, w14, w16, ror 8
+ ubfx x16, x9, #56, #8
+ eor w13, w14, w17, ror 16
+ ubfx x17, x8, #40, #8
+ ldr w10, [x7, x10, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ eor w16, w16, w10, ror 24
+ ldp x8, x9, [x20], #16
+ eor w15, w15, w17, ror 8
+ eor w15, w15, w16, ror 24
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x8
+ eor x13, x13, x9
+ ubfx x8, x13, #48, #8
+ ubfx x11, x12, #24, #8
+ ubfx x16, x13, #8, #8
+ ubfx x17, x12, #32, #8
+ ldr x14, [x7]
+ ldr x14, [x7, #64]
+ ldr x14, [x7, #128]
+ ldr x14, [x7, #192]
+ ldr x14, [x7, #256]
+ ldr x14, [x7, #320]
+ ldr x14, [x7, #384]
+ ldr x14, [x7, #448]
+ ldr x14, [x7, #512]
+ ldr x14, [x7, #576]
+ ldr x14, [x7, #640]
+ ldr x14, [x7, #704]
+ ldr x14, [x7, #768]
+ ldr x14, [x7, #832]
+ ldr x14, [x7, #896]
+ ldr x14, [x7, #960]
+ ldr w8, [x7, x8, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x9, x12, #16, #8
+ eor w8, w8, w11, ror 24
+ ubfx x11, x12, #56, #8
+ eor w8, w8, w16, ror 8
+ ubfx x16, x13, #40, #8
+ eor w8, w8, w17, ror 16
+ ubfx x17, x13, #0, #8
+ ldr w9, [x7, x9, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x10, x12, #48, #8
+ eor w9, w9, w11, ror 24
+ ubfx x11, x13, #24, #8
+ eor w9, w9, w16, ror 8
+ ubfx x16, x12, #8, #8
+ eor w9, w9, w17, ror 16
+ ubfx x17, x13, #32, #8
+ bfi x8, x9, #32, #32
+ ldr w10, [x7, x10, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w10, w10, w11, ror 24
+ ubfx x11, x13, #16, #8
+ eor w10, w10, w16, ror 8
+ ubfx x16, x13, #56, #8
+ eor w9, w10, w17, ror 16
+ ubfx x17, x12, #40, #8
+ ldr w14, [x7, x14, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ eor w16, w16, w14, ror 24
+ ldp x12, x13, [x20], #16
+ eor w11, w11, w17, ror 8
+ eor w11, w11, w16, ror 24
+ bfi x9, x11, #32, #32
+ ; XOR in Key Schedule
+ eor x8, x8, x12
+ eor x9, x9, x13
+ subs w19, w19, #2
+ bne L_AES_CBC_decrypt_loop_nr_even
+ ubfx x12, x9, #48, #8
+ ubfx x15, x8, #24, #8
+ ubfx x16, x9, #8, #8
+ ubfx x17, x8, #32, #8
+ ldr x10, [x7]
+ ldr x10, [x7, #64]
+ ldr x10, [x7, #128]
+ ldr x10, [x7, #192]
+ ldr x10, [x7, #256]
+ ldr x10, [x7, #320]
+ ldr x10, [x7, #384]
+ ldr x10, [x7, #448]
+ ldr x10, [x7, #512]
+ ldr x10, [x7, #576]
+ ldr x10, [x7, #640]
+ ldr x10, [x7, #704]
+ ldr x10, [x7, #768]
+ ldr x10, [x7, #832]
+ ldr x10, [x7, #896]
+ ldr x10, [x7, #960]
+ ldr w12, [x7, x12, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x13, x8, #16, #8
+ eor w12, w12, w15, ror 24
+ ubfx x15, x8, #56, #8
+ eor w12, w12, w16, ror 8
+ ubfx x16, x9, #40, #8
+ eor w12, w12, w17, ror 16
+ ubfx x17, x9, #0, #8
+ ldr w13, [x7, x13, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x14, x8, #48, #8
+ eor w13, w13, w15, ror 24
+ ubfx x15, x9, #24, #8
+ eor w13, w13, w16, ror 8
+ ubfx x16, x8, #8, #8
+ eor w13, w13, w17, ror 16
+ ubfx x17, x9, #32, #8
+ bfi x12, x13, #32, #32
+ ldr w14, [x7, x14, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x10, x8, #0, #8
+ eor w14, w14, w15, ror 24
+ ubfx x15, x9, #16, #8
+ eor w14, w14, w16, ror 8
+ ubfx x16, x9, #56, #8
+ eor w13, w14, w17, ror 16
+ ubfx x17, x8, #40, #8
+ ldr w10, [x7, x10, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ eor w16, w16, w10, ror 24
+ ldp x8, x9, [x20], #16
+ eor w15, w15, w17, ror 8
+ eor w15, w15, w16, ror 24
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x8
+ eor x13, x13, x9
+ ubfx x8, x12, #32, #8
+ ubfx x11, x13, #8, #8
+ ubfx x16, x13, #48, #8
+ ubfx x17, x12, #24, #8
+ ldr x15, [x6]
+ ldr x15, [x6, #64]
+ ldr x15, [x6, #128]
+ ldr x15, [x6, #192]
+ ldrb w8, [x6, x8, LSL 0]
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ubfx x9, x13, #0, #8
+ eor w8, w8, w11, lsl 8
+ ubfx x11, x13, #40, #8
+ eor w8, w8, w16, lsl 16
+ ubfx x16, x12, #16, #8
+ eor w8, w8, w17, lsl 24
+ ubfx x17, x12, #56, #8
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w9, [x6, x9, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x10, x13, #32, #8
+ eor w9, w9, w11, lsl 8
+ ubfx x11, x12, #8, #8
+ eor w9, w9, w16, lsl 16
+ ubfx x16, x12, #48, #8
+ eor w9, w9, w17, lsl 24
+ ubfx x17, x13, #24, #8
+ bfi x8, x9, #32, #32
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x15, x13, #56, #8
+ eor w10, w10, w11, lsl 8
+ ubfx x11, x12, #0, #8
+ eor w10, w10, w16, lsl 16
+ ubfx x16, x12, #40, #8
+ eor w9, w10, w17, lsl 24
+ ubfx x17, x13, #16, #8
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ eor w16, w16, w15, lsl 16
+ ldp x12, x13, [x20]
+ eor w11, w11, w16, lsl 8
+ eor w11, w11, w17, lsl 16
+ bfi x9, x11, #32, #32
+ ; XOR in Key Schedule
+ eor x8, x8, x12
+ eor x9, x9, x13
+ rev32 x8, x8
+ rev32 x9, x9
+ ldp x12, x13, [x5]
+ eor x8, x8, x12
+ eor x9, x9, x13
+ str x8, [x1]
+ str x9, [x1, #8]
+ subs x2, x2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ beq L_AES_CBC_decrypt_end_dec_odd
+ mov x20, x3
+ ldr x8, [x0]
+ ldr x9, [x0, #8]
+ stp x8, x9, [x5]
+ rev32 x8, x8
+ rev32 x9, x9
+ ldp x12, x13, [x20], #16
+ ; Round: 0 - XOR in key schedule
+ eor x8, x8, x12
+ eor x9, x9, x13
+ sub w19, w4, #2
+L_AES_CBC_decrypt_loop_nr_odd
+ ubfx x12, x9, #48, #8
+ ubfx x15, x8, #24, #8
+ ubfx x16, x9, #8, #8
+ ubfx x17, x8, #32, #8
+ ldr x10, [x7]
+ ldr x10, [x7, #64]
+ ldr x10, [x7, #128]
+ ldr x10, [x7, #192]
+ ldr x10, [x7, #256]
+ ldr x10, [x7, #320]
+ ldr x10, [x7, #384]
+ ldr x10, [x7, #448]
+ ldr x10, [x7, #512]
+ ldr x10, [x7, #576]
+ ldr x10, [x7, #640]
+ ldr x10, [x7, #704]
+ ldr x10, [x7, #768]
+ ldr x10, [x7, #832]
+ ldr x10, [x7, #896]
+ ldr x10, [x7, #960]
+ ldr w12, [x7, x12, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x13, x8, #16, #8
+ eor w12, w12, w15, ror 24
+ ubfx x15, x8, #56, #8
+ eor w12, w12, w16, ror 8
+ ubfx x16, x9, #40, #8
+ eor w12, w12, w17, ror 16
+ ubfx x17, x9, #0, #8
+ ldr w13, [x7, x13, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x14, x8, #48, #8
+ eor w13, w13, w15, ror 24
+ ubfx x15, x9, #24, #8
+ eor w13, w13, w16, ror 8
+ ubfx x16, x8, #8, #8
+ eor w13, w13, w17, ror 16
+ ubfx x17, x9, #32, #8
+ bfi x12, x13, #32, #32
+ ldr w14, [x7, x14, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x10, x8, #0, #8
+ eor w14, w14, w15, ror 24
+ ubfx x15, x9, #16, #8
+ eor w14, w14, w16, ror 8
+ ubfx x16, x9, #56, #8
+ eor w13, w14, w17, ror 16
+ ubfx x17, x8, #40, #8
+ ldr w10, [x7, x10, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ eor w16, w16, w10, ror 24
+ ldp x8, x9, [x20], #16
+ eor w15, w15, w17, ror 8
+ eor w15, w15, w16, ror 24
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x8
+ eor x13, x13, x9
+ ubfx x8, x13, #48, #8
+ ubfx x11, x12, #24, #8
+ ubfx x16, x13, #8, #8
+ ubfx x17, x12, #32, #8
+ ldr x14, [x7]
+ ldr x14, [x7, #64]
+ ldr x14, [x7, #128]
+ ldr x14, [x7, #192]
+ ldr x14, [x7, #256]
+ ldr x14, [x7, #320]
+ ldr x14, [x7, #384]
+ ldr x14, [x7, #448]
+ ldr x14, [x7, #512]
+ ldr x14, [x7, #576]
+ ldr x14, [x7, #640]
+ ldr x14, [x7, #704]
+ ldr x14, [x7, #768]
+ ldr x14, [x7, #832]
+ ldr x14, [x7, #896]
+ ldr x14, [x7, #960]
+ ldr w8, [x7, x8, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x9, x12, #16, #8
+ eor w8, w8, w11, ror 24
+ ubfx x11, x12, #56, #8
+ eor w8, w8, w16, ror 8
+ ubfx x16, x13, #40, #8
+ eor w8, w8, w17, ror 16
+ ubfx x17, x13, #0, #8
+ ldr w9, [x7, x9, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x10, x12, #48, #8
+ eor w9, w9, w11, ror 24
+ ubfx x11, x13, #24, #8
+ eor w9, w9, w16, ror 8
+ ubfx x16, x12, #8, #8
+ eor w9, w9, w17, ror 16
+ ubfx x17, x13, #32, #8
+ bfi x8, x9, #32, #32
+ ldr w10, [x7, x10, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w10, w10, w11, ror 24
+ ubfx x11, x13, #16, #8
+ eor w10, w10, w16, ror 8
+ ubfx x16, x13, #56, #8
+ eor w9, w10, w17, ror 16
+ ubfx x17, x12, #40, #8
+ ldr w14, [x7, x14, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w11, [x7, x11, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ eor w16, w16, w14, ror 24
+ ldp x12, x13, [x20], #16
+ eor w11, w11, w17, ror 8
+ eor w11, w11, w16, ror 24
+ bfi x9, x11, #32, #32
+ ; XOR in Key Schedule
+ eor x8, x8, x12
+ eor x9, x9, x13
+ subs w19, w19, #2
+ bne L_AES_CBC_decrypt_loop_nr_odd
+ ubfx x12, x9, #48, #8
+ ubfx x15, x8, #24, #8
+ ubfx x16, x9, #8, #8
+ ubfx x17, x8, #32, #8
+ ldr x10, [x7]
+ ldr x10, [x7, #64]
+ ldr x10, [x7, #128]
+ ldr x10, [x7, #192]
+ ldr x10, [x7, #256]
+ ldr x10, [x7, #320]
+ ldr x10, [x7, #384]
+ ldr x10, [x7, #448]
+ ldr x10, [x7, #512]
+ ldr x10, [x7, #576]
+ ldr x10, [x7, #640]
+ ldr x10, [x7, #704]
+ ldr x10, [x7, #768]
+ ldr x10, [x7, #832]
+ ldr x10, [x7, #896]
+ ldr x10, [x7, #960]
+ ldr w12, [x7, x12, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x13, x8, #16, #8
+ eor w12, w12, w15, ror 24
+ ubfx x15, x8, #56, #8
+ eor w12, w12, w16, ror 8
+ ubfx x16, x9, #40, #8
+ eor w12, w12, w17, ror 16
+ ubfx x17, x9, #0, #8
+ ldr w13, [x7, x13, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x14, x8, #48, #8
+ eor w13, w13, w15, ror 24
+ ubfx x15, x9, #24, #8
+ eor w13, w13, w16, ror 8
+ ubfx x16, x8, #8, #8
+ eor w13, w13, w17, ror 16
+ ubfx x17, x9, #32, #8
+ bfi x12, x13, #32, #32
+ ldr w14, [x7, x14, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ ubfx x10, x8, #0, #8
+ eor w14, w14, w15, ror 24
+ ubfx x15, x9, #16, #8
+ eor w14, w14, w16, ror 8
+ ubfx x16, x9, #56, #8
+ eor w13, w14, w17, ror 16
+ ubfx x17, x8, #40, #8
+ ldr w10, [x7, x10, LSL 2]
+ ldr w16, [x7, x16, LSL 2]
+ ldr w15, [x7, x15, LSL 2]
+ ldr w17, [x7, x17, LSL 2]
+ eor w16, w16, w10, ror 24
+ ldp x8, x9, [x20], #16
+ eor w15, w15, w17, ror 8
+ eor w15, w15, w16, ror 24
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x8
+ eor x13, x13, x9
+ ubfx x8, x12, #32, #8
+ ubfx x11, x13, #8, #8
+ ubfx x16, x13, #48, #8
+ ubfx x17, x12, #24, #8
+ ldr x15, [x6]
+ ldr x15, [x6, #64]
+ ldr x15, [x6, #128]
+ ldr x15, [x6, #192]
+ ldrb w8, [x6, x8, LSL 0]
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ubfx x9, x13, #0, #8
+ eor w8, w8, w11, lsl 8
+ ubfx x11, x13, #40, #8
+ eor w8, w8, w16, lsl 16
+ ubfx x16, x12, #16, #8
+ eor w8, w8, w17, lsl 24
+ ubfx x17, x12, #56, #8
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w9, [x6, x9, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x10, x13, #32, #8
+ eor w9, w9, w11, lsl 8
+ ubfx x11, x12, #8, #8
+ eor w9, w9, w16, lsl 16
+ ubfx x16, x12, #48, #8
+ eor w9, w9, w17, lsl 24
+ ubfx x17, x13, #24, #8
+ bfi x8, x9, #32, #32
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ ldrb w10, [x6, x10, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ubfx x15, x13, #56, #8
+ eor w10, w10, w11, lsl 8
+ ubfx x11, x12, #0, #8
+ eor w10, w10, w16, lsl 16
+ ubfx x16, x12, #40, #8
+ eor w9, w10, w17, lsl 24
+ ubfx x17, x13, #16, #8
+ ldrb w15, [x6, x15, LSL 0]
+ ldrb w16, [x6, x16, LSL 0]
+ ldrb w11, [x6, x11, LSL 0]
+ ldrb w17, [x6, x17, LSL 0]
+ eor w16, w16, w15, lsl 16
+ ldp x12, x13, [x20]
+ eor w11, w11, w16, lsl 8
+ eor w11, w11, w17, lsl 16
+ bfi x9, x11, #32, #32
+ ; XOR in Key Schedule
+ eor x8, x8, x12
+ eor x9, x9, x13
+ rev32 x8, x8
+ rev32 x9, x9
+ ldnp x12, x13, [x5, #16]
+ eor x8, x8, x12
+ eor x9, x9, x13
+ str x8, [x1]
+ str x9, [x1, #8]
+ subs x2, x2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ bne L_AES_CBC_decrypt_loop_block
+ b L_AES_CBC_decrypt_end_dec
+L_AES_CBC_decrypt_end_dec_odd
+ ldnp x12, x13, [x5, #16]
+ stp x12, x13, [x5]
+L_AES_CBC_decrypt_end_dec
+ ldp x17, x19, [x29, #24]
+ ldr x20, [x29, #40]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ ENDIF
+ IF :DEF:HAVE_AESGCM
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_GCM_gmult_len_r
+ DCD 0x00000000, 0x1c200000, 0x38400000, 0x24600000
+ DCD 0x70800000, 0x6ca00000, 0x48c00000, 0x54e00000
+ DCD 0xe1000000, 0xfd200000, 0xd9400000, 0xc5600000
+ DCD 0x91800000, 0x8da00000, 0xa9c00000, 0xb5e00000
+ DCD 0x00000000, 0x01c20000, 0x03840000, 0x02460000
+ DCD 0x07080000, 0x06ca0000, 0x048c0000, 0x054e0000
+ DCD 0x0e100000, 0x0fd20000, 0x0d940000, 0x0c560000
+ DCD 0x09180000, 0x08da0000, 0x0a9c0000, 0x0b5e0000
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT GCM_gmult_len
+GCM_gmult_len PROC
+ adrp x10, L_GCM_gmult_len_r
+ add x10, x10, L_GCM_gmult_len_r
+L_GCM_gmult_len_start_block
+ ldp x4, x5, [x0]
+ ldp x6, x7, [x2]
+ eor x4, x4, x6
+ eor x5, x5, x7
+ ubfx x12, x5, #56, #4
+ add x12, x1, x12, lsl 4
+ ldp x8, x9, [x12]
+ ubfx x12, x5, #60, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x5, #48, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x5, #52, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x5, #40, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x5, #44, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x5, #32, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x5, #36, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x5, #24, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x5, #28, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x5, #16, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x5, #20, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x5, #8, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x5, #12, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x5, #0, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x5, #4, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x4, #56, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x4, #60, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x4, #48, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x4, #52, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x4, #40, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x4, #44, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x4, #32, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x4, #36, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x4, #24, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x4, #28, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x4, #16, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x4, #20, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfx x12, x4, #8, #4
+ add x12, x1, x12, lsl 4
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x12, x4, #12, #4
+ mov x11, x9
+ add x12, x12, #16
+ lsr x9, x9, #8
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 56
+ ldp x6, x7, [x12]
+ lsr x8, x8, #8
+ eor x8, x8, x6
+ sub x12, x12, #0x100
+ eor x9, x9, x7
+ ldr x7, [x12, #8]
+ ubfx w6, w11, #0, #4
+ eor x11, x11, x7, lsl 4
+ add w6, w6, #16
+ ubfx w11, w11, #4, #4
+ ldr w6, [x10, x6, LSL 2]
+ ldr w7, [x10, x11, LSL 2]
+ eor x8, x8, x6, lsl 32
+ eor x8, x8, x7, lsl 32
+ ubfiz x12, x4, #4, #4
+ add x12, x12, x1
+ ldp x6, x7, [x12]
+ eor x8, x8, x6
+ eor x9, x9, x7
+ ubfx x11, x9, #0, #4
+ ubfx x12, x4, #4, #4
+ lsr x9, x9, #4
+ add x12, x1, x12, lsl 4
+ orr x9, x9, x8, lsl 60
+ ldp x6, x7, [x12]
+ lsr x8, x8, #4
+ eor x8, x8, x6
+ ldr w6, [x10, x11, LSL 2]
+ eor x9, x9, x7
+ eor x8, x8, x6, lsl 32
+ rev x8, x8
+ rev x9, x9
+ stp x8, x9, [x0]
+ subs x3, x3, #16
+ add x2, x2, #16
+ bne L_GCM_gmult_len_start_block
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_GCM_encrypt
+AES_GCM_encrypt PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ stp x20, x21, [x29, #32]
+ adrp x19, L_AES_ARM64_te
+ add x19, x19, L_AES_ARM64_te
+ ldp x16, x17, [x5]
+ rev32 x16, x16
+ rev32 x17, x17
+L_AES_GCM_encrypt_loop_block
+ mov x21, x3
+ lsr x9, x17, #32
+ ldp x10, x11, [x21], #16
+ add w9, w9, #1
+ bfi x17, x9, #32, #32
+ ; Round: 0 - XOR in key schedule
+ eor x6, x16, x10
+ eor x7, x17, x11
+ sub w20, w4, #2
+L_AES_GCM_encrypt_loop_nr
+ ubfx x10, x6, #48, #8
+ ubfx x13, x6, #24, #8
+ ubfx x14, x7, #8, #8
+ ubfx x15, x7, #32, #8
+ ldr x8, [x19]
+ ldr x8, [x19, #64]
+ ldr x8, [x19, #128]
+ ldr x8, [x19, #192]
+ ldr x8, [x19, #256]
+ ldr x8, [x19, #320]
+ ldr x8, [x19, #384]
+ ldr x8, [x19, #448]
+ ldr x8, [x19, #512]
+ ldr x8, [x19, #576]
+ ldr x8, [x19, #640]
+ ldr x8, [x19, #704]
+ ldr x8, [x19, #768]
+ ldr x8, [x19, #832]
+ ldr x8, [x19, #896]
+ ldr x8, [x19, #960]
+ ldr w10, [x19, x10, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x11, x7, #16, #8
+ eor w10, w10, w13, ror 24
+ ubfx x13, x6, #56, #8
+ eor w10, w10, w14, ror 8
+ ubfx x14, x7, #40, #8
+ eor w10, w10, w15, ror 16
+ ubfx x15, x6, #0, #8
+ ldr w11, [x19, x11, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x12, x7, #48, #8
+ eor w11, w11, w13, ror 24
+ ubfx x13, x7, #24, #8
+ eor w11, w11, w14, ror 8
+ ubfx x14, x6, #8, #8
+ eor w11, w11, w15, ror 16
+ ubfx x15, x6, #32, #8
+ bfi x10, x11, #32, #32
+ ldr w12, [x19, x12, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x8, x7, #0, #8
+ eor w12, w12, w13, ror 24
+ ubfx x13, x6, #16, #8
+ eor w12, w12, w14, ror 8
+ ubfx x14, x7, #56, #8
+ eor w11, w12, w15, ror 16
+ ubfx x15, x6, #40, #8
+ ldr w8, [x19, x8, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ eor w14, w14, w8, ror 24
+ ldp x6, x7, [x21], #16
+ eor w13, w13, w14, ror 24
+ eor w13, w13, w15, ror 8
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x6
+ eor x11, x11, x7
+ ubfx x6, x10, #48, #8
+ ubfx x9, x10, #24, #8
+ ubfx x14, x11, #8, #8
+ ubfx x15, x11, #32, #8
+ ldr x12, [x19]
+ ldr x12, [x19, #64]
+ ldr x12, [x19, #128]
+ ldr x12, [x19, #192]
+ ldr x12, [x19, #256]
+ ldr x12, [x19, #320]
+ ldr x12, [x19, #384]
+ ldr x12, [x19, #448]
+ ldr x12, [x19, #512]
+ ldr x12, [x19, #576]
+ ldr x12, [x19, #640]
+ ldr x12, [x19, #704]
+ ldr x12, [x19, #768]
+ ldr x12, [x19, #832]
+ ldr x12, [x19, #896]
+ ldr x12, [x19, #960]
+ ldr w6, [x19, x6, LSL 2]
+ ldr w9, [x19, x9, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x7, x11, #16, #8
+ eor w6, w6, w9, ror 24
+ ubfx x9, x10, #56, #8
+ eor w6, w6, w14, ror 8
+ ubfx x14, x11, #40, #8
+ eor w6, w6, w15, ror 16
+ ubfx x15, x10, #0, #8
+ ldr w7, [x19, x7, LSL 2]
+ ldr w9, [x19, x9, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x8, x11, #48, #8
+ eor w7, w7, w9, ror 24
+ ubfx x9, x11, #24, #8
+ eor w7, w7, w14, ror 8
+ ubfx x14, x10, #8, #8
+ eor w7, w7, w15, ror 16
+ ubfx x15, x10, #32, #8
+ bfi x6, x7, #32, #32
+ ldr w8, [x19, x8, LSL 2]
+ ldr w9, [x19, x9, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x12, x11, #0, #8
+ eor w8, w8, w9, ror 24
+ ubfx x9, x10, #16, #8
+ eor w8, w8, w14, ror 8
+ ubfx x14, x11, #56, #8
+ eor w7, w8, w15, ror 16
+ ubfx x15, x10, #40, #8
+ ldr w12, [x19, x12, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w9, [x19, x9, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ eor w14, w14, w12, ror 24
+ ldp x10, x11, [x21], #16
+ eor w9, w9, w14, ror 24
+ eor w9, w9, w15, ror 8
+ bfi x7, x9, #32, #32
+ ; XOR in Key Schedule
+ eor x6, x6, x10
+ eor x7, x7, x11
+ subs w20, w20, #2
+ bne L_AES_GCM_encrypt_loop_nr
+ ubfx x10, x6, #48, #8
+ ubfx x13, x6, #24, #8
+ ubfx x14, x7, #8, #8
+ ubfx x15, x7, #32, #8
+ ldr x8, [x19]
+ ldr x8, [x19, #64]
+ ldr x8, [x19, #128]
+ ldr x8, [x19, #192]
+ ldr x8, [x19, #256]
+ ldr x8, [x19, #320]
+ ldr x8, [x19, #384]
+ ldr x8, [x19, #448]
+ ldr x8, [x19, #512]
+ ldr x8, [x19, #576]
+ ldr x8, [x19, #640]
+ ldr x8, [x19, #704]
+ ldr x8, [x19, #768]
+ ldr x8, [x19, #832]
+ ldr x8, [x19, #896]
+ ldr x8, [x19, #960]
+ ldr w10, [x19, x10, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x11, x7, #16, #8
+ eor w10, w10, w13, ror 24
+ ubfx x13, x6, #56, #8
+ eor w10, w10, w14, ror 8
+ ubfx x14, x7, #40, #8
+ eor w10, w10, w15, ror 16
+ ubfx x15, x6, #0, #8
+ ldr w11, [x19, x11, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x12, x7, #48, #8
+ eor w11, w11, w13, ror 24
+ ubfx x13, x7, #24, #8
+ eor w11, w11, w14, ror 8
+ ubfx x14, x6, #8, #8
+ eor w11, w11, w15, ror 16
+ ubfx x15, x6, #32, #8
+ bfi x10, x11, #32, #32
+ ldr w12, [x19, x12, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ ubfx x8, x7, #0, #8
+ eor w12, w12, w13, ror 24
+ ubfx x13, x6, #16, #8
+ eor w12, w12, w14, ror 8
+ ubfx x14, x7, #56, #8
+ eor w11, w12, w15, ror 16
+ ubfx x15, x6, #40, #8
+ ldr w8, [x19, x8, LSL 2]
+ ldr w14, [x19, x14, LSL 2]
+ ldr w13, [x19, x13, LSL 2]
+ ldr w15, [x19, x15, LSL 2]
+ eor w14, w14, w8, ror 24
+ ldp x6, x7, [x21], #16
+ eor w13, w13, w14, ror 24
+ eor w13, w13, w15, ror 8
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x6
+ eor x11, x11, x7
+ ubfx x6, x11, #32, #8
+ ubfx x9, x11, #8, #8
+ ubfx x14, x10, #48, #8
+ ubfx x15, x10, #24, #8
+ lsl w6, w6, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldr x13, [x19]
+ ldr x13, [x19, #64]
+ ldr x13, [x19, #128]
+ ldr x13, [x19, #192]
+ ldr x13, [x19, #256]
+ ldr x13, [x19, #320]
+ ldr x13, [x19, #384]
+ ldr x13, [x19, #448]
+ ldr x13, [x19, #512]
+ ldr x13, [x19, #576]
+ ldr x13, [x19, #640]
+ ldr x13, [x19, #704]
+ ldr x13, [x19, #768]
+ ldr x13, [x19, #832]
+ ldr x13, [x19, #896]
+ ldr x13, [x19, #960]
+ ldrb w6, [x19, x6, LSL 0]
+ ldrb w9, [x19, x9, LSL 0]
+ ldrb w14, [x19, x14, LSL 0]
+ ldrb w15, [x19, x15, LSL 0]
+ ubfx x7, x10, #0, #8
+ eor w6, w6, w9, lsl 8
+ ubfx x9, x11, #40, #8
+ eor w6, w6, w14, lsl 16
+ ubfx x14, x11, #16, #8
+ eor w6, w6, w15, lsl 24
+ ubfx x15, x10, #56, #8
+ lsl w7, w7, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldrb w7, [x19, x7, LSL 0]
+ ldrb w9, [x19, x9, LSL 0]
+ ldrb w14, [x19, x14, LSL 0]
+ ldrb w15, [x19, x15, LSL 0]
+ ubfx x8, x10, #32, #8
+ eor w7, w7, w9, lsl 8
+ ubfx x9, x10, #8, #8
+ eor w7, w7, w14, lsl 16
+ ubfx x14, x11, #48, #8
+ eor w7, w7, w15, lsl 24
+ ubfx x15, x11, #24, #8
+ bfi x6, x7, #32, #32
+ lsl w8, w8, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldrb w8, [x19, x8, LSL 0]
+ ldrb w9, [x19, x9, LSL 0]
+ ldrb w14, [x19, x14, LSL 0]
+ ldrb w15, [x19, x15, LSL 0]
+ ubfx x13, x11, #56, #8
+ eor w8, w8, w9, lsl 8
+ ubfx x9, x11, #0, #8
+ eor w8, w8, w14, lsl 16
+ ubfx x14, x10, #40, #8
+ eor w7, w8, w15, lsl 24
+ ubfx x15, x10, #16, #8
+ lsl w13, w13, #2
+ lsl w9, w9, #2
+ lsl w14, w14, #2
+ lsl w15, w15, #2
+ ldrb w13, [x19, x13, LSL 0]
+ ldrb w9, [x19, x9, LSL 0]
+ ldrb w14, [x19, x14, LSL 0]
+ ldrb w15, [x19, x15, LSL 0]
+ eor w14, w14, w13, lsl 16
+ ldp x10, x11, [x21]
+ eor w9, w9, w14, lsl 8
+ eor w9, w9, w15, lsl 16
+ bfi x7, x9, #32, #32
+ ; XOR in Key Schedule
+ eor x6, x6, x10
+ eor x7, x7, x11
+ rev32 x6, x6
+ rev32 x7, x7
+ ldr x10, [x0]
+ ldr x11, [x0, #8]
+ eor x6, x6, x10
+ eor x7, x7, x11
+ str x6, [x1]
+ str x7, [x1, #8]
+ subs x2, x2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ bne L_AES_GCM_encrypt_loop_block
+ rev32 x16, x16
+ rev32 x17, x17
+ stp x16, x17, [x5]
+ ldp x17, x19, [x29, #16]
+ ldp x20, x21, [x29, #32]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ ENDIF
+ IF :DEF:WOLFSSL_AES_XTS
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_XTS_encrypt
+AES_XTS_encrypt PROC
+ stp x29, x30, [sp, #-96]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ stp x24, x25, [x29, #72]
+ str x26, [x29, #88]
+ adrp x8, L_AES_ARM64_te
+ add x8, x8, L_AES_ARM64_te
+ mov x9, #0x87
+ mov x26, x5
+ ldp x21, x22, [x3]
+ ldp x14, x15, [x26], #16
+ rev32 x21, x21
+ rev32 x22, x22
+ ; Round: 0 - XOR in key schedule
+ eor x21, x21, x14
+ eor x22, x22, x15
+ sub w25, w7, #2
+L_AES_XTS_encrypt_loop_nr_tweak
+ ubfx x14, x21, #48, #8
+ ubfx x17, x21, #24, #8
+ ubfx x19, x22, #8, #8
+ ubfx x20, x22, #32, #8
+ ldr x23, [x8]
+ ldr x23, [x8, #64]
+ ldr x23, [x8, #128]
+ ldr x23, [x8, #192]
+ ldr x23, [x8, #256]
+ ldr x23, [x8, #320]
+ ldr x23, [x8, #384]
+ ldr x23, [x8, #448]
+ ldr x23, [x8, #512]
+ ldr x23, [x8, #576]
+ ldr x23, [x8, #640]
+ ldr x23, [x8, #704]
+ ldr x23, [x8, #768]
+ ldr x23, [x8, #832]
+ ldr x23, [x8, #896]
+ ldr x23, [x8, #960]
+ ldr w14, [x8, x14, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x15, x22, #16, #8
+ eor w14, w14, w17, ror 24
+ ubfx x17, x21, #56, #8
+ eor w14, w14, w19, ror 8
+ ubfx x19, x22, #40, #8
+ eor w14, w14, w20, ror 16
+ ubfx x20, x21, #0, #8
+ ldr w15, [x8, x15, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x22, #48, #8
+ eor w15, w15, w17, ror 24
+ ubfx x17, x22, #24, #8
+ eor w15, w15, w19, ror 8
+ ubfx x19, x21, #8, #8
+ eor w15, w15, w20, ror 16
+ ubfx x20, x21, #32, #8
+ bfi x14, x15, #32, #32
+ ldr w16, [x8, x16, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x23, x22, #0, #8
+ eor w16, w16, w17, ror 24
+ ubfx x17, x21, #16, #8
+ eor w16, w16, w19, ror 8
+ ubfx x19, x22, #56, #8
+ eor w15, w16, w20, ror 16
+ ubfx x20, x21, #40, #8
+ ldr w23, [x8, x23, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w23, ror 24
+ ldp x21, x22, [x26], #16
+ eor w17, w17, w19, ror 24
+ eor w17, w17, w20, ror 8
+ bfi x15, x17, #32, #32
+ ; XOR in Key Schedule
+ eor x14, x14, x21
+ eor x15, x15, x22
+ ubfx x21, x14, #48, #8
+ ubfx x24, x14, #24, #8
+ ubfx x19, x15, #8, #8
+ ubfx x20, x15, #32, #8
+ ldr x16, [x8]
+ ldr x16, [x8, #64]
+ ldr x16, [x8, #128]
+ ldr x16, [x8, #192]
+ ldr x16, [x8, #256]
+ ldr x16, [x8, #320]
+ ldr x16, [x8, #384]
+ ldr x16, [x8, #448]
+ ldr x16, [x8, #512]
+ ldr x16, [x8, #576]
+ ldr x16, [x8, #640]
+ ldr x16, [x8, #704]
+ ldr x16, [x8, #768]
+ ldr x16, [x8, #832]
+ ldr x16, [x8, #896]
+ ldr x16, [x8, #960]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w24, [x8, x24, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x22, x15, #16, #8
+ eor w21, w21, w24, ror 24
+ ubfx x24, x14, #56, #8
+ eor w21, w21, w19, ror 8
+ ubfx x19, x15, #40, #8
+ eor w21, w21, w20, ror 16
+ ubfx x20, x14, #0, #8
+ ldr w22, [x8, x22, LSL 2]
+ ldr w24, [x8, x24, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x23, x15, #48, #8
+ eor w22, w22, w24, ror 24
+ ubfx x24, x15, #24, #8
+ eor w22, w22, w19, ror 8
+ ubfx x19, x14, #8, #8
+ eor w22, w22, w20, ror 16
+ ubfx x20, x14, #32, #8
+ bfi x21, x22, #32, #32
+ ldr w23, [x8, x23, LSL 2]
+ ldr w24, [x8, x24, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x15, #0, #8
+ eor w23, w23, w24, ror 24
+ ubfx x24, x14, #16, #8
+ eor w23, w23, w19, ror 8
+ ubfx x19, x15, #56, #8
+ eor w22, w23, w20, ror 16
+ ubfx x20, x14, #40, #8
+ ldr w16, [x8, x16, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w24, [x8, x24, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w16, ror 24
+ ldp x14, x15, [x26], #16
+ eor w24, w24, w19, ror 24
+ eor w24, w24, w20, ror 8
+ bfi x22, x24, #32, #32
+ ; XOR in Key Schedule
+ eor x21, x21, x14
+ eor x22, x22, x15
+ subs w25, w25, #2
+ bne L_AES_XTS_encrypt_loop_nr_tweak
+ ubfx x14, x21, #48, #8
+ ubfx x17, x21, #24, #8
+ ubfx x19, x22, #8, #8
+ ubfx x20, x22, #32, #8
+ ldr x23, [x8]
+ ldr x23, [x8, #64]
+ ldr x23, [x8, #128]
+ ldr x23, [x8, #192]
+ ldr x23, [x8, #256]
+ ldr x23, [x8, #320]
+ ldr x23, [x8, #384]
+ ldr x23, [x8, #448]
+ ldr x23, [x8, #512]
+ ldr x23, [x8, #576]
+ ldr x23, [x8, #640]
+ ldr x23, [x8, #704]
+ ldr x23, [x8, #768]
+ ldr x23, [x8, #832]
+ ldr x23, [x8, #896]
+ ldr x23, [x8, #960]
+ ldr w14, [x8, x14, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x15, x22, #16, #8
+ eor w14, w14, w17, ror 24
+ ubfx x17, x21, #56, #8
+ eor w14, w14, w19, ror 8
+ ubfx x19, x22, #40, #8
+ eor w14, w14, w20, ror 16
+ ubfx x20, x21, #0, #8
+ ldr w15, [x8, x15, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x22, #48, #8
+ eor w15, w15, w17, ror 24
+ ubfx x17, x22, #24, #8
+ eor w15, w15, w19, ror 8
+ ubfx x19, x21, #8, #8
+ eor w15, w15, w20, ror 16
+ ubfx x20, x21, #32, #8
+ bfi x14, x15, #32, #32
+ ldr w16, [x8, x16, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x23, x22, #0, #8
+ eor w16, w16, w17, ror 24
+ ubfx x17, x21, #16, #8
+ eor w16, w16, w19, ror 8
+ ubfx x19, x22, #56, #8
+ eor w15, w16, w20, ror 16
+ ubfx x20, x21, #40, #8
+ ldr w23, [x8, x23, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w23, ror 24
+ ldp x21, x22, [x26], #16
+ eor w17, w17, w19, ror 24
+ eor w17, w17, w20, ror 8
+ bfi x15, x17, #32, #32
+ ; XOR in Key Schedule
+ eor x14, x14, x21
+ eor x15, x15, x22
+ ubfx x21, x15, #32, #8
+ ubfx x24, x15, #8, #8
+ ubfx x19, x14, #48, #8
+ ubfx x20, x14, #24, #8
+ lsl w21, w21, #2
+ lsl w24, w24, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldr x17, [x8]
+ ldr x17, [x8, #64]
+ ldr x17, [x8, #128]
+ ldr x17, [x8, #192]
+ ldr x17, [x8, #256]
+ ldr x17, [x8, #320]
+ ldr x17, [x8, #384]
+ ldr x17, [x8, #448]
+ ldr x17, [x8, #512]
+ ldr x17, [x8, #576]
+ ldr x17, [x8, #640]
+ ldr x17, [x8, #704]
+ ldr x17, [x8, #768]
+ ldr x17, [x8, #832]
+ ldr x17, [x8, #896]
+ ldr x17, [x8, #960]
+ ldrb w21, [x8, x21, LSL 0]
+ ldrb w24, [x8, x24, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x22, x14, #0, #8
+ eor w21, w21, w24, lsl 8
+ ubfx x24, x15, #40, #8
+ eor w21, w21, w19, lsl 16
+ ubfx x19, x15, #16, #8
+ eor w21, w21, w20, lsl 24
+ ubfx x20, x14, #56, #8
+ lsl w22, w22, #2
+ lsl w24, w24, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w22, [x8, x22, LSL 0]
+ ldrb w24, [x8, x24, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x23, x14, #32, #8
+ eor w22, w22, w24, lsl 8
+ ubfx x24, x14, #8, #8
+ eor w22, w22, w19, lsl 16
+ ubfx x19, x15, #48, #8
+ eor w22, w22, w20, lsl 24
+ ubfx x20, x15, #24, #8
+ bfi x21, x22, #32, #32
+ lsl w23, w23, #2
+ lsl w24, w24, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w23, [x8, x23, LSL 0]
+ ldrb w24, [x8, x24, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x17, x15, #56, #8
+ eor w23, w23, w24, lsl 8
+ ubfx x24, x15, #0, #8
+ eor w23, w23, w19, lsl 16
+ ubfx x19, x14, #40, #8
+ eor w22, w23, w20, lsl 24
+ ubfx x20, x14, #16, #8
+ lsl w17, w17, #2
+ lsl w24, w24, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w17, [x8, x17, LSL 0]
+ ldrb w24, [x8, x24, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ eor w19, w19, w17, lsl 16
+ ldp x14, x15, [x26]
+ eor w24, w24, w19, lsl 8
+ eor w24, w24, w20, lsl 16
+ bfi x22, x24, #32, #32
+ ; XOR in Key Schedule
+ eor x21, x21, x14
+ eor x22, x22, x15
+ rev32 x21, x21
+ rev32 x22, x22
+L_AES_XTS_encrypt_loop_block
+ mov x26, x4
+ ldp x10, x11, [x0]
+ ldp x14, x15, [x26], #16
+ eor x10, x10, x21
+ eor x11, x11, x22
+ rev32 x10, x10
+ rev32 x11, x11
+ ; Round: 0 - XOR in key schedule
+ eor x10, x10, x14
+ eor x11, x11, x15
+ sub w25, w7, #2
+L_AES_XTS_encrypt_loop_nr
+ ubfx x14, x10, #48, #8
+ ubfx x17, x10, #24, #8
+ ubfx x19, x11, #8, #8
+ ubfx x20, x11, #32, #8
+ ldr x12, [x8]
+ ldr x12, [x8, #64]
+ ldr x12, [x8, #128]
+ ldr x12, [x8, #192]
+ ldr x12, [x8, #256]
+ ldr x12, [x8, #320]
+ ldr x12, [x8, #384]
+ ldr x12, [x8, #448]
+ ldr x12, [x8, #512]
+ ldr x12, [x8, #576]
+ ldr x12, [x8, #640]
+ ldr x12, [x8, #704]
+ ldr x12, [x8, #768]
+ ldr x12, [x8, #832]
+ ldr x12, [x8, #896]
+ ldr x12, [x8, #960]
+ ldr w14, [x8, x14, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x15, x11, #16, #8
+ eor w14, w14, w17, ror 24
+ ubfx x17, x10, #56, #8
+ eor w14, w14, w19, ror 8
+ ubfx x19, x11, #40, #8
+ eor w14, w14, w20, ror 16
+ ubfx x20, x10, #0, #8
+ ldr w15, [x8, x15, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x11, #48, #8
+ eor w15, w15, w17, ror 24
+ ubfx x17, x11, #24, #8
+ eor w15, w15, w19, ror 8
+ ubfx x19, x10, #8, #8
+ eor w15, w15, w20, ror 16
+ ubfx x20, x10, #32, #8
+ bfi x14, x15, #32, #32
+ ldr w16, [x8, x16, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x12, x11, #0, #8
+ eor w16, w16, w17, ror 24
+ ubfx x17, x10, #16, #8
+ eor w16, w16, w19, ror 8
+ ubfx x19, x11, #56, #8
+ eor w15, w16, w20, ror 16
+ ubfx x20, x10, #40, #8
+ ldr w12, [x8, x12, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w12, ror 24
+ ldp x10, x11, [x26], #16
+ eor w17, w17, w19, ror 24
+ eor w17, w17, w20, ror 8
+ bfi x15, x17, #32, #32
+ ; XOR in Key Schedule
+ eor x14, x14, x10
+ eor x15, x15, x11
+ ubfx x10, x14, #48, #8
+ ubfx x13, x14, #24, #8
+ ubfx x19, x15, #8, #8
+ ubfx x20, x15, #32, #8
+ ldr x16, [x8]
+ ldr x16, [x8, #64]
+ ldr x16, [x8, #128]
+ ldr x16, [x8, #192]
+ ldr x16, [x8, #256]
+ ldr x16, [x8, #320]
+ ldr x16, [x8, #384]
+ ldr x16, [x8, #448]
+ ldr x16, [x8, #512]
+ ldr x16, [x8, #576]
+ ldr x16, [x8, #640]
+ ldr x16, [x8, #704]
+ ldr x16, [x8, #768]
+ ldr x16, [x8, #832]
+ ldr x16, [x8, #896]
+ ldr x16, [x8, #960]
+ ldr w10, [x8, x10, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x11, x15, #16, #8
+ eor w10, w10, w13, ror 24
+ ubfx x13, x14, #56, #8
+ eor w10, w10, w19, ror 8
+ ubfx x19, x15, #40, #8
+ eor w10, w10, w20, ror 16
+ ubfx x20, x14, #0, #8
+ ldr w11, [x8, x11, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x12, x15, #48, #8
+ eor w11, w11, w13, ror 24
+ ubfx x13, x15, #24, #8
+ eor w11, w11, w19, ror 8
+ ubfx x19, x14, #8, #8
+ eor w11, w11, w20, ror 16
+ ubfx x20, x14, #32, #8
+ bfi x10, x11, #32, #32
+ ldr w12, [x8, x12, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x15, #0, #8
+ eor w12, w12, w13, ror 24
+ ubfx x13, x14, #16, #8
+ eor w12, w12, w19, ror 8
+ ubfx x19, x15, #56, #8
+ eor w11, w12, w20, ror 16
+ ubfx x20, x14, #40, #8
+ ldr w16, [x8, x16, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w16, ror 24
+ ldp x14, x15, [x26], #16
+ eor w13, w13, w19, ror 24
+ eor w13, w13, w20, ror 8
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x14
+ eor x11, x11, x15
+ subs w25, w25, #2
+ bne L_AES_XTS_encrypt_loop_nr
+ ubfx x14, x10, #48, #8
+ ubfx x17, x10, #24, #8
+ ubfx x19, x11, #8, #8
+ ubfx x20, x11, #32, #8
+ ldr x12, [x8]
+ ldr x12, [x8, #64]
+ ldr x12, [x8, #128]
+ ldr x12, [x8, #192]
+ ldr x12, [x8, #256]
+ ldr x12, [x8, #320]
+ ldr x12, [x8, #384]
+ ldr x12, [x8, #448]
+ ldr x12, [x8, #512]
+ ldr x12, [x8, #576]
+ ldr x12, [x8, #640]
+ ldr x12, [x8, #704]
+ ldr x12, [x8, #768]
+ ldr x12, [x8, #832]
+ ldr x12, [x8, #896]
+ ldr x12, [x8, #960]
+ ldr w14, [x8, x14, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x15, x11, #16, #8
+ eor w14, w14, w17, ror 24
+ ubfx x17, x10, #56, #8
+ eor w14, w14, w19, ror 8
+ ubfx x19, x11, #40, #8
+ eor w14, w14, w20, ror 16
+ ubfx x20, x10, #0, #8
+ ldr w15, [x8, x15, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x11, #48, #8
+ eor w15, w15, w17, ror 24
+ ubfx x17, x11, #24, #8
+ eor w15, w15, w19, ror 8
+ ubfx x19, x10, #8, #8
+ eor w15, w15, w20, ror 16
+ ubfx x20, x10, #32, #8
+ bfi x14, x15, #32, #32
+ ldr w16, [x8, x16, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x12, x11, #0, #8
+ eor w16, w16, w17, ror 24
+ ubfx x17, x10, #16, #8
+ eor w16, w16, w19, ror 8
+ ubfx x19, x11, #56, #8
+ eor w15, w16, w20, ror 16
+ ubfx x20, x10, #40, #8
+ ldr w12, [x8, x12, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w12, ror 24
+ ldp x10, x11, [x26], #16
+ eor w17, w17, w19, ror 24
+ eor w17, w17, w20, ror 8
+ bfi x15, x17, #32, #32
+ ; XOR in Key Schedule
+ eor x14, x14, x10
+ eor x15, x15, x11
+ ubfx x10, x15, #32, #8
+ ubfx x13, x15, #8, #8
+ ubfx x19, x14, #48, #8
+ ubfx x20, x14, #24, #8
+ lsl w10, w10, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldr x17, [x8]
+ ldr x17, [x8, #64]
+ ldr x17, [x8, #128]
+ ldr x17, [x8, #192]
+ ldr x17, [x8, #256]
+ ldr x17, [x8, #320]
+ ldr x17, [x8, #384]
+ ldr x17, [x8, #448]
+ ldr x17, [x8, #512]
+ ldr x17, [x8, #576]
+ ldr x17, [x8, #640]
+ ldr x17, [x8, #704]
+ ldr x17, [x8, #768]
+ ldr x17, [x8, #832]
+ ldr x17, [x8, #896]
+ ldr x17, [x8, #960]
+ ldrb w10, [x8, x10, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x11, x14, #0, #8
+ eor w10, w10, w13, lsl 8
+ ubfx x13, x15, #40, #8
+ eor w10, w10, w19, lsl 16
+ ubfx x19, x15, #16, #8
+ eor w10, w10, w20, lsl 24
+ ubfx x20, x14, #56, #8
+ lsl w11, w11, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w11, [x8, x11, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x12, x14, #32, #8
+ eor w11, w11, w13, lsl 8
+ ubfx x13, x14, #8, #8
+ eor w11, w11, w19, lsl 16
+ ubfx x19, x15, #48, #8
+ eor w11, w11, w20, lsl 24
+ ubfx x20, x15, #24, #8
+ bfi x10, x11, #32, #32
+ lsl w12, w12, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w12, [x8, x12, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x17, x15, #56, #8
+ eor w12, w12, w13, lsl 8
+ ubfx x13, x15, #0, #8
+ eor w12, w12, w19, lsl 16
+ ubfx x19, x14, #40, #8
+ eor w11, w12, w20, lsl 24
+ ubfx x20, x14, #16, #8
+ lsl w17, w17, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w17, [x8, x17, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ eor w19, w19, w17, lsl 16
+ ldp x14, x15, [x26]
+ eor w13, w13, w19, lsl 8
+ eor w13, w13, w20, lsl 16
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x14
+ eor x11, x11, x15
+ rev32 x10, x10
+ rev32 x11, x11
+ eor x10, x10, x21
+ eor x11, x11, x22
+ stp x10, x11, [x1]
+ and x19, x9, x22, asr 63
+ extr x22, x22, x21, #63
+ eor x21, x19, x21, lsl 1
+ sub w2, w2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ cmp w2, #16
+ bge L_AES_XTS_encrypt_loop_block
+ cbz w2, L_AES_XTS_encrypt_done_data
+ mov x26, x4
+ sub x1, x1, #16
+ ldp x10, x11, [x1], #16
+ stp x10, x11, [x6]
+ mov w14, w2
+L_AES_XTS_encrypt_start_byte
+ ldrb w19, [x6]
+ ldrb w20, [x0], #1
+ strb w19, [x1], #1
+ strb w20, [x6], #1
+ subs w14, w14, #1
+ bgt L_AES_XTS_encrypt_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ ldp x10, x11, [x6]
+ ldp x14, x15, [x26], #16
+ eor x10, x10, x21
+ eor x11, x11, x22
+ rev32 x10, x10
+ rev32 x11, x11
+ ; Round: 0 - XOR in key schedule
+ eor x10, x10, x14
+ eor x11, x11, x15
+ sub w25, w7, #2
+L_AES_XTS_encrypt_loop_nr_partial
+ ubfx x14, x10, #48, #8
+ ubfx x17, x10, #24, #8
+ ubfx x19, x11, #8, #8
+ ubfx x20, x11, #32, #8
+ ldr x12, [x8]
+ ldr x12, [x8, #64]
+ ldr x12, [x8, #128]
+ ldr x12, [x8, #192]
+ ldr x12, [x8, #256]
+ ldr x12, [x8, #320]
+ ldr x12, [x8, #384]
+ ldr x12, [x8, #448]
+ ldr x12, [x8, #512]
+ ldr x12, [x8, #576]
+ ldr x12, [x8, #640]
+ ldr x12, [x8, #704]
+ ldr x12, [x8, #768]
+ ldr x12, [x8, #832]
+ ldr x12, [x8, #896]
+ ldr x12, [x8, #960]
+ ldr w14, [x8, x14, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x15, x11, #16, #8
+ eor w14, w14, w17, ror 24
+ ubfx x17, x10, #56, #8
+ eor w14, w14, w19, ror 8
+ ubfx x19, x11, #40, #8
+ eor w14, w14, w20, ror 16
+ ubfx x20, x10, #0, #8
+ ldr w15, [x8, x15, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x11, #48, #8
+ eor w15, w15, w17, ror 24
+ ubfx x17, x11, #24, #8
+ eor w15, w15, w19, ror 8
+ ubfx x19, x10, #8, #8
+ eor w15, w15, w20, ror 16
+ ubfx x20, x10, #32, #8
+ bfi x14, x15, #32, #32
+ ldr w16, [x8, x16, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x12, x11, #0, #8
+ eor w16, w16, w17, ror 24
+ ubfx x17, x10, #16, #8
+ eor w16, w16, w19, ror 8
+ ubfx x19, x11, #56, #8
+ eor w15, w16, w20, ror 16
+ ubfx x20, x10, #40, #8
+ ldr w12, [x8, x12, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w12, ror 24
+ ldp x10, x11, [x26], #16
+ eor w17, w17, w19, ror 24
+ eor w17, w17, w20, ror 8
+ bfi x15, x17, #32, #32
+ ; XOR in Key Schedule
+ eor x14, x14, x10
+ eor x15, x15, x11
+ ubfx x10, x14, #48, #8
+ ubfx x13, x14, #24, #8
+ ubfx x19, x15, #8, #8
+ ubfx x20, x15, #32, #8
+ ldr x16, [x8]
+ ldr x16, [x8, #64]
+ ldr x16, [x8, #128]
+ ldr x16, [x8, #192]
+ ldr x16, [x8, #256]
+ ldr x16, [x8, #320]
+ ldr x16, [x8, #384]
+ ldr x16, [x8, #448]
+ ldr x16, [x8, #512]
+ ldr x16, [x8, #576]
+ ldr x16, [x8, #640]
+ ldr x16, [x8, #704]
+ ldr x16, [x8, #768]
+ ldr x16, [x8, #832]
+ ldr x16, [x8, #896]
+ ldr x16, [x8, #960]
+ ldr w10, [x8, x10, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x11, x15, #16, #8
+ eor w10, w10, w13, ror 24
+ ubfx x13, x14, #56, #8
+ eor w10, w10, w19, ror 8
+ ubfx x19, x15, #40, #8
+ eor w10, w10, w20, ror 16
+ ubfx x20, x14, #0, #8
+ ldr w11, [x8, x11, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x12, x15, #48, #8
+ eor w11, w11, w13, ror 24
+ ubfx x13, x15, #24, #8
+ eor w11, w11, w19, ror 8
+ ubfx x19, x14, #8, #8
+ eor w11, w11, w20, ror 16
+ ubfx x20, x14, #32, #8
+ bfi x10, x11, #32, #32
+ ldr w12, [x8, x12, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x15, #0, #8
+ eor w12, w12, w13, ror 24
+ ubfx x13, x14, #16, #8
+ eor w12, w12, w19, ror 8
+ ubfx x19, x15, #56, #8
+ eor w11, w12, w20, ror 16
+ ubfx x20, x14, #40, #8
+ ldr w16, [x8, x16, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w13, [x8, x13, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w16, ror 24
+ ldp x14, x15, [x26], #16
+ eor w13, w13, w19, ror 24
+ eor w13, w13, w20, ror 8
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x14
+ eor x11, x11, x15
+ subs w25, w25, #2
+ bne L_AES_XTS_encrypt_loop_nr_partial
+ ubfx x14, x10, #48, #8
+ ubfx x17, x10, #24, #8
+ ubfx x19, x11, #8, #8
+ ubfx x20, x11, #32, #8
+ ldr x12, [x8]
+ ldr x12, [x8, #64]
+ ldr x12, [x8, #128]
+ ldr x12, [x8, #192]
+ ldr x12, [x8, #256]
+ ldr x12, [x8, #320]
+ ldr x12, [x8, #384]
+ ldr x12, [x8, #448]
+ ldr x12, [x8, #512]
+ ldr x12, [x8, #576]
+ ldr x12, [x8, #640]
+ ldr x12, [x8, #704]
+ ldr x12, [x8, #768]
+ ldr x12, [x8, #832]
+ ldr x12, [x8, #896]
+ ldr x12, [x8, #960]
+ ldr w14, [x8, x14, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x15, x11, #16, #8
+ eor w14, w14, w17, ror 24
+ ubfx x17, x10, #56, #8
+ eor w14, w14, w19, ror 8
+ ubfx x19, x11, #40, #8
+ eor w14, w14, w20, ror 16
+ ubfx x20, x10, #0, #8
+ ldr w15, [x8, x15, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x16, x11, #48, #8
+ eor w15, w15, w17, ror 24
+ ubfx x17, x11, #24, #8
+ eor w15, w15, w19, ror 8
+ ubfx x19, x10, #8, #8
+ eor w15, w15, w20, ror 16
+ ubfx x20, x10, #32, #8
+ bfi x14, x15, #32, #32
+ ldr w16, [x8, x16, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ubfx x12, x11, #0, #8
+ eor w16, w16, w17, ror 24
+ ubfx x17, x10, #16, #8
+ eor w16, w16, w19, ror 8
+ ubfx x19, x11, #56, #8
+ eor w15, w16, w20, ror 16
+ ubfx x20, x10, #40, #8
+ ldr w12, [x8, x12, LSL 2]
+ ldr w19, [x8, x19, LSL 2]
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ eor w19, w19, w12, ror 24
+ ldp x10, x11, [x26], #16
+ eor w17, w17, w19, ror 24
+ eor w17, w17, w20, ror 8
+ bfi x15, x17, #32, #32
+ ; XOR in Key Schedule
+ eor x14, x14, x10
+ eor x15, x15, x11
+ ubfx x10, x15, #32, #8
+ ubfx x13, x15, #8, #8
+ ubfx x19, x14, #48, #8
+ ubfx x20, x14, #24, #8
+ lsl w10, w10, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldr x17, [x8]
+ ldr x17, [x8, #64]
+ ldr x17, [x8, #128]
+ ldr x17, [x8, #192]
+ ldr x17, [x8, #256]
+ ldr x17, [x8, #320]
+ ldr x17, [x8, #384]
+ ldr x17, [x8, #448]
+ ldr x17, [x8, #512]
+ ldr x17, [x8, #576]
+ ldr x17, [x8, #640]
+ ldr x17, [x8, #704]
+ ldr x17, [x8, #768]
+ ldr x17, [x8, #832]
+ ldr x17, [x8, #896]
+ ldr x17, [x8, #960]
+ ldrb w10, [x8, x10, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x11, x14, #0, #8
+ eor w10, w10, w13, lsl 8
+ ubfx x13, x15, #40, #8
+ eor w10, w10, w19, lsl 16
+ ubfx x19, x15, #16, #8
+ eor w10, w10, w20, lsl 24
+ ubfx x20, x14, #56, #8
+ lsl w11, w11, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w11, [x8, x11, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x12, x14, #32, #8
+ eor w11, w11, w13, lsl 8
+ ubfx x13, x14, #8, #8
+ eor w11, w11, w19, lsl 16
+ ubfx x19, x15, #48, #8
+ eor w11, w11, w20, lsl 24
+ ubfx x20, x15, #24, #8
+ bfi x10, x11, #32, #32
+ lsl w12, w12, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w12, [x8, x12, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ ubfx x17, x15, #56, #8
+ eor w12, w12, w13, lsl 8
+ ubfx x13, x15, #0, #8
+ eor w12, w12, w19, lsl 16
+ ubfx x19, x14, #40, #8
+ eor w11, w12, w20, lsl 24
+ ubfx x20, x14, #16, #8
+ lsl w17, w17, #2
+ lsl w13, w13, #2
+ lsl w19, w19, #2
+ lsl w20, w20, #2
+ ldrb w17, [x8, x17, LSL 0]
+ ldrb w13, [x8, x13, LSL 0]
+ ldrb w19, [x8, x19, LSL 0]
+ ldrb w20, [x8, x20, LSL 0]
+ eor w19, w19, w17, lsl 16
+ ldp x14, x15, [x26]
+ eor w13, w13, w19, lsl 8
+ eor w13, w13, w20, lsl 16
+ bfi x11, x13, #32, #32
+ ; XOR in Key Schedule
+ eor x10, x10, x14
+ eor x11, x11, x15
+ rev32 x10, x10
+ rev32 x11, x11
+ eor x10, x10, x21
+ eor x11, x11, x22
+ stp x10, x11, [x1]
+L_AES_XTS_encrypt_done_data
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldp x24, x25, [x29, #72]
+ ldr x26, [x29, #88]
+ ldp x29, x30, [sp], #0x60
+ ret
+ ENDP
+ IF :DEF:HAVE_AES_DECRYPT
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT AES_XTS_decrypt
+AES_XTS_decrypt PROC
+ stp x29, x30, [sp, #-112]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ stp x24, x25, [x29, #72]
+ stp x26, x27, [x29, #88]
+ str x28, [x29, #104]
+ adrp x8, L_AES_ARM64_td
+ add x8, x8, L_AES_ARM64_td
+ adrp x9, L_AES_ARM64_td4
+ add x9, x9, L_AES_ARM64_td4
+ adrp x10, L_AES_ARM64_te
+ add x10, x10, L_AES_ARM64_te
+ ands w11, w2, #15
+ cset w11, ne
+ sub w2, w2, w11, lsl 4
+ mov x11, #0x87
+ mov x28, x5
+ ldp x23, x24, [x3]
+ ldp x16, x17, [x28], #16
+ rev32 x23, x23
+ rev32 x24, x24
+ ; Round: 0 - XOR in key schedule
+ eor x23, x23, x16
+ eor x24, x24, x17
+ sub w27, w7, #2
+L_AES_XTS_decrypt_loop_nr_tweak
+ ubfx x16, x23, #48, #8
+ ubfx x20, x23, #24, #8
+ ubfx x21, x24, #8, #8
+ ubfx x22, x24, #32, #8
+ ldr x25, [x10]
+ ldr x25, [x10, #64]
+ ldr x25, [x10, #128]
+ ldr x25, [x10, #192]
+ ldr x25, [x10, #256]
+ ldr x25, [x10, #320]
+ ldr x25, [x10, #384]
+ ldr x25, [x10, #448]
+ ldr x25, [x10, #512]
+ ldr x25, [x10, #576]
+ ldr x25, [x10, #640]
+ ldr x25, [x10, #704]
+ ldr x25, [x10, #768]
+ ldr x25, [x10, #832]
+ ldr x25, [x10, #896]
+ ldr x25, [x10, #960]
+ ldr w16, [x10, x16, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x17, x24, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x23, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x24, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x23, #0, #8
+ ldr w17, [x10, x17, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x19, x24, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x24, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x23, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x23, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x10, x19, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x25, x24, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x23, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x24, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x23, #40, #8
+ ldr w25, [x10, x25, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ eor w21, w21, w25, ror 24
+ ldp x23, x24, [x28], #16
+ eor w20, w20, w21, ror 24
+ eor w20, w20, w22, ror 8
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x23
+ eor x17, x17, x24
+ ubfx x23, x16, #48, #8
+ ubfx x26, x16, #24, #8
+ ubfx x21, x17, #8, #8
+ ubfx x22, x17, #32, #8
+ ldr x19, [x10]
+ ldr x19, [x10, #64]
+ ldr x19, [x10, #128]
+ ldr x19, [x10, #192]
+ ldr x19, [x10, #256]
+ ldr x19, [x10, #320]
+ ldr x19, [x10, #384]
+ ldr x19, [x10, #448]
+ ldr x19, [x10, #512]
+ ldr x19, [x10, #576]
+ ldr x19, [x10, #640]
+ ldr x19, [x10, #704]
+ ldr x19, [x10, #768]
+ ldr x19, [x10, #832]
+ ldr x19, [x10, #896]
+ ldr x19, [x10, #960]
+ ldr w23, [x10, x23, LSL 2]
+ ldr w26, [x10, x26, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x24, x17, #16, #8
+ eor w23, w23, w26, ror 24
+ ubfx x26, x16, #56, #8
+ eor w23, w23, w21, ror 8
+ ubfx x21, x17, #40, #8
+ eor w23, w23, w22, ror 16
+ ubfx x22, x16, #0, #8
+ ldr w24, [x10, x24, LSL 2]
+ ldr w26, [x10, x26, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x25, x17, #48, #8
+ eor w24, w24, w26, ror 24
+ ubfx x26, x17, #24, #8
+ eor w24, w24, w21, ror 8
+ ubfx x21, x16, #8, #8
+ eor w24, w24, w22, ror 16
+ ubfx x22, x16, #32, #8
+ bfi x23, x24, #32, #32
+ ldr w25, [x10, x25, LSL 2]
+ ldr w26, [x10, x26, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x19, x17, #0, #8
+ eor w25, w25, w26, ror 24
+ ubfx x26, x16, #16, #8
+ eor w25, w25, w21, ror 8
+ ubfx x21, x17, #56, #8
+ eor w24, w25, w22, ror 16
+ ubfx x22, x16, #40, #8
+ ldr w19, [x10, x19, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w26, [x10, x26, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ eor w21, w21, w19, ror 24
+ ldp x16, x17, [x28], #16
+ eor w26, w26, w21, ror 24
+ eor w26, w26, w22, ror 8
+ bfi x24, x26, #32, #32
+ ; XOR in Key Schedule
+ eor x23, x23, x16
+ eor x24, x24, x17
+ subs w27, w27, #2
+ bne L_AES_XTS_decrypt_loop_nr_tweak
+ ubfx x16, x23, #48, #8
+ ubfx x20, x23, #24, #8
+ ubfx x21, x24, #8, #8
+ ubfx x22, x24, #32, #8
+ ldr x25, [x10]
+ ldr x25, [x10, #64]
+ ldr x25, [x10, #128]
+ ldr x25, [x10, #192]
+ ldr x25, [x10, #256]
+ ldr x25, [x10, #320]
+ ldr x25, [x10, #384]
+ ldr x25, [x10, #448]
+ ldr x25, [x10, #512]
+ ldr x25, [x10, #576]
+ ldr x25, [x10, #640]
+ ldr x25, [x10, #704]
+ ldr x25, [x10, #768]
+ ldr x25, [x10, #832]
+ ldr x25, [x10, #896]
+ ldr x25, [x10, #960]
+ ldr w16, [x10, x16, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x17, x24, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x23, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x24, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x23, #0, #8
+ ldr w17, [x10, x17, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x19, x24, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x24, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x23, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x23, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x10, x19, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ ubfx x25, x24, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x23, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x24, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x23, #40, #8
+ ldr w25, [x10, x25, LSL 2]
+ ldr w21, [x10, x21, LSL 2]
+ ldr w20, [x10, x20, LSL 2]
+ ldr w22, [x10, x22, LSL 2]
+ eor w21, w21, w25, ror 24
+ ldp x23, x24, [x28], #16
+ eor w20, w20, w21, ror 24
+ eor w20, w20, w22, ror 8
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x23
+ eor x17, x17, x24
+ ubfx x23, x17, #32, #8
+ ubfx x26, x17, #8, #8
+ ubfx x21, x16, #48, #8
+ ubfx x22, x16, #24, #8
+ lsl w23, w23, #2
+ lsl w26, w26, #2
+ lsl w21, w21, #2
+ lsl w22, w22, #2
+ ldr x20, [x10]
+ ldr x20, [x10, #64]
+ ldr x20, [x10, #128]
+ ldr x20, [x10, #192]
+ ldr x20, [x10, #256]
+ ldr x20, [x10, #320]
+ ldr x20, [x10, #384]
+ ldr x20, [x10, #448]
+ ldr x20, [x10, #512]
+ ldr x20, [x10, #576]
+ ldr x20, [x10, #640]
+ ldr x20, [x10, #704]
+ ldr x20, [x10, #768]
+ ldr x20, [x10, #832]
+ ldr x20, [x10, #896]
+ ldr x20, [x10, #960]
+ ldrb w23, [x10, x23, LSL 0]
+ ldrb w26, [x10, x26, LSL 0]
+ ldrb w21, [x10, x21, LSL 0]
+ ldrb w22, [x10, x22, LSL 0]
+ ubfx x24, x16, #0, #8
+ eor w23, w23, w26, lsl 8
+ ubfx x26, x17, #40, #8
+ eor w23, w23, w21, lsl 16
+ ubfx x21, x17, #16, #8
+ eor w23, w23, w22, lsl 24
+ ubfx x22, x16, #56, #8
+ lsl w24, w24, #2
+ lsl w26, w26, #2
+ lsl w21, w21, #2
+ lsl w22, w22, #2
+ ldrb w24, [x10, x24, LSL 0]
+ ldrb w26, [x10, x26, LSL 0]
+ ldrb w21, [x10, x21, LSL 0]
+ ldrb w22, [x10, x22, LSL 0]
+ ubfx x25, x16, #32, #8
+ eor w24, w24, w26, lsl 8
+ ubfx x26, x16, #8, #8
+ eor w24, w24, w21, lsl 16
+ ubfx x21, x17, #48, #8
+ eor w24, w24, w22, lsl 24
+ ubfx x22, x17, #24, #8
+ bfi x23, x24, #32, #32
+ lsl w25, w25, #2
+ lsl w26, w26, #2
+ lsl w21, w21, #2
+ lsl w22, w22, #2
+ ldrb w25, [x10, x25, LSL 0]
+ ldrb w26, [x10, x26, LSL 0]
+ ldrb w21, [x10, x21, LSL 0]
+ ldrb w22, [x10, x22, LSL 0]
+ ubfx x20, x17, #56, #8
+ eor w25, w25, w26, lsl 8
+ ubfx x26, x17, #0, #8
+ eor w25, w25, w21, lsl 16
+ ubfx x21, x16, #40, #8
+ eor w24, w25, w22, lsl 24
+ ubfx x22, x16, #16, #8
+ lsl w20, w20, #2
+ lsl w26, w26, #2
+ lsl w21, w21, #2
+ lsl w22, w22, #2
+ ldrb w20, [x10, x20, LSL 0]
+ ldrb w26, [x10, x26, LSL 0]
+ ldrb w21, [x10, x21, LSL 0]
+ ldrb w22, [x10, x22, LSL 0]
+ eor w21, w21, w20, lsl 16
+ ldp x16, x17, [x28]
+ eor w26, w26, w21, lsl 8
+ eor w26, w26, w22, lsl 16
+ bfi x24, x26, #32, #32
+ ; XOR in Key Schedule
+ eor x23, x23, x16
+ eor x24, x24, x17
+ rev32 x23, x23
+ rev32 x24, x24
+ cmp w2, #16
+ blt L_AES_XTS_decrypt_start_partail
+L_AES_XTS_decrypt_loop_block
+ mov x28, x4
+ ldp x12, x13, [x0]
+ ldp x16, x17, [x28], #16
+ eor x12, x12, x23
+ eor x13, x13, x24
+ rev32 x12, x12
+ rev32 x13, x13
+ ; Round: 0 - XOR in key schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ sub w27, w7, #2
+L_AES_XTS_decrypt_loop_nr
+ ubfx x16, x13, #48, #8
+ ubfx x20, x12, #24, #8
+ ubfx x21, x13, #8, #8
+ ubfx x22, x12, #32, #8
+ ldr x14, [x8]
+ ldr x14, [x8, #64]
+ ldr x14, [x8, #128]
+ ldr x14, [x8, #192]
+ ldr x14, [x8, #256]
+ ldr x14, [x8, #320]
+ ldr x14, [x8, #384]
+ ldr x14, [x8, #448]
+ ldr x14, [x8, #512]
+ ldr x14, [x8, #576]
+ ldr x14, [x8, #640]
+ ldr x14, [x8, #704]
+ ldr x14, [x8, #768]
+ ldr x14, [x8, #832]
+ ldr x14, [x8, #896]
+ ldr x14, [x8, #960]
+ ldr w16, [x8, x16, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x17, x12, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x12, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x13, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x13, #0, #8
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x12, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x13, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x12, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x13, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x13, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x13, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x12, #40, #8
+ ldr w14, [x8, x14, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w14, ror 24
+ ldp x12, x13, [x28], #16
+ eor w20, w20, w22, ror 8
+ eor w20, w20, w21, ror 24
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x12
+ eor x17, x17, x13
+ ubfx x12, x17, #48, #8
+ ubfx x15, x16, #24, #8
+ ubfx x21, x17, #8, #8
+ ubfx x22, x16, #32, #8
+ ldr x19, [x8]
+ ldr x19, [x8, #64]
+ ldr x19, [x8, #128]
+ ldr x19, [x8, #192]
+ ldr x19, [x8, #256]
+ ldr x19, [x8, #320]
+ ldr x19, [x8, #384]
+ ldr x19, [x8, #448]
+ ldr x19, [x8, #512]
+ ldr x19, [x8, #576]
+ ldr x19, [x8, #640]
+ ldr x19, [x8, #704]
+ ldr x19, [x8, #768]
+ ldr x19, [x8, #832]
+ ldr x19, [x8, #896]
+ ldr x19, [x8, #960]
+ ldr w12, [x8, x12, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x13, x16, #16, #8
+ eor w12, w12, w15, ror 24
+ ubfx x15, x16, #56, #8
+ eor w12, w12, w21, ror 8
+ ubfx x21, x17, #40, #8
+ eor w12, w12, w22, ror 16
+ ubfx x22, x17, #0, #8
+ ldr w13, [x8, x13, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x16, #48, #8
+ eor w13, w13, w15, ror 24
+ ubfx x15, x17, #24, #8
+ eor w13, w13, w21, ror 8
+ ubfx x21, x16, #8, #8
+ eor w13, w13, w22, ror 16
+ ubfx x22, x17, #32, #8
+ bfi x12, x13, #32, #32
+ ldr w14, [x8, x14, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x16, #0, #8
+ eor w14, w14, w15, ror 24
+ ubfx x15, x17, #16, #8
+ eor w14, w14, w21, ror 8
+ ubfx x21, x17, #56, #8
+ eor w13, w14, w22, ror 16
+ ubfx x22, x16, #40, #8
+ ldr w19, [x8, x19, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w19, ror 24
+ ldp x16, x17, [x28], #16
+ eor w15, w15, w22, ror 8
+ eor w15, w15, w21, ror 24
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ subs w27, w27, #2
+ bne L_AES_XTS_decrypt_loop_nr
+ ubfx x16, x13, #48, #8
+ ubfx x20, x12, #24, #8
+ ubfx x21, x13, #8, #8
+ ubfx x22, x12, #32, #8
+ ldr x14, [x8]
+ ldr x14, [x8, #64]
+ ldr x14, [x8, #128]
+ ldr x14, [x8, #192]
+ ldr x14, [x8, #256]
+ ldr x14, [x8, #320]
+ ldr x14, [x8, #384]
+ ldr x14, [x8, #448]
+ ldr x14, [x8, #512]
+ ldr x14, [x8, #576]
+ ldr x14, [x8, #640]
+ ldr x14, [x8, #704]
+ ldr x14, [x8, #768]
+ ldr x14, [x8, #832]
+ ldr x14, [x8, #896]
+ ldr x14, [x8, #960]
+ ldr w16, [x8, x16, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x17, x12, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x12, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x13, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x13, #0, #8
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x12, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x13, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x12, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x13, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x13, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x13, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x12, #40, #8
+ ldr w14, [x8, x14, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w14, ror 24
+ ldp x12, x13, [x28], #16
+ eor w20, w20, w22, ror 8
+ eor w20, w20, w21, ror 24
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x12
+ eor x17, x17, x13
+ ubfx x12, x16, #32, #8
+ ubfx x15, x17, #8, #8
+ ubfx x21, x17, #48, #8
+ ubfx x22, x16, #24, #8
+ ldr x20, [x9]
+ ldr x20, [x9, #64]
+ ldr x20, [x9, #128]
+ ldr x20, [x9, #192]
+ ldrb w12, [x9, x12, LSL 0]
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ubfx x13, x17, #0, #8
+ eor w12, w12, w15, lsl 8
+ ubfx x15, x17, #40, #8
+ eor w12, w12, w21, lsl 16
+ ubfx x21, x16, #16, #8
+ eor w12, w12, w22, lsl 24
+ ubfx x22, x16, #56, #8
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ldrb w13, [x9, x13, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ubfx x14, x17, #32, #8
+ eor w13, w13, w15, lsl 8
+ ubfx x15, x16, #8, #8
+ eor w13, w13, w21, lsl 16
+ ubfx x21, x16, #48, #8
+ eor w13, w13, w22, lsl 24
+ ubfx x22, x17, #24, #8
+ bfi x12, x13, #32, #32
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ldrb w14, [x9, x14, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ubfx x20, x17, #56, #8
+ eor w14, w14, w15, lsl 8
+ ubfx x15, x16, #0, #8
+ eor w14, w14, w21, lsl 16
+ ubfx x21, x16, #40, #8
+ eor w13, w14, w22, lsl 24
+ ubfx x22, x17, #16, #8
+ ldrb w20, [x9, x20, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ eor w21, w21, w20, lsl 16
+ ldp x16, x17, [x28]
+ eor w15, w15, w21, lsl 8
+ eor w15, w15, w22, lsl 16
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ rev32 x12, x12
+ rev32 x13, x13
+ eor x12, x12, x23
+ eor x13, x13, x24
+ stp x12, x13, [x1]
+ and x21, x11, x24, asr 63
+ extr x24, x24, x23, #63
+ eor x23, x21, x23, lsl 1
+ sub w2, w2, #16
+ add x0, x0, #16
+ add x1, x1, #16
+ cmp w2, #16
+ bge L_AES_XTS_decrypt_loop_block
+ cbz w2, L_AES_XTS_decrypt_done_data
+L_AES_XTS_decrypt_start_partail
+ and x21, x11, x24, asr 63
+ extr x26, x24, x23, #63
+ eor x25, x21, x23, lsl 1
+ mov x28, x4
+ ldp x12, x13, [x0], #16
+ ldp x16, x17, [x28], #16
+ eor x12, x12, x25
+ eor x13, x13, x26
+ rev32 x12, x12
+ rev32 x13, x13
+ ; Round: 0 - XOR in key schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ sub w27, w7, #2
+L_AES_XTS_decrypt_loop_nr_partial_1
+ ubfx x16, x13, #48, #8
+ ubfx x20, x12, #24, #8
+ ubfx x21, x13, #8, #8
+ ubfx x22, x12, #32, #8
+ ldr x14, [x8]
+ ldr x14, [x8, #64]
+ ldr x14, [x8, #128]
+ ldr x14, [x8, #192]
+ ldr x14, [x8, #256]
+ ldr x14, [x8, #320]
+ ldr x14, [x8, #384]
+ ldr x14, [x8, #448]
+ ldr x14, [x8, #512]
+ ldr x14, [x8, #576]
+ ldr x14, [x8, #640]
+ ldr x14, [x8, #704]
+ ldr x14, [x8, #768]
+ ldr x14, [x8, #832]
+ ldr x14, [x8, #896]
+ ldr x14, [x8, #960]
+ ldr w16, [x8, x16, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x17, x12, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x12, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x13, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x13, #0, #8
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x12, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x13, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x12, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x13, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x13, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x13, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x12, #40, #8
+ ldr w14, [x8, x14, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w14, ror 24
+ ldp x12, x13, [x28], #16
+ eor w20, w20, w22, ror 8
+ eor w20, w20, w21, ror 24
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x12
+ eor x17, x17, x13
+ ubfx x12, x17, #48, #8
+ ubfx x15, x16, #24, #8
+ ubfx x21, x17, #8, #8
+ ubfx x22, x16, #32, #8
+ ldr x19, [x8]
+ ldr x19, [x8, #64]
+ ldr x19, [x8, #128]
+ ldr x19, [x8, #192]
+ ldr x19, [x8, #256]
+ ldr x19, [x8, #320]
+ ldr x19, [x8, #384]
+ ldr x19, [x8, #448]
+ ldr x19, [x8, #512]
+ ldr x19, [x8, #576]
+ ldr x19, [x8, #640]
+ ldr x19, [x8, #704]
+ ldr x19, [x8, #768]
+ ldr x19, [x8, #832]
+ ldr x19, [x8, #896]
+ ldr x19, [x8, #960]
+ ldr w12, [x8, x12, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x13, x16, #16, #8
+ eor w12, w12, w15, ror 24
+ ubfx x15, x16, #56, #8
+ eor w12, w12, w21, ror 8
+ ubfx x21, x17, #40, #8
+ eor w12, w12, w22, ror 16
+ ubfx x22, x17, #0, #8
+ ldr w13, [x8, x13, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x16, #48, #8
+ eor w13, w13, w15, ror 24
+ ubfx x15, x17, #24, #8
+ eor w13, w13, w21, ror 8
+ ubfx x21, x16, #8, #8
+ eor w13, w13, w22, ror 16
+ ubfx x22, x17, #32, #8
+ bfi x12, x13, #32, #32
+ ldr w14, [x8, x14, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x16, #0, #8
+ eor w14, w14, w15, ror 24
+ ubfx x15, x17, #16, #8
+ eor w14, w14, w21, ror 8
+ ubfx x21, x17, #56, #8
+ eor w13, w14, w22, ror 16
+ ubfx x22, x16, #40, #8
+ ldr w19, [x8, x19, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w19, ror 24
+ ldp x16, x17, [x28], #16
+ eor w15, w15, w22, ror 8
+ eor w15, w15, w21, ror 24
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ subs w27, w27, #2
+ bne L_AES_XTS_decrypt_loop_nr_partial_1
+ ubfx x16, x13, #48, #8
+ ubfx x20, x12, #24, #8
+ ubfx x21, x13, #8, #8
+ ubfx x22, x12, #32, #8
+ ldr x14, [x8]
+ ldr x14, [x8, #64]
+ ldr x14, [x8, #128]
+ ldr x14, [x8, #192]
+ ldr x14, [x8, #256]
+ ldr x14, [x8, #320]
+ ldr x14, [x8, #384]
+ ldr x14, [x8, #448]
+ ldr x14, [x8, #512]
+ ldr x14, [x8, #576]
+ ldr x14, [x8, #640]
+ ldr x14, [x8, #704]
+ ldr x14, [x8, #768]
+ ldr x14, [x8, #832]
+ ldr x14, [x8, #896]
+ ldr x14, [x8, #960]
+ ldr w16, [x8, x16, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x17, x12, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x12, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x13, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x13, #0, #8
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x12, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x13, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x12, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x13, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x13, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x13, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x12, #40, #8
+ ldr w14, [x8, x14, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w14, ror 24
+ ldp x12, x13, [x28], #16
+ eor w20, w20, w22, ror 8
+ eor w20, w20, w21, ror 24
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x12
+ eor x17, x17, x13
+ ubfx x12, x16, #32, #8
+ ubfx x15, x17, #8, #8
+ ubfx x21, x17, #48, #8
+ ubfx x22, x16, #24, #8
+ ldr x20, [x9]
+ ldr x20, [x9, #64]
+ ldr x20, [x9, #128]
+ ldr x20, [x9, #192]
+ ldrb w12, [x9, x12, LSL 0]
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ubfx x13, x17, #0, #8
+ eor w12, w12, w15, lsl 8
+ ubfx x15, x17, #40, #8
+ eor w12, w12, w21, lsl 16
+ ubfx x21, x16, #16, #8
+ eor w12, w12, w22, lsl 24
+ ubfx x22, x16, #56, #8
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ldrb w13, [x9, x13, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ubfx x14, x17, #32, #8
+ eor w13, w13, w15, lsl 8
+ ubfx x15, x16, #8, #8
+ eor w13, w13, w21, lsl 16
+ ubfx x21, x16, #48, #8
+ eor w13, w13, w22, lsl 24
+ ubfx x22, x17, #24, #8
+ bfi x12, x13, #32, #32
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ldrb w14, [x9, x14, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ubfx x20, x17, #56, #8
+ eor w14, w14, w15, lsl 8
+ ubfx x15, x16, #0, #8
+ eor w14, w14, w21, lsl 16
+ ubfx x21, x16, #40, #8
+ eor w13, w14, w22, lsl 24
+ ubfx x22, x17, #16, #8
+ ldrb w20, [x9, x20, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ eor w21, w21, w20, lsl 16
+ ldp x16, x17, [x28]
+ eor w15, w15, w21, lsl 8
+ eor w15, w15, w22, lsl 16
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ rev32 x12, x12
+ rev32 x13, x13
+ eor x12, x12, x25
+ eor x13, x13, x26
+ stp x12, x13, [x6]
+ add x1, x1, #16
+ mov w16, w2
+L_AES_XTS_decrypt_start_byte
+ ldrb w21, [x6]
+ ldrb w22, [x0], #1
+ strb w21, [x1], #1
+ strb w22, [x6], #1
+ subs w16, w16, #1
+ bgt L_AES_XTS_decrypt_start_byte
+ sub x1, x1, x2
+ sub x6, x6, x2
+ sub x1, x1, #16
+ mov x28, x4
+ ldp x12, x13, [x6]
+ ldp x16, x17, [x28], #16
+ eor x12, x12, x23
+ eor x13, x13, x24
+ rev32 x12, x12
+ rev32 x13, x13
+ ; Round: 0 - XOR in key schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ sub w27, w7, #2
+L_AES_XTS_decrypt_loop_nr_partial_2
+ ubfx x16, x13, #48, #8
+ ubfx x20, x12, #24, #8
+ ubfx x21, x13, #8, #8
+ ubfx x22, x12, #32, #8
+ ldr x14, [x8]
+ ldr x14, [x8, #64]
+ ldr x14, [x8, #128]
+ ldr x14, [x8, #192]
+ ldr x14, [x8, #256]
+ ldr x14, [x8, #320]
+ ldr x14, [x8, #384]
+ ldr x14, [x8, #448]
+ ldr x14, [x8, #512]
+ ldr x14, [x8, #576]
+ ldr x14, [x8, #640]
+ ldr x14, [x8, #704]
+ ldr x14, [x8, #768]
+ ldr x14, [x8, #832]
+ ldr x14, [x8, #896]
+ ldr x14, [x8, #960]
+ ldr w16, [x8, x16, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x17, x12, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x12, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x13, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x13, #0, #8
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x12, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x13, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x12, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x13, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x13, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x13, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x12, #40, #8
+ ldr w14, [x8, x14, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w14, ror 24
+ ldp x12, x13, [x28], #16
+ eor w20, w20, w22, ror 8
+ eor w20, w20, w21, ror 24
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x12
+ eor x17, x17, x13
+ ubfx x12, x17, #48, #8
+ ubfx x15, x16, #24, #8
+ ubfx x21, x17, #8, #8
+ ubfx x22, x16, #32, #8
+ ldr x19, [x8]
+ ldr x19, [x8, #64]
+ ldr x19, [x8, #128]
+ ldr x19, [x8, #192]
+ ldr x19, [x8, #256]
+ ldr x19, [x8, #320]
+ ldr x19, [x8, #384]
+ ldr x19, [x8, #448]
+ ldr x19, [x8, #512]
+ ldr x19, [x8, #576]
+ ldr x19, [x8, #640]
+ ldr x19, [x8, #704]
+ ldr x19, [x8, #768]
+ ldr x19, [x8, #832]
+ ldr x19, [x8, #896]
+ ldr x19, [x8, #960]
+ ldr w12, [x8, x12, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x13, x16, #16, #8
+ eor w12, w12, w15, ror 24
+ ubfx x15, x16, #56, #8
+ eor w12, w12, w21, ror 8
+ ubfx x21, x17, #40, #8
+ eor w12, w12, w22, ror 16
+ ubfx x22, x17, #0, #8
+ ldr w13, [x8, x13, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x16, #48, #8
+ eor w13, w13, w15, ror 24
+ ubfx x15, x17, #24, #8
+ eor w13, w13, w21, ror 8
+ ubfx x21, x16, #8, #8
+ eor w13, w13, w22, ror 16
+ ubfx x22, x17, #32, #8
+ bfi x12, x13, #32, #32
+ ldr w14, [x8, x14, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x16, #0, #8
+ eor w14, w14, w15, ror 24
+ ubfx x15, x17, #16, #8
+ eor w14, w14, w21, ror 8
+ ubfx x21, x17, #56, #8
+ eor w13, w14, w22, ror 16
+ ubfx x22, x16, #40, #8
+ ldr w19, [x8, x19, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w15, [x8, x15, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w19, ror 24
+ ldp x16, x17, [x28], #16
+ eor w15, w15, w22, ror 8
+ eor w15, w15, w21, ror 24
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ subs w27, w27, #2
+ bne L_AES_XTS_decrypt_loop_nr_partial_2
+ ubfx x16, x13, #48, #8
+ ubfx x20, x12, #24, #8
+ ubfx x21, x13, #8, #8
+ ubfx x22, x12, #32, #8
+ ldr x14, [x8]
+ ldr x14, [x8, #64]
+ ldr x14, [x8, #128]
+ ldr x14, [x8, #192]
+ ldr x14, [x8, #256]
+ ldr x14, [x8, #320]
+ ldr x14, [x8, #384]
+ ldr x14, [x8, #448]
+ ldr x14, [x8, #512]
+ ldr x14, [x8, #576]
+ ldr x14, [x8, #640]
+ ldr x14, [x8, #704]
+ ldr x14, [x8, #768]
+ ldr x14, [x8, #832]
+ ldr x14, [x8, #896]
+ ldr x14, [x8, #960]
+ ldr w16, [x8, x16, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x17, x12, #16, #8
+ eor w16, w16, w20, ror 24
+ ubfx x20, x12, #56, #8
+ eor w16, w16, w21, ror 8
+ ubfx x21, x13, #40, #8
+ eor w16, w16, w22, ror 16
+ ubfx x22, x13, #0, #8
+ ldr w17, [x8, x17, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x19, x12, #48, #8
+ eor w17, w17, w20, ror 24
+ ubfx x20, x13, #24, #8
+ eor w17, w17, w21, ror 8
+ ubfx x21, x12, #8, #8
+ eor w17, w17, w22, ror 16
+ ubfx x22, x13, #32, #8
+ bfi x16, x17, #32, #32
+ ldr w19, [x8, x19, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ ubfx x14, x12, #0, #8
+ eor w19, w19, w20, ror 24
+ ubfx x20, x13, #16, #8
+ eor w19, w19, w21, ror 8
+ ubfx x21, x13, #56, #8
+ eor w17, w19, w22, ror 16
+ ubfx x22, x12, #40, #8
+ ldr w14, [x8, x14, LSL 2]
+ ldr w21, [x8, x21, LSL 2]
+ ldr w20, [x8, x20, LSL 2]
+ ldr w22, [x8, x22, LSL 2]
+ eor w21, w21, w14, ror 24
+ ldp x12, x13, [x28], #16
+ eor w20, w20, w22, ror 8
+ eor w20, w20, w21, ror 24
+ bfi x17, x20, #32, #32
+ ; XOR in Key Schedule
+ eor x16, x16, x12
+ eor x17, x17, x13
+ ubfx x12, x16, #32, #8
+ ubfx x15, x17, #8, #8
+ ubfx x21, x17, #48, #8
+ ubfx x22, x16, #24, #8
+ ldr x20, [x9]
+ ldr x20, [x9, #64]
+ ldr x20, [x9, #128]
+ ldr x20, [x9, #192]
+ ldrb w12, [x9, x12, LSL 0]
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ubfx x13, x17, #0, #8
+ eor w12, w12, w15, lsl 8
+ ubfx x15, x17, #40, #8
+ eor w12, w12, w21, lsl 16
+ ubfx x21, x16, #16, #8
+ eor w12, w12, w22, lsl 24
+ ubfx x22, x16, #56, #8
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ldrb w13, [x9, x13, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ubfx x14, x17, #32, #8
+ eor w13, w13, w15, lsl 8
+ ubfx x15, x16, #8, #8
+ eor w13, w13, w21, lsl 16
+ ubfx x21, x16, #48, #8
+ eor w13, w13, w22, lsl 24
+ ubfx x22, x17, #24, #8
+ bfi x12, x13, #32, #32
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ ldrb w14, [x9, x14, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ubfx x20, x17, #56, #8
+ eor w14, w14, w15, lsl 8
+ ubfx x15, x16, #0, #8
+ eor w14, w14, w21, lsl 16
+ ubfx x21, x16, #40, #8
+ eor w13, w14, w22, lsl 24
+ ubfx x22, x17, #16, #8
+ ldrb w20, [x9, x20, LSL 0]
+ ldrb w21, [x9, x21, LSL 0]
+ ldrb w15, [x9, x15, LSL 0]
+ ldrb w22, [x9, x22, LSL 0]
+ eor w21, w21, w20, lsl 16
+ ldp x16, x17, [x28]
+ eor w15, w15, w21, lsl 8
+ eor w15, w15, w22, lsl 16
+ bfi x13, x15, #32, #32
+ ; XOR in Key Schedule
+ eor x12, x12, x16
+ eor x13, x13, x17
+ rev32 x12, x12
+ rev32 x13, x13
+ eor x12, x12, x23
+ eor x13, x13, x24
+ stp x12, x13, [x1]
+L_AES_XTS_decrypt_done_data
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldp x24, x25, [x29, #72]
+ ldp x26, x27, [x29, #88]
+ ldr x28, [x29, #104]
+ ldp x29, x30, [sp], #0x70
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+ END
diff --git a/wolfcrypt/src/port/arm/armv8-chacha-asm.asm b/wolfcrypt/src/port/arm/armv8-chacha-asm.asm
new file mode 100644
index 0000000000..6a8a7e6565
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-chacha-asm.asm
@@ -0,0 +1,1016 @@
+; /* armv8-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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./chacha/chacha.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-chacha-asm.asm
+ IF :DEF:HAVE_CHACHA
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_chacha20_arm64_ctr
+ DCD 0x00000000, 0x00000001, 0x00000002, 0x00000003
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_chacha20_arm64_rol8
+ DCD 0x02010003, 0x06050407, 0x0a09080b, 0x0e0d0c0f
+ IF :LNOT::DEF:WOLFSSL_ARMASM_NO_NEON
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT wc_chacha_crypt_bytes
+wc_chacha_crypt_bytes PROC
+ stp x29, x30, [sp, #-160]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ stp x24, x25, [x29, #72]
+ str x26, [x29, #88]
+ stp d8, d9, [x29, #96]
+ stp d10, d11, [x29, #112]
+ stp d12, d13, [x29, #128]
+ stp d14, d15, [x29, #144]
+ adrp x5, L_chacha20_arm64_rol8
+ add x5, x5, L_chacha20_arm64_rol8
+ adrp x6, L_chacha20_arm64_ctr
+ add x6, x6, L_chacha20_arm64_ctr
+ eor v29.16b, v29.16b, v29.16b
+ mov x26, #5
+ eor v31.16b, v31.16b, v31.16b
+ mov w7, #1
+ ld1 {v30.16b}, [x5]
+ ld1 {v28.4s}, [x6]
+ add x4, x0, #0x44
+ mov v29.s[0], w26
+ mov v31.s[0], w7
+ ; Load state to encrypt
+ ld1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x0]
+ cmp x3, #0x140
+ blt L_chacha_crypt_bytes_arm64_lt_320
+ mov w25, #4
+L_chacha_crypt_bytes_arm64_loop_320
+ ; Move state into regular register
+ mov x8, v16.d[0]
+ mov x10, v16.d[1]
+ mov x12, v17.d[0]
+ mov x14, v17.d[1]
+ mov x16, v18.d[0]
+ mov x19, v18.d[1]
+ mov x21, v19.d[0]
+ mov x23, v19.d[1]
+ sub x3, x3, #0x140
+ ; Move state into vector registers
+ dup v0.4s, v16.s[0]
+ dup v1.4s, v16.s[1]
+ lsr x9, x8, #32
+ dup v2.4s, v16.s[2]
+ dup v3.4s, v16.s[3]
+ lsr x11, x10, #32
+ dup v4.4s, v17.s[0]
+ dup v5.4s, v17.s[1]
+ lsr x13, x12, #32
+ dup v6.4s, v17.s[2]
+ dup v7.4s, v17.s[3]
+ lsr x15, x14, #32
+ dup v8.4s, v18.s[0]
+ dup v9.4s, v18.s[1]
+ lsr x17, x16, #32
+ dup v10.4s, v18.s[2]
+ dup v11.4s, v18.s[3]
+ lsr x20, x19, #32
+ dup v12.4s, v19.s[0]
+ dup v13.4s, v19.s[1]
+ lsr x22, x21, #32
+ dup v14.4s, v19.s[2]
+ dup v15.4s, v19.s[3]
+ lsr x24, x23, #32
+ ; Add to counter word
+ add v12.4s, v12.4s, v28.4s
+ add w21, w21, w25
+ ; Set number of odd+even rounds to perform
+ mov x26, #10
+L_chacha_crypt_bytes_arm64_round_start_320
+ subs x26, x26, #1
+ ; Round odd
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v4.4s
+ add w8, w8, w12
+ add v1.4s, v1.4s, v5.4s
+ add w9, w9, w13
+ add v2.4s, v2.4s, v6.4s
+ add w10, w10, w14
+ add v3.4s, v3.4s, v7.4s
+ add w11, w11, w15
+ eor v12.16b, v12.16b, v0.16b
+ eor w21, w21, w8
+ eor v13.16b, v13.16b, v1.16b
+ eor w22, w22, w9
+ eor v14.16b, v14.16b, v2.16b
+ eor w23, w23, w10
+ eor v15.16b, v15.16b, v3.16b
+ eor w24, w24, w11
+ rev32 v12.8h, v12.8h
+ ror w21, w21, #16
+ rev32 v13.8h, v13.8h
+ ror w22, w22, #16
+ rev32 v14.8h, v14.8h
+ ror w23, w23, #16
+ rev32 v15.8h, v15.8h
+ ror w24, w24, #16
+ ; c += d; b ^= c; b <<<= 12;
+ add v8.4s, v8.4s, v12.4s
+ add w16, w16, w21
+ add v9.4s, v9.4s, v13.4s
+ add w17, w17, w22
+ add v10.4s, v10.4s, v14.4s
+ add w19, w19, w23
+ add v11.4s, v11.4s, v15.4s
+ add w20, w20, w24
+ eor v20.16b, v4.16b, v8.16b
+ eor w12, w12, w16
+ eor v21.16b, v5.16b, v9.16b
+ eor w13, w13, w17
+ eor v22.16b, v6.16b, v10.16b
+ eor w14, w14, w19
+ eor v23.16b, v7.16b, v11.16b
+ eor w15, w15, w20
+ shl v4.4s, v20.4s, #12
+ ror w12, w12, #20
+ shl v5.4s, v21.4s, #12
+ ror w13, w13, #20
+ shl v6.4s, v22.4s, #12
+ ror w14, w14, #20
+ shl v7.4s, v23.4s, #12
+ ror w15, w15, #20
+ sri v4.4s, v20.4s, #20
+ sri v5.4s, v21.4s, #20
+ sri v6.4s, v22.4s, #20
+ sri v7.4s, v23.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v4.4s
+ add w8, w8, w12
+ add v1.4s, v1.4s, v5.4s
+ add w9, w9, w13
+ add v2.4s, v2.4s, v6.4s
+ add w10, w10, w14
+ add v3.4s, v3.4s, v7.4s
+ add w11, w11, w15
+ eor v12.16b, v12.16b, v0.16b
+ eor w21, w21, w8
+ eor v13.16b, v13.16b, v1.16b
+ eor w22, w22, w9
+ eor v14.16b, v14.16b, v2.16b
+ eor w23, w23, w10
+ eor v15.16b, v15.16b, v3.16b
+ eor w24, w24, w11
+ tbl v12.16b, {v12.16b}, v30.16b
+ ror w21, w21, #24
+ tbl v13.16b, {v13.16b}, v30.16b
+ ror w22, w22, #24
+ tbl v14.16b, {v14.16b}, v30.16b
+ ror w23, w23, #24
+ tbl v15.16b, {v15.16b}, v30.16b
+ ror w24, w24, #24
+ ; c += d; b ^= c; b <<<= 7;
+ add v8.4s, v8.4s, v12.4s
+ add w16, w16, w21
+ add v9.4s, v9.4s, v13.4s
+ add w17, w17, w22
+ add v10.4s, v10.4s, v14.4s
+ add w19, w19, w23
+ add v11.4s, v11.4s, v15.4s
+ add w20, w20, w24
+ eor v20.16b, v4.16b, v8.16b
+ eor w12, w12, w16
+ eor v21.16b, v5.16b, v9.16b
+ eor w13, w13, w17
+ eor v22.16b, v6.16b, v10.16b
+ eor w14, w14, w19
+ eor v23.16b, v7.16b, v11.16b
+ eor w15, w15, w20
+ shl v4.4s, v20.4s, #7
+ ror w12, w12, #25
+ shl v5.4s, v21.4s, #7
+ ror w13, w13, #25
+ shl v6.4s, v22.4s, #7
+ ror w14, w14, #25
+ shl v7.4s, v23.4s, #7
+ ror w15, w15, #25
+ sri v4.4s, v20.4s, #25
+ sri v5.4s, v21.4s, #25
+ sri v6.4s, v22.4s, #25
+ sri v7.4s, v23.4s, #25
+ ; Round even
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v5.4s
+ add w8, w8, w13
+ add v1.4s, v1.4s, v6.4s
+ add w9, w9, w14
+ add v2.4s, v2.4s, v7.4s
+ add w10, w10, w15
+ add v3.4s, v3.4s, v4.4s
+ add w11, w11, w12
+ eor v15.16b, v15.16b, v0.16b
+ eor w24, w24, w8
+ eor v12.16b, v12.16b, v1.16b
+ eor w21, w21, w9
+ eor v13.16b, v13.16b, v2.16b
+ eor w22, w22, w10
+ eor v14.16b, v14.16b, v3.16b
+ eor w23, w23, w11
+ rev32 v15.8h, v15.8h
+ ror w24, w24, #16
+ rev32 v12.8h, v12.8h
+ ror w21, w21, #16
+ rev32 v13.8h, v13.8h
+ ror w22, w22, #16
+ rev32 v14.8h, v14.8h
+ ror w23, w23, #16
+ ; c += d; b ^= c; b <<<= 12;
+ add v10.4s, v10.4s, v15.4s
+ add w19, w19, w24
+ add v11.4s, v11.4s, v12.4s
+ add w20, w20, w21
+ add v8.4s, v8.4s, v13.4s
+ add w16, w16, w22
+ add v9.4s, v9.4s, v14.4s
+ add w17, w17, w23
+ eor v20.16b, v5.16b, v10.16b
+ eor w13, w13, w19
+ eor v21.16b, v6.16b, v11.16b
+ eor w14, w14, w20
+ eor v22.16b, v7.16b, v8.16b
+ eor w15, w15, w16
+ eor v23.16b, v4.16b, v9.16b
+ eor w12, w12, w17
+ shl v5.4s, v20.4s, #12
+ ror w13, w13, #20
+ shl v6.4s, v21.4s, #12
+ ror w14, w14, #20
+ shl v7.4s, v22.4s, #12
+ ror w15, w15, #20
+ shl v4.4s, v23.4s, #12
+ ror w12, w12, #20
+ sri v5.4s, v20.4s, #20
+ sri v6.4s, v21.4s, #20
+ sri v7.4s, v22.4s, #20
+ sri v4.4s, v23.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v5.4s
+ add w8, w8, w13
+ add v1.4s, v1.4s, v6.4s
+ add w9, w9, w14
+ add v2.4s, v2.4s, v7.4s
+ add w10, w10, w15
+ add v3.4s, v3.4s, v4.4s
+ add w11, w11, w12
+ eor v15.16b, v15.16b, v0.16b
+ eor w24, w24, w8
+ eor v12.16b, v12.16b, v1.16b
+ eor w21, w21, w9
+ eor v13.16b, v13.16b, v2.16b
+ eor w22, w22, w10
+ eor v14.16b, v14.16b, v3.16b
+ eor w23, w23, w11
+ tbl v15.16b, {v15.16b}, v30.16b
+ ror w24, w24, #24
+ tbl v12.16b, {v12.16b}, v30.16b
+ ror w21, w21, #24
+ tbl v13.16b, {v13.16b}, v30.16b
+ ror w22, w22, #24
+ tbl v14.16b, {v14.16b}, v30.16b
+ ror w23, w23, #24
+ ; c += d; b ^= c; b <<<= 7;
+ add v10.4s, v10.4s, v15.4s
+ add w19, w19, w24
+ add v11.4s, v11.4s, v12.4s
+ add w20, w20, w21
+ add v8.4s, v8.4s, v13.4s
+ add w16, w16, w22
+ add v9.4s, v9.4s, v14.4s
+ add w17, w17, w23
+ eor v20.16b, v5.16b, v10.16b
+ eor w13, w13, w19
+ eor v21.16b, v6.16b, v11.16b
+ eor w14, w14, w20
+ eor v22.16b, v7.16b, v8.16b
+ eor w15, w15, w16
+ eor v23.16b, v4.16b, v9.16b
+ eor w12, w12, w17
+ shl v5.4s, v20.4s, #7
+ ror w13, w13, #25
+ shl v6.4s, v21.4s, #7
+ ror w14, w14, #25
+ shl v7.4s, v22.4s, #7
+ ror w15, w15, #25
+ shl v4.4s, v23.4s, #7
+ ror w12, w12, #25
+ sri v5.4s, v20.4s, #25
+ sri v6.4s, v21.4s, #25
+ sri v7.4s, v22.4s, #25
+ sri v4.4s, v23.4s, #25
+ bne L_chacha_crypt_bytes_arm64_round_start_320
+ ; Add counter now rather than after transposed
+ add v12.4s, v12.4s, v28.4s
+ add w21, w21, w25
+ ; Load message
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ ; Transpose vectors
+ trn1 v20.4s, v0.4s, v1.4s
+ trn1 v22.4s, v2.4s, v3.4s
+ orr x8, x8, x9, lsl 32
+ trn2 v21.4s, v0.4s, v1.4s
+ trn2 v23.4s, v2.4s, v3.4s
+ trn1 v0.2d, v20.2d, v22.2d
+ trn1 v1.2d, v21.2d, v23.2d
+ orr x10, x10, x11, lsl 32
+ trn2 v2.2d, v20.2d, v22.2d
+ trn2 v3.2d, v21.2d, v23.2d
+ trn1 v20.4s, v4.4s, v5.4s
+ trn1 v22.4s, v6.4s, v7.4s
+ orr x12, x12, x13, lsl 32
+ trn2 v21.4s, v4.4s, v5.4s
+ trn2 v23.4s, v6.4s, v7.4s
+ trn1 v4.2d, v20.2d, v22.2d
+ trn1 v5.2d, v21.2d, v23.2d
+ orr x14, x14, x15, lsl 32
+ trn2 v6.2d, v20.2d, v22.2d
+ trn2 v7.2d, v21.2d, v23.2d
+ trn1 v20.4s, v8.4s, v9.4s
+ trn1 v22.4s, v10.4s, v11.4s
+ orr x16, x16, x17, lsl 32
+ trn2 v21.4s, v8.4s, v9.4s
+ trn2 v23.4s, v10.4s, v11.4s
+ trn1 v8.2d, v20.2d, v22.2d
+ trn1 v9.2d, v21.2d, v23.2d
+ orr x19, x19, x20, lsl 32
+ trn2 v10.2d, v20.2d, v22.2d
+ trn2 v11.2d, v21.2d, v23.2d
+ trn1 v20.4s, v12.4s, v13.4s
+ trn1 v22.4s, v14.4s, v15.4s
+ orr x21, x21, x22, lsl 32
+ trn2 v21.4s, v12.4s, v13.4s
+ trn2 v23.4s, v14.4s, v15.4s
+ trn1 v12.2d, v20.2d, v22.2d
+ trn1 v13.2d, v21.2d, v23.2d
+ orr x23, x23, x24, lsl 32
+ trn2 v14.2d, v20.2d, v22.2d
+ trn2 v15.2d, v21.2d, v23.2d
+ ; Add back state, XOR in message and store (load next block)
+ add v20.4s, v0.4s, v16.4s
+ add v21.4s, v4.4s, v17.4s
+ add v22.4s, v8.4s, v18.4s
+ add v23.4s, v12.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ add v20.4s, v1.4s, v16.4s
+ add v21.4s, v5.4s, v17.4s
+ add v22.4s, v9.4s, v18.4s
+ add v23.4s, v13.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ add v20.4s, v2.4s, v16.4s
+ add v21.4s, v6.4s, v17.4s
+ add v22.4s, v10.4s, v18.4s
+ add v23.4s, v14.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ add v20.4s, v3.4s, v16.4s
+ add v21.4s, v7.4s, v17.4s
+ add v22.4s, v11.4s, v18.4s
+ add v23.4s, v15.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ ; Move regular registers into vector registers for adding and xor
+ mov v0.d[0], x8
+ mov v0.d[1], x10
+ mov v1.d[0], x12
+ mov v1.d[1], x14
+ mov v2.d[0], x16
+ mov v2.d[1], x19
+ mov v3.d[0], x21
+ mov v3.d[1], x23
+ ; Add back state, XOR in message and store
+ add v0.4s, v0.4s, v16.4s
+ add v1.4s, v1.4s, v17.4s
+ add v2.4s, v2.4s, v18.4s
+ add v3.4s, v3.4s, v19.4s
+ eor v0.16b, v0.16b, v24.16b
+ eor v1.16b, v1.16b, v25.16b
+ eor v2.16b, v2.16b, v26.16b
+ eor v3.16b, v3.16b, v27.16b
+ st1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x1], #0x40
+ cmp x3, #0x140
+ add v19.4s, v19.4s, v29.4s
+ bge L_chacha_crypt_bytes_arm64_loop_320
+ ; Done doing 320 bytes at a time
+L_chacha_crypt_bytes_arm64_lt_320
+ cmp x3, #0x100
+ blt L_chacha_crypt_bytes_arm64_lt_256
+ ; Move state into vector registers
+ dup v0.4s, v16.s[0]
+ dup v1.4s, v16.s[1]
+ dup v2.4s, v16.s[2]
+ dup v3.4s, v16.s[3]
+ dup v4.4s, v17.s[0]
+ dup v5.4s, v17.s[1]
+ dup v6.4s, v17.s[2]
+ dup v7.4s, v17.s[3]
+ dup v8.4s, v18.s[0]
+ dup v9.4s, v18.s[1]
+ dup v10.4s, v18.s[2]
+ dup v11.4s, v18.s[3]
+ dup v12.4s, v19.s[0]
+ dup v13.4s, v19.s[1]
+ dup v14.4s, v19.s[2]
+ dup v15.4s, v19.s[3]
+ ; Add to counter word
+ add v12.4s, v12.4s, v28.4s
+ ; Set number of odd+even rounds to perform
+ mov x26, #10
+L_chacha_crypt_bytes_arm64_round_start_256
+ subs x26, x26, #1
+ ; Round odd
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v4.4s
+ add v1.4s, v1.4s, v5.4s
+ add v2.4s, v2.4s, v6.4s
+ add v3.4s, v3.4s, v7.4s
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ eor v14.16b, v14.16b, v2.16b
+ eor v15.16b, v15.16b, v3.16b
+ rev32 v12.8h, v12.8h
+ rev32 v13.8h, v13.8h
+ rev32 v14.8h, v14.8h
+ rev32 v15.8h, v15.8h
+ ; c += d; b ^= c; b <<<= 12;
+ add v8.4s, v8.4s, v12.4s
+ add v9.4s, v9.4s, v13.4s
+ add v10.4s, v10.4s, v14.4s
+ add v11.4s, v11.4s, v15.4s
+ eor v20.16b, v4.16b, v8.16b
+ eor v21.16b, v5.16b, v9.16b
+ eor v22.16b, v6.16b, v10.16b
+ eor v23.16b, v7.16b, v11.16b
+ shl v4.4s, v20.4s, #12
+ shl v5.4s, v21.4s, #12
+ shl v6.4s, v22.4s, #12
+ shl v7.4s, v23.4s, #12
+ sri v4.4s, v20.4s, #20
+ sri v5.4s, v21.4s, #20
+ sri v6.4s, v22.4s, #20
+ sri v7.4s, v23.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v4.4s
+ add v1.4s, v1.4s, v5.4s
+ add v2.4s, v2.4s, v6.4s
+ add v3.4s, v3.4s, v7.4s
+ eor v12.16b, v12.16b, v0.16b
+ eor v13.16b, v13.16b, v1.16b
+ eor v14.16b, v14.16b, v2.16b
+ eor v15.16b, v15.16b, v3.16b
+ tbl v12.16b, {v12.16b}, v30.16b
+ tbl v13.16b, {v13.16b}, v30.16b
+ tbl v14.16b, {v14.16b}, v30.16b
+ tbl v15.16b, {v15.16b}, v30.16b
+ ; c += d; b ^= c; b <<<= 7;
+ add v8.4s, v8.4s, v12.4s
+ add v9.4s, v9.4s, v13.4s
+ add v10.4s, v10.4s, v14.4s
+ add v11.4s, v11.4s, v15.4s
+ eor v20.16b, v4.16b, v8.16b
+ eor v21.16b, v5.16b, v9.16b
+ eor v22.16b, v6.16b, v10.16b
+ eor v23.16b, v7.16b, v11.16b
+ shl v4.4s, v20.4s, #7
+ shl v5.4s, v21.4s, #7
+ shl v6.4s, v22.4s, #7
+ shl v7.4s, v23.4s, #7
+ sri v4.4s, v20.4s, #25
+ sri v5.4s, v21.4s, #25
+ sri v6.4s, v22.4s, #25
+ sri v7.4s, v23.4s, #25
+ ; Round even
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v5.4s
+ add v1.4s, v1.4s, v6.4s
+ add v2.4s, v2.4s, v7.4s
+ add v3.4s, v3.4s, v4.4s
+ eor v15.16b, v15.16b, v0.16b
+ eor v12.16b, v12.16b, v1.16b
+ eor v13.16b, v13.16b, v2.16b
+ eor v14.16b, v14.16b, v3.16b
+ rev32 v15.8h, v15.8h
+ rev32 v12.8h, v12.8h
+ rev32 v13.8h, v13.8h
+ rev32 v14.8h, v14.8h
+ ; c += d; b ^= c; b <<<= 12;
+ add v10.4s, v10.4s, v15.4s
+ add v11.4s, v11.4s, v12.4s
+ add v8.4s, v8.4s, v13.4s
+ add v9.4s, v9.4s, v14.4s
+ eor v20.16b, v5.16b, v10.16b
+ eor v21.16b, v6.16b, v11.16b
+ eor v22.16b, v7.16b, v8.16b
+ eor v23.16b, v4.16b, v9.16b
+ shl v5.4s, v20.4s, #12
+ shl v6.4s, v21.4s, #12
+ shl v7.4s, v22.4s, #12
+ shl v4.4s, v23.4s, #12
+ sri v5.4s, v20.4s, #20
+ sri v6.4s, v21.4s, #20
+ sri v7.4s, v22.4s, #20
+ sri v4.4s, v23.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v5.4s
+ add v1.4s, v1.4s, v6.4s
+ add v2.4s, v2.4s, v7.4s
+ add v3.4s, v3.4s, v4.4s
+ eor v15.16b, v15.16b, v0.16b
+ eor v12.16b, v12.16b, v1.16b
+ eor v13.16b, v13.16b, v2.16b
+ eor v14.16b, v14.16b, v3.16b
+ tbl v15.16b, {v15.16b}, v30.16b
+ tbl v12.16b, {v12.16b}, v30.16b
+ tbl v13.16b, {v13.16b}, v30.16b
+ tbl v14.16b, {v14.16b}, v30.16b
+ ; c += d; b ^= c; b <<<= 7;
+ add v10.4s, v10.4s, v15.4s
+ add v11.4s, v11.4s, v12.4s
+ add v8.4s, v8.4s, v13.4s
+ add v9.4s, v9.4s, v14.4s
+ eor v20.16b, v5.16b, v10.16b
+ eor v21.16b, v6.16b, v11.16b
+ eor v22.16b, v7.16b, v8.16b
+ eor v23.16b, v4.16b, v9.16b
+ shl v5.4s, v20.4s, #7
+ shl v6.4s, v21.4s, #7
+ shl v7.4s, v22.4s, #7
+ shl v4.4s, v23.4s, #7
+ sri v5.4s, v20.4s, #25
+ sri v6.4s, v21.4s, #25
+ sri v7.4s, v22.4s, #25
+ sri v4.4s, v23.4s, #25
+ bne L_chacha_crypt_bytes_arm64_round_start_256
+ mov x26, #4
+ ; Add counter now rather than after transposed
+ add v12.4s, v12.4s, v28.4s
+ ; Load message
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ ; Transpose vectors
+ trn1 v20.4s, v0.4s, v1.4s
+ trn1 v22.4s, v2.4s, v3.4s
+ trn2 v21.4s, v0.4s, v1.4s
+ trn2 v23.4s, v2.4s, v3.4s
+ trn1 v0.2d, v20.2d, v22.2d
+ trn1 v1.2d, v21.2d, v23.2d
+ trn2 v2.2d, v20.2d, v22.2d
+ trn2 v3.2d, v21.2d, v23.2d
+ trn1 v20.4s, v4.4s, v5.4s
+ trn1 v22.4s, v6.4s, v7.4s
+ trn2 v21.4s, v4.4s, v5.4s
+ trn2 v23.4s, v6.4s, v7.4s
+ trn1 v4.2d, v20.2d, v22.2d
+ trn1 v5.2d, v21.2d, v23.2d
+ trn2 v6.2d, v20.2d, v22.2d
+ trn2 v7.2d, v21.2d, v23.2d
+ trn1 v20.4s, v8.4s, v9.4s
+ trn1 v22.4s, v10.4s, v11.4s
+ trn2 v21.4s, v8.4s, v9.4s
+ trn2 v23.4s, v10.4s, v11.4s
+ trn1 v8.2d, v20.2d, v22.2d
+ trn1 v9.2d, v21.2d, v23.2d
+ trn2 v10.2d, v20.2d, v22.2d
+ trn2 v11.2d, v21.2d, v23.2d
+ trn1 v20.4s, v12.4s, v13.4s
+ trn1 v22.4s, v14.4s, v15.4s
+ trn2 v21.4s, v12.4s, v13.4s
+ trn2 v23.4s, v14.4s, v15.4s
+ trn1 v12.2d, v20.2d, v22.2d
+ trn1 v13.2d, v21.2d, v23.2d
+ trn2 v14.2d, v20.2d, v22.2d
+ trn2 v15.2d, v21.2d, v23.2d
+ ; Add back state, XOR in message and store (load next block)
+ add v20.4s, v0.4s, v16.4s
+ add v21.4s, v4.4s, v17.4s
+ add v22.4s, v8.4s, v18.4s
+ add v23.4s, v12.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ add v20.4s, v1.4s, v16.4s
+ add v21.4s, v5.4s, v17.4s
+ add v22.4s, v9.4s, v18.4s
+ add v23.4s, v13.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ add v20.4s, v2.4s, v16.4s
+ add v21.4s, v6.4s, v17.4s
+ add v22.4s, v10.4s, v18.4s
+ add v23.4s, v14.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ add v20.4s, v3.4s, v16.4s
+ add v21.4s, v7.4s, v17.4s
+ add v22.4s, v11.4s, v18.4s
+ add v23.4s, v15.4s, v19.4s
+ eor v20.16b, v20.16b, v24.16b
+ eor v21.16b, v21.16b, v25.16b
+ eor v22.16b, v22.16b, v26.16b
+ eor v23.16b, v23.16b, v27.16b
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ mov v29.s[0], w26
+ sub x3, x3, #0x100
+ add v19.4s, v19.4s, v29.4s
+ ; Done 256-byte block
+L_chacha_crypt_bytes_arm64_lt_256
+ cmp x3, #0x80
+ blt L_chacha_crypt_bytes_arm64_lt_128
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ ; Move state into vector registers
+ mov v4.16b, v16.16b
+ mov v5.16b, v17.16b
+ mov v6.16b, v18.16b
+ mov v7.16b, v19.16b
+ mov v0.16b, v16.16b
+ mov v1.16b, v17.16b
+ mov v2.16b, v18.16b
+ mov v3.16b, v19.16b
+ ; Add counter word
+ add v7.4s, v7.4s, v31.4s
+ ; Set number of odd+even rounds to perform
+ mov x26, #10
+L_chacha_crypt_bytes_arm64_round_start_128
+ subs x26, x26, #1
+ ; Round odd
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v1.4s
+ add v4.4s, v4.4s, v5.4s
+ eor v3.16b, v3.16b, v0.16b
+ eor v7.16b, v7.16b, v4.16b
+ rev32 v3.8h, v3.8h
+ rev32 v7.8h, v7.8h
+ ; c += d; b ^= c; b <<<= 12;
+ add v2.4s, v2.4s, v3.4s
+ add v6.4s, v6.4s, v7.4s
+ eor v20.16b, v1.16b, v2.16b
+ eor v21.16b, v5.16b, v6.16b
+ shl v1.4s, v20.4s, #12
+ shl v5.4s, v21.4s, #12
+ sri v1.4s, v20.4s, #20
+ sri v5.4s, v21.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v1.4s
+ add v4.4s, v4.4s, v5.4s
+ eor v3.16b, v3.16b, v0.16b
+ eor v7.16b, v7.16b, v4.16b
+ tbl v3.16b, {v3.16b}, v30.16b
+ tbl v7.16b, {v7.16b}, v30.16b
+ ; c += d; b ^= c; b <<<= 7;
+ add v2.4s, v2.4s, v3.4s
+ add v6.4s, v6.4s, v7.4s
+ eor v20.16b, v1.16b, v2.16b
+ eor v21.16b, v5.16b, v6.16b
+ shl v1.4s, v20.4s, #7
+ shl v5.4s, v21.4s, #7
+ sri v1.4s, v20.4s, #25
+ sri v5.4s, v21.4s, #25
+ ext v3.16b, v3.16b, v3.16b, #12
+ ext v7.16b, v7.16b, v7.16b, #12
+ ext v1.16b, v1.16b, v1.16b, #4
+ ext v5.16b, v5.16b, v5.16b, #4
+ ext v2.16b, v2.16b, v2.16b, #8
+ ext v6.16b, v6.16b, v6.16b, #8
+ ; Round even
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v1.4s
+ add v4.4s, v4.4s, v5.4s
+ eor v3.16b, v3.16b, v0.16b
+ eor v7.16b, v7.16b, v4.16b
+ rev32 v3.8h, v3.8h
+ rev32 v7.8h, v7.8h
+ ; c += d; b ^= c; b <<<= 12;
+ add v2.4s, v2.4s, v3.4s
+ add v6.4s, v6.4s, v7.4s
+ eor v20.16b, v1.16b, v2.16b
+ eor v21.16b, v5.16b, v6.16b
+ shl v1.4s, v20.4s, #12
+ shl v5.4s, v21.4s, #12
+ sri v1.4s, v20.4s, #20
+ sri v5.4s, v21.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v1.4s
+ add v4.4s, v4.4s, v5.4s
+ eor v3.16b, v3.16b, v0.16b
+ eor v7.16b, v7.16b, v4.16b
+ tbl v3.16b, {v3.16b}, v30.16b
+ tbl v7.16b, {v7.16b}, v30.16b
+ ; c += d; b ^= c; b <<<= 7;
+ add v2.4s, v2.4s, v3.4s
+ add v6.4s, v6.4s, v7.4s
+ eor v20.16b, v1.16b, v2.16b
+ eor v21.16b, v5.16b, v6.16b
+ shl v1.4s, v20.4s, #7
+ shl v5.4s, v21.4s, #7
+ sri v1.4s, v20.4s, #25
+ sri v5.4s, v21.4s, #25
+ ext v3.16b, v3.16b, v3.16b, #4
+ ext v7.16b, v7.16b, v7.16b, #4
+ ext v1.16b, v1.16b, v1.16b, #12
+ ext v5.16b, v5.16b, v5.16b, #12
+ ext v2.16b, v2.16b, v2.16b, #8
+ ext v6.16b, v6.16b, v6.16b, #8
+ bne L_chacha_crypt_bytes_arm64_round_start_128
+ ; Add back state, XOR in message and store (load next block)
+ add v0.4s, v0.4s, v16.4s
+ add v1.4s, v1.4s, v17.4s
+ add v2.4s, v2.4s, v18.4s
+ add v3.4s, v3.4s, v19.4s
+ eor v24.16b, v24.16b, v0.16b
+ eor v25.16b, v25.16b, v1.16b
+ eor v26.16b, v26.16b, v2.16b
+ eor v27.16b, v27.16b, v3.16b
+ ld1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x2], #0x40
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ add v19.4s, v19.4s, v31.4s
+ add v4.4s, v4.4s, v16.4s
+ add v5.4s, v5.4s, v17.4s
+ add v6.4s, v6.4s, v18.4s
+ add v7.4s, v7.4s, v19.4s
+ eor v20.16b, v20.16b, v4.16b
+ eor v21.16b, v21.16b, v5.16b
+ eor v22.16b, v22.16b, v6.16b
+ eor v23.16b, v23.16b, v7.16b
+ st1 {v20.16b, v21.16b, v22.16b, v23.16b}, [x1], #0x40
+ add v19.4s, v19.4s, v31.4s
+ sub x3, x3, #0x80
+ ; Done 128-byte block
+L_chacha_crypt_bytes_arm64_lt_128
+ cmp x3, #0
+ beq L_chacha_crypt_bytes_arm64_done_all
+ mov w5, #0x40
+L_chacha_crypt_bytes_arm64_loop_64
+ ; Move state into vector registers
+ mov v0.16b, v16.16b
+ mov v1.16b, v17.16b
+ mov v2.16b, v18.16b
+ mov v3.16b, v19.16b
+ ; Set number of odd+even rounds to perform
+ mov x26, #10
+L_chacha_crypt_bytes_arm64_round_64
+ subs x26, x26, #1
+ ; Round odd
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v1.4s
+ eor v3.16b, v3.16b, v0.16b
+ rev32 v3.8h, v3.8h
+ ; c += d; b ^= c; b <<<= 12;
+ add v2.4s, v2.4s, v3.4s
+ eor v20.16b, v1.16b, v2.16b
+ shl v1.4s, v20.4s, #12
+ sri v1.4s, v20.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v1.4s
+ eor v3.16b, v3.16b, v0.16b
+ tbl v3.16b, {v3.16b}, v30.16b
+ ; c += d; b ^= c; b <<<= 7;
+ add v2.4s, v2.4s, v3.4s
+ eor v20.16b, v1.16b, v2.16b
+ shl v1.4s, v20.4s, #7
+ sri v1.4s, v20.4s, #25
+ ext v3.16b, v3.16b, v3.16b, #12
+ ext v1.16b, v1.16b, v1.16b, #4
+ ext v2.16b, v2.16b, v2.16b, #8
+ ; Round even
+ ; a += b; d ^= a; d <<<= 16;
+ add v0.4s, v0.4s, v1.4s
+ eor v3.16b, v3.16b, v0.16b
+ rev32 v3.8h, v3.8h
+ ; c += d; b ^= c; b <<<= 12;
+ add v2.4s, v2.4s, v3.4s
+ eor v20.16b, v1.16b, v2.16b
+ shl v1.4s, v20.4s, #12
+ sri v1.4s, v20.4s, #20
+ ; a += b; d ^= a; d <<<= 8;
+ add v0.4s, v0.4s, v1.4s
+ eor v3.16b, v3.16b, v0.16b
+ tbl v3.16b, {v3.16b}, v30.16b
+ ; c += d; b ^= c; b <<<= 7;
+ add v2.4s, v2.4s, v3.4s
+ eor v20.16b, v1.16b, v2.16b
+ shl v1.4s, v20.4s, #7
+ sri v1.4s, v20.4s, #25
+ ext v3.16b, v3.16b, v3.16b, #4
+ ext v1.16b, v1.16b, v1.16b, #12
+ ext v2.16b, v2.16b, v2.16b, #8
+ bne L_chacha_crypt_bytes_arm64_round_64
+ ; Add back state
+ add v0.4s, v0.4s, v16.4s
+ add v1.4s, v1.4s, v17.4s
+ add v2.4s, v2.4s, v18.4s
+ add v3.4s, v3.4s, v19.4s
+ ; Check if data is less than 64 bytes - store in over
+ cmp x3, #0x40
+ add v19.4s, v19.4s, v31.4s
+ blt L_chacha_crypt_bytes_arm64_lt_64
+ ; Encipher 64 bytes
+ ld1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x2], #0x40
+ eor v24.16b, v24.16b, v0.16b
+ eor v25.16b, v25.16b, v1.16b
+ eor v26.16b, v26.16b, v2.16b
+ eor v27.16b, v27.16b, v3.16b
+ st1 {v24.16b, v25.16b, v26.16b, v27.16b}, [x1], #0x40
+ ; Check for more bytes to be enciphered
+ subs x3, x3, #0x40
+ bne L_chacha_crypt_bytes_arm64_loop_64
+ b L_chacha_crypt_bytes_arm64_done
+L_chacha_crypt_bytes_arm64_lt_64
+ ; Calculate bytes left in block not used
+ sub w5, w5, w3
+ ; Store encipher block in over for further operations and left
+ st1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x4]
+ str w5, [x0, #64]
+ ; Encipher 32 bytes
+ cmp x3, #32
+ blt L_chacha_crypt_bytes_arm64_lt_32
+ ld1 {v24.16b, v25.16b}, [x2], #32
+ eor v24.16b, v24.16b, v0.16b
+ eor v25.16b, v25.16b, v1.16b
+ st1 {v24.16b, v25.16b}, [x1], #32
+ subs x3, x3, #32
+ mov v0.16b, v2.16b
+ mov v1.16b, v3.16b
+ beq L_chacha_crypt_bytes_arm64_done
+L_chacha_crypt_bytes_arm64_lt_32
+ cmp x3, #16
+ blt L_chacha_crypt_bytes_arm64_lt_16
+ ; Encipher 16 bytes
+ ld1 {v24.16b}, [x2], #16
+ eor v24.16b, v24.16b, v0.16b
+ st1 {v24.16b}, [x1], #16
+ subs x3, x3, #16
+ mov v0.16b, v1.16b
+ beq L_chacha_crypt_bytes_arm64_done
+L_chacha_crypt_bytes_arm64_lt_16
+ cmp x3, #8
+ blt L_chacha_crypt_bytes_arm64_lt_8
+ ; Encipher 8 bytes
+ ld1 {v24.8b}, [x2], #8
+ eor v24.8b, v24.8b, v0.8b
+ st1 {v24.8b}, [x1], #8
+ subs x3, x3, #8
+ mov v0.d[0], v0.d[1]
+ beq L_chacha_crypt_bytes_arm64_done
+L_chacha_crypt_bytes_arm64_lt_8
+ mov x5, v0.d[0]
+L_chacha_crypt_bytes_arm64_loop_lt_8
+ ; Encipher 1 byte at a time
+ ldrb w6, [x2], #1
+ eor w6, w6, w5
+ strb w6, [x1], #1
+ subs x3, x3, #1
+ lsr x5, x5, #8
+ bgt L_chacha_crypt_bytes_arm64_loop_lt_8
+L_chacha_crypt_bytes_arm64_done
+L_chacha_crypt_bytes_arm64_done_all
+ st1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x0]
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldp x24, x25, [x29, #72]
+ ldr x26, [x29, #88]
+ ldp d8, d9, [x29, #96]
+ ldp d10, d11, [x29, #112]
+ ldp d12, d13, [x29, #128]
+ ldp d14, d15, [x29, #144]
+ ldp x29, x30, [sp], #0xa0
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT wc_chacha_setiv
+wc_chacha_setiv PROC
+ ldr x3, [x1]
+ ldr w4, [x1, #8]
+ str x2, [x0, #48]
+ str x3, [x0, #52]
+ str w4, [x0, #60]
+ ret
+ ENDP
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_chacha_setkey_arm64_constant
+ DCD 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574
+ DCD 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT wc_chacha_setkey
+wc_chacha_setkey PROC
+ adrp x3, L_chacha_setkey_arm64_constant
+ add x3, x3, L_chacha_setkey_arm64_constant
+ subs x2, x2, #16
+ add x3, x3, x2
+ ; Start with constants
+ ld1 {v0.4s}, [x3]
+ ld1 {v1.16b}, [x1], #16
+ IF :DEF:BIG_ENDIAN_ORDER
+ rev32 v1.8h, v1.8h
+ ENDIF
+ st1 {v0.4s}, [x0], #16
+ st1 {v1.4s}, [x0], #16
+ beq L_chacha_setkey_arm64_done
+ ld1 {v1.16b}, [x1]
+ IF :DEF:BIG_ENDIAN_ORDER
+ rev32 v1.8h, v1.8h
+ ENDIF
+L_chacha_setkey_arm64_done
+ st1 {v1.4s}, [x0]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT wc_chacha_use_over
+wc_chacha_use_over PROC
+L_chacha_use_over_arm64_16byte_loop
+ cmp x3, #16
+ blt L_chacha_use_over_arm64_word_loop
+ ; 16 bytes of state XORed into message.
+ ld1 {v0.16b}, [x0], #16
+ ld1 {v1.16b}, [x2], #16
+ eor v1.16b, v1.16b, v0.16b
+ subs x3, x3, #16
+ st1 {v1.16b}, [x1], #16
+ beq L_chacha_use_over_arm64_done
+ b L_chacha_use_over_arm64_16byte_loop
+L_chacha_use_over_arm64_word_loop
+ cmp x3, #4
+ blt L_chacha_use_over_arm64_byte_loop
+ ; 4 bytes of state XORed into message.
+ ldr w4, [x0], #4
+ ldr w5, [x2], #4
+ eor w5, w5, w4
+ subs x3, x3, #4
+ str w5, [x1], #4
+ beq L_chacha_use_over_arm64_done
+ b L_chacha_use_over_arm64_word_loop
+L_chacha_use_over_arm64_byte_loop
+ ; 1 bytes of state XORed into message.
+ ldrb w4, [x0], #1
+ ldrb w5, [x2], #1
+ eor w5, w5, w4
+ subs x3, x3, #1
+ strb w5, [x1], #1
+ bne L_chacha_use_over_arm64_byte_loop
+L_chacha_use_over_arm64_done
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ END
diff --git a/wolfcrypt/src/port/arm/armv8-curve25519.asm b/wolfcrypt/src/port/arm/armv8-curve25519.asm
new file mode 100644
index 0000000000..6c06c06bb6
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-curve25519.asm
@@ -0,0 +1,11482 @@
+; /* armv8-curve25519
+; *
+; * 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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./x25519/x25519.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-curve25519.asm
+ IF :DEF:HAVE_CURVE25519 :LOR: :DEF:HAVE_ED25519
+ IF :LNOT::DEF:CURVE25519_SMALL :LOR: :LNOT::DEF:ED25519_SMALL
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_init
+fe_init PROC
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_frombytes
+fe_frombytes PROC
+ ldp x2, x3, [x1]
+ ldp x4, x5, [x1, #16]
+ and x5, x5, #0x7fffffffffffffff
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_tobytes
+fe_tobytes PROC
+ mov x7, #19
+ ldp x2, x3, [x1]
+ ldp x4, x5, [x1, #16]
+ adds x6, x2, x7
+ adcs x6, x3, xzr
+ adcs x6, x4, xzr
+ adc x6, x5, xzr
+ and x6, x7, x6, asr 63
+ adds x2, x2, x6
+ adcs x3, x3, xzr
+ adcs x4, x4, xzr
+ adc x5, x5, xzr
+ and x5, x5, #0x7fffffffffffffff
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_1
+fe_1 PROC
+ ; Set one
+ mov x1, #1
+ stp x1, xzr, [x0]
+ stp xzr, xzr, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_0
+fe_0 PROC
+ ; Set zero
+ stp xzr, xzr, [x0]
+ stp xzr, xzr, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_copy
+fe_copy PROC
+ ; Copy
+ ldp x2, x3, [x1]
+ ldp x4, x5, [x1, #16]
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_sub
+fe_sub PROC
+ ; Sub
+ ldp x3, x4, [x1]
+ ldp x5, x6, [x1, #16]
+ ldp x7, x8, [x2]
+ ldp x9, x10, [x2, #16]
+ subs x3, x3, x7
+ sbcs x4, x4, x8
+ sbcs x5, x5, x9
+ sbcs x6, x6, x10
+ csetm x11, cc
+ mov x12, #-19
+ ; Mask the modulus
+ extr x11, x11, x6, #63
+ mul x12, x11, x12
+ ; Add modulus (if underflow)
+ subs x3, x3, x12
+ sbcs x4, x4, xzr
+ and x6, x6, #0x7fffffffffffffff
+ sbcs x5, x5, xzr
+ sbc x6, x6, xzr
+ stp x3, x4, [x0]
+ stp x5, x6, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_add
+fe_add PROC
+ ; Add
+ ldp x3, x4, [x1]
+ ldp x5, x6, [x1, #16]
+ ldp x7, x8, [x2]
+ ldp x9, x10, [x2, #16]
+ adds x3, x3, x7
+ adcs x4, x4, x8
+ adcs x5, x5, x9
+ adcs x6, x6, x10
+ cset x11, cs
+ mov x12, #19
+ ; Mask the modulus
+ extr x11, x11, x6, #63
+ mul x12, x11, x12
+ ; Sub modulus (if overflow)
+ adds x3, x3, x12
+ adcs x4, x4, xzr
+ and x6, x6, #0x7fffffffffffffff
+ adcs x5, x5, xzr
+ adc x6, x6, xzr
+ stp x3, x4, [x0]
+ stp x5, x6, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_neg
+fe_neg PROC
+ ldp x2, x3, [x1]
+ ldp x4, x5, [x1, #16]
+ mov x6, #-19
+ mov x7, #-1
+ mov x8, #-1
+ mov x9, #0x7fffffffffffffff
+ subs x6, x6, x2
+ sbcs x7, x7, x3
+ sbcs x8, x8, x4
+ sbc x9, x9, x5
+ stp x6, x7, [x0]
+ stp x8, x9, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_isnonzero
+fe_isnonzero PROC
+ mov x6, #19
+ ldp x1, x2, [x0]
+ ldp x3, x4, [x0, #16]
+ adds x5, x1, x6
+ adcs x5, x2, xzr
+ adcs x5, x3, xzr
+ adc x5, x4, xzr
+ and x5, x6, x5, asr 63
+ adds x1, x1, x5
+ adcs x2, x2, xzr
+ adcs x3, x3, xzr
+ adc x4, x4, xzr
+ and x4, x4, #0x7fffffffffffffff
+ orr x0, x1, x2
+ orr x3, x3, x4
+ orr x0, x0, x3
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_isnegative
+fe_isnegative PROC
+ mov x6, #19
+ ldp x1, x2, [x0]
+ ldp x3, x4, [x0, #16]
+ adds x5, x1, x6
+ adcs x5, x2, xzr
+ adcs x5, x3, xzr
+ adc x5, x4, xzr
+ and x0, x1, #1
+ eor x0, x0, x5, lsr 63
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_cmov_table
+fe_cmov_table PROC
+ stp x29, x30, [sp, #-128]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #40]
+ stp x20, x21, [x29, #56]
+ stp x22, x23, [x29, #72]
+ stp x24, x25, [x29, #88]
+ stp x26, x27, [x29, #104]
+ str x28, [x29, #120]
+ str x0, [x29, #16]
+ sxtb x2, w2
+ sbfx x3, x2, #7, #1
+ eor x0, x2, x3
+ sub x0, x0, x3
+ mov x4, #1
+ mov x5, xzr
+ mov x6, xzr
+ mov x7, xzr
+ mov x8, #1
+ mov x9, xzr
+ mov x10, xzr
+ mov x11, xzr
+ mov x12, xzr
+ mov x13, xzr
+ mov x14, xzr
+ mov x15, xzr
+ cmp x0, #1
+ ldp x16, x17, [x1]
+ ldp x19, x20, [x1, #16]
+ ldp x21, x22, [x1, #32]
+ ldp x23, x24, [x1, #48]
+ ldp x25, x26, [x1, #64]
+ ldp x27, x28, [x1, #80]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ cmp x0, #2
+ ldp x16, x17, [x1, #96]
+ ldp x19, x20, [x1, #112]
+ ldp x21, x22, [x1, #128]
+ ldp x23, x24, [x1, #144]
+ ldp x25, x26, [x1, #160]
+ ldp x27, x28, [x1, #176]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ cmp x0, #3
+ ldp x16, x17, [x1, #192]
+ ldp x19, x20, [x1, #208]
+ ldp x21, x22, [x1, #224]
+ ldp x23, x24, [x1, #240]
+ ldp x25, x26, [x1, #256]
+ ldp x27, x28, [x1, #272]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ cmp x0, #4
+ ldp x16, x17, [x1, #288]
+ ldp x19, x20, [x1, #304]
+ ldp x21, x22, [x1, #320]
+ ldp x23, x24, [x1, #336]
+ ldp x25, x26, [x1, #352]
+ ldp x27, x28, [x1, #368]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ add x1, x1, #0x180
+ cmp x0, #5
+ ldp x16, x17, [x1]
+ ldp x19, x20, [x1, #16]
+ ldp x21, x22, [x1, #32]
+ ldp x23, x24, [x1, #48]
+ ldp x25, x26, [x1, #64]
+ ldp x27, x28, [x1, #80]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ cmp x0, #6
+ ldp x16, x17, [x1, #96]
+ ldp x19, x20, [x1, #112]
+ ldp x21, x22, [x1, #128]
+ ldp x23, x24, [x1, #144]
+ ldp x25, x26, [x1, #160]
+ ldp x27, x28, [x1, #176]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ cmp x0, #7
+ ldp x16, x17, [x1, #192]
+ ldp x19, x20, [x1, #208]
+ ldp x21, x22, [x1, #224]
+ ldp x23, x24, [x1, #240]
+ ldp x25, x26, [x1, #256]
+ ldp x27, x28, [x1, #272]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ cmp x0, #8
+ ldp x16, x17, [x1, #288]
+ ldp x19, x20, [x1, #304]
+ ldp x21, x22, [x1, #320]
+ ldp x23, x24, [x1, #336]
+ ldp x25, x26, [x1, #352]
+ ldp x27, x28, [x1, #368]
+ csel x4, x16, x4, eq
+ csel x5, x17, x5, eq
+ csel x6, x19, x6, eq
+ csel x7, x20, x7, eq
+ csel x8, x21, x8, eq
+ csel x9, x22, x9, eq
+ csel x10, x23, x10, eq
+ csel x11, x24, x11, eq
+ csel x12, x25, x12, eq
+ csel x13, x26, x13, eq
+ csel x14, x27, x14, eq
+ csel x15, x28, x15, eq
+ mov x16, #-19
+ mov x17, #-1
+ mov x19, #-1
+ mov x20, #0x7fffffffffffffff
+ subs x16, x16, x12
+ sbcs x17, x17, x13
+ sbcs x19, x19, x14
+ sbc x20, x20, x15
+ cmp x2, #0
+ mov x3, x4
+ csel x4, x8, x4, lt
+ csel x8, x3, x8, lt
+ mov x3, x5
+ csel x5, x9, x5, lt
+ csel x9, x3, x9, lt
+ mov x3, x6
+ csel x6, x10, x6, lt
+ csel x10, x3, x10, lt
+ mov x3, x7
+ csel x7, x11, x7, lt
+ csel x11, x3, x11, lt
+ csel x12, x16, x12, lt
+ csel x13, x17, x13, lt
+ csel x14, x19, x14, lt
+ csel x15, x20, x15, lt
+ ldr x0, [x29, #16]
+ stp x4, x5, [x0]
+ stp x6, x7, [x0, #16]
+ stp x8, x9, [x0, #32]
+ stp x10, x11, [x0, #48]
+ stp x12, x13, [x0, #64]
+ stp x14, x15, [x0, #80]
+ ldp x17, x19, [x29, #40]
+ ldp x20, x21, [x29, #56]
+ ldp x22, x23, [x29, #72]
+ ldp x24, x25, [x29, #88]
+ ldp x26, x27, [x29, #104]
+ ldr x28, [x29, #120]
+ ldp x29, x30, [sp], #0x80
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_invert_nct
+fe_invert_nct PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ str x24, [x29, #72]
+ mov x19, #-19
+ mov x20, #-1
+ mov x21, #0x7fffffffffffffff
+ ldr x6, [x1]
+ ldr x7, [x1, #8]
+ ldr x8, [x1, #16]
+ ldr x9, [x1, #24]
+ mov x2, x19
+ mov x3, x20
+ mov x4, x20
+ mov x5, x21
+ mov x10, xzr
+ mov x11, xzr
+ mov x12, xzr
+ mov x13, xzr
+ mov x14, #1
+ mov x15, xzr
+ mov x16, xzr
+ mov x17, xzr
+ mov x22, #0xff
+ cmp x9, #0
+ beq L_fe_invert_nct_num_bits_init_v_0
+ mov x24, #0x100
+ clz x23, x9
+ sub x23, x24, x23
+ b L_fe_invert_nct_num_bits_init_v_3
+L_fe_invert_nct_num_bits_init_v_0
+ cmp x8, #0
+ beq L_fe_invert_nct_num_bits_init_v_1
+ mov x24, #0xc0
+ clz x23, x8
+ sub x23, x24, x23
+ b L_fe_invert_nct_num_bits_init_v_3
+L_fe_invert_nct_num_bits_init_v_1
+ cmp x7, #0
+ beq L_fe_invert_nct_num_bits_init_v_2
+ mov x24, #0x80
+ clz x23, x7
+ sub x23, x24, x23
+ b L_fe_invert_nct_num_bits_init_v_3
+L_fe_invert_nct_num_bits_init_v_2
+ mov x24, #0x40
+ clz x23, x6
+ sub x23, x24, x23
+L_fe_invert_nct_num_bits_init_v_3
+ tst x6, #1
+ bne L_fe_invert_nct_loop
+L_fe_invert_nct_even_init_v_0
+ extr x6, x7, x6, #1
+ extr x7, x8, x7, #1
+ extr x8, x9, x8, #1
+ lsr x9, x9, #1
+ sub x23, x23, #1
+ ands x24, x14, #1
+ beq L_fe_invert_nct_even_init_v_1
+ adds x14, x14, x19
+ adcs x15, x15, x20
+ adcs x16, x16, x20
+ adcs x17, x17, x21
+ cset x24, cs
+L_fe_invert_nct_even_init_v_1
+ extr x14, x15, x14, #1
+ extr x15, x16, x15, #1
+ extr x16, x17, x16, #1
+ extr x17, x24, x17, #1
+ tst x6, #1
+ beq L_fe_invert_nct_even_init_v_0
+L_fe_invert_nct_loop
+ cmp x22, #1
+ beq L_fe_invert_nct_u_done
+ cmp x23, #1
+ beq L_fe_invert_nct_v_done
+ cmp x22, x23
+ bhi L_fe_invert_nct_u_larger
+ bcc L_fe_invert_nct_v_larger
+ cmp x5, x9
+ bhi L_fe_invert_nct_u_larger
+ bcc L_fe_invert_nct_v_larger
+ cmp x4, x8
+ bhi L_fe_invert_nct_u_larger
+ bcc L_fe_invert_nct_v_larger
+ cmp x3, x7
+ bhi L_fe_invert_nct_u_larger
+ bcc L_fe_invert_nct_v_larger
+ cmp x2, x6
+ bcc L_fe_invert_nct_v_larger
+L_fe_invert_nct_u_larger
+ subs x2, x2, x6
+ sbcs x3, x3, x7
+ sbcs x4, x4, x8
+ sbc x5, x5, x9
+ subs x10, x10, x14
+ sbcs x11, x11, x15
+ sbcs x12, x12, x16
+ sbcs x13, x13, x17
+ bcs L_fe_invert_nct_sub_uv
+ adds x10, x10, x19
+ adcs x11, x11, x20
+ adcs x12, x12, x20
+ adc x13, x13, x21
+L_fe_invert_nct_sub_uv
+ cmp x5, #0
+ beq L_fe_invert_nct_nct_num_bits_u_0
+ mov x24, #0x100
+ clz x22, x5
+ sub x22, x24, x22
+ b L_fe_invert_nct_nct_num_bits_u_3
+L_fe_invert_nct_nct_num_bits_u_0
+ cmp x4, #0
+ beq L_fe_invert_nct_nct_num_bits_u_1
+ mov x24, #0xc0
+ clz x22, x4
+ sub x22, x24, x22
+ b L_fe_invert_nct_nct_num_bits_u_3
+L_fe_invert_nct_nct_num_bits_u_1
+ cmp x3, #0
+ beq L_fe_invert_nct_nct_num_bits_u_2
+ mov x24, #0x80
+ clz x22, x3
+ sub x22, x24, x22
+ b L_fe_invert_nct_nct_num_bits_u_3
+L_fe_invert_nct_nct_num_bits_u_2
+ mov x24, #0x40
+ clz x22, x2
+ sub x22, x24, x22
+L_fe_invert_nct_nct_num_bits_u_3
+L_fe_invert_nct_even_u_0
+ extr x2, x3, x2, #1
+ extr x3, x4, x3, #1
+ extr x4, x5, x4, #1
+ lsr x5, x5, #1
+ sub x22, x22, #1
+ ands x24, x10, #1
+ beq L_fe_invert_nct_even_u_1
+ adds x10, x10, x19
+ adcs x11, x11, x20
+ adcs x12, x12, x20
+ adcs x13, x13, x21
+ cset x24, cs
+L_fe_invert_nct_even_u_1
+ extr x10, x11, x10, #1
+ extr x11, x12, x11, #1
+ extr x12, x13, x12, #1
+ extr x13, x24, x13, #1
+ tst x2, #1
+ beq L_fe_invert_nct_even_u_0
+ b L_fe_invert_nct_loop
+L_fe_invert_nct_v_larger
+ subs x6, x6, x2
+ sbcs x7, x7, x3
+ sbcs x8, x8, x4
+ sbc x9, x9, x5
+ subs x14, x14, x10
+ sbcs x15, x15, x11
+ sbcs x16, x16, x12
+ sbcs x17, x17, x13
+ bcs L_fe_invert_nct_sub_vu
+ adds x14, x14, x19
+ adcs x15, x15, x20
+ adcs x16, x16, x20
+ adc x17, x17, x21
+L_fe_invert_nct_sub_vu
+ cmp x9, #0
+ beq L_fe_invert_nct_nct_num_bits_v_0
+ mov x24, #0x100
+ clz x23, x9
+ sub x23, x24, x23
+ b L_fe_invert_nct_nct_num_bits_v_3
+L_fe_invert_nct_nct_num_bits_v_0
+ cmp x8, #0
+ beq L_fe_invert_nct_nct_num_bits_v_1
+ mov x24, #0xc0
+ clz x23, x8
+ sub x23, x24, x23
+ b L_fe_invert_nct_nct_num_bits_v_3
+L_fe_invert_nct_nct_num_bits_v_1
+ cmp x7, #0
+ beq L_fe_invert_nct_nct_num_bits_v_2
+ mov x24, #0x80
+ clz x23, x7
+ sub x23, x24, x23
+ b L_fe_invert_nct_nct_num_bits_v_3
+L_fe_invert_nct_nct_num_bits_v_2
+ mov x24, #0x40
+ clz x23, x6
+ sub x23, x24, x23
+L_fe_invert_nct_nct_num_bits_v_3
+L_fe_invert_nct_even_v_0
+ extr x6, x7, x6, #1
+ extr x7, x8, x7, #1
+ extr x8, x9, x8, #1
+ lsr x9, x9, #1
+ sub x23, x23, #1
+ ands x24, x14, #1
+ beq L_fe_invert_nct_even_v_1
+ adds x14, x14, x19
+ adcs x15, x15, x20
+ adcs x16, x16, x20
+ adcs x17, x17, x21
+ cset x24, cs
+L_fe_invert_nct_even_v_1
+ extr x14, x15, x14, #1
+ extr x15, x16, x15, #1
+ extr x16, x17, x16, #1
+ extr x17, x24, x17, #1
+ tst x6, #1
+ beq L_fe_invert_nct_even_v_0
+ b L_fe_invert_nct_loop
+L_fe_invert_nct_u_done
+ str x10, [x0]
+ str x11, [x0, #8]
+ str x12, [x0, #16]
+ str x13, [x0, #24]
+ b L_fe_invert_nct_done
+L_fe_invert_nct_v_done
+ str x14, [x0]
+ str x15, [x0, #8]
+ str x16, [x0, #16]
+ str x17, [x0, #24]
+L_fe_invert_nct_done
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldr x24, [x29, #72]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_mul
+fe_mul PROC
+ stp x29, x30, [sp, #-64]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ str x22, [x29, #56]
+ ; Multiply
+ ldp x14, x15, [x1]
+ ldp x16, x17, [x1, #16]
+ ldp x19, x20, [x2]
+ ldp x21, x22, [x2, #16]
+ ; A[0] * B[0]
+ umulh x7, x14, x19
+ mul x6, x14, x19
+ ; A[2] * B[0]
+ umulh x9, x16, x19
+ mul x8, x16, x19
+ ; A[1] * B[0]
+ mul x3, x15, x19
+ adds x7, x7, x3
+ umulh x4, x15, x19
+ adcs x8, x8, x4
+ ; A[1] * B[3]
+ umulh x11, x15, x22
+ adc x9, x9, xzr
+ mul x10, x15, x22
+ ; A[0] * B[1]
+ mul x3, x14, x20
+ adds x7, x7, x3
+ umulh x4, x14, x20
+ adcs x8, x8, x4
+ ; A[2] * B[1]
+ mul x3, x16, x20
+ adcs x9, x9, x3
+ umulh x4, x16, x20
+ adcs x10, x10, x4
+ adc x11, x11, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x21
+ adds x9, x9, x3
+ umulh x4, x15, x21
+ adcs x10, x10, x4
+ adcs x11, x11, xzr
+ adc x12, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x21
+ adds x8, x8, x3
+ umulh x4, x14, x21
+ adcs x9, x9, x4
+ adcs x10, x10, xzr
+ adcs x11, x11, xzr
+ adc x12, x12, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x20
+ adds x8, x8, x3
+ umulh x4, x15, x20
+ adcs x9, x9, x4
+ ; A[3] * B[1]
+ mul x3, x17, x20
+ adcs x10, x10, x3
+ umulh x4, x17, x20
+ adcs x11, x11, x4
+ adc x12, x12, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x21
+ adds x10, x10, x3
+ umulh x4, x16, x21
+ adcs x11, x11, x4
+ ; A[3] * B[3]
+ mul x3, x17, x22
+ adcs x12, x12, x3
+ umulh x13, x17, x22
+ adc x13, x13, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x22
+ adds x9, x9, x3
+ umulh x4, x14, x22
+ adcs x10, x10, x4
+ ; A[2] * B[3]
+ mul x3, x16, x22
+ adcs x11, x11, x3
+ umulh x4, x16, x22
+ adcs x12, x12, x4
+ adc x13, x13, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x19
+ adds x9, x9, x3
+ umulh x4, x17, x19
+ adcs x10, x10, x4
+ ; A[3] * B[2]
+ mul x3, x17, x21
+ adcs x11, x11, x3
+ umulh x4, x17, x21
+ adcs x12, x12, x4
+ adc x13, x13, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x13
+ adds x9, x9, x4
+ umulh x5, x3, x13
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x5, x5, x3
+ and x9, x9, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x10
+ adds x6, x6, x4
+ umulh x10, x3, x10
+ mul x4, x3, x11
+ adcs x7, x7, x4
+ umulh x11, x3, x11
+ mul x4, x3, x12
+ adcs x8, x8, x4
+ umulh x12, x3, x12
+ adc x9, x9, xzr
+ ; Add high product results in
+ adds x6, x6, x5
+ adcs x7, x7, x10
+ adcs x8, x8, x11
+ adc x9, x9, x12
+ ; Reduce if top bit set
+ mov x3, #19
+ and x4, x3, x9, asr 63
+ adds x6, x6, x4
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Store
+ stp x6, x7, [x0]
+ stp x8, x9, [x0, #16]
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldr x22, [x29, #56]
+ ldp x29, x30, [sp], #0x40
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_sq
+fe_sq PROC
+ ; Square
+ ldp x13, x14, [x1]
+ ldp x15, x16, [x1, #16]
+ ; A[0] * A[1]
+ umulh x7, x13, x14
+ mul x6, x13, x14
+ ; A[0] * A[3]
+ umulh x9, x13, x16
+ mul x8, x13, x16
+ ; A[0] * A[2]
+ mul x2, x13, x15
+ adds x7, x7, x2
+ umulh x3, x13, x15
+ adcs x8, x8, x3
+ ; A[1] * A[3]
+ mul x2, x14, x16
+ adcs x9, x9, x2
+ umulh x10, x14, x16
+ adc x10, x10, xzr
+ ; A[1] * A[2]
+ mul x2, x14, x15
+ adds x8, x8, x2
+ umulh x3, x14, x15
+ adcs x9, x9, x3
+ ; A[2] * A[3]
+ mul x2, x15, x16
+ adcs x10, x10, x2
+ umulh x11, x15, x16
+ adc x11, x11, xzr
+ ; Double
+ adds x6, x6, x6
+ adcs x7, x7, x7
+ adcs x8, x8, x8
+ adcs x9, x9, x9
+ adcs x10, x10, x10
+ adcs x11, x11, x11
+ adc x12, xzr, xzr
+ ; A[0] * A[0]
+ umulh x3, x13, x13
+ mul x5, x13, x13
+ ; A[1] * A[1]
+ mul x2, x14, x14
+ adds x6, x6, x3
+ umulh x3, x14, x14
+ adcs x7, x7, x2
+ ; A[2] * A[2]
+ mul x2, x15, x15
+ adcs x8, x8, x3
+ umulh x3, x15, x15
+ adcs x9, x9, x2
+ ; A[3] * A[3]
+ mul x2, x16, x16
+ adcs x10, x10, x3
+ umulh x3, x16, x16
+ adcs x11, x11, x2
+ adc x12, x12, x3
+ ; Reduce
+ mov x2, #38
+ mul x3, x2, x12
+ adds x8, x8, x3
+ umulh x4, x2, x12
+ adc x4, x4, xzr
+ mov x2, #19
+ extr x4, x4, x8, #63
+ mul x4, x4, x2
+ and x8, x8, #0x7fffffffffffffff
+ mov x2, #38
+ mul x3, x2, x9
+ adds x5, x5, x3
+ umulh x9, x2, x9
+ mul x3, x2, x10
+ adcs x6, x6, x3
+ umulh x10, x2, x10
+ mul x3, x2, x11
+ adcs x7, x7, x3
+ umulh x11, x2, x11
+ adc x8, x8, xzr
+ ; Add high product results in
+ adds x5, x5, x4
+ adcs x6, x6, x9
+ adcs x7, x7, x10
+ adc x8, x8, x11
+ ; Reduce if top bit set
+ mov x2, #19
+ and x3, x2, x8, asr 63
+ adds x5, x5, x3
+ adcs x6, x6, xzr
+ and x8, x8, #0x7fffffffffffffff
+ adcs x7, x7, xzr
+ adc x8, x8, xzr
+ ; Store
+ stp x5, x6, [x0]
+ stp x7, x8, [x0, #16]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_invert
+fe_invert PROC
+ stp x29, x30, [sp, #-176]!
+ add x29, sp, #0
+ stp x17, x20, [x29, #160]
+ ; Invert
+ str x0, [x29, #144]
+ str x1, [x29, #152]
+ add x0, x29, #16
+ ldr x1, [x29, #152]
+ bl fe_sq
+ add x0, x29, #48
+ add x1, x29, #16
+ bl fe_sq
+ add x0, x29, #48
+ add x1, x29, #48
+ bl fe_sq
+ add x0, x29, #48
+ ldr x1, [x29, #152]
+ add x2, x29, #48
+ bl fe_mul
+ add x0, x29, #16
+ add x1, x29, #16
+ add x2, x29, #48
+ bl fe_mul
+ add x0, x29, #0x50
+ add x1, x29, #16
+ bl fe_sq
+ add x0, x29, #48
+ add x1, x29, #48
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 5 times
+ mov x20, #5
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_invert1
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert1
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #48
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ; Loop: 10 times
+ mov x20, #10
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_invert2
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert2
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #0x50
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ; Loop: 20 times
+ mov x20, #20
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_fe_invert3
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert3
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 10 times
+ mov x20, #10
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_fe_invert4
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert4
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #48
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ; Loop: 50 times
+ mov x20, #50
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_invert5
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert5
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #0x50
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ; Loop: 100 times
+ mov x20, #0x64
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_fe_invert6
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert6
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 50 times
+ mov x20, #50
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_fe_invert7
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert7
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #48
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ; Loop: 5 times
+ mov x20, #5
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_invert8
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x20, x20, #1
+ bne L_fe_invert8
+ ; Store
+ stp x6, x7, [x29, #48]
+ stp x8, x9, [x29, #64]
+ ldr x0, [x29, #144]
+ add x1, x29, #48
+ add x2, x29, #16
+ bl fe_mul
+ ldp x17, x20, [x29, #160]
+ ldp x29, x30, [sp], #0xb0
+ ret
+ ENDP
+ IF :LNOT::DEF:HAVE_ED25519 :LAND: :LNOT::DEF:WOLFSSL_CURVE25519_USE_ED25519
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 16
+L_curve25519_base_x2
+ DCQ 0x5cae469cdd684efb, 0x8f3f5ced1e350b5c
+ DCQ 0xd9750c687d157114, 0x20d342d51873f1b7
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT curve25519_base
+curve25519_base PROC
+ stp x29, x30, [sp, #-272]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #184]
+ stp x20, x21, [x29, #200]
+ stp x22, x23, [x29, #216]
+ stp x24, x25, [x29, #232]
+ stp x26, x27, [x29, #248]
+ str x28, [x29, #264]
+ adrp x2, L_curve25519_base_x2
+ add x2, x2, L_curve25519_base_x2
+ ldp x6, x7, [x2]
+ ldp x8, x9, [x2, #16]
+ mov x10, #1
+ mov x11, xzr
+ mov x12, xzr
+ mov x13, xzr
+ ; Set base point x-ordinate
+ mov x24, #9
+ stp x24, xzr, [x0]
+ stp xzr, xzr, [x0, #16]
+ ; Set one
+ mov x24, #1
+ stp x24, xzr, [x29, #16]
+ stp xzr, xzr, [x29, #32]
+ mov x2, xzr
+ mov x23, x0
+ mov x24, #0xfd
+L_curve25519_base_bits
+ lsr x3, x24, #6
+ and x4, x24, #63
+ ldr x5, [x1, x3, LSL 3]
+ lsr x5, x5, x4
+ eor x2, x2, x5
+ ; Conditional Swap
+ subs xzr, xzr, x2, lsl 63
+ ldp x25, x26, [x29, #16]
+ ldp x27, x28, [x29, #32]
+ csel x19, x25, x10, ne
+ csel x25, x10, x25, ne
+ csel x20, x26, x11, ne
+ csel x26, x11, x26, ne
+ csel x21, x27, x12, ne
+ csel x27, x12, x27, ne
+ csel x22, x28, x13, ne
+ csel x28, x13, x28, ne
+ ; Conditional Swap
+ subs xzr, xzr, x2, lsl 63
+ ldp x10, x11, [x0]
+ ldp x12, x13, [x0, #16]
+ csel x14, x10, x6, ne
+ csel x10, x6, x10, ne
+ csel x15, x11, x7, ne
+ csel x11, x7, x11, ne
+ csel x16, x12, x8, ne
+ csel x12, x8, x12, ne
+ csel x17, x13, x9, ne
+ csel x13, x9, x13, ne
+ mov x2, x5
+ ; Add
+ adds x6, x10, x25
+ adcs x7, x11, x26
+ adcs x8, x12, x27
+ adcs x9, x13, x28
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x6, x6, x3
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Sub
+ subs x25, x10, x25
+ sbcs x26, x11, x26
+ sbcs x27, x12, x27
+ sbcs x28, x13, x28
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x28, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x25, x25, x3
+ sbcs x26, x26, xzr
+ and x28, x28, #0x7fffffffffffffff
+ sbcs x27, x27, xzr
+ sbc x28, x28, xzr
+ stp x25, x26, [x29, #80]
+ stp x27, x28, [x29, #96]
+ ; Add
+ adds x10, x14, x19
+ adcs x11, x15, x20
+ adcs x12, x16, x21
+ adcs x13, x17, x22
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x10, x10, x3
+ adcs x11, x11, xzr
+ and x13, x13, #0x7fffffffffffffff
+ adcs x12, x12, xzr
+ adc x13, x13, xzr
+ ; Sub
+ subs x14, x14, x19
+ sbcs x15, x15, x20
+ sbcs x16, x16, x21
+ sbcs x17, x17, x22
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x17, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x14, x14, x3
+ sbcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ sbcs x16, x16, xzr
+ sbc x17, x17, xzr
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x20, x14, x6
+ mul x19, x14, x6
+ ; A[2] * B[0]
+ umulh x22, x16, x6
+ mul x21, x16, x6
+ ; A[1] * B[0]
+ mul x3, x15, x6
+ adds x20, x20, x3
+ umulh x4, x15, x6
+ adcs x21, x21, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x9
+ adc x22, x22, xzr
+ mul x25, x15, x9
+ ; A[0] * B[1]
+ mul x3, x14, x7
+ adds x20, x20, x3
+ umulh x4, x14, x7
+ adcs x21, x21, x4
+ ; A[2] * B[1]
+ mul x3, x16, x7
+ adcs x22, x22, x3
+ umulh x4, x16, x7
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x8
+ adds x22, x22, x3
+ umulh x4, x15, x8
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x8
+ adds x21, x21, x3
+ umulh x4, x14, x8
+ adcs x22, x22, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x7
+ adds x21, x21, x3
+ umulh x4, x15, x7
+ adcs x22, x22, x4
+ ; A[3] * B[1]
+ mul x3, x17, x7
+ adcs x25, x25, x3
+ umulh x4, x17, x7
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x8
+ adds x25, x25, x3
+ umulh x4, x16, x8
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x9
+ adcs x27, x27, x3
+ umulh x28, x17, x9
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x9
+ adds x22, x22, x3
+ umulh x4, x14, x9
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x9
+ adcs x26, x26, x3
+ umulh x4, x16, x9
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x6
+ adds x22, x22, x3
+ umulh x4, x17, x6
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x8
+ adcs x26, x26, x3
+ umulh x4, x17, x8
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x22, x22, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x22, #63
+ mul x5, x5, x3
+ and x22, x22, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x19, x19, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x20, x20, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x21, x21, x4
+ umulh x27, x3, x27
+ adc x22, x22, xzr
+ ; Add high product results in
+ adds x19, x19, x5
+ adcs x20, x20, x25
+ adcs x21, x21, x26
+ adc x22, x22, x27
+ ; Store
+ stp x19, x20, [x29, #48]
+ stp x21, x22, [x29, #64]
+ ; Multiply
+ ldp x25, x26, [x29, #80]
+ ldp x27, x28, [x29, #96]
+ ; A[0] * B[0]
+ umulh x20, x10, x25
+ mul x19, x10, x25
+ ; A[2] * B[0]
+ umulh x22, x12, x25
+ mul x21, x12, x25
+ ; A[1] * B[0]
+ mul x3, x11, x25
+ adds x20, x20, x3
+ umulh x4, x11, x25
+ adcs x21, x21, x4
+ ; A[1] * B[3]
+ umulh x15, x11, x28
+ adc x22, x22, xzr
+ mul x14, x11, x28
+ ; A[0] * B[1]
+ mul x3, x10, x26
+ adds x20, x20, x3
+ umulh x4, x10, x26
+ adcs x21, x21, x4
+ ; A[2] * B[1]
+ mul x3, x12, x26
+ adcs x22, x22, x3
+ umulh x4, x12, x26
+ adcs x14, x14, x4
+ adc x15, x15, xzr
+ ; A[1] * B[2]
+ mul x3, x11, x27
+ adds x22, x22, x3
+ umulh x4, x11, x27
+ adcs x14, x14, x4
+ adcs x15, x15, xzr
+ adc x16, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x10, x27
+ adds x21, x21, x3
+ umulh x4, x10, x27
+ adcs x22, x22, x4
+ adcs x14, x14, xzr
+ adcs x15, x15, xzr
+ adc x16, x16, xzr
+ ; A[1] * B[1]
+ mul x3, x11, x26
+ adds x21, x21, x3
+ umulh x4, x11, x26
+ adcs x22, x22, x4
+ ; A[3] * B[1]
+ mul x3, x13, x26
+ adcs x14, x14, x3
+ umulh x4, x13, x26
+ adcs x15, x15, x4
+ adc x16, x16, xzr
+ ; A[2] * B[2]
+ mul x3, x12, x27
+ adds x14, x14, x3
+ umulh x4, x12, x27
+ adcs x15, x15, x4
+ ; A[3] * B[3]
+ mul x3, x13, x28
+ adcs x16, x16, x3
+ umulh x17, x13, x28
+ adc x17, x17, xzr
+ ; A[0] * B[3]
+ mul x3, x10, x28
+ adds x22, x22, x3
+ umulh x4, x10, x28
+ adcs x14, x14, x4
+ ; A[2] * B[3]
+ mul x3, x12, x28
+ adcs x15, x15, x3
+ umulh x4, x12, x28
+ adcs x16, x16, x4
+ adc x17, x17, xzr
+ ; A[3] * B[0]
+ mul x3, x13, x25
+ adds x22, x22, x3
+ umulh x4, x13, x25
+ adcs x14, x14, x4
+ ; A[3] * B[2]
+ mul x3, x13, x27
+ adcs x15, x15, x3
+ umulh x4, x13, x27
+ adcs x16, x16, x4
+ adc x17, x17, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x22, x22, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x22, #63
+ mul x5, x5, x3
+ and x22, x22, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x19, x19, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x20, x20, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x21, x21, x4
+ umulh x16, x3, x16
+ adc x22, x22, xzr
+ ; Add high product results in
+ adds x19, x19, x5
+ adcs x20, x20, x14
+ adcs x21, x21, x15
+ adc x22, x22, x16
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x25, x26
+ mul x11, x25, x26
+ ; A[0] * A[3]
+ umulh x14, x25, x28
+ mul x13, x25, x28
+ ; A[0] * A[2]
+ mul x3, x25, x27
+ adds x12, x12, x3
+ umulh x4, x25, x27
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x26, x28
+ adcs x14, x14, x3
+ umulh x15, x26, x28
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x26, x27
+ adds x13, x13, x3
+ umulh x4, x26, x27
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x27, x28
+ adcs x15, x15, x3
+ umulh x16, x27, x28
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x25, x25
+ mul x10, x25, x25
+ ; A[1] * A[1]
+ mul x3, x26, x26
+ adds x11, x11, x4
+ umulh x4, x26, x26
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x27, x27
+ adcs x13, x13, x4
+ umulh x4, x27, x27
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x28, x28
+ adcs x15, x15, x4
+ umulh x4, x28, x28
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x10, x10, x5
+ adcs x11, x11, x14
+ adcs x12, x12, x15
+ adc x13, x13, x16
+ ; Square
+ ; A[0] * A[1]
+ umulh x16, x6, x7
+ mul x15, x6, x7
+ ; A[0] * A[3]
+ umulh x25, x6, x9
+ mul x17, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x16, x16, x3
+ umulh x4, x6, x8
+ adcs x17, x17, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x25, x25, x3
+ umulh x26, x7, x9
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x17, x17, x3
+ umulh x4, x7, x8
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x26, x26, x3
+ umulh x27, x8, x9
+ adc x27, x27, xzr
+ ; Double
+ adds x15, x15, x15
+ adcs x16, x16, x16
+ adcs x17, x17, x17
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x14, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x15, x15, x4
+ umulh x4, x7, x7
+ adcs x16, x16, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x17, x17, x4
+ umulh x4, x8, x8
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x26, x26, x4
+ umulh x4, x9, x9
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x17, x17, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x14, x14, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x15, x15, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x16, x16, x4
+ umulh x27, x3, x27
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x25
+ adcs x16, x16, x26
+ adc x17, x17, x27
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x7, x14, x10
+ mul x6, x14, x10
+ ; A[2] * B[0]
+ umulh x9, x16, x10
+ mul x8, x16, x10
+ ; A[1] * B[0]
+ mul x3, x15, x10
+ adds x7, x7, x3
+ umulh x4, x15, x10
+ adcs x8, x8, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x13
+ adc x9, x9, xzr
+ mul x25, x15, x13
+ ; A[0] * B[1]
+ mul x3, x14, x11
+ adds x7, x7, x3
+ umulh x4, x14, x11
+ adcs x8, x8, x4
+ ; A[2] * B[1]
+ mul x3, x16, x11
+ adcs x9, x9, x3
+ umulh x4, x16, x11
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x12
+ adds x9, x9, x3
+ umulh x4, x15, x12
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x12
+ adds x8, x8, x3
+ umulh x4, x14, x12
+ adcs x9, x9, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x11
+ adds x8, x8, x3
+ umulh x4, x15, x11
+ adcs x9, x9, x4
+ ; A[3] * B[1]
+ mul x3, x17, x11
+ adcs x25, x25, x3
+ umulh x4, x17, x11
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x12
+ adds x25, x25, x3
+ umulh x4, x16, x12
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x13
+ adcs x27, x27, x3
+ umulh x28, x17, x13
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x13
+ adds x9, x9, x3
+ umulh x4, x14, x13
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x13
+ adcs x26, x26, x3
+ umulh x4, x16, x13
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x10
+ adds x9, x9, x3
+ umulh x4, x17, x10
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x12
+ adcs x26, x26, x3
+ umulh x4, x17, x12
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x9, x9, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x5, x5, x3
+ and x9, x9, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x6, x6, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x7, x7, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x8, x8, x4
+ umulh x27, x3, x27
+ adc x9, x9, xzr
+ ; Add high product results in
+ adds x6, x6, x5
+ adcs x7, x7, x25
+ adcs x8, x8, x26
+ adc x9, x9, x27
+ ; Store
+ stp x6, x7, [x0]
+ stp x8, x9, [x0, #16]
+ ; Sub
+ subs x14, x14, x10
+ sbcs x15, x15, x11
+ sbcs x16, x16, x12
+ sbcs x17, x17, x13
+ csetm x5, cc
+ mov x3, #-19
+ ; Mask the modulus
+ extr x5, x5, x17, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x14, x14, x3
+ sbcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ sbcs x16, x16, xzr
+ sbc x17, x17, xzr
+ ; Multiply by 121666
+ mov x5, #0xdb42
+ movk x5, #1, lsl 16
+ mul x6, x14, x5
+ umulh x7, x14, x5
+ mul x3, x15, x5
+ umulh x8, x15, x5
+ adds x7, x7, x3
+ adc x8, x8, xzr
+ mul x3, x16, x5
+ umulh x9, x16, x5
+ adds x8, x8, x3
+ adc x9, x9, xzr
+ mul x3, x17, x5
+ umulh x4, x17, x5
+ adds x9, x9, x3
+ adc x4, x4, xzr
+ mov x5, #19
+ extr x4, x4, x9, #63
+ mul x4, x4, x5
+ adds x6, x6, x4
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Add
+ adds x10, x10, x6
+ adcs x11, x11, x7
+ adcs x12, x12, x8
+ adcs x13, x13, x9
+ cset x5, cs
+ mov x3, #19
+ ; Mask the modulus
+ extr x5, x5, x13, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x10, x10, x3
+ adcs x11, x11, xzr
+ and x13, x13, #0x7fffffffffffffff
+ adcs x12, x12, xzr
+ adc x13, x13, xzr
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x7, x14, x10
+ mul x6, x14, x10
+ ; A[2] * B[0]
+ umulh x9, x16, x10
+ mul x8, x16, x10
+ ; A[1] * B[0]
+ mul x3, x15, x10
+ adds x7, x7, x3
+ umulh x4, x15, x10
+ adcs x8, x8, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x13
+ adc x9, x9, xzr
+ mul x25, x15, x13
+ ; A[0] * B[1]
+ mul x3, x14, x11
+ adds x7, x7, x3
+ umulh x4, x14, x11
+ adcs x8, x8, x4
+ ; A[2] * B[1]
+ mul x3, x16, x11
+ adcs x9, x9, x3
+ umulh x4, x16, x11
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x12
+ adds x9, x9, x3
+ umulh x4, x15, x12
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x12
+ adds x8, x8, x3
+ umulh x4, x14, x12
+ adcs x9, x9, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x11
+ adds x8, x8, x3
+ umulh x4, x15, x11
+ adcs x9, x9, x4
+ ; A[3] * B[1]
+ mul x3, x17, x11
+ adcs x25, x25, x3
+ umulh x4, x17, x11
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x12
+ adds x25, x25, x3
+ umulh x4, x16, x12
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x13
+ adcs x27, x27, x3
+ umulh x28, x17, x13
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x13
+ adds x9, x9, x3
+ umulh x4, x14, x13
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x13
+ adcs x26, x26, x3
+ umulh x4, x16, x13
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x10
+ adds x9, x9, x3
+ umulh x4, x17, x10
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x12
+ adcs x26, x26, x3
+ umulh x4, x17, x12
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x9, x9, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x5, x5, x3
+ and x9, x9, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x6, x6, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x7, x7, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x8, x8, x4
+ umulh x27, x3, x27
+ adc x9, x9, xzr
+ ; Add high product results in
+ adds x6, x6, x5
+ adcs x7, x7, x25
+ adcs x8, x8, x26
+ adc x9, x9, x27
+ ; Store
+ stp x6, x7, [x29, #16]
+ stp x8, x9, [x29, #32]
+ ; Add
+ ldp x25, x26, [x29, #48]
+ ldp x27, x28, [x29, #64]
+ adds x10, x25, x19
+ adcs x11, x26, x20
+ adcs x12, x27, x21
+ adcs x13, x28, x22
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x10, x10, x3
+ adcs x11, x11, xzr
+ and x13, x13, #0x7fffffffffffffff
+ adcs x12, x12, xzr
+ adc x13, x13, xzr
+ ; Sub
+ subs x19, x25, x19
+ sbcs x20, x26, x20
+ sbcs x21, x27, x21
+ sbcs x22, x28, x22
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x22, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x19, x19, x3
+ sbcs x20, x20, xzr
+ and x22, x22, #0x7fffffffffffffff
+ sbcs x21, x21, xzr
+ sbc x22, x22, xzr
+ ; Square
+ ; A[0] * A[1]
+ umulh x8, x10, x11
+ mul x7, x10, x11
+ ; A[0] * A[3]
+ umulh x25, x10, x13
+ mul x9, x10, x13
+ ; A[0] * A[2]
+ mul x3, x10, x12
+ adds x8, x8, x3
+ umulh x4, x10, x12
+ adcs x9, x9, x4
+ ; A[1] * A[3]
+ mul x3, x11, x13
+ adcs x25, x25, x3
+ umulh x26, x11, x13
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x11, x12
+ adds x9, x9, x3
+ umulh x4, x11, x12
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x12, x13
+ adcs x26, x26, x3
+ umulh x27, x12, x13
+ adc x27, x27, xzr
+ ; Double
+ adds x7, x7, x7
+ adcs x8, x8, x8
+ adcs x9, x9, x9
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x10, x10
+ mul x6, x10, x10
+ ; A[1] * A[1]
+ mul x3, x11, x11
+ adds x7, x7, x4
+ umulh x4, x11, x11
+ adcs x8, x8, x3
+ ; A[2] * A[2]
+ mul x3, x12, x12
+ adcs x9, x9, x4
+ umulh x4, x12, x12
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x13, x13
+ adcs x26, x26, x4
+ umulh x4, x13, x13
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x9, x9, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x5, x5, x3
+ and x9, x9, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x6, x6, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x7, x7, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x8, x8, x4
+ umulh x27, x3, x27
+ adc x9, x9, xzr
+ ; Add high product results in
+ adds x6, x6, x5
+ adcs x7, x7, x25
+ adcs x8, x8, x26
+ adc x9, x9, x27
+ ; Square
+ ; A[0] * A[1]
+ umulh x16, x19, x20
+ mul x15, x19, x20
+ ; A[0] * A[3]
+ umulh x25, x19, x22
+ mul x17, x19, x22
+ ; A[0] * A[2]
+ mul x3, x19, x21
+ adds x16, x16, x3
+ umulh x4, x19, x21
+ adcs x17, x17, x4
+ ; A[1] * A[3]
+ mul x3, x20, x22
+ adcs x25, x25, x3
+ umulh x26, x20, x22
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x20, x21
+ adds x17, x17, x3
+ umulh x4, x20, x21
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x21, x22
+ adcs x26, x26, x3
+ umulh x27, x21, x22
+ adc x27, x27, xzr
+ ; Double
+ adds x15, x15, x15
+ adcs x16, x16, x16
+ adcs x17, x17, x17
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x19, x19
+ mul x14, x19, x19
+ ; A[1] * A[1]
+ mul x3, x20, x20
+ adds x15, x15, x4
+ umulh x4, x20, x20
+ adcs x16, x16, x3
+ ; A[2] * A[2]
+ mul x3, x21, x21
+ adcs x17, x17, x4
+ umulh x4, x21, x21
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x22, x22
+ adcs x26, x26, x4
+ umulh x4, x22, x22
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x17, x17, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x14, x14, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x15, x15, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x16, x16, x4
+ umulh x27, x3, x27
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x25
+ adcs x16, x16, x26
+ adc x17, x17, x27
+ ; Multiply by 9
+ mov x5, #9
+ mul x10, x14, x5
+ umulh x11, x14, x5
+ mul x3, x15, x5
+ umulh x12, x15, x5
+ adds x11, x11, x3
+ adc x12, x12, xzr
+ mul x3, x16, x5
+ umulh x13, x16, x5
+ adds x12, x12, x3
+ adc x13, x13, xzr
+ mul x3, x17, x5
+ umulh x4, x17, x5
+ adds x13, x13, x3
+ adc x4, x4, xzr
+ mov x5, #19
+ extr x4, x4, x13, #63
+ mul x4, x4, x5
+ adds x10, x10, x4
+ adcs x11, x11, xzr
+ and x13, x13, #0x7fffffffffffffff
+ adcs x12, x12, xzr
+ adc x13, x13, xzr
+ subs x24, x24, #1
+ cmp x24, #3
+ bge L_curve25519_base_bits
+ ; Conditional Swap
+ subs xzr, xzr, x2, lsl 63
+ ldp x25, x26, [x29, #16]
+ ldp x27, x28, [x29, #32]
+ csel x19, x25, x10, ne
+ csel x25, x10, x25, ne
+ csel x20, x26, x11, ne
+ csel x26, x11, x26, ne
+ csel x21, x27, x12, ne
+ csel x27, x12, x27, ne
+ csel x22, x28, x13, ne
+ csel x28, x13, x28, ne
+ ; Conditional Swap
+ subs xzr, xzr, x2, lsl 63
+ ldp x10, x11, [x0]
+ ldp x12, x13, [x0, #16]
+ csel x14, x10, x6, ne
+ csel x10, x6, x10, ne
+ csel x15, x11, x7, ne
+ csel x11, x7, x11, ne
+ csel x16, x12, x8, ne
+ csel x12, x8, x12, ne
+ csel x17, x13, x9, ne
+ csel x13, x9, x13, ne
+L_curve25519_base_3
+ ; Add
+ adds x6, x10, x25
+ adcs x7, x11, x26
+ adcs x8, x12, x27
+ adcs x9, x13, x28
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x6, x6, x3
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Sub
+ subs x25, x10, x25
+ sbcs x26, x11, x26
+ sbcs x27, x12, x27
+ sbcs x28, x13, x28
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x28, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x25, x25, x3
+ sbcs x26, x26, xzr
+ and x28, x28, #0x7fffffffffffffff
+ sbcs x27, x27, xzr
+ sbc x28, x28, xzr
+ ; Square
+ ; A[0] * A[1]
+ umulh x21, x25, x26
+ mul x20, x25, x26
+ ; A[0] * A[3]
+ umulh x14, x25, x28
+ mul x22, x25, x28
+ ; A[0] * A[2]
+ mul x3, x25, x27
+ adds x21, x21, x3
+ umulh x4, x25, x27
+ adcs x22, x22, x4
+ ; A[1] * A[3]
+ mul x3, x26, x28
+ adcs x14, x14, x3
+ umulh x15, x26, x28
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x26, x27
+ adds x22, x22, x3
+ umulh x4, x26, x27
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x27, x28
+ adcs x15, x15, x3
+ umulh x16, x27, x28
+ adc x16, x16, xzr
+ ; Double
+ adds x20, x20, x20
+ adcs x21, x21, x21
+ adcs x22, x22, x22
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x25, x25
+ mul x19, x25, x25
+ ; A[1] * A[1]
+ mul x3, x26, x26
+ adds x20, x20, x4
+ umulh x4, x26, x26
+ adcs x21, x21, x3
+ ; A[2] * A[2]
+ mul x3, x27, x27
+ adcs x22, x22, x4
+ umulh x4, x27, x27
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x28, x28
+ adcs x15, x15, x4
+ umulh x4, x28, x28
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x22, x22, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x22, #63
+ mul x5, x5, x3
+ and x22, x22, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x19, x19, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x20, x20, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x21, x21, x4
+ umulh x16, x3, x16
+ adc x22, x22, xzr
+ ; Add high product results in
+ adds x19, x19, x5
+ adcs x20, x20, x14
+ adcs x21, x21, x15
+ adc x22, x22, x16
+ ; Square
+ ; A[0] * A[1]
+ umulh x16, x6, x7
+ mul x15, x6, x7
+ ; A[0] * A[3]
+ umulh x25, x6, x9
+ mul x17, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x16, x16, x3
+ umulh x4, x6, x8
+ adcs x17, x17, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x25, x25, x3
+ umulh x26, x7, x9
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x17, x17, x3
+ umulh x4, x7, x8
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x26, x26, x3
+ umulh x27, x8, x9
+ adc x27, x27, xzr
+ ; Double
+ adds x15, x15, x15
+ adcs x16, x16, x16
+ adcs x17, x17, x17
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x14, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x15, x15, x4
+ umulh x4, x7, x7
+ adcs x16, x16, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x17, x17, x4
+ umulh x4, x8, x8
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x26, x26, x4
+ umulh x4, x9, x9
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x17, x17, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x14, x14, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x15, x15, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x16, x16, x4
+ umulh x27, x3, x27
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x25
+ adcs x16, x16, x26
+ adc x17, x17, x27
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x11, x14, x19
+ mul x10, x14, x19
+ ; A[2] * B[0]
+ umulh x13, x16, x19
+ mul x12, x16, x19
+ ; A[1] * B[0]
+ mul x3, x15, x19
+ adds x11, x11, x3
+ umulh x4, x15, x19
+ adcs x12, x12, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x22
+ adc x13, x13, xzr
+ mul x25, x15, x22
+ ; A[0] * B[1]
+ mul x3, x14, x20
+ adds x11, x11, x3
+ umulh x4, x14, x20
+ adcs x12, x12, x4
+ ; A[2] * B[1]
+ mul x3, x16, x20
+ adcs x13, x13, x3
+ umulh x4, x16, x20
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x21
+ adds x13, x13, x3
+ umulh x4, x15, x21
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x21
+ adds x12, x12, x3
+ umulh x4, x14, x21
+ adcs x13, x13, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x20
+ adds x12, x12, x3
+ umulh x4, x15, x20
+ adcs x13, x13, x4
+ ; A[3] * B[1]
+ mul x3, x17, x20
+ adcs x25, x25, x3
+ umulh x4, x17, x20
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x21
+ adds x25, x25, x3
+ umulh x4, x16, x21
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x22
+ adcs x27, x27, x3
+ umulh x28, x17, x22
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x22
+ adds x13, x13, x3
+ umulh x4, x14, x22
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x22
+ adcs x26, x26, x3
+ umulh x4, x16, x22
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x19
+ adds x13, x13, x3
+ umulh x4, x17, x19
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x21
+ adcs x26, x26, x3
+ umulh x4, x17, x21
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x13, x13, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x10, x10, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x11, x11, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x12, x12, x4
+ umulh x27, x3, x27
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x10, x10, x5
+ adcs x11, x11, x25
+ adcs x12, x12, x26
+ adc x13, x13, x27
+ ; Store
+ stp x10, x11, [x0]
+ stp x12, x13, [x0, #16]
+ ; Sub
+ subs x14, x14, x19
+ sbcs x15, x15, x20
+ sbcs x16, x16, x21
+ sbcs x17, x17, x22
+ csetm x5, cc
+ mov x3, #-19
+ ; Mask the modulus
+ extr x5, x5, x17, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x14, x14, x3
+ sbcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ sbcs x16, x16, xzr
+ sbc x17, x17, xzr
+ ; Multiply by 121666
+ mov x5, #0xdb42
+ movk x5, #1, lsl 16
+ mul x6, x14, x5
+ umulh x7, x14, x5
+ mul x3, x15, x5
+ umulh x8, x15, x5
+ adds x7, x7, x3
+ adc x8, x8, xzr
+ mul x3, x16, x5
+ umulh x9, x16, x5
+ adds x8, x8, x3
+ adc x9, x9, xzr
+ mul x3, x17, x5
+ umulh x4, x17, x5
+ adds x9, x9, x3
+ adc x4, x4, xzr
+ mov x5, #19
+ extr x4, x4, x9, #63
+ mul x4, x4, x5
+ adds x6, x6, x4
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Add
+ adds x19, x19, x6
+ adcs x20, x20, x7
+ adcs x21, x21, x8
+ adcs x22, x22, x9
+ cset x5, cs
+ mov x3, #19
+ ; Mask the modulus
+ extr x5, x5, x22, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x19, x19, x3
+ adcs x20, x20, xzr
+ and x22, x22, #0x7fffffffffffffff
+ adcs x21, x21, xzr
+ adc x22, x22, xzr
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x26, x14, x19
+ mul x25, x14, x19
+ ; A[2] * B[0]
+ umulh x28, x16, x19
+ mul x27, x16, x19
+ ; A[1] * B[0]
+ mul x3, x15, x19
+ adds x26, x26, x3
+ umulh x4, x15, x19
+ adcs x27, x27, x4
+ ; A[1] * B[3]
+ umulh x7, x15, x22
+ adc x28, x28, xzr
+ mul x6, x15, x22
+ ; A[0] * B[1]
+ mul x3, x14, x20
+ adds x26, x26, x3
+ umulh x4, x14, x20
+ adcs x27, x27, x4
+ ; A[2] * B[1]
+ mul x3, x16, x20
+ adcs x28, x28, x3
+ umulh x4, x16, x20
+ adcs x6, x6, x4
+ adc x7, x7, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x21
+ adds x28, x28, x3
+ umulh x4, x15, x21
+ adcs x6, x6, x4
+ adcs x7, x7, xzr
+ adc x8, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x21
+ adds x27, x27, x3
+ umulh x4, x14, x21
+ adcs x28, x28, x4
+ adcs x6, x6, xzr
+ adcs x7, x7, xzr
+ adc x8, x8, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x20
+ adds x27, x27, x3
+ umulh x4, x15, x20
+ adcs x28, x28, x4
+ ; A[3] * B[1]
+ mul x3, x17, x20
+ adcs x6, x6, x3
+ umulh x4, x17, x20
+ adcs x7, x7, x4
+ adc x8, x8, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x21
+ adds x6, x6, x3
+ umulh x4, x16, x21
+ adcs x7, x7, x4
+ ; A[3] * B[3]
+ mul x3, x17, x22
+ adcs x8, x8, x3
+ umulh x9, x17, x22
+ adc x9, x9, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x22
+ adds x28, x28, x3
+ umulh x4, x14, x22
+ adcs x6, x6, x4
+ ; A[2] * B[3]
+ mul x3, x16, x22
+ adcs x7, x7, x3
+ umulh x4, x16, x22
+ adcs x8, x8, x4
+ adc x9, x9, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x19
+ adds x28, x28, x3
+ umulh x4, x17, x19
+ adcs x6, x6, x4
+ ; A[3] * B[2]
+ mul x3, x17, x21
+ adcs x7, x7, x3
+ umulh x4, x17, x21
+ adcs x8, x8, x4
+ adc x9, x9, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x9
+ adds x28, x28, x4
+ umulh x5, x3, x9
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x28, #63
+ mul x5, x5, x3
+ and x28, x28, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x6
+ adds x25, x25, x4
+ umulh x6, x3, x6
+ mul x4, x3, x7
+ adcs x26, x26, x4
+ umulh x7, x3, x7
+ mul x4, x3, x8
+ adcs x27, x27, x4
+ umulh x8, x3, x8
+ adc x28, x28, xzr
+ ; Add high product results in
+ adds x25, x25, x5
+ adcs x26, x26, x6
+ adcs x27, x27, x7
+ adc x28, x28, x8
+ ; Store
+ stp x25, x26, [x29, #16]
+ stp x27, x28, [x29, #32]
+ subs x24, x24, #1
+ bge L_curve25519_base_3
+ ; Invert
+ add x0, x29, #48
+ add x1, x29, #16
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #48
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #0x50
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #16
+ add x2, x29, #0x50
+ bl fe_mul
+ add x0, x29, #48
+ add x1, x29, #48
+ add x2, x29, #0x50
+ bl fe_mul
+ add x0, x29, #0x70
+ add x1, x29, #48
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #0x50
+ add x2, x29, #0x70
+ bl fe_mul
+ ; Loop: 5 times
+ mov x24, #5
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_base_inv_1
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_1
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 10 times
+ mov x24, #10
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_base_inv_2
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_2
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x70
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 20 times
+ mov x24, #20
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_base_inv_3
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_3
+ ; Store
+ stp x6, x7, [x29, #144]
+ stp x8, x9, [x29, #160]
+ add x0, x29, #0x70
+ add x1, x29, #0x90
+ add x2, x29, #0x70
+ bl fe_mul
+ ; Loop: 10 times
+ mov x24, #10
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_base_inv_4
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_4
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 50 times
+ mov x24, #50
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_base_inv_5
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_5
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x70
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 100 times
+ mov x24, #0x64
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_base_inv_6
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_6
+ ; Store
+ stp x6, x7, [x29, #144]
+ stp x8, x9, [x29, #160]
+ add x0, x29, #0x70
+ add x1, x29, #0x90
+ add x2, x29, #0x70
+ bl fe_mul
+ ; Loop: 50 times
+ mov x24, #50
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_base_inv_7
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_7
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 5 times
+ mov x24, #5
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_base_inv_8
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_base_inv_8
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #16
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ mov x0, x23
+ ; Multiply
+ ldp x6, x7, [x0]
+ ldp x8, x9, [x0, #16]
+ ldp x10, x11, [x29, #16]
+ ldp x12, x13, [x29, #32]
+ ; A[0] * B[0]
+ umulh x15, x6, x10
+ mul x14, x6, x10
+ ; A[2] * B[0]
+ umulh x17, x8, x10
+ mul x16, x8, x10
+ ; A[1] * B[0]
+ mul x3, x7, x10
+ adds x15, x15, x3
+ umulh x4, x7, x10
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x7, x13
+ adc x17, x17, xzr
+ mul x19, x7, x13
+ ; A[0] * B[1]
+ mul x3, x6, x11
+ adds x15, x15, x3
+ umulh x4, x6, x11
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x8, x11
+ adcs x17, x17, x3
+ umulh x4, x8, x11
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x7, x12
+ adds x17, x17, x3
+ umulh x4, x7, x12
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x6, x12
+ adds x16, x16, x3
+ umulh x4, x6, x12
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x7, x11
+ adds x16, x16, x3
+ umulh x4, x7, x11
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x9, x11
+ adcs x19, x19, x3
+ umulh x4, x9, x11
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x8, x12
+ adds x19, x19, x3
+ umulh x4, x8, x12
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x9, x13
+ adcs x21, x21, x3
+ umulh x22, x9, x13
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x6, x13
+ adds x17, x17, x3
+ umulh x4, x6, x13
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x8, x13
+ adcs x20, x20, x3
+ umulh x4, x8, x13
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x9, x10
+ adds x17, x17, x3
+ umulh x4, x9, x10
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x9, x12
+ adcs x20, x20, x3
+ umulh x4, x9, x12
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Reduce if top bit set
+ mov x3, #19
+ and x4, x3, x17, asr 63
+ adds x14, x14, x4
+ adcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ adcs x16, x16, xzr
+ adc x17, x17, xzr
+ adds x4, x14, x3
+ adcs x4, x15, xzr
+ adcs x4, x16, xzr
+ adc x4, x17, xzr
+ and x4, x3, x4, asr 63
+ adds x14, x14, x4
+ adcs x15, x15, xzr
+ mov x4, #0x7fffffffffffffff
+ adcs x16, x16, xzr
+ adc x17, x17, xzr
+ and x17, x17, x4
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ mov x0, xzr
+ ldp x17, x19, [x29, #184]
+ ldp x20, x21, [x29, #200]
+ ldp x22, x23, [x29, #216]
+ ldp x24, x25, [x29, #232]
+ ldp x26, x27, [x29, #248]
+ ldr x28, [x29, #264]
+ ldp x29, x30, [sp], #0x110
+ ret
+ ENDP
+ ENDIF
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT curve25519
+curve25519 PROC
+ stp x29, x30, [sp, #-288]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #200]
+ stp x20, x21, [x29, #216]
+ stp x22, x23, [x29, #232]
+ stp x24, x25, [x29, #248]
+ stp x26, x27, [x29, #264]
+ str x28, [x29, #280]
+ mov x23, xzr
+ str x0, [x29, #176]
+ ldp x6, x7, [x2]
+ ldp x8, x9, [x2, #16]
+ mov x10, #1
+ mov x11, xzr
+ mov x12, xzr
+ mov x13, xzr
+ stp x10, x11, [x0]
+ stp x12, x13, [x0, #16]
+ ; Set zero
+ stp xzr, xzr, [x29, #16]
+ stp xzr, xzr, [x29, #32]
+ mov x24, #0xfe
+L_curve25519_bits
+ lsr x3, x24, #6
+ and x4, x24, #63
+ ldr x5, [x1, x3, LSL 3]
+ lsr x5, x5, x4
+ eor x23, x23, x5
+ ; Conditional Swap
+ subs xzr, xzr, x23, lsl 63
+ ldp x25, x26, [x29, #16]
+ ldp x27, x28, [x29, #32]
+ csel x19, x25, x10, ne
+ csel x25, x10, x25, ne
+ csel x20, x26, x11, ne
+ csel x26, x11, x26, ne
+ csel x21, x27, x12, ne
+ csel x27, x12, x27, ne
+ csel x22, x28, x13, ne
+ csel x28, x13, x28, ne
+ ; Conditional Swap
+ subs xzr, xzr, x23, lsl 63
+ ldp x10, x11, [x0]
+ ldp x12, x13, [x0, #16]
+ csel x14, x10, x6, ne
+ csel x10, x6, x10, ne
+ csel x15, x11, x7, ne
+ csel x11, x7, x11, ne
+ csel x16, x12, x8, ne
+ csel x12, x8, x12, ne
+ csel x17, x13, x9, ne
+ csel x13, x9, x13, ne
+ mov x23, x5
+ ; Add
+ adds x6, x10, x25
+ adcs x7, x11, x26
+ adcs x8, x12, x27
+ adcs x9, x13, x28
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x6, x6, x3
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Sub
+ subs x25, x10, x25
+ sbcs x26, x11, x26
+ sbcs x27, x12, x27
+ sbcs x28, x13, x28
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x28, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x25, x25, x3
+ sbcs x26, x26, xzr
+ and x28, x28, #0x7fffffffffffffff
+ sbcs x27, x27, xzr
+ sbc x28, x28, xzr
+ stp x25, x26, [x29, #80]
+ stp x27, x28, [x29, #96]
+ ; Add
+ adds x10, x14, x19
+ adcs x11, x15, x20
+ adcs x12, x16, x21
+ adcs x13, x17, x22
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x10, x10, x3
+ adcs x11, x11, xzr
+ and x13, x13, #0x7fffffffffffffff
+ adcs x12, x12, xzr
+ adc x13, x13, xzr
+ ; Sub
+ subs x14, x14, x19
+ sbcs x15, x15, x20
+ sbcs x16, x16, x21
+ sbcs x17, x17, x22
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x17, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x14, x14, x3
+ sbcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ sbcs x16, x16, xzr
+ sbc x17, x17, xzr
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x20, x14, x6
+ mul x19, x14, x6
+ ; A[2] * B[0]
+ umulh x22, x16, x6
+ mul x21, x16, x6
+ ; A[1] * B[0]
+ mul x3, x15, x6
+ adds x20, x20, x3
+ umulh x4, x15, x6
+ adcs x21, x21, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x9
+ adc x22, x22, xzr
+ mul x25, x15, x9
+ ; A[0] * B[1]
+ mul x3, x14, x7
+ adds x20, x20, x3
+ umulh x4, x14, x7
+ adcs x21, x21, x4
+ ; A[2] * B[1]
+ mul x3, x16, x7
+ adcs x22, x22, x3
+ umulh x4, x16, x7
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x8
+ adds x22, x22, x3
+ umulh x4, x15, x8
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x8
+ adds x21, x21, x3
+ umulh x4, x14, x8
+ adcs x22, x22, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x7
+ adds x21, x21, x3
+ umulh x4, x15, x7
+ adcs x22, x22, x4
+ ; A[3] * B[1]
+ mul x3, x17, x7
+ adcs x25, x25, x3
+ umulh x4, x17, x7
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x8
+ adds x25, x25, x3
+ umulh x4, x16, x8
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x9
+ adcs x27, x27, x3
+ umulh x28, x17, x9
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x9
+ adds x22, x22, x3
+ umulh x4, x14, x9
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x9
+ adcs x26, x26, x3
+ umulh x4, x16, x9
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x6
+ adds x22, x22, x3
+ umulh x4, x17, x6
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x8
+ adcs x26, x26, x3
+ umulh x4, x17, x8
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x22, x22, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x22, #63
+ mul x5, x5, x3
+ and x22, x22, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x19, x19, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x20, x20, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x21, x21, x4
+ umulh x27, x3, x27
+ adc x22, x22, xzr
+ ; Add high product results in
+ adds x19, x19, x5
+ adcs x20, x20, x25
+ adcs x21, x21, x26
+ adc x22, x22, x27
+ ; Store
+ stp x19, x20, [x29, #48]
+ stp x21, x22, [x29, #64]
+ ; Multiply
+ ldp x25, x26, [x29, #80]
+ ldp x27, x28, [x29, #96]
+ ; A[0] * B[0]
+ umulh x20, x10, x25
+ mul x19, x10, x25
+ ; A[2] * B[0]
+ umulh x22, x12, x25
+ mul x21, x12, x25
+ ; A[1] * B[0]
+ mul x3, x11, x25
+ adds x20, x20, x3
+ umulh x4, x11, x25
+ adcs x21, x21, x4
+ ; A[1] * B[3]
+ umulh x15, x11, x28
+ adc x22, x22, xzr
+ mul x14, x11, x28
+ ; A[0] * B[1]
+ mul x3, x10, x26
+ adds x20, x20, x3
+ umulh x4, x10, x26
+ adcs x21, x21, x4
+ ; A[2] * B[1]
+ mul x3, x12, x26
+ adcs x22, x22, x3
+ umulh x4, x12, x26
+ adcs x14, x14, x4
+ adc x15, x15, xzr
+ ; A[1] * B[2]
+ mul x3, x11, x27
+ adds x22, x22, x3
+ umulh x4, x11, x27
+ adcs x14, x14, x4
+ adcs x15, x15, xzr
+ adc x16, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x10, x27
+ adds x21, x21, x3
+ umulh x4, x10, x27
+ adcs x22, x22, x4
+ adcs x14, x14, xzr
+ adcs x15, x15, xzr
+ adc x16, x16, xzr
+ ; A[1] * B[1]
+ mul x3, x11, x26
+ adds x21, x21, x3
+ umulh x4, x11, x26
+ adcs x22, x22, x4
+ ; A[3] * B[1]
+ mul x3, x13, x26
+ adcs x14, x14, x3
+ umulh x4, x13, x26
+ adcs x15, x15, x4
+ adc x16, x16, xzr
+ ; A[2] * B[2]
+ mul x3, x12, x27
+ adds x14, x14, x3
+ umulh x4, x12, x27
+ adcs x15, x15, x4
+ ; A[3] * B[3]
+ mul x3, x13, x28
+ adcs x16, x16, x3
+ umulh x17, x13, x28
+ adc x17, x17, xzr
+ ; A[0] * B[3]
+ mul x3, x10, x28
+ adds x22, x22, x3
+ umulh x4, x10, x28
+ adcs x14, x14, x4
+ ; A[2] * B[3]
+ mul x3, x12, x28
+ adcs x15, x15, x3
+ umulh x4, x12, x28
+ adcs x16, x16, x4
+ adc x17, x17, xzr
+ ; A[3] * B[0]
+ mul x3, x13, x25
+ adds x22, x22, x3
+ umulh x4, x13, x25
+ adcs x14, x14, x4
+ ; A[3] * B[2]
+ mul x3, x13, x27
+ adcs x15, x15, x3
+ umulh x4, x13, x27
+ adcs x16, x16, x4
+ adc x17, x17, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x22, x22, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x22, #63
+ mul x5, x5, x3
+ and x22, x22, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x19, x19, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x20, x20, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x21, x21, x4
+ umulh x16, x3, x16
+ adc x22, x22, xzr
+ ; Add high product results in
+ adds x19, x19, x5
+ adcs x20, x20, x14
+ adcs x21, x21, x15
+ adc x22, x22, x16
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x25, x26
+ mul x11, x25, x26
+ ; A[0] * A[3]
+ umulh x14, x25, x28
+ mul x13, x25, x28
+ ; A[0] * A[2]
+ mul x3, x25, x27
+ adds x12, x12, x3
+ umulh x4, x25, x27
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x26, x28
+ adcs x14, x14, x3
+ umulh x15, x26, x28
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x26, x27
+ adds x13, x13, x3
+ umulh x4, x26, x27
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x27, x28
+ adcs x15, x15, x3
+ umulh x16, x27, x28
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x25, x25
+ mul x10, x25, x25
+ ; A[1] * A[1]
+ mul x3, x26, x26
+ adds x11, x11, x4
+ umulh x4, x26, x26
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x27, x27
+ adcs x13, x13, x4
+ umulh x4, x27, x27
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x28, x28
+ adcs x15, x15, x4
+ umulh x4, x28, x28
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x10, x10, x5
+ adcs x11, x11, x14
+ adcs x12, x12, x15
+ adc x13, x13, x16
+ ; Square
+ ; A[0] * A[1]
+ umulh x16, x6, x7
+ mul x15, x6, x7
+ ; A[0] * A[3]
+ umulh x25, x6, x9
+ mul x17, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x16, x16, x3
+ umulh x4, x6, x8
+ adcs x17, x17, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x25, x25, x3
+ umulh x26, x7, x9
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x17, x17, x3
+ umulh x4, x7, x8
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x26, x26, x3
+ umulh x27, x8, x9
+ adc x27, x27, xzr
+ ; Double
+ adds x15, x15, x15
+ adcs x16, x16, x16
+ adcs x17, x17, x17
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x14, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x15, x15, x4
+ umulh x4, x7, x7
+ adcs x16, x16, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x17, x17, x4
+ umulh x4, x8, x8
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x26, x26, x4
+ umulh x4, x9, x9
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x17, x17, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x14, x14, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x15, x15, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x16, x16, x4
+ umulh x27, x3, x27
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x25
+ adcs x16, x16, x26
+ adc x17, x17, x27
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x7, x14, x10
+ mul x6, x14, x10
+ ; A[2] * B[0]
+ umulh x9, x16, x10
+ mul x8, x16, x10
+ ; A[1] * B[0]
+ mul x3, x15, x10
+ adds x7, x7, x3
+ umulh x4, x15, x10
+ adcs x8, x8, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x13
+ adc x9, x9, xzr
+ mul x25, x15, x13
+ ; A[0] * B[1]
+ mul x3, x14, x11
+ adds x7, x7, x3
+ umulh x4, x14, x11
+ adcs x8, x8, x4
+ ; A[2] * B[1]
+ mul x3, x16, x11
+ adcs x9, x9, x3
+ umulh x4, x16, x11
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x12
+ adds x9, x9, x3
+ umulh x4, x15, x12
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x12
+ adds x8, x8, x3
+ umulh x4, x14, x12
+ adcs x9, x9, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x11
+ adds x8, x8, x3
+ umulh x4, x15, x11
+ adcs x9, x9, x4
+ ; A[3] * B[1]
+ mul x3, x17, x11
+ adcs x25, x25, x3
+ umulh x4, x17, x11
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x12
+ adds x25, x25, x3
+ umulh x4, x16, x12
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x13
+ adcs x27, x27, x3
+ umulh x28, x17, x13
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x13
+ adds x9, x9, x3
+ umulh x4, x14, x13
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x13
+ adcs x26, x26, x3
+ umulh x4, x16, x13
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x10
+ adds x9, x9, x3
+ umulh x4, x17, x10
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x12
+ adcs x26, x26, x3
+ umulh x4, x17, x12
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x9, x9, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x5, x5, x3
+ and x9, x9, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x6, x6, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x7, x7, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x8, x8, x4
+ umulh x27, x3, x27
+ adc x9, x9, xzr
+ ; Add high product results in
+ adds x6, x6, x5
+ adcs x7, x7, x25
+ adcs x8, x8, x26
+ adc x9, x9, x27
+ ; Store
+ stp x6, x7, [x0]
+ stp x8, x9, [x0, #16]
+ ; Sub
+ subs x14, x14, x10
+ sbcs x15, x15, x11
+ sbcs x16, x16, x12
+ sbcs x17, x17, x13
+ csetm x5, cc
+ mov x3, #-19
+ ; Mask the modulus
+ extr x5, x5, x17, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x14, x14, x3
+ sbcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ sbcs x16, x16, xzr
+ sbc x17, x17, xzr
+ ; Multiply by 121666
+ mov x5, #0xdb42
+ movk x5, #1, lsl 16
+ mul x6, x14, x5
+ umulh x7, x14, x5
+ mul x3, x15, x5
+ umulh x8, x15, x5
+ adds x7, x7, x3
+ adc x8, x8, xzr
+ mul x3, x16, x5
+ umulh x9, x16, x5
+ adds x8, x8, x3
+ adc x9, x9, xzr
+ mul x3, x17, x5
+ umulh x4, x17, x5
+ adds x9, x9, x3
+ adc x4, x4, xzr
+ mov x5, #19
+ extr x4, x4, x9, #63
+ mul x4, x4, x5
+ adds x6, x6, x4
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Add
+ adds x10, x10, x6
+ adcs x11, x11, x7
+ adcs x12, x12, x8
+ adcs x13, x13, x9
+ cset x5, cs
+ mov x3, #19
+ ; Mask the modulus
+ extr x5, x5, x13, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x10, x10, x3
+ adcs x11, x11, xzr
+ and x13, x13, #0x7fffffffffffffff
+ adcs x12, x12, xzr
+ adc x13, x13, xzr
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x7, x14, x10
+ mul x6, x14, x10
+ ; A[2] * B[0]
+ umulh x9, x16, x10
+ mul x8, x16, x10
+ ; A[1] * B[0]
+ mul x3, x15, x10
+ adds x7, x7, x3
+ umulh x4, x15, x10
+ adcs x8, x8, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x13
+ adc x9, x9, xzr
+ mul x25, x15, x13
+ ; A[0] * B[1]
+ mul x3, x14, x11
+ adds x7, x7, x3
+ umulh x4, x14, x11
+ adcs x8, x8, x4
+ ; A[2] * B[1]
+ mul x3, x16, x11
+ adcs x9, x9, x3
+ umulh x4, x16, x11
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x12
+ adds x9, x9, x3
+ umulh x4, x15, x12
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x12
+ adds x8, x8, x3
+ umulh x4, x14, x12
+ adcs x9, x9, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x11
+ adds x8, x8, x3
+ umulh x4, x15, x11
+ adcs x9, x9, x4
+ ; A[3] * B[1]
+ mul x3, x17, x11
+ adcs x25, x25, x3
+ umulh x4, x17, x11
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x12
+ adds x25, x25, x3
+ umulh x4, x16, x12
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x13
+ adcs x27, x27, x3
+ umulh x28, x17, x13
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x13
+ adds x9, x9, x3
+ umulh x4, x14, x13
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x13
+ adcs x26, x26, x3
+ umulh x4, x16, x13
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x10
+ adds x9, x9, x3
+ umulh x4, x17, x10
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x12
+ adcs x26, x26, x3
+ umulh x4, x17, x12
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x9, x9, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x5, x5, x3
+ and x9, x9, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x6, x6, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x7, x7, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x8, x8, x4
+ umulh x27, x3, x27
+ adc x9, x9, xzr
+ ; Add high product results in
+ adds x6, x6, x5
+ adcs x7, x7, x25
+ adcs x8, x8, x26
+ adc x9, x9, x27
+ ; Store
+ stp x6, x7, [x29, #16]
+ stp x8, x9, [x29, #32]
+ ; Add
+ ldp x25, x26, [x29, #48]
+ ldp x27, x28, [x29, #64]
+ adds x10, x25, x19
+ adcs x11, x26, x20
+ adcs x12, x27, x21
+ adcs x13, x28, x22
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x10, x10, x3
+ adcs x11, x11, xzr
+ and x13, x13, #0x7fffffffffffffff
+ adcs x12, x12, xzr
+ adc x13, x13, xzr
+ ; Sub
+ subs x19, x25, x19
+ sbcs x20, x26, x20
+ sbcs x21, x27, x21
+ sbcs x22, x28, x22
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x22, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x19, x19, x3
+ sbcs x20, x20, xzr
+ and x22, x22, #0x7fffffffffffffff
+ sbcs x21, x21, xzr
+ sbc x22, x22, xzr
+ ; Square
+ ; A[0] * A[1]
+ umulh x8, x10, x11
+ mul x7, x10, x11
+ ; A[0] * A[3]
+ umulh x25, x10, x13
+ mul x9, x10, x13
+ ; A[0] * A[2]
+ mul x3, x10, x12
+ adds x8, x8, x3
+ umulh x4, x10, x12
+ adcs x9, x9, x4
+ ; A[1] * A[3]
+ mul x3, x11, x13
+ adcs x25, x25, x3
+ umulh x26, x11, x13
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x11, x12
+ adds x9, x9, x3
+ umulh x4, x11, x12
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x12, x13
+ adcs x26, x26, x3
+ umulh x27, x12, x13
+ adc x27, x27, xzr
+ ; Double
+ adds x7, x7, x7
+ adcs x8, x8, x8
+ adcs x9, x9, x9
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x10, x10
+ mul x6, x10, x10
+ ; A[1] * A[1]
+ mul x3, x11, x11
+ adds x7, x7, x4
+ umulh x4, x11, x11
+ adcs x8, x8, x3
+ ; A[2] * A[2]
+ mul x3, x12, x12
+ adcs x9, x9, x4
+ umulh x4, x12, x12
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x13, x13
+ adcs x26, x26, x4
+ umulh x4, x13, x13
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x9, x9, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x5, x5, x3
+ and x9, x9, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x6, x6, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x7, x7, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x8, x8, x4
+ umulh x27, x3, x27
+ adc x9, x9, xzr
+ ; Add high product results in
+ adds x6, x6, x5
+ adcs x7, x7, x25
+ adcs x8, x8, x26
+ adc x9, x9, x27
+ ; Square
+ ; A[0] * A[1]
+ umulh x16, x19, x20
+ mul x15, x19, x20
+ ; A[0] * A[3]
+ umulh x25, x19, x22
+ mul x17, x19, x22
+ ; A[0] * A[2]
+ mul x3, x19, x21
+ adds x16, x16, x3
+ umulh x4, x19, x21
+ adcs x17, x17, x4
+ ; A[1] * A[3]
+ mul x3, x20, x22
+ adcs x25, x25, x3
+ umulh x26, x20, x22
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x20, x21
+ adds x17, x17, x3
+ umulh x4, x20, x21
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x21, x22
+ adcs x26, x26, x3
+ umulh x27, x21, x22
+ adc x27, x27, xzr
+ ; Double
+ adds x15, x15, x15
+ adcs x16, x16, x16
+ adcs x17, x17, x17
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x19, x19
+ mul x14, x19, x19
+ ; A[1] * A[1]
+ mul x3, x20, x20
+ adds x15, x15, x4
+ umulh x4, x20, x20
+ adcs x16, x16, x3
+ ; A[2] * A[2]
+ mul x3, x21, x21
+ adcs x17, x17, x4
+ umulh x4, x21, x21
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x22, x22
+ adcs x26, x26, x4
+ umulh x4, x22, x22
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x17, x17, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x14, x14, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x15, x15, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x16, x16, x4
+ umulh x27, x3, x27
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x25
+ adcs x16, x16, x26
+ adc x17, x17, x27
+ ; Multiply
+ ldp x19, x20, [x2]
+ ldp x21, x22, [x2, #16]
+ ; A[0] * B[0]
+ umulh x11, x19, x14
+ mul x10, x19, x14
+ ; A[2] * B[0]
+ umulh x13, x21, x14
+ mul x12, x21, x14
+ ; A[1] * B[0]
+ mul x3, x20, x14
+ adds x11, x11, x3
+ umulh x4, x20, x14
+ adcs x12, x12, x4
+ ; A[1] * B[3]
+ umulh x26, x20, x17
+ adc x13, x13, xzr
+ mul x25, x20, x17
+ ; A[0] * B[1]
+ mul x3, x19, x15
+ adds x11, x11, x3
+ umulh x4, x19, x15
+ adcs x12, x12, x4
+ ; A[2] * B[1]
+ mul x3, x21, x15
+ adcs x13, x13, x3
+ umulh x4, x21, x15
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x20, x16
+ adds x13, x13, x3
+ umulh x4, x20, x16
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x19, x16
+ adds x12, x12, x3
+ umulh x4, x19, x16
+ adcs x13, x13, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x20, x15
+ adds x12, x12, x3
+ umulh x4, x20, x15
+ adcs x13, x13, x4
+ ; A[3] * B[1]
+ mul x3, x22, x15
+ adcs x25, x25, x3
+ umulh x4, x22, x15
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x21, x16
+ adds x25, x25, x3
+ umulh x4, x21, x16
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x22, x17
+ adcs x27, x27, x3
+ umulh x28, x22, x17
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x19, x17
+ adds x13, x13, x3
+ umulh x4, x19, x17
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x21, x17
+ adcs x26, x26, x3
+ umulh x4, x21, x17
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x22, x14
+ adds x13, x13, x3
+ umulh x4, x22, x14
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x22, x16
+ adcs x26, x26, x3
+ umulh x4, x22, x16
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x13, x13, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x10, x10, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x11, x11, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x12, x12, x4
+ umulh x27, x3, x27
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x10, x10, x5
+ adcs x11, x11, x25
+ adcs x12, x12, x26
+ adc x13, x13, x27
+ subs x24, x24, #1
+ cmp x24, #3
+ bge L_curve25519_bits
+ ; Conditional Swap
+ subs xzr, xzr, x23, lsl 63
+ ldp x25, x26, [x29, #16]
+ ldp x27, x28, [x29, #32]
+ csel x19, x25, x10, ne
+ csel x25, x10, x25, ne
+ csel x20, x26, x11, ne
+ csel x26, x11, x26, ne
+ csel x21, x27, x12, ne
+ csel x27, x12, x27, ne
+ csel x22, x28, x13, ne
+ csel x28, x13, x28, ne
+ ; Conditional Swap
+ subs xzr, xzr, x23, lsl 63
+ ldp x10, x11, [x0]
+ ldp x12, x13, [x0, #16]
+ csel x14, x10, x6, ne
+ csel x10, x6, x10, ne
+ csel x15, x11, x7, ne
+ csel x11, x7, x11, ne
+ csel x16, x12, x8, ne
+ csel x12, x8, x12, ne
+ csel x17, x13, x9, ne
+ csel x13, x9, x13, ne
+L_curve25519_3
+ ; Add
+ adds x6, x10, x25
+ adcs x7, x11, x26
+ adcs x8, x12, x27
+ adcs x9, x13, x28
+ cset x5, cs
+ mov x3, #19
+ extr x5, x5, x9, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x6, x6, x3
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Sub
+ subs x25, x10, x25
+ sbcs x26, x11, x26
+ sbcs x27, x12, x27
+ sbcs x28, x13, x28
+ csetm x5, cc
+ mov x3, #-19
+ extr x5, x5, x28, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x25, x25, x3
+ sbcs x26, x26, xzr
+ and x28, x28, #0x7fffffffffffffff
+ sbcs x27, x27, xzr
+ sbc x28, x28, xzr
+ ; Square
+ ; A[0] * A[1]
+ umulh x21, x25, x26
+ mul x20, x25, x26
+ ; A[0] * A[3]
+ umulh x14, x25, x28
+ mul x22, x25, x28
+ ; A[0] * A[2]
+ mul x3, x25, x27
+ adds x21, x21, x3
+ umulh x4, x25, x27
+ adcs x22, x22, x4
+ ; A[1] * A[3]
+ mul x3, x26, x28
+ adcs x14, x14, x3
+ umulh x15, x26, x28
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x26, x27
+ adds x22, x22, x3
+ umulh x4, x26, x27
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x27, x28
+ adcs x15, x15, x3
+ umulh x16, x27, x28
+ adc x16, x16, xzr
+ ; Double
+ adds x20, x20, x20
+ adcs x21, x21, x21
+ adcs x22, x22, x22
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x25, x25
+ mul x19, x25, x25
+ ; A[1] * A[1]
+ mul x3, x26, x26
+ adds x20, x20, x4
+ umulh x4, x26, x26
+ adcs x21, x21, x3
+ ; A[2] * A[2]
+ mul x3, x27, x27
+ adcs x22, x22, x4
+ umulh x4, x27, x27
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x28, x28
+ adcs x15, x15, x4
+ umulh x4, x28, x28
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x22, x22, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x22, #63
+ mul x5, x5, x3
+ and x22, x22, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x19, x19, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x20, x20, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x21, x21, x4
+ umulh x16, x3, x16
+ adc x22, x22, xzr
+ ; Add high product results in
+ adds x19, x19, x5
+ adcs x20, x20, x14
+ adcs x21, x21, x15
+ adc x22, x22, x16
+ ; Square
+ ; A[0] * A[1]
+ umulh x16, x6, x7
+ mul x15, x6, x7
+ ; A[0] * A[3]
+ umulh x25, x6, x9
+ mul x17, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x16, x16, x3
+ umulh x4, x6, x8
+ adcs x17, x17, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x25, x25, x3
+ umulh x26, x7, x9
+ adc x26, x26, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x17, x17, x3
+ umulh x4, x7, x8
+ adcs x25, x25, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x26, x26, x3
+ umulh x27, x8, x9
+ adc x27, x27, xzr
+ ; Double
+ adds x15, x15, x15
+ adcs x16, x16, x16
+ adcs x17, x17, x17
+ adcs x25, x25, x25
+ adcs x26, x26, x26
+ adcs x27, x27, x27
+ adc x28, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x14, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x15, x15, x4
+ umulh x4, x7, x7
+ adcs x16, x16, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x17, x17, x4
+ umulh x4, x8, x8
+ adcs x25, x25, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x26, x26, x4
+ umulh x4, x9, x9
+ adcs x27, x27, x3
+ adc x28, x28, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x17, x17, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x14, x14, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x15, x15, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x16, x16, x4
+ umulh x27, x3, x27
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x25
+ adcs x16, x16, x26
+ adc x17, x17, x27
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x11, x14, x19
+ mul x10, x14, x19
+ ; A[2] * B[0]
+ umulh x13, x16, x19
+ mul x12, x16, x19
+ ; A[1] * B[0]
+ mul x3, x15, x19
+ adds x11, x11, x3
+ umulh x4, x15, x19
+ adcs x12, x12, x4
+ ; A[1] * B[3]
+ umulh x26, x15, x22
+ adc x13, x13, xzr
+ mul x25, x15, x22
+ ; A[0] * B[1]
+ mul x3, x14, x20
+ adds x11, x11, x3
+ umulh x4, x14, x20
+ adcs x12, x12, x4
+ ; A[2] * B[1]
+ mul x3, x16, x20
+ adcs x13, x13, x3
+ umulh x4, x16, x20
+ adcs x25, x25, x4
+ adc x26, x26, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x21
+ adds x13, x13, x3
+ umulh x4, x15, x21
+ adcs x25, x25, x4
+ adcs x26, x26, xzr
+ adc x27, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x21
+ adds x12, x12, x3
+ umulh x4, x14, x21
+ adcs x13, x13, x4
+ adcs x25, x25, xzr
+ adcs x26, x26, xzr
+ adc x27, x27, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x20
+ adds x12, x12, x3
+ umulh x4, x15, x20
+ adcs x13, x13, x4
+ ; A[3] * B[1]
+ mul x3, x17, x20
+ adcs x25, x25, x3
+ umulh x4, x17, x20
+ adcs x26, x26, x4
+ adc x27, x27, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x21
+ adds x25, x25, x3
+ umulh x4, x16, x21
+ adcs x26, x26, x4
+ ; A[3] * B[3]
+ mul x3, x17, x22
+ adcs x27, x27, x3
+ umulh x28, x17, x22
+ adc x28, x28, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x22
+ adds x13, x13, x3
+ umulh x4, x14, x22
+ adcs x25, x25, x4
+ ; A[2] * B[3]
+ mul x3, x16, x22
+ adcs x26, x26, x3
+ umulh x4, x16, x22
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x19
+ adds x13, x13, x3
+ umulh x4, x17, x19
+ adcs x25, x25, x4
+ ; A[3] * B[2]
+ mul x3, x17, x21
+ adcs x26, x26, x3
+ umulh x4, x17, x21
+ adcs x27, x27, x4
+ adc x28, x28, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x28
+ adds x13, x13, x4
+ umulh x5, x3, x28
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x25
+ adds x10, x10, x4
+ umulh x25, x3, x25
+ mul x4, x3, x26
+ adcs x11, x11, x4
+ umulh x26, x3, x26
+ mul x4, x3, x27
+ adcs x12, x12, x4
+ umulh x27, x3, x27
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x10, x10, x5
+ adcs x11, x11, x25
+ adcs x12, x12, x26
+ adc x13, x13, x27
+ ; Store
+ stp x10, x11, [x0]
+ stp x12, x13, [x0, #16]
+ ; Sub
+ subs x14, x14, x19
+ sbcs x15, x15, x20
+ sbcs x16, x16, x21
+ sbcs x17, x17, x22
+ csetm x5, cc
+ mov x3, #-19
+ ; Mask the modulus
+ extr x5, x5, x17, #63
+ mul x3, x5, x3
+ ; Add modulus (if underflow)
+ subs x14, x14, x3
+ sbcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ sbcs x16, x16, xzr
+ sbc x17, x17, xzr
+ ; Multiply by 121666
+ mov x5, #0xdb42
+ movk x5, #1, lsl 16
+ mul x6, x14, x5
+ umulh x7, x14, x5
+ mul x3, x15, x5
+ umulh x8, x15, x5
+ adds x7, x7, x3
+ adc x8, x8, xzr
+ mul x3, x16, x5
+ umulh x9, x16, x5
+ adds x8, x8, x3
+ adc x9, x9, xzr
+ mul x3, x17, x5
+ umulh x4, x17, x5
+ adds x9, x9, x3
+ adc x4, x4, xzr
+ mov x5, #19
+ extr x4, x4, x9, #63
+ mul x4, x4, x5
+ adds x6, x6, x4
+ adcs x7, x7, xzr
+ and x9, x9, #0x7fffffffffffffff
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ ; Add
+ adds x19, x19, x6
+ adcs x20, x20, x7
+ adcs x21, x21, x8
+ adcs x22, x22, x9
+ cset x5, cs
+ mov x3, #19
+ ; Mask the modulus
+ extr x5, x5, x22, #63
+ mul x3, x5, x3
+ ; Sub modulus (if overflow)
+ adds x19, x19, x3
+ adcs x20, x20, xzr
+ and x22, x22, #0x7fffffffffffffff
+ adcs x21, x21, xzr
+ adc x22, x22, xzr
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x26, x14, x19
+ mul x25, x14, x19
+ ; A[2] * B[0]
+ umulh x28, x16, x19
+ mul x27, x16, x19
+ ; A[1] * B[0]
+ mul x3, x15, x19
+ adds x26, x26, x3
+ umulh x4, x15, x19
+ adcs x27, x27, x4
+ ; A[1] * B[3]
+ umulh x7, x15, x22
+ adc x28, x28, xzr
+ mul x6, x15, x22
+ ; A[0] * B[1]
+ mul x3, x14, x20
+ adds x26, x26, x3
+ umulh x4, x14, x20
+ adcs x27, x27, x4
+ ; A[2] * B[1]
+ mul x3, x16, x20
+ adcs x28, x28, x3
+ umulh x4, x16, x20
+ adcs x6, x6, x4
+ adc x7, x7, xzr
+ ; A[1] * B[2]
+ mul x3, x15, x21
+ adds x28, x28, x3
+ umulh x4, x15, x21
+ adcs x6, x6, x4
+ adcs x7, x7, xzr
+ adc x8, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x14, x21
+ adds x27, x27, x3
+ umulh x4, x14, x21
+ adcs x28, x28, x4
+ adcs x6, x6, xzr
+ adcs x7, x7, xzr
+ adc x8, x8, xzr
+ ; A[1] * B[1]
+ mul x3, x15, x20
+ adds x27, x27, x3
+ umulh x4, x15, x20
+ adcs x28, x28, x4
+ ; A[3] * B[1]
+ mul x3, x17, x20
+ adcs x6, x6, x3
+ umulh x4, x17, x20
+ adcs x7, x7, x4
+ adc x8, x8, xzr
+ ; A[2] * B[2]
+ mul x3, x16, x21
+ adds x6, x6, x3
+ umulh x4, x16, x21
+ adcs x7, x7, x4
+ ; A[3] * B[3]
+ mul x3, x17, x22
+ adcs x8, x8, x3
+ umulh x9, x17, x22
+ adc x9, x9, xzr
+ ; A[0] * B[3]
+ mul x3, x14, x22
+ adds x28, x28, x3
+ umulh x4, x14, x22
+ adcs x6, x6, x4
+ ; A[2] * B[3]
+ mul x3, x16, x22
+ adcs x7, x7, x3
+ umulh x4, x16, x22
+ adcs x8, x8, x4
+ adc x9, x9, xzr
+ ; A[3] * B[0]
+ mul x3, x17, x19
+ adds x28, x28, x3
+ umulh x4, x17, x19
+ adcs x6, x6, x4
+ ; A[3] * B[2]
+ mul x3, x17, x21
+ adcs x7, x7, x3
+ umulh x4, x17, x21
+ adcs x8, x8, x4
+ adc x9, x9, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x9
+ adds x28, x28, x4
+ umulh x5, x3, x9
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x28, #63
+ mul x5, x5, x3
+ and x28, x28, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x6
+ adds x25, x25, x4
+ umulh x6, x3, x6
+ mul x4, x3, x7
+ adcs x26, x26, x4
+ umulh x7, x3, x7
+ mul x4, x3, x8
+ adcs x27, x27, x4
+ umulh x8, x3, x8
+ adc x28, x28, xzr
+ ; Add high product results in
+ adds x25, x25, x5
+ adcs x26, x26, x6
+ adcs x27, x27, x7
+ adc x28, x28, x8
+ ; Store
+ stp x25, x26, [x29, #16]
+ stp x27, x28, [x29, #32]
+ subs x24, x24, #1
+ bge L_curve25519_3
+ ; Invert
+ add x0, x29, #48
+ add x1, x29, #16
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #48
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #0x50
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #16
+ add x2, x29, #0x50
+ bl fe_mul
+ add x0, x29, #48
+ add x1, x29, #48
+ add x2, x29, #0x50
+ bl fe_mul
+ add x0, x29, #0x70
+ add x1, x29, #48
+ bl fe_sq
+ add x0, x29, #0x50
+ add x1, x29, #0x50
+ add x2, x29, #0x70
+ bl fe_mul
+ ; Loop: 5 times
+ mov x24, #5
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_inv_1
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_1
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 10 times
+ mov x24, #10
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_inv_2
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_2
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x70
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 20 times
+ mov x24, #20
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_inv_3
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_3
+ ; Store
+ stp x6, x7, [x29, #144]
+ stp x8, x9, [x29, #160]
+ add x0, x29, #0x70
+ add x1, x29, #0x90
+ add x2, x29, #0x70
+ bl fe_mul
+ ; Loop: 10 times
+ mov x24, #10
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_inv_4
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_4
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 50 times
+ mov x24, #50
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_inv_5
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_5
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x70
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 100 times
+ mov x24, #0x64
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_inv_6
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_6
+ ; Store
+ stp x6, x7, [x29, #144]
+ stp x8, x9, [x29, #160]
+ add x0, x29, #0x70
+ add x1, x29, #0x90
+ add x2, x29, #0x70
+ bl fe_mul
+ ; Loop: 50 times
+ mov x24, #50
+ ldp x6, x7, [x29, #112]
+ ldp x8, x9, [x29, #128]
+L_curve25519_inv_7
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_7
+ ; Store
+ stp x6, x7, [x29, #112]
+ stp x8, x9, [x29, #128]
+ add x0, x29, #0x50
+ add x1, x29, #0x70
+ add x2, x29, #0x50
+ bl fe_mul
+ ; Loop: 5 times
+ mov x24, #5
+ ldp x6, x7, [x29, #80]
+ ldp x8, x9, [x29, #96]
+L_curve25519_inv_8
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x24, x24, #1
+ bne L_curve25519_inv_8
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #16
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ldr x0, [x29, #176]
+ ; Multiply
+ ldp x6, x7, [x0]
+ ldp x8, x9, [x0, #16]
+ ldp x10, x11, [x29, #16]
+ ldp x12, x13, [x29, #32]
+ ; A[0] * B[0]
+ umulh x15, x6, x10
+ mul x14, x6, x10
+ ; A[2] * B[0]
+ umulh x17, x8, x10
+ mul x16, x8, x10
+ ; A[1] * B[0]
+ mul x3, x7, x10
+ adds x15, x15, x3
+ umulh x4, x7, x10
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x7, x13
+ adc x17, x17, xzr
+ mul x19, x7, x13
+ ; A[0] * B[1]
+ mul x3, x6, x11
+ adds x15, x15, x3
+ umulh x4, x6, x11
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x8, x11
+ adcs x17, x17, x3
+ umulh x4, x8, x11
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x7, x12
+ adds x17, x17, x3
+ umulh x4, x7, x12
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x6, x12
+ adds x16, x16, x3
+ umulh x4, x6, x12
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x7, x11
+ adds x16, x16, x3
+ umulh x4, x7, x11
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x9, x11
+ adcs x19, x19, x3
+ umulh x4, x9, x11
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x8, x12
+ adds x19, x19, x3
+ umulh x4, x8, x12
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x9, x13
+ adcs x21, x21, x3
+ umulh x22, x9, x13
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x6, x13
+ adds x17, x17, x3
+ umulh x4, x6, x13
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x8, x13
+ adcs x20, x20, x3
+ umulh x4, x8, x13
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x9, x10
+ adds x17, x17, x3
+ umulh x4, x9, x10
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x9, x12
+ adcs x20, x20, x3
+ umulh x4, x9, x12
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Reduce if top bit set
+ mov x3, #19
+ and x4, x3, x17, asr 63
+ adds x14, x14, x4
+ adcs x15, x15, xzr
+ and x17, x17, #0x7fffffffffffffff
+ adcs x16, x16, xzr
+ adc x17, x17, xzr
+ adds x4, x14, x3
+ adcs x4, x15, xzr
+ adcs x4, x16, xzr
+ adc x4, x17, xzr
+ and x4, x3, x4, asr 63
+ adds x14, x14, x4
+ adcs x15, x15, xzr
+ mov x4, #0x7fffffffffffffff
+ adcs x16, x16, xzr
+ adc x17, x17, xzr
+ and x17, x17, x4
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ mov x0, xzr
+ ldp x17, x19, [x29, #200]
+ ldp x20, x21, [x29, #216]
+ ldp x22, x23, [x29, #232]
+ ldp x24, x25, [x29, #248]
+ ldp x26, x27, [x29, #264]
+ ldr x28, [x29, #280]
+ ldp x29, x30, [sp], #0x120
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT fe_pow22523
+fe_pow22523 PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x23, [x29, #128]
+ ; pow22523
+ str x0, [x29, #112]
+ str x1, [x29, #120]
+ add x0, x29, #16
+ ldr x1, [x29, #120]
+ bl fe_sq
+ add x0, x29, #48
+ add x1, x29, #16
+ bl fe_sq
+ add x0, x29, #48
+ add x1, x29, #48
+ bl fe_sq
+ add x0, x29, #48
+ ldr x1, [x29, #120]
+ add x2, x29, #48
+ bl fe_mul
+ add x0, x29, #16
+ add x1, x29, #16
+ add x2, x29, #48
+ bl fe_mul
+ add x0, x29, #16
+ add x1, x29, #16
+ bl fe_sq
+ add x0, x29, #16
+ add x1, x29, #48
+ add x2, x29, #16
+ bl fe_mul
+ ; Loop: 5 times
+ mov x23, #5
+ ldp x6, x7, [x29, #16]
+ ldp x8, x9, [x29, #32]
+L_fe_pow22523_1
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x23, x23, #1
+ bne L_fe_pow22523_1
+ ; Store
+ stp x6, x7, [x29, #48]
+ stp x8, x9, [x29, #64]
+ add x0, x29, #16
+ add x1, x29, #48
+ add x2, x29, #16
+ bl fe_mul
+ ; Loop: 10 times
+ mov x23, #10
+ ldp x6, x7, [x29, #16]
+ ldp x8, x9, [x29, #32]
+L_fe_pow22523_2
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x23, x23, #1
+ bne L_fe_pow22523_2
+ ; Store
+ stp x6, x7, [x29, #48]
+ stp x8, x9, [x29, #64]
+ add x0, x29, #48
+ add x1, x29, #48
+ add x2, x29, #16
+ bl fe_mul
+ ; Loop: 20 times
+ mov x23, #20
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_pow22523_3
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x23, x23, #1
+ bne L_fe_pow22523_3
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #48
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ; Loop: 10 times
+ mov x23, #10
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_pow22523_4
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x23, x23, #1
+ bne L_fe_pow22523_4
+ ; Store
+ stp x6, x7, [x29, #48]
+ stp x8, x9, [x29, #64]
+ add x0, x29, #16
+ add x1, x29, #48
+ add x2, x29, #16
+ bl fe_mul
+ ; Loop: 50 times
+ mov x23, #50
+ ldp x6, x7, [x29, #16]
+ ldp x8, x9, [x29, #32]
+L_fe_pow22523_5
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x23, x23, #1
+ bne L_fe_pow22523_5
+ ; Store
+ stp x6, x7, [x29, #48]
+ stp x8, x9, [x29, #64]
+ add x0, x29, #48
+ add x1, x29, #48
+ add x2, x29, #16
+ bl fe_mul
+ ; Loop: 100 times
+ mov x23, #0x64
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_pow22523_6
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x23, x23, #1
+ bne L_fe_pow22523_6
+ ; Store
+ stp x6, x7, [x29, #80]
+ stp x8, x9, [x29, #96]
+ add x0, x29, #48
+ add x1, x29, #0x50
+ add x2, x29, #48
+ bl fe_mul
+ ; Loop: 50 times
+ mov x23, #50
+ ldp x6, x7, [x29, #48]
+ ldp x8, x9, [x29, #64]
+L_fe_pow22523_7
+ ; Square
+ ; A[0] * A[1]
+ umulh x12, x6, x7
+ mul x11, x6, x7
+ ; A[0] * A[3]
+ umulh x14, x6, x9
+ mul x13, x6, x9
+ ; A[0] * A[2]
+ mul x3, x6, x8
+ adds x12, x12, x3
+ umulh x4, x6, x8
+ adcs x13, x13, x4
+ ; A[1] * A[3]
+ mul x3, x7, x9
+ adcs x14, x14, x3
+ umulh x15, x7, x9
+ adc x15, x15, xzr
+ ; A[1] * A[2]
+ mul x3, x7, x8
+ adds x13, x13, x3
+ umulh x4, x7, x8
+ adcs x14, x14, x4
+ ; A[2] * A[3]
+ mul x3, x8, x9
+ adcs x15, x15, x3
+ umulh x16, x8, x9
+ adc x16, x16, xzr
+ ; Double
+ adds x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adcs x15, x15, x15
+ adcs x16, x16, x16
+ adc x17, xzr, xzr
+ ; A[0] * A[0]
+ umulh x4, x6, x6
+ mul x10, x6, x6
+ ; A[1] * A[1]
+ mul x3, x7, x7
+ adds x11, x11, x4
+ umulh x4, x7, x7
+ adcs x12, x12, x3
+ ; A[2] * A[2]
+ mul x3, x8, x8
+ adcs x13, x13, x4
+ umulh x4, x8, x8
+ adcs x14, x14, x3
+ ; A[3] * A[3]
+ mul x3, x9, x9
+ adcs x15, x15, x4
+ umulh x4, x9, x9
+ adcs x16, x16, x3
+ adc x17, x17, x4
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x17
+ adds x13, x13, x4
+ umulh x5, x3, x17
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x13, #63
+ mul x5, x5, x3
+ and x13, x13, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x14
+ adds x10, x10, x4
+ umulh x14, x3, x14
+ mul x4, x3, x15
+ adcs x11, x11, x4
+ umulh x15, x3, x15
+ mul x4, x3, x16
+ adcs x12, x12, x4
+ umulh x16, x3, x16
+ adc x13, x13, xzr
+ ; Add high product results in
+ adds x6, x10, x5
+ adcs x7, x11, x14
+ adcs x8, x12, x15
+ adc x9, x13, x16
+ subs x23, x23, #1
+ bne L_fe_pow22523_7
+ ; Store
+ stp x6, x7, [x29, #48]
+ stp x8, x9, [x29, #64]
+ add x0, x29, #16
+ add x1, x29, #48
+ add x2, x29, #16
+ bl fe_mul
+ add x0, x29, #16
+ add x1, x29, #16
+ bl fe_sq
+ bl fe_sq
+ ldr x0, [x29, #112]
+ add x1, x29, #16
+ ldr x2, [x29, #120]
+ bl fe_mul
+ ldp x17, x23, [x29, #128]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT ge_p1p1_to_p2
+ge_p1p1_to_p2 PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #40]
+ stp x20, x21, [x29, #56]
+ str x22, [x29, #72]
+ str x0, [x29, #16]
+ str x1, [x29, #24]
+ mov x2, x1
+ add x1, x1, #0x60
+ ; Multiply
+ ldp x10, x11, [x1]
+ ldp x12, x13, [x1, #16]
+ ldp x6, x7, [x2]
+ ldp x8, x9, [x2, #16]
+ ; A[0] * B[0]
+ umulh x15, x10, x6
+ mul x14, x10, x6
+ ; A[2] * B[0]
+ umulh x17, x12, x6
+ mul x16, x12, x6
+ ; A[1] * B[0]
+ mul x3, x11, x6
+ adds x15, x15, x3
+ umulh x4, x11, x6
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x11, x9
+ adc x17, x17, xzr
+ mul x19, x11, x9
+ ; A[0] * B[1]
+ mul x3, x10, x7
+ adds x15, x15, x3
+ umulh x4, x10, x7
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x12, x7
+ adcs x17, x17, x3
+ umulh x4, x12, x7
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x11, x8
+ adds x17, x17, x3
+ umulh x4, x11, x8
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x10, x8
+ adds x16, x16, x3
+ umulh x4, x10, x8
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x11, x7
+ adds x16, x16, x3
+ umulh x4, x11, x7
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x13, x7
+ adcs x19, x19, x3
+ umulh x4, x13, x7
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x12, x8
+ adds x19, x19, x3
+ umulh x4, x12, x8
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x13, x9
+ adcs x21, x21, x3
+ umulh x22, x13, x9
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x10, x9
+ adds x17, x17, x3
+ umulh x4, x10, x9
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x12, x9
+ adcs x20, x20, x3
+ umulh x4, x12, x9
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x13, x6
+ adds x17, x17, x3
+ umulh x4, x13, x6
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x13, x8
+ adcs x20, x20, x3
+ umulh x4, x13, x8
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ sub x2, x1, #32
+ add x0, x0, #0x40
+ ; Multiply
+ ldp x6, x7, [x2]
+ ldp x8, x9, [x2, #16]
+ ; A[0] * B[0]
+ umulh x15, x10, x6
+ mul x14, x10, x6
+ ; A[2] * B[0]
+ umulh x17, x12, x6
+ mul x16, x12, x6
+ ; A[1] * B[0]
+ mul x3, x11, x6
+ adds x15, x15, x3
+ umulh x4, x11, x6
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x11, x9
+ adc x17, x17, xzr
+ mul x19, x11, x9
+ ; A[0] * B[1]
+ mul x3, x10, x7
+ adds x15, x15, x3
+ umulh x4, x10, x7
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x12, x7
+ adcs x17, x17, x3
+ umulh x4, x12, x7
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x11, x8
+ adds x17, x17, x3
+ umulh x4, x11, x8
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x10, x8
+ adds x16, x16, x3
+ umulh x4, x10, x8
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x11, x7
+ adds x16, x16, x3
+ umulh x4, x11, x7
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x13, x7
+ adcs x19, x19, x3
+ umulh x4, x13, x7
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x12, x8
+ adds x19, x19, x3
+ umulh x4, x12, x8
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x13, x9
+ adcs x21, x21, x3
+ umulh x22, x13, x9
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x10, x9
+ adds x17, x17, x3
+ umulh x4, x10, x9
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x12, x9
+ adcs x20, x20, x3
+ umulh x4, x12, x9
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x13, x6
+ adds x17, x17, x3
+ umulh x4, x13, x6
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x13, x8
+ adcs x20, x20, x3
+ umulh x4, x13, x8
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ sub x1, x1, #0x40
+ sub x0, x0, #32
+ ; Multiply
+ ldp x10, x11, [x1]
+ ldp x12, x13, [x1, #16]
+ ; A[0] * B[0]
+ umulh x15, x10, x6
+ mul x14, x10, x6
+ ; A[2] * B[0]
+ umulh x17, x12, x6
+ mul x16, x12, x6
+ ; A[1] * B[0]
+ mul x3, x11, x6
+ adds x15, x15, x3
+ umulh x4, x11, x6
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x11, x9
+ adc x17, x17, xzr
+ mul x19, x11, x9
+ ; A[0] * B[1]
+ mul x3, x10, x7
+ adds x15, x15, x3
+ umulh x4, x10, x7
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x12, x7
+ adcs x17, x17, x3
+ umulh x4, x12, x7
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x11, x8
+ adds x17, x17, x3
+ umulh x4, x11, x8
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x10, x8
+ adds x16, x16, x3
+ umulh x4, x10, x8
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x11, x7
+ adds x16, x16, x3
+ umulh x4, x11, x7
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x13, x7
+ adcs x19, x19, x3
+ umulh x4, x13, x7
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x12, x8
+ adds x19, x19, x3
+ umulh x4, x12, x8
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x13, x9
+ adcs x21, x21, x3
+ umulh x22, x13, x9
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x10, x9
+ adds x17, x17, x3
+ umulh x4, x10, x9
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x12, x9
+ adcs x20, x20, x3
+ umulh x4, x12, x9
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x13, x6
+ adds x17, x17, x3
+ umulh x4, x13, x6
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x13, x8
+ adcs x20, x20, x3
+ umulh x4, x13, x8
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ ldp x17, x19, [x29, #40]
+ ldp x20, x21, [x29, #56]
+ ldr x22, [x29, #72]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT ge_p1p1_to_p3
+ge_p1p1_to_p3 PROC
+ stp x29, x30, [sp, #-112]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #40]
+ stp x20, x21, [x29, #56]
+ stp x22, x23, [x29, #72]
+ stp x24, x25, [x29, #88]
+ str x26, [x29, #104]
+ str x0, [x29, #16]
+ str x1, [x29, #24]
+ mov x2, x1
+ add x1, x1, #0x60
+ ; Multiply
+ ldp x10, x11, [x1]
+ ldp x12, x13, [x1, #16]
+ ldp x6, x7, [x2]
+ ldp x8, x9, [x2, #16]
+ ; A[0] * B[0]
+ umulh x15, x10, x6
+ mul x14, x10, x6
+ ; A[2] * B[0]
+ umulh x17, x12, x6
+ mul x16, x12, x6
+ ; A[1] * B[0]
+ mul x3, x11, x6
+ adds x15, x15, x3
+ umulh x4, x11, x6
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x11, x9
+ adc x17, x17, xzr
+ mul x19, x11, x9
+ ; A[0] * B[1]
+ mul x3, x10, x7
+ adds x15, x15, x3
+ umulh x4, x10, x7
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x12, x7
+ adcs x17, x17, x3
+ umulh x4, x12, x7
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x11, x8
+ adds x17, x17, x3
+ umulh x4, x11, x8
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x10, x8
+ adds x16, x16, x3
+ umulh x4, x10, x8
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x11, x7
+ adds x16, x16, x3
+ umulh x4, x11, x7
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x13, x7
+ adcs x19, x19, x3
+ umulh x4, x13, x7
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x12, x8
+ adds x19, x19, x3
+ umulh x4, x12, x8
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x13, x9
+ adcs x21, x21, x3
+ umulh x22, x13, x9
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x10, x9
+ adds x17, x17, x3
+ umulh x4, x10, x9
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x12, x9
+ adcs x20, x20, x3
+ umulh x4, x12, x9
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x13, x6
+ adds x17, x17, x3
+ umulh x4, x13, x6
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x13, x8
+ adcs x20, x20, x3
+ umulh x4, x13, x8
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ sub x1, x1, #0x40
+ add x0, x0, #0x60
+ ; Multiply
+ ldp x23, x24, [x1]
+ ldp x25, x26, [x1, #16]
+ ; A[0] * B[0]
+ umulh x15, x23, x6
+ mul x14, x23, x6
+ ; A[2] * B[0]
+ umulh x17, x25, x6
+ mul x16, x25, x6
+ ; A[1] * B[0]
+ mul x3, x24, x6
+ adds x15, x15, x3
+ umulh x4, x24, x6
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x24, x9
+ adc x17, x17, xzr
+ mul x19, x24, x9
+ ; A[0] * B[1]
+ mul x3, x23, x7
+ adds x15, x15, x3
+ umulh x4, x23, x7
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x25, x7
+ adcs x17, x17, x3
+ umulh x4, x25, x7
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x24, x8
+ adds x17, x17, x3
+ umulh x4, x24, x8
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x23, x8
+ adds x16, x16, x3
+ umulh x4, x23, x8
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x24, x7
+ adds x16, x16, x3
+ umulh x4, x24, x7
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x26, x7
+ adcs x19, x19, x3
+ umulh x4, x26, x7
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x25, x8
+ adds x19, x19, x3
+ umulh x4, x25, x8
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x26, x9
+ adcs x21, x21, x3
+ umulh x22, x26, x9
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x23, x9
+ adds x17, x17, x3
+ umulh x4, x23, x9
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x25, x9
+ adcs x20, x20, x3
+ umulh x4, x25, x9
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x26, x6
+ adds x17, x17, x3
+ umulh x4, x26, x6
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x26, x8
+ adcs x20, x20, x3
+ umulh x4, x26, x8
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ add x2, x1, #32
+ sub x0, x0, #0x40
+ ; Multiply
+ ldp x6, x7, [x2]
+ ldp x8, x9, [x2, #16]
+ ; A[0] * B[0]
+ umulh x15, x23, x6
+ mul x14, x23, x6
+ ; A[2] * B[0]
+ umulh x17, x25, x6
+ mul x16, x25, x6
+ ; A[1] * B[0]
+ mul x3, x24, x6
+ adds x15, x15, x3
+ umulh x4, x24, x6
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x24, x9
+ adc x17, x17, xzr
+ mul x19, x24, x9
+ ; A[0] * B[1]
+ mul x3, x23, x7
+ adds x15, x15, x3
+ umulh x4, x23, x7
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x25, x7
+ adcs x17, x17, x3
+ umulh x4, x25, x7
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x24, x8
+ adds x17, x17, x3
+ umulh x4, x24, x8
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x23, x8
+ adds x16, x16, x3
+ umulh x4, x23, x8
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x24, x7
+ adds x16, x16, x3
+ umulh x4, x24, x7
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x26, x7
+ adcs x19, x19, x3
+ umulh x4, x26, x7
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x25, x8
+ adds x19, x19, x3
+ umulh x4, x25, x8
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x26, x9
+ adcs x21, x21, x3
+ umulh x22, x26, x9
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x23, x9
+ adds x17, x17, x3
+ umulh x4, x23, x9
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x25, x9
+ adcs x20, x20, x3
+ umulh x4, x25, x9
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x26, x6
+ adds x17, x17, x3
+ umulh x4, x26, x6
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x26, x8
+ adcs x20, x20, x3
+ umulh x4, x26, x8
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ add x1, x1, #0x40
+ add x0, x0, #32
+ ; Multiply
+ ; A[0] * B[0]
+ umulh x15, x10, x6
+ mul x14, x10, x6
+ ; A[2] * B[0]
+ umulh x17, x12, x6
+ mul x16, x12, x6
+ ; A[1] * B[0]
+ mul x3, x11, x6
+ adds x15, x15, x3
+ umulh x4, x11, x6
+ adcs x16, x16, x4
+ ; A[1] * B[3]
+ umulh x20, x11, x9
+ adc x17, x17, xzr
+ mul x19, x11, x9
+ ; A[0] * B[1]
+ mul x3, x10, x7
+ adds x15, x15, x3
+ umulh x4, x10, x7
+ adcs x16, x16, x4
+ ; A[2] * B[1]
+ mul x3, x12, x7
+ adcs x17, x17, x3
+ umulh x4, x12, x7
+ adcs x19, x19, x4
+ adc x20, x20, xzr
+ ; A[1] * B[2]
+ mul x3, x11, x8
+ adds x17, x17, x3
+ umulh x4, x11, x8
+ adcs x19, x19, x4
+ adcs x20, x20, xzr
+ adc x21, xzr, xzr
+ ; A[0] * B[2]
+ mul x3, x10, x8
+ adds x16, x16, x3
+ umulh x4, x10, x8
+ adcs x17, x17, x4
+ adcs x19, x19, xzr
+ adcs x20, x20, xzr
+ adc x21, x21, xzr
+ ; A[1] * B[1]
+ mul x3, x11, x7
+ adds x16, x16, x3
+ umulh x4, x11, x7
+ adcs x17, x17, x4
+ ; A[3] * B[1]
+ mul x3, x13, x7
+ adcs x19, x19, x3
+ umulh x4, x13, x7
+ adcs x20, x20, x4
+ adc x21, x21, xzr
+ ; A[2] * B[2]
+ mul x3, x12, x8
+ adds x19, x19, x3
+ umulh x4, x12, x8
+ adcs x20, x20, x4
+ ; A[3] * B[3]
+ mul x3, x13, x9
+ adcs x21, x21, x3
+ umulh x22, x13, x9
+ adc x22, x22, xzr
+ ; A[0] * B[3]
+ mul x3, x10, x9
+ adds x17, x17, x3
+ umulh x4, x10, x9
+ adcs x19, x19, x4
+ ; A[2] * B[3]
+ mul x3, x12, x9
+ adcs x20, x20, x3
+ umulh x4, x12, x9
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; A[3] * B[0]
+ mul x3, x13, x6
+ adds x17, x17, x3
+ umulh x4, x13, x6
+ adcs x19, x19, x4
+ ; A[3] * B[2]
+ mul x3, x13, x8
+ adcs x20, x20, x3
+ umulh x4, x13, x8
+ adcs x21, x21, x4
+ adc x22, x22, xzr
+ ; Reduce
+ mov x3, #38
+ mul x4, x3, x22
+ adds x17, x17, x4
+ umulh x5, x3, x22
+ adc x5, x5, xzr
+ mov x3, #19
+ extr x5, x5, x17, #63
+ mul x5, x5, x3
+ and x17, x17, #0x7fffffffffffffff
+ mov x3, #38
+ mul x4, x3, x19
+ adds x14, x14, x4
+ umulh x19, x3, x19
+ mul x4, x3, x20
+ adcs x15, x15, x4
+ umulh x20, x3, x20
+ mul x4, x3, x21
+ adcs x16, x16, x4
+ umulh x21, x3, x21
+ adc x17, x17, xzr
+ ; Add high product results in
+ adds x14, x14, x5
+ adcs x15, x15, x19
+ adcs x16, x16, x20
+ adc x17, x17, x21
+ ; Store
+ stp x14, x15, [x0]
+ stp x16, x17, [x0, #16]
+ ldp x17, x19, [x29, #40]
+ ldp x20, x21, [x29, #56]
+ ldp x22, x23, [x29, #72]
+ ldp x24, x25, [x29, #88]
+ ldr x26, [x29, #104]
+ ldp x29, x30, [sp], #0x70
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT ge_p2_dbl
+ge_p2_dbl PROC
+ stp x29, x30, [sp, #-128]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #40]
+ stp x20, x21, [x29, #56]
+ stp x22, x23, [x29, #72]
+ stp x24, x25, [x29, #88]
+ stp x26, x27, [x29, #104]
+ str x28, [x29, #120]
+ str x0, [x29, #16]
+ str x1, [x29, #24]
+ add x0, x0, #0x40
+ ; Square
+ ldp x4, x5, [x1]
+ ldp x6, x7, [x1, #16]
+ ; A[0] * A[1]
+ umulh x10, x4, x5
+ mul x9, x4, x5
+ ; A[0] * A[3]
+ umulh x12, x4, x7
+ mul x11, x4, x7
+ ; A[0] * A[2]
+ mul x25, x4, x6
+ adds x10, x10, x25
+ umulh x26, x4, x6
+ adcs x11, x11, x26
+ ; A[1] * A[3]
+ mul x25, x5, x7
+ adcs x12, x12, x25
+ umulh x13, x5, x7
+ adc x13, x13, xzr
+ ; A[1] * A[2]
+ mul x25, x5, x6
+ adds x11, x11, x25
+ umulh x26, x5, x6
+ adcs x12, x12, x26
+ ; A[2] * A[3]
+ mul x25, x6, x7
+ adcs x13, x13, x25
+ umulh x14, x6, x7
+ adc x14, x14, xzr
+ ; Double
+ adds x9, x9, x9
+ adcs x10, x10, x10
+ adcs x11, x11, x11
+ adcs x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adc x15, xzr, xzr
+ ; A[0] * A[0]
+ umulh x26, x4, x4
+ mul x8, x4, x4
+ ; A[1] * A[1]
+ mul x25, x5, x5
+ adds x9, x9, x26
+ umulh x26, x5, x5
+ adcs x10, x10, x25
+ ; A[2] * A[2]
+ mul x25, x6, x6
+ adcs x11, x11, x26
+ umulh x26, x6, x6
+ adcs x12, x12, x25
+ ; A[3] * A[3]
+ mul x25, x7, x7
+ adcs x13, x13, x26
+ umulh x26, x7, x7
+ adcs x14, x14, x25
+ adc x15, x15, x26
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x15
+ adds x11, x11, x26
+ umulh x27, x25, x15
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x11, #63
+ mul x27, x27, x25
+ and x11, x11, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x12
+ adds x8, x8, x26
+ umulh x12, x25, x12
+ mul x26, x25, x13
+ adcs x9, x9, x26
+ umulh x13, x25, x13
+ mul x26, x25, x14
+ adcs x10, x10, x26
+ umulh x14, x25, x14
+ adc x11, x11, xzr
+ ; Add high product results in
+ adds x8, x8, x27
+ adcs x9, x9, x12
+ adcs x10, x10, x13
+ adc x11, x11, x14
+ ; Store
+ stp x8, x9, [x0]
+ stp x10, x11, [x0, #16]
+ add x2, x1, #32
+ sub x0, x0, #32
+ ; Square
+ ldp x16, x17, [x2]
+ ldp x19, x20, [x2, #16]
+ ; A[0] * A[1]
+ umulh x23, x16, x17
+ mul x22, x16, x17
+ ; A[0] * A[3]
+ umulh x4, x16, x20
+ mul x24, x16, x20
+ ; A[0] * A[2]
+ mul x25, x16, x19
+ adds x23, x23, x25
+ umulh x26, x16, x19
+ adcs x24, x24, x26
+ ; A[1] * A[3]
+ mul x25, x17, x20
+ adcs x4, x4, x25
+ umulh x5, x17, x20
+ adc x5, x5, xzr
+ ; A[1] * A[2]
+ mul x25, x17, x19
+ adds x24, x24, x25
+ umulh x26, x17, x19
+ adcs x4, x4, x26
+ ; A[2] * A[3]
+ mul x25, x19, x20
+ adcs x5, x5, x25
+ umulh x6, x19, x20
+ adc x6, x6, xzr
+ ; Double
+ adds x22, x22, x22
+ adcs x23, x23, x23
+ adcs x24, x24, x24
+ adcs x4, x4, x4
+ adcs x5, x5, x5
+ adcs x6, x6, x6
+ adc x7, xzr, xzr
+ ; A[0] * A[0]
+ umulh x26, x16, x16
+ mul x21, x16, x16
+ ; A[1] * A[1]
+ mul x25, x17, x17
+ adds x22, x22, x26
+ umulh x26, x17, x17
+ adcs x23, x23, x25
+ ; A[2] * A[2]
+ mul x25, x19, x19
+ adcs x24, x24, x26
+ umulh x26, x19, x19
+ adcs x4, x4, x25
+ ; A[3] * A[3]
+ mul x25, x20, x20
+ adcs x5, x5, x26
+ umulh x26, x20, x20
+ adcs x6, x6, x25
+ adc x7, x7, x26
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x7
+ adds x24, x24, x26
+ umulh x27, x25, x7
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x24, #63
+ mul x27, x27, x25
+ and x24, x24, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x4
+ adds x21, x21, x26
+ umulh x4, x25, x4
+ mul x26, x25, x5
+ adcs x22, x22, x26
+ umulh x5, x25, x5
+ mul x26, x25, x6
+ adcs x23, x23, x26
+ umulh x6, x25, x6
+ adc x24, x24, xzr
+ ; Add high product results in
+ adds x21, x21, x27
+ adcs x22, x22, x4
+ adcs x23, x23, x5
+ adc x24, x24, x6
+ add x3, x0, #32
+ mov x2, x0
+ add x1, x0, #32
+ ; Add
+ adds x4, x21, x8
+ adcs x5, x22, x9
+ adcs x6, x23, x10
+ adcs x7, x24, x11
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x7, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x4, x4, x25
+ adcs x5, x5, xzr
+ and x7, x7, #0x7fffffffffffffff
+ adcs x6, x6, xzr
+ adc x7, x7, xzr
+ ; Sub
+ subs x12, x21, x8
+ sbcs x13, x22, x9
+ sbcs x14, x23, x10
+ sbcs x15, x24, x11
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ stp x4, x5, [x0]
+ stp x6, x7, [x0, #16]
+ stp x12, x13, [x1]
+ stp x14, x15, [x1, #16]
+ ldr x1, [x29, #24]
+ add x2, x1, #32
+ sub x0, x0, #32
+ ; Add
+ ldp x8, x9, [x1]
+ ldp x10, x11, [x1, #16]
+ adds x8, x8, x16
+ adcs x9, x9, x17
+ adcs x10, x10, x19
+ adcs x11, x11, x20
+ cset x28, cs
+ mov x25, #19
+ ; Mask the modulus
+ extr x28, x28, x11, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x8, x8, x25
+ adcs x9, x9, xzr
+ and x11, x11, #0x7fffffffffffffff
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ mov x1, x0
+ ; Square
+ ; A[0] * A[1]
+ umulh x23, x8, x9
+ mul x22, x8, x9
+ ; A[0] * A[3]
+ umulh x4, x8, x11
+ mul x24, x8, x11
+ ; A[0] * A[2]
+ mul x25, x8, x10
+ adds x23, x23, x25
+ umulh x26, x8, x10
+ adcs x24, x24, x26
+ ; A[1] * A[3]
+ mul x25, x9, x11
+ adcs x4, x4, x25
+ umulh x5, x9, x11
+ adc x5, x5, xzr
+ ; A[1] * A[2]
+ mul x25, x9, x10
+ adds x24, x24, x25
+ umulh x26, x9, x10
+ adcs x4, x4, x26
+ ; A[2] * A[3]
+ mul x25, x10, x11
+ adcs x5, x5, x25
+ umulh x6, x10, x11
+ adc x6, x6, xzr
+ ; Double
+ adds x22, x22, x22
+ adcs x23, x23, x23
+ adcs x24, x24, x24
+ adcs x4, x4, x4
+ adcs x5, x5, x5
+ adcs x6, x6, x6
+ adc x7, xzr, xzr
+ ; A[0] * A[0]
+ umulh x26, x8, x8
+ mul x21, x8, x8
+ ; A[1] * A[1]
+ mul x25, x9, x9
+ adds x22, x22, x26
+ umulh x26, x9, x9
+ adcs x23, x23, x25
+ ; A[2] * A[2]
+ mul x25, x10, x10
+ adcs x24, x24, x26
+ umulh x26, x10, x10
+ adcs x4, x4, x25
+ ; A[3] * A[3]
+ mul x25, x11, x11
+ adcs x5, x5, x26
+ umulh x26, x11, x11
+ adcs x6, x6, x25
+ adc x7, x7, x26
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x7
+ adds x24, x24, x26
+ umulh x27, x25, x7
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x24, #63
+ mul x27, x27, x25
+ and x24, x24, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x4
+ adds x21, x21, x26
+ umulh x4, x25, x4
+ mul x26, x25, x5
+ adcs x22, x22, x26
+ umulh x5, x25, x5
+ mul x26, x25, x6
+ adcs x23, x23, x26
+ umulh x6, x25, x6
+ adc x24, x24, xzr
+ ; Add high product results in
+ adds x21, x21, x27
+ adcs x22, x22, x4
+ adcs x23, x23, x5
+ adc x24, x24, x6
+ add x2, x0, #32
+ ; Sub
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ subs x21, x21, x8
+ sbcs x22, x22, x9
+ sbcs x23, x23, x10
+ sbcs x24, x24, x11
+ csetm x28, cc
+ mov x25, #-19
+ ; Mask the modulus
+ extr x28, x28, x24, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x21, x21, x25
+ sbcs x22, x22, xzr
+ and x24, x24, #0x7fffffffffffffff
+ sbcs x23, x23, xzr
+ sbc x24, x24, xzr
+ stp x21, x22, [x0]
+ stp x23, x24, [x0, #16]
+ ldr x2, [x29, #24]
+ add x2, x2, #0x40
+ add x0, x0, #0x60
+ ; Square * 2
+ ldp x16, x17, [x2]
+ ldp x19, x20, [x2, #16]
+ ; A[0] * A[1]
+ umulh x6, x16, x17
+ mul x5, x16, x17
+ ; A[0] * A[3]
+ umulh x8, x16, x20
+ mul x7, x16, x20
+ ; A[0] * A[2]
+ mul x25, x16, x19
+ adds x6, x6, x25
+ umulh x26, x16, x19
+ adcs x7, x7, x26
+ ; A[1] * A[3]
+ mul x25, x17, x20
+ adcs x8, x8, x25
+ umulh x9, x17, x20
+ adc x9, x9, xzr
+ ; A[1] * A[2]
+ mul x25, x17, x19
+ adds x7, x7, x25
+ umulh x26, x17, x19
+ adcs x8, x8, x26
+ ; A[2] * A[3]
+ mul x25, x19, x20
+ adcs x9, x9, x25
+ umulh x10, x19, x20
+ adc x10, x10, xzr
+ ; Double
+ adds x5, x5, x5
+ adcs x6, x6, x6
+ adcs x7, x7, x7
+ adcs x8, x8, x8
+ adcs x9, x9, x9
+ adcs x10, x10, x10
+ adc x11, xzr, xzr
+ ; A[0] * A[0]
+ umulh x26, x16, x16
+ mul x4, x16, x16
+ ; A[1] * A[1]
+ mul x25, x17, x17
+ adds x5, x5, x26
+ umulh x26, x17, x17
+ adcs x6, x6, x25
+ ; A[2] * A[2]
+ mul x25, x19, x19
+ adcs x7, x7, x26
+ umulh x26, x19, x19
+ adcs x8, x8, x25
+ ; A[3] * A[3]
+ mul x25, x20, x20
+ adcs x9, x9, x26
+ umulh x26, x20, x20
+ adcs x10, x10, x25
+ adc x11, x11, x26
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x7, x7, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x7, #63
+ mul x27, x27, x25
+ and x7, x7, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x4, x4, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x5, x5, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x6, x6, x26
+ umulh x10, x25, x10
+ adc x7, x7, xzr
+ ; Add high product results in
+ adds x4, x4, x27
+ adcs x5, x5, x8
+ adcs x6, x6, x9
+ adc x7, x7, x10
+ mov x25, #19
+ lsr x26, x7, #62
+ extr x7, x7, x6, #63
+ extr x6, x6, x5, #63
+ extr x5, x5, x4, #63
+ lsl x4, x4, #1
+ mul x26, x26, x25
+ adds x4, x4, x26
+ adcs x5, x5, xzr
+ and x7, x7, #0x7fffffffffffffff
+ adcs x6, x6, xzr
+ adc x7, x7, xzr
+ ; Store
+ sub x1, x0, #32
+ ; Sub
+ subs x4, x4, x12
+ sbcs x5, x5, x13
+ sbcs x6, x6, x14
+ sbcs x7, x7, x15
+ csetm x28, cc
+ mov x25, #-19
+ ; Mask the modulus
+ extr x28, x28, x7, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x4, x4, x25
+ sbcs x5, x5, xzr
+ and x7, x7, #0x7fffffffffffffff
+ sbcs x6, x6, xzr
+ sbc x7, x7, xzr
+ stp x4, x5, [x0]
+ stp x6, x7, [x0, #16]
+ ldp x17, x19, [x29, #40]
+ ldp x20, x21, [x29, #56]
+ ldp x22, x23, [x29, #72]
+ ldp x24, x25, [x29, #88]
+ ldp x26, x27, [x29, #104]
+ ldr x28, [x29, #120]
+ ldp x29, x30, [sp], #0x80
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT ge_madd
+ge_madd PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #56]
+ stp x20, x21, [x29, #72]
+ stp x22, x23, [x29, #88]
+ stp x24, x25, [x29, #104]
+ stp x26, x27, [x29, #120]
+ str x28, [x29, #136]
+ str x0, [x29, #16]
+ str x1, [x29, #24]
+ str x2, [x29, #32]
+ mov x3, x1
+ add x2, x1, #32
+ add x1, x0, #32
+ ; Add
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ldp x4, x5, [x3]
+ ldp x6, x7, [x3, #16]
+ adds x16, x8, x4
+ adcs x17, x9, x5
+ adcs x19, x10, x6
+ adcs x20, x11, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x20, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x16, x16, x25
+ adcs x17, x17, xzr
+ and x20, x20, #0x7fffffffffffffff
+ adcs x19, x19, xzr
+ adc x20, x20, xzr
+ ; Sub
+ subs x12, x8, x4
+ sbcs x13, x9, x5
+ sbcs x14, x10, x6
+ sbcs x15, x11, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ ldr x2, [x29, #32]
+ mov x1, x0
+ ; Multiply
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ; A[0] * B[0]
+ umulh x22, x16, x8
+ mul x21, x16, x8
+ ; A[2] * B[0]
+ umulh x24, x19, x8
+ mul x23, x19, x8
+ ; A[1] * B[0]
+ mul x25, x17, x8
+ adds x22, x22, x25
+ umulh x26, x17, x8
+ adcs x23, x23, x26
+ ; A[1] * B[3]
+ umulh x5, x17, x11
+ adc x24, x24, xzr
+ mul x4, x17, x11
+ ; A[0] * B[1]
+ mul x25, x16, x9
+ adds x22, x22, x25
+ umulh x26, x16, x9
+ adcs x23, x23, x26
+ ; A[2] * B[1]
+ mul x25, x19, x9
+ adcs x24, x24, x25
+ umulh x26, x19, x9
+ adcs x4, x4, x26
+ adc x5, x5, xzr
+ ; A[1] * B[2]
+ mul x25, x17, x10
+ adds x24, x24, x25
+ umulh x26, x17, x10
+ adcs x4, x4, x26
+ adcs x5, x5, xzr
+ adc x6, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x16, x10
+ adds x23, x23, x25
+ umulh x26, x16, x10
+ adcs x24, x24, x26
+ adcs x4, x4, xzr
+ adcs x5, x5, xzr
+ adc x6, x6, xzr
+ ; A[1] * B[1]
+ mul x25, x17, x9
+ adds x23, x23, x25
+ umulh x26, x17, x9
+ adcs x24, x24, x26
+ ; A[3] * B[1]
+ mul x25, x20, x9
+ adcs x4, x4, x25
+ umulh x26, x20, x9
+ adcs x5, x5, x26
+ adc x6, x6, xzr
+ ; A[2] * B[2]
+ mul x25, x19, x10
+ adds x4, x4, x25
+ umulh x26, x19, x10
+ adcs x5, x5, x26
+ ; A[3] * B[3]
+ mul x25, x20, x11
+ adcs x6, x6, x25
+ umulh x7, x20, x11
+ adc x7, x7, xzr
+ ; A[0] * B[3]
+ mul x25, x16, x11
+ adds x24, x24, x25
+ umulh x26, x16, x11
+ adcs x4, x4, x26
+ ; A[2] * B[3]
+ mul x25, x19, x11
+ adcs x5, x5, x25
+ umulh x26, x19, x11
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; A[3] * B[0]
+ mul x25, x20, x8
+ adds x24, x24, x25
+ umulh x26, x20, x8
+ adcs x4, x4, x26
+ ; A[3] * B[2]
+ mul x25, x20, x10
+ adcs x5, x5, x25
+ umulh x26, x20, x10
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x7
+ adds x24, x24, x26
+ umulh x27, x25, x7
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x24, #63
+ mul x27, x27, x25
+ and x24, x24, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x4
+ adds x21, x21, x26
+ umulh x4, x25, x4
+ mul x26, x25, x5
+ adcs x22, x22, x26
+ umulh x5, x25, x5
+ mul x26, x25, x6
+ adcs x23, x23, x26
+ umulh x6, x25, x6
+ adc x24, x24, xzr
+ ; Add high product results in
+ adds x21, x21, x27
+ adcs x22, x22, x4
+ adcs x23, x23, x5
+ adc x24, x24, x6
+ add x2, x2, #32
+ add x1, x0, #32
+ add x0, x0, #32
+ ; Multiply
+ ldp x16, x17, [x2]
+ ldp x19, x20, [x2, #16]
+ ; A[0] * B[0]
+ umulh x5, x12, x16
+ mul x4, x12, x16
+ ; A[2] * B[0]
+ umulh x7, x14, x16
+ mul x6, x14, x16
+ ; A[1] * B[0]
+ mul x25, x13, x16
+ adds x5, x5, x25
+ umulh x26, x13, x16
+ adcs x6, x6, x26
+ ; A[1] * B[3]
+ umulh x9, x13, x20
+ adc x7, x7, xzr
+ mul x8, x13, x20
+ ; A[0] * B[1]
+ mul x25, x12, x17
+ adds x5, x5, x25
+ umulh x26, x12, x17
+ adcs x6, x6, x26
+ ; A[2] * B[1]
+ mul x25, x14, x17
+ adcs x7, x7, x25
+ umulh x26, x14, x17
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x13, x19
+ adds x7, x7, x25
+ umulh x26, x13, x19
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x12, x19
+ adds x6, x6, x25
+ umulh x26, x12, x19
+ adcs x7, x7, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x13, x17
+ adds x6, x6, x25
+ umulh x26, x13, x17
+ adcs x7, x7, x26
+ ; A[3] * B[1]
+ mul x25, x15, x17
+ adcs x8, x8, x25
+ umulh x26, x15, x17
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x14, x19
+ adds x8, x8, x25
+ umulh x26, x14, x19
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x15, x20
+ adcs x10, x10, x25
+ umulh x11, x15, x20
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x12, x20
+ adds x7, x7, x25
+ umulh x26, x12, x20
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x14, x20
+ adcs x9, x9, x25
+ umulh x26, x14, x20
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x15, x16
+ adds x7, x7, x25
+ umulh x26, x15, x16
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x15, x19
+ adcs x9, x9, x25
+ umulh x26, x15, x19
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x7, x7, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x7, #63
+ mul x27, x27, x25
+ and x7, x7, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x4, x4, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x5, x5, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x6, x6, x26
+ umulh x10, x25, x10
+ adc x7, x7, xzr
+ ; Add high product results in
+ adds x4, x4, x27
+ adcs x5, x5, x8
+ adcs x6, x6, x9
+ adc x7, x7, x10
+ mov x3, x0
+ sub x2, x0, #32
+ sub x1, x0, #32
+ ; Add
+ adds x8, x21, x4
+ adcs x9, x22, x5
+ adcs x10, x23, x6
+ adcs x11, x24, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x11, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x8, x8, x25
+ adcs x9, x9, xzr
+ and x11, x11, #0x7fffffffffffffff
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ ; Sub
+ subs x12, x21, x4
+ sbcs x13, x22, x5
+ sbcs x14, x23, x6
+ sbcs x15, x24, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ stp x8, x9, [x0]
+ stp x10, x11, [x0, #16]
+ stp x12, x13, [x1]
+ stp x14, x15, [x1, #16]
+ ldr x1, [x29, #24]
+ ldr x2, [x29, #32]
+ add x2, x2, #0x40
+ add x1, x1, #0x60
+ add x0, x0, #0x40
+ ; Multiply
+ ldp x21, x22, [x1]
+ ldp x23, x24, [x1, #16]
+ ldp x4, x5, [x2]
+ ldp x6, x7, [x2, #16]
+ ; A[0] * B[0]
+ umulh x17, x21, x4
+ mul x16, x21, x4
+ ; A[2] * B[0]
+ umulh x20, x23, x4
+ mul x19, x23, x4
+ ; A[1] * B[0]
+ mul x25, x22, x4
+ adds x17, x17, x25
+ umulh x26, x22, x4
+ adcs x19, x19, x26
+ ; A[1] * B[3]
+ umulh x9, x22, x7
+ adc x20, x20, xzr
+ mul x8, x22, x7
+ ; A[0] * B[1]
+ mul x25, x21, x5
+ adds x17, x17, x25
+ umulh x26, x21, x5
+ adcs x19, x19, x26
+ ; A[2] * B[1]
+ mul x25, x23, x5
+ adcs x20, x20, x25
+ umulh x26, x23, x5
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x22, x6
+ adds x20, x20, x25
+ umulh x26, x22, x6
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x21, x6
+ adds x19, x19, x25
+ umulh x26, x21, x6
+ adcs x20, x20, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x22, x5
+ adds x19, x19, x25
+ umulh x26, x22, x5
+ adcs x20, x20, x26
+ ; A[3] * B[1]
+ mul x25, x24, x5
+ adcs x8, x8, x25
+ umulh x26, x24, x5
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x23, x6
+ adds x8, x8, x25
+ umulh x26, x23, x6
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x24, x7
+ adcs x10, x10, x25
+ umulh x11, x24, x7
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x21, x7
+ adds x20, x20, x25
+ umulh x26, x21, x7
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x23, x7
+ adcs x9, x9, x25
+ umulh x26, x23, x7
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x24, x4
+ adds x20, x20, x25
+ umulh x26, x24, x4
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x24, x6
+ adcs x9, x9, x25
+ umulh x26, x24, x6
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x20, x20, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x20, #63
+ mul x27, x27, x25
+ and x20, x20, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x16, x16, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x17, x17, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x19, x19, x26
+ umulh x10, x25, x10
+ adc x20, x20, xzr
+ ; Add high product results in
+ adds x16, x16, x27
+ adcs x17, x17, x8
+ adcs x19, x19, x9
+ adc x20, x20, x10
+ sub x1, x1, #32
+ ; Double
+ ldp x12, x13, [x1]
+ ldp x14, x15, [x1, #16]
+ adds x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adc x15, x15, x15
+ mov x25, #-19
+ asr x28, x15, #63
+ ; Mask the modulus
+ and x25, x28, x25
+ and x26, x28, #0x7fffffffffffffff
+ ; Sub modulus (if overflow)
+ subs x12, x12, x25
+ sbcs x13, x13, x28
+ sbcs x14, x14, x28
+ sbc x15, x15, x26
+ mov x3, x0
+ sub x2, x0, #32
+ mov x1, x0
+ sub x0, x0, #32
+ ; Add
+ adds x8, x12, x16
+ adcs x9, x13, x17
+ adcs x10, x14, x19
+ adcs x11, x15, x20
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x11, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x8, x8, x25
+ adcs x9, x9, xzr
+ and x11, x11, #0x7fffffffffffffff
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ ; Sub
+ subs x4, x12, x16
+ sbcs x5, x13, x17
+ sbcs x6, x14, x19
+ sbcs x7, x15, x20
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x7, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x4, x4, x25
+ sbcs x5, x5, xzr
+ and x7, x7, #0x7fffffffffffffff
+ sbcs x6, x6, xzr
+ sbc x7, x7, xzr
+ stp x8, x9, [x0]
+ stp x10, x11, [x0, #16]
+ stp x4, x5, [x1]
+ stp x6, x7, [x1, #16]
+ ldp x17, x19, [x29, #56]
+ ldp x20, x21, [x29, #72]
+ ldp x22, x23, [x29, #88]
+ ldp x24, x25, [x29, #104]
+ ldp x26, x27, [x29, #120]
+ ldr x28, [x29, #136]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT ge_msub
+ge_msub PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #56]
+ stp x20, x21, [x29, #72]
+ stp x22, x23, [x29, #88]
+ stp x24, x25, [x29, #104]
+ stp x26, x27, [x29, #120]
+ str x28, [x29, #136]
+ str x0, [x29, #16]
+ str x1, [x29, #24]
+ str x2, [x29, #32]
+ mov x3, x1
+ add x2, x1, #32
+ add x1, x0, #32
+ ; Add
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ldp x4, x5, [x3]
+ ldp x6, x7, [x3, #16]
+ adds x16, x8, x4
+ adcs x17, x9, x5
+ adcs x19, x10, x6
+ adcs x20, x11, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x20, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x16, x16, x25
+ adcs x17, x17, xzr
+ and x20, x20, #0x7fffffffffffffff
+ adcs x19, x19, xzr
+ adc x20, x20, xzr
+ ; Sub
+ subs x12, x8, x4
+ sbcs x13, x9, x5
+ sbcs x14, x10, x6
+ sbcs x15, x11, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ ldr x2, [x29, #32]
+ add x2, x2, #32
+ mov x1, x0
+ ; Multiply
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ; A[0] * B[0]
+ umulh x22, x16, x8
+ mul x21, x16, x8
+ ; A[2] * B[0]
+ umulh x24, x19, x8
+ mul x23, x19, x8
+ ; A[1] * B[0]
+ mul x25, x17, x8
+ adds x22, x22, x25
+ umulh x26, x17, x8
+ adcs x23, x23, x26
+ ; A[1] * B[3]
+ umulh x5, x17, x11
+ adc x24, x24, xzr
+ mul x4, x17, x11
+ ; A[0] * B[1]
+ mul x25, x16, x9
+ adds x22, x22, x25
+ umulh x26, x16, x9
+ adcs x23, x23, x26
+ ; A[2] * B[1]
+ mul x25, x19, x9
+ adcs x24, x24, x25
+ umulh x26, x19, x9
+ adcs x4, x4, x26
+ adc x5, x5, xzr
+ ; A[1] * B[2]
+ mul x25, x17, x10
+ adds x24, x24, x25
+ umulh x26, x17, x10
+ adcs x4, x4, x26
+ adcs x5, x5, xzr
+ adc x6, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x16, x10
+ adds x23, x23, x25
+ umulh x26, x16, x10
+ adcs x24, x24, x26
+ adcs x4, x4, xzr
+ adcs x5, x5, xzr
+ adc x6, x6, xzr
+ ; A[1] * B[1]
+ mul x25, x17, x9
+ adds x23, x23, x25
+ umulh x26, x17, x9
+ adcs x24, x24, x26
+ ; A[3] * B[1]
+ mul x25, x20, x9
+ adcs x4, x4, x25
+ umulh x26, x20, x9
+ adcs x5, x5, x26
+ adc x6, x6, xzr
+ ; A[2] * B[2]
+ mul x25, x19, x10
+ adds x4, x4, x25
+ umulh x26, x19, x10
+ adcs x5, x5, x26
+ ; A[3] * B[3]
+ mul x25, x20, x11
+ adcs x6, x6, x25
+ umulh x7, x20, x11
+ adc x7, x7, xzr
+ ; A[0] * B[3]
+ mul x25, x16, x11
+ adds x24, x24, x25
+ umulh x26, x16, x11
+ adcs x4, x4, x26
+ ; A[2] * B[3]
+ mul x25, x19, x11
+ adcs x5, x5, x25
+ umulh x26, x19, x11
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; A[3] * B[0]
+ mul x25, x20, x8
+ adds x24, x24, x25
+ umulh x26, x20, x8
+ adcs x4, x4, x26
+ ; A[3] * B[2]
+ mul x25, x20, x10
+ adcs x5, x5, x25
+ umulh x26, x20, x10
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x7
+ adds x24, x24, x26
+ umulh x27, x25, x7
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x24, #63
+ mul x27, x27, x25
+ and x24, x24, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x4
+ adds x21, x21, x26
+ umulh x4, x25, x4
+ mul x26, x25, x5
+ adcs x22, x22, x26
+ umulh x5, x25, x5
+ mul x26, x25, x6
+ adcs x23, x23, x26
+ umulh x6, x25, x6
+ adc x24, x24, xzr
+ ; Add high product results in
+ adds x21, x21, x27
+ adcs x22, x22, x4
+ adcs x23, x23, x5
+ adc x24, x24, x6
+ sub x2, x2, #32
+ add x1, x0, #32
+ add x0, x0, #32
+ ; Multiply
+ ldp x16, x17, [x2]
+ ldp x19, x20, [x2, #16]
+ ; A[0] * B[0]
+ umulh x5, x12, x16
+ mul x4, x12, x16
+ ; A[2] * B[0]
+ umulh x7, x14, x16
+ mul x6, x14, x16
+ ; A[1] * B[0]
+ mul x25, x13, x16
+ adds x5, x5, x25
+ umulh x26, x13, x16
+ adcs x6, x6, x26
+ ; A[1] * B[3]
+ umulh x9, x13, x20
+ adc x7, x7, xzr
+ mul x8, x13, x20
+ ; A[0] * B[1]
+ mul x25, x12, x17
+ adds x5, x5, x25
+ umulh x26, x12, x17
+ adcs x6, x6, x26
+ ; A[2] * B[1]
+ mul x25, x14, x17
+ adcs x7, x7, x25
+ umulh x26, x14, x17
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x13, x19
+ adds x7, x7, x25
+ umulh x26, x13, x19
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x12, x19
+ adds x6, x6, x25
+ umulh x26, x12, x19
+ adcs x7, x7, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x13, x17
+ adds x6, x6, x25
+ umulh x26, x13, x17
+ adcs x7, x7, x26
+ ; A[3] * B[1]
+ mul x25, x15, x17
+ adcs x8, x8, x25
+ umulh x26, x15, x17
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x14, x19
+ adds x8, x8, x25
+ umulh x26, x14, x19
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x15, x20
+ adcs x10, x10, x25
+ umulh x11, x15, x20
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x12, x20
+ adds x7, x7, x25
+ umulh x26, x12, x20
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x14, x20
+ adcs x9, x9, x25
+ umulh x26, x14, x20
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x15, x16
+ adds x7, x7, x25
+ umulh x26, x15, x16
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x15, x19
+ adcs x9, x9, x25
+ umulh x26, x15, x19
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x7, x7, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x7, #63
+ mul x27, x27, x25
+ and x7, x7, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x4, x4, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x5, x5, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x6, x6, x26
+ umulh x10, x25, x10
+ adc x7, x7, xzr
+ ; Add high product results in
+ adds x4, x4, x27
+ adcs x5, x5, x8
+ adcs x6, x6, x9
+ adc x7, x7, x10
+ mov x3, x0
+ sub x2, x0, #32
+ sub x1, x0, #32
+ ; Add
+ adds x8, x21, x4
+ adcs x9, x22, x5
+ adcs x10, x23, x6
+ adcs x11, x24, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x11, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x8, x8, x25
+ adcs x9, x9, xzr
+ and x11, x11, #0x7fffffffffffffff
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ ; Sub
+ subs x12, x21, x4
+ sbcs x13, x22, x5
+ sbcs x14, x23, x6
+ sbcs x15, x24, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ stp x8, x9, [x0]
+ stp x10, x11, [x0, #16]
+ stp x12, x13, [x1]
+ stp x14, x15, [x1, #16]
+ ldr x1, [x29, #24]
+ ldr x2, [x29, #32]
+ add x2, x2, #0x40
+ add x1, x1, #0x60
+ add x0, x0, #0x40
+ ; Multiply
+ ldp x21, x22, [x1]
+ ldp x23, x24, [x1, #16]
+ ldp x4, x5, [x2]
+ ldp x6, x7, [x2, #16]
+ ; A[0] * B[0]
+ umulh x17, x21, x4
+ mul x16, x21, x4
+ ; A[2] * B[0]
+ umulh x20, x23, x4
+ mul x19, x23, x4
+ ; A[1] * B[0]
+ mul x25, x22, x4
+ adds x17, x17, x25
+ umulh x26, x22, x4
+ adcs x19, x19, x26
+ ; A[1] * B[3]
+ umulh x9, x22, x7
+ adc x20, x20, xzr
+ mul x8, x22, x7
+ ; A[0] * B[1]
+ mul x25, x21, x5
+ adds x17, x17, x25
+ umulh x26, x21, x5
+ adcs x19, x19, x26
+ ; A[2] * B[1]
+ mul x25, x23, x5
+ adcs x20, x20, x25
+ umulh x26, x23, x5
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x22, x6
+ adds x20, x20, x25
+ umulh x26, x22, x6
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x21, x6
+ adds x19, x19, x25
+ umulh x26, x21, x6
+ adcs x20, x20, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x22, x5
+ adds x19, x19, x25
+ umulh x26, x22, x5
+ adcs x20, x20, x26
+ ; A[3] * B[1]
+ mul x25, x24, x5
+ adcs x8, x8, x25
+ umulh x26, x24, x5
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x23, x6
+ adds x8, x8, x25
+ umulh x26, x23, x6
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x24, x7
+ adcs x10, x10, x25
+ umulh x11, x24, x7
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x21, x7
+ adds x20, x20, x25
+ umulh x26, x21, x7
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x23, x7
+ adcs x9, x9, x25
+ umulh x26, x23, x7
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x24, x4
+ adds x20, x20, x25
+ umulh x26, x24, x4
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x24, x6
+ adcs x9, x9, x25
+ umulh x26, x24, x6
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x20, x20, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x20, #63
+ mul x27, x27, x25
+ and x20, x20, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x16, x16, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x17, x17, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x19, x19, x26
+ umulh x10, x25, x10
+ adc x20, x20, xzr
+ ; Add high product results in
+ adds x16, x16, x27
+ adcs x17, x17, x8
+ adcs x19, x19, x9
+ adc x20, x20, x10
+ sub x1, x1, #32
+ ; Double
+ ldp x12, x13, [x1]
+ ldp x14, x15, [x1, #16]
+ adds x12, x12, x12
+ adcs x13, x13, x13
+ adcs x14, x14, x14
+ adc x15, x15, x15
+ mov x25, #-19
+ asr x28, x15, #63
+ ; Mask the modulus
+ and x25, x28, x25
+ and x26, x28, #0x7fffffffffffffff
+ ; Sub modulus (if overflow)
+ subs x12, x12, x25
+ sbcs x13, x13, x28
+ sbcs x14, x14, x28
+ sbc x15, x15, x26
+ mov x3, x0
+ sub x2, x0, #32
+ sub x1, x0, #32
+ ; Add
+ adds x8, x12, x16
+ adcs x9, x13, x17
+ adcs x10, x14, x19
+ adcs x11, x15, x20
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x11, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x8, x8, x25
+ adcs x9, x9, xzr
+ and x11, x11, #0x7fffffffffffffff
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ ; Sub
+ subs x4, x12, x16
+ sbcs x5, x13, x17
+ sbcs x6, x14, x19
+ sbcs x7, x15, x20
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x7, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x4, x4, x25
+ sbcs x5, x5, xzr
+ and x7, x7, #0x7fffffffffffffff
+ sbcs x6, x6, xzr
+ sbc x7, x7, xzr
+ stp x8, x9, [x0]
+ stp x10, x11, [x0, #16]
+ stp x4, x5, [x1]
+ stp x6, x7, [x1, #16]
+ ldp x17, x19, [x29, #56]
+ ldp x20, x21, [x29, #72]
+ ldp x22, x23, [x29, #88]
+ ldp x24, x25, [x29, #104]
+ ldp x26, x27, [x29, #120]
+ ldr x28, [x29, #136]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT ge_add
+ge_add PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #56]
+ stp x20, x21, [x29, #72]
+ stp x22, x23, [x29, #88]
+ stp x24, x25, [x29, #104]
+ stp x26, x27, [x29, #120]
+ str x28, [x29, #136]
+ str x0, [x29, #16]
+ str x1, [x29, #24]
+ str x2, [x29, #32]
+ mov x3, x1
+ add x2, x1, #32
+ add x1, x0, #32
+ ; Add
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ldp x4, x5, [x3]
+ ldp x6, x7, [x3, #16]
+ adds x16, x8, x4
+ adcs x17, x9, x5
+ adcs x19, x10, x6
+ adcs x20, x11, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x20, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x16, x16, x25
+ adcs x17, x17, xzr
+ and x20, x20, #0x7fffffffffffffff
+ adcs x19, x19, xzr
+ adc x20, x20, xzr
+ ; Sub
+ subs x12, x8, x4
+ sbcs x13, x9, x5
+ sbcs x14, x10, x6
+ sbcs x15, x11, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ ldr x2, [x29, #32]
+ mov x1, x0
+ ; Multiply
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ; A[0] * B[0]
+ umulh x22, x16, x8
+ mul x21, x16, x8
+ ; A[2] * B[0]
+ umulh x24, x19, x8
+ mul x23, x19, x8
+ ; A[1] * B[0]
+ mul x25, x17, x8
+ adds x22, x22, x25
+ umulh x26, x17, x8
+ adcs x23, x23, x26
+ ; A[1] * B[3]
+ umulh x5, x17, x11
+ adc x24, x24, xzr
+ mul x4, x17, x11
+ ; A[0] * B[1]
+ mul x25, x16, x9
+ adds x22, x22, x25
+ umulh x26, x16, x9
+ adcs x23, x23, x26
+ ; A[2] * B[1]
+ mul x25, x19, x9
+ adcs x24, x24, x25
+ umulh x26, x19, x9
+ adcs x4, x4, x26
+ adc x5, x5, xzr
+ ; A[1] * B[2]
+ mul x25, x17, x10
+ adds x24, x24, x25
+ umulh x26, x17, x10
+ adcs x4, x4, x26
+ adcs x5, x5, xzr
+ adc x6, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x16, x10
+ adds x23, x23, x25
+ umulh x26, x16, x10
+ adcs x24, x24, x26
+ adcs x4, x4, xzr
+ adcs x5, x5, xzr
+ adc x6, x6, xzr
+ ; A[1] * B[1]
+ mul x25, x17, x9
+ adds x23, x23, x25
+ umulh x26, x17, x9
+ adcs x24, x24, x26
+ ; A[3] * B[1]
+ mul x25, x20, x9
+ adcs x4, x4, x25
+ umulh x26, x20, x9
+ adcs x5, x5, x26
+ adc x6, x6, xzr
+ ; A[2] * B[2]
+ mul x25, x19, x10
+ adds x4, x4, x25
+ umulh x26, x19, x10
+ adcs x5, x5, x26
+ ; A[3] * B[3]
+ mul x25, x20, x11
+ adcs x6, x6, x25
+ umulh x7, x20, x11
+ adc x7, x7, xzr
+ ; A[0] * B[3]
+ mul x25, x16, x11
+ adds x24, x24, x25
+ umulh x26, x16, x11
+ adcs x4, x4, x26
+ ; A[2] * B[3]
+ mul x25, x19, x11
+ adcs x5, x5, x25
+ umulh x26, x19, x11
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; A[3] * B[0]
+ mul x25, x20, x8
+ adds x24, x24, x25
+ umulh x26, x20, x8
+ adcs x4, x4, x26
+ ; A[3] * B[2]
+ mul x25, x20, x10
+ adcs x5, x5, x25
+ umulh x26, x20, x10
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x7
+ adds x24, x24, x26
+ umulh x27, x25, x7
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x24, #63
+ mul x27, x27, x25
+ and x24, x24, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x4
+ adds x21, x21, x26
+ umulh x4, x25, x4
+ mul x26, x25, x5
+ adcs x22, x22, x26
+ umulh x5, x25, x5
+ mul x26, x25, x6
+ adcs x23, x23, x26
+ umulh x6, x25, x6
+ adc x24, x24, xzr
+ ; Add high product results in
+ adds x21, x21, x27
+ adcs x22, x22, x4
+ adcs x23, x23, x5
+ adc x24, x24, x6
+ ; Store
+ stp x21, x22, [x0]
+ stp x23, x24, [x0, #16]
+ add x2, x2, #32
+ add x1, x0, #32
+ add x0, x0, #32
+ ; Multiply
+ ldp x16, x17, [x2]
+ ldp x19, x20, [x2, #16]
+ ; A[0] * B[0]
+ umulh x5, x12, x16
+ mul x4, x12, x16
+ ; A[2] * B[0]
+ umulh x7, x14, x16
+ mul x6, x14, x16
+ ; A[1] * B[0]
+ mul x25, x13, x16
+ adds x5, x5, x25
+ umulh x26, x13, x16
+ adcs x6, x6, x26
+ ; A[1] * B[3]
+ umulh x9, x13, x20
+ adc x7, x7, xzr
+ mul x8, x13, x20
+ ; A[0] * B[1]
+ mul x25, x12, x17
+ adds x5, x5, x25
+ umulh x26, x12, x17
+ adcs x6, x6, x26
+ ; A[2] * B[1]
+ mul x25, x14, x17
+ adcs x7, x7, x25
+ umulh x26, x14, x17
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x13, x19
+ adds x7, x7, x25
+ umulh x26, x13, x19
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x12, x19
+ adds x6, x6, x25
+ umulh x26, x12, x19
+ adcs x7, x7, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x13, x17
+ adds x6, x6, x25
+ umulh x26, x13, x17
+ adcs x7, x7, x26
+ ; A[3] * B[1]
+ mul x25, x15, x17
+ adcs x8, x8, x25
+ umulh x26, x15, x17
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x14, x19
+ adds x8, x8, x25
+ umulh x26, x14, x19
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x15, x20
+ adcs x10, x10, x25
+ umulh x11, x15, x20
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x12, x20
+ adds x7, x7, x25
+ umulh x26, x12, x20
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x14, x20
+ adcs x9, x9, x25
+ umulh x26, x14, x20
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x15, x16
+ adds x7, x7, x25
+ umulh x26, x15, x16
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x15, x19
+ adcs x9, x9, x25
+ umulh x26, x15, x19
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x7, x7, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x7, #63
+ mul x27, x27, x25
+ and x7, x7, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x4, x4, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x5, x5, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x6, x6, x26
+ umulh x10, x25, x10
+ adc x7, x7, xzr
+ ; Add high product results in
+ adds x4, x4, x27
+ adcs x5, x5, x8
+ adcs x6, x6, x9
+ adc x7, x7, x10
+ ; Store
+ stp x4, x5, [x0]
+ stp x6, x7, [x0, #16]
+ mov x3, x0
+ sub x2, x0, #32
+ sub x1, x0, #32
+ ; Add
+ adds x8, x21, x4
+ adcs x9, x22, x5
+ adcs x10, x23, x6
+ adcs x11, x24, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x11, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x8, x8, x25
+ adcs x9, x9, xzr
+ and x11, x11, #0x7fffffffffffffff
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ ; Sub
+ subs x12, x21, x4
+ sbcs x13, x22, x5
+ sbcs x14, x23, x6
+ sbcs x15, x24, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ stp x8, x9, [x0]
+ stp x10, x11, [x0, #16]
+ stp x12, x13, [x1]
+ stp x14, x15, [x1, #16]
+ ldr x1, [x29, #24]
+ ldr x2, [x29, #32]
+ add x2, x2, #0x60
+ add x1, x1, #0x60
+ add x0, x0, #0x40
+ ; Multiply
+ ldp x21, x22, [x1]
+ ldp x23, x24, [x1, #16]
+ ldp x4, x5, [x2]
+ ldp x6, x7, [x2, #16]
+ ; A[0] * B[0]
+ umulh x17, x21, x4
+ mul x16, x21, x4
+ ; A[2] * B[0]
+ umulh x20, x23, x4
+ mul x19, x23, x4
+ ; A[1] * B[0]
+ mul x25, x22, x4
+ adds x17, x17, x25
+ umulh x26, x22, x4
+ adcs x19, x19, x26
+ ; A[1] * B[3]
+ umulh x9, x22, x7
+ adc x20, x20, xzr
+ mul x8, x22, x7
+ ; A[0] * B[1]
+ mul x25, x21, x5
+ adds x17, x17, x25
+ umulh x26, x21, x5
+ adcs x19, x19, x26
+ ; A[2] * B[1]
+ mul x25, x23, x5
+ adcs x20, x20, x25
+ umulh x26, x23, x5
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x22, x6
+ adds x20, x20, x25
+ umulh x26, x22, x6
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x21, x6
+ adds x19, x19, x25
+ umulh x26, x21, x6
+ adcs x20, x20, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x22, x5
+ adds x19, x19, x25
+ umulh x26, x22, x5
+ adcs x20, x20, x26
+ ; A[3] * B[1]
+ mul x25, x24, x5
+ adcs x8, x8, x25
+ umulh x26, x24, x5
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x23, x6
+ adds x8, x8, x25
+ umulh x26, x23, x6
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x24, x7
+ adcs x10, x10, x25
+ umulh x11, x24, x7
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x21, x7
+ adds x20, x20, x25
+ umulh x26, x21, x7
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x23, x7
+ adcs x9, x9, x25
+ umulh x26, x23, x7
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x24, x4
+ adds x20, x20, x25
+ umulh x26, x24, x4
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x24, x6
+ adcs x9, x9, x25
+ umulh x26, x24, x6
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x20, x20, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x20, #63
+ mul x27, x27, x25
+ and x20, x20, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x16, x16, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x17, x17, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x19, x19, x26
+ umulh x10, x25, x10
+ adc x20, x20, xzr
+ ; Add high product results in
+ adds x16, x16, x27
+ adcs x17, x17, x8
+ adcs x19, x19, x9
+ adc x20, x20, x10
+ ; Store
+ stp x16, x17, [x0]
+ stp x19, x20, [x0, #16]
+ sub x3, x2, #32
+ sub x2, x1, #32
+ sub x1, x0, #32
+ ; Multiply
+ ldp x4, x5, [x2]
+ ldp x6, x7, [x2, #16]
+ ldp x12, x13, [x3]
+ ldp x14, x15, [x3, #16]
+ ; A[0] * B[0]
+ umulh x9, x4, x12
+ mul x8, x4, x12
+ ; A[2] * B[0]
+ umulh x11, x6, x12
+ mul x10, x6, x12
+ ; A[1] * B[0]
+ mul x25, x5, x12
+ adds x9, x9, x25
+ umulh x26, x5, x12
+ adcs x10, x10, x26
+ ; A[1] * B[3]
+ umulh x17, x5, x15
+ adc x11, x11, xzr
+ mul x16, x5, x15
+ ; A[0] * B[1]
+ mul x25, x4, x13
+ adds x9, x9, x25
+ umulh x26, x4, x13
+ adcs x10, x10, x26
+ ; A[2] * B[1]
+ mul x25, x6, x13
+ adcs x11, x11, x25
+ umulh x26, x6, x13
+ adcs x16, x16, x26
+ adc x17, x17, xzr
+ ; A[1] * B[2]
+ mul x25, x5, x14
+ adds x11, x11, x25
+ umulh x26, x5, x14
+ adcs x16, x16, x26
+ adcs x17, x17, xzr
+ adc x19, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x4, x14
+ adds x10, x10, x25
+ umulh x26, x4, x14
+ adcs x11, x11, x26
+ adcs x16, x16, xzr
+ adcs x17, x17, xzr
+ adc x19, x19, xzr
+ ; A[1] * B[1]
+ mul x25, x5, x13
+ adds x10, x10, x25
+ umulh x26, x5, x13
+ adcs x11, x11, x26
+ ; A[3] * B[1]
+ mul x25, x7, x13
+ adcs x16, x16, x25
+ umulh x26, x7, x13
+ adcs x17, x17, x26
+ adc x19, x19, xzr
+ ; A[2] * B[2]
+ mul x25, x6, x14
+ adds x16, x16, x25
+ umulh x26, x6, x14
+ adcs x17, x17, x26
+ ; A[3] * B[3]
+ mul x25, x7, x15
+ adcs x19, x19, x25
+ umulh x20, x7, x15
+ adc x20, x20, xzr
+ ; A[0] * B[3]
+ mul x25, x4, x15
+ adds x11, x11, x25
+ umulh x26, x4, x15
+ adcs x16, x16, x26
+ ; A[2] * B[3]
+ mul x25, x6, x15
+ adcs x17, x17, x25
+ umulh x26, x6, x15
+ adcs x19, x19, x26
+ adc x20, x20, xzr
+ ; A[3] * B[0]
+ mul x25, x7, x12
+ adds x11, x11, x25
+ umulh x26, x7, x12
+ adcs x16, x16, x26
+ ; A[3] * B[2]
+ mul x25, x7, x14
+ adcs x17, x17, x25
+ umulh x26, x7, x14
+ adcs x19, x19, x26
+ adc x20, x20, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x20
+ adds x11, x11, x26
+ umulh x27, x25, x20
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x11, #63
+ mul x27, x27, x25
+ and x11, x11, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x16
+ adds x8, x8, x26
+ umulh x16, x25, x16
+ mul x26, x25, x17
+ adcs x9, x9, x26
+ umulh x17, x25, x17
+ mul x26, x25, x19
+ adcs x10, x10, x26
+ umulh x19, x25, x19
+ adc x11, x11, xzr
+ ; Add high product results in
+ adds x8, x8, x27
+ adcs x9, x9, x16
+ adcs x10, x10, x17
+ adc x11, x11, x19
+ ; Double
+ adds x8, x8, x8
+ adcs x9, x9, x9
+ adcs x10, x10, x10
+ adc x11, x11, x11
+ mov x25, #-19
+ asr x28, x11, #63
+ ; Mask the modulus
+ and x25, x28, x25
+ and x26, x28, #0x7fffffffffffffff
+ ; Sub modulus (if overflow)
+ subs x8, x8, x25
+ sbcs x9, x9, x28
+ sbcs x10, x10, x28
+ sbc x11, x11, x26
+ mov x3, x0
+ sub x2, x0, #32
+ mov x1, x0
+ sub x0, x0, #32
+ ; Add
+ ldp x4, x5, [x3]
+ ldp x6, x7, [x3, #16]
+ adds x21, x8, x4
+ adcs x22, x9, x5
+ adcs x23, x10, x6
+ adcs x24, x11, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x24, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x21, x21, x25
+ adcs x22, x22, xzr
+ and x24, x24, #0x7fffffffffffffff
+ adcs x23, x23, xzr
+ adc x24, x24, xzr
+ ; Sub
+ subs x12, x8, x4
+ sbcs x13, x9, x5
+ sbcs x14, x10, x6
+ sbcs x15, x11, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ stp x21, x22, [x0]
+ stp x23, x24, [x0, #16]
+ stp x12, x13, [x1]
+ stp x14, x15, [x1, #16]
+ ldp x17, x19, [x29, #56]
+ ldp x20, x21, [x29, #72]
+ ldp x22, x23, [x29, #88]
+ ldp x24, x25, [x29, #104]
+ ldp x26, x27, [x29, #120]
+ ldr x28, [x29, #136]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT ge_sub
+ge_sub PROC
+ stp x29, x30, [sp, #-144]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #56]
+ stp x20, x21, [x29, #72]
+ stp x22, x23, [x29, #88]
+ stp x24, x25, [x29, #104]
+ stp x26, x27, [x29, #120]
+ str x28, [x29, #136]
+ str x0, [x29, #16]
+ str x1, [x29, #24]
+ str x2, [x29, #32]
+ mov x3, x1
+ add x2, x1, #32
+ add x1, x0, #32
+ ; Add
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ldp x4, x5, [x3]
+ ldp x6, x7, [x3, #16]
+ adds x16, x8, x4
+ adcs x17, x9, x5
+ adcs x19, x10, x6
+ adcs x20, x11, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x20, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x16, x16, x25
+ adcs x17, x17, xzr
+ and x20, x20, #0x7fffffffffffffff
+ adcs x19, x19, xzr
+ adc x20, x20, xzr
+ ; Sub
+ subs x12, x8, x4
+ sbcs x13, x9, x5
+ sbcs x14, x10, x6
+ sbcs x15, x11, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ ldr x2, [x29, #32]
+ add x2, x2, #32
+ mov x1, x0
+ ; Multiply
+ ldp x8, x9, [x2]
+ ldp x10, x11, [x2, #16]
+ ; A[0] * B[0]
+ umulh x22, x16, x8
+ mul x21, x16, x8
+ ; A[2] * B[0]
+ umulh x24, x19, x8
+ mul x23, x19, x8
+ ; A[1] * B[0]
+ mul x25, x17, x8
+ adds x22, x22, x25
+ umulh x26, x17, x8
+ adcs x23, x23, x26
+ ; A[1] * B[3]
+ umulh x5, x17, x11
+ adc x24, x24, xzr
+ mul x4, x17, x11
+ ; A[0] * B[1]
+ mul x25, x16, x9
+ adds x22, x22, x25
+ umulh x26, x16, x9
+ adcs x23, x23, x26
+ ; A[2] * B[1]
+ mul x25, x19, x9
+ adcs x24, x24, x25
+ umulh x26, x19, x9
+ adcs x4, x4, x26
+ adc x5, x5, xzr
+ ; A[1] * B[2]
+ mul x25, x17, x10
+ adds x24, x24, x25
+ umulh x26, x17, x10
+ adcs x4, x4, x26
+ adcs x5, x5, xzr
+ adc x6, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x16, x10
+ adds x23, x23, x25
+ umulh x26, x16, x10
+ adcs x24, x24, x26
+ adcs x4, x4, xzr
+ adcs x5, x5, xzr
+ adc x6, x6, xzr
+ ; A[1] * B[1]
+ mul x25, x17, x9
+ adds x23, x23, x25
+ umulh x26, x17, x9
+ adcs x24, x24, x26
+ ; A[3] * B[1]
+ mul x25, x20, x9
+ adcs x4, x4, x25
+ umulh x26, x20, x9
+ adcs x5, x5, x26
+ adc x6, x6, xzr
+ ; A[2] * B[2]
+ mul x25, x19, x10
+ adds x4, x4, x25
+ umulh x26, x19, x10
+ adcs x5, x5, x26
+ ; A[3] * B[3]
+ mul x25, x20, x11
+ adcs x6, x6, x25
+ umulh x7, x20, x11
+ adc x7, x7, xzr
+ ; A[0] * B[3]
+ mul x25, x16, x11
+ adds x24, x24, x25
+ umulh x26, x16, x11
+ adcs x4, x4, x26
+ ; A[2] * B[3]
+ mul x25, x19, x11
+ adcs x5, x5, x25
+ umulh x26, x19, x11
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; A[3] * B[0]
+ mul x25, x20, x8
+ adds x24, x24, x25
+ umulh x26, x20, x8
+ adcs x4, x4, x26
+ ; A[3] * B[2]
+ mul x25, x20, x10
+ adcs x5, x5, x25
+ umulh x26, x20, x10
+ adcs x6, x6, x26
+ adc x7, x7, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x7
+ adds x24, x24, x26
+ umulh x27, x25, x7
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x24, #63
+ mul x27, x27, x25
+ and x24, x24, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x4
+ adds x21, x21, x26
+ umulh x4, x25, x4
+ mul x26, x25, x5
+ adcs x22, x22, x26
+ umulh x5, x25, x5
+ mul x26, x25, x6
+ adcs x23, x23, x26
+ umulh x6, x25, x6
+ adc x24, x24, xzr
+ ; Add high product results in
+ adds x21, x21, x27
+ adcs x22, x22, x4
+ adcs x23, x23, x5
+ adc x24, x24, x6
+ ; Reduce if top bit set
+ mov x25, #19
+ and x26, x25, x24, asr 63
+ adds x21, x21, x26
+ adcs x22, x22, xzr
+ and x24, x24, #0x7fffffffffffffff
+ adcs x23, x23, xzr
+ adc x24, x24, xzr
+ ; Store
+ stp x21, x22, [x0]
+ stp x23, x24, [x0, #16]
+ sub x2, x2, #32
+ add x1, x0, #32
+ add x0, x0, #32
+ ; Multiply
+ ldp x16, x17, [x2]
+ ldp x19, x20, [x2, #16]
+ ; A[0] * B[0]
+ umulh x5, x12, x16
+ mul x4, x12, x16
+ ; A[2] * B[0]
+ umulh x7, x14, x16
+ mul x6, x14, x16
+ ; A[1] * B[0]
+ mul x25, x13, x16
+ adds x5, x5, x25
+ umulh x26, x13, x16
+ adcs x6, x6, x26
+ ; A[1] * B[3]
+ umulh x9, x13, x20
+ adc x7, x7, xzr
+ mul x8, x13, x20
+ ; A[0] * B[1]
+ mul x25, x12, x17
+ adds x5, x5, x25
+ umulh x26, x12, x17
+ adcs x6, x6, x26
+ ; A[2] * B[1]
+ mul x25, x14, x17
+ adcs x7, x7, x25
+ umulh x26, x14, x17
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x13, x19
+ adds x7, x7, x25
+ umulh x26, x13, x19
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x12, x19
+ adds x6, x6, x25
+ umulh x26, x12, x19
+ adcs x7, x7, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x13, x17
+ adds x6, x6, x25
+ umulh x26, x13, x17
+ adcs x7, x7, x26
+ ; A[3] * B[1]
+ mul x25, x15, x17
+ adcs x8, x8, x25
+ umulh x26, x15, x17
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x14, x19
+ adds x8, x8, x25
+ umulh x26, x14, x19
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x15, x20
+ adcs x10, x10, x25
+ umulh x11, x15, x20
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x12, x20
+ adds x7, x7, x25
+ umulh x26, x12, x20
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x14, x20
+ adcs x9, x9, x25
+ umulh x26, x14, x20
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x15, x16
+ adds x7, x7, x25
+ umulh x26, x15, x16
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x15, x19
+ adcs x9, x9, x25
+ umulh x26, x15, x19
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x7, x7, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x7, #63
+ mul x27, x27, x25
+ and x7, x7, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x4, x4, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x5, x5, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x6, x6, x26
+ umulh x10, x25, x10
+ adc x7, x7, xzr
+ ; Add high product results in
+ adds x4, x4, x27
+ adcs x5, x5, x8
+ adcs x6, x6, x9
+ adc x7, x7, x10
+ ; Store
+ stp x4, x5, [x0]
+ stp x6, x7, [x0, #16]
+ mov x3, x0
+ sub x2, x0, #32
+ sub x1, x0, #32
+ ; Add
+ adds x8, x21, x4
+ adcs x9, x22, x5
+ adcs x10, x23, x6
+ adcs x11, x24, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x11, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x8, x8, x25
+ adcs x9, x9, xzr
+ and x11, x11, #0x7fffffffffffffff
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ ; Sub
+ subs x12, x21, x4
+ sbcs x13, x22, x5
+ sbcs x14, x23, x6
+ sbcs x15, x24, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x12, x12, x25
+ sbcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ sbcs x14, x14, xzr
+ sbc x15, x15, xzr
+ stp x8, x9, [x0]
+ stp x10, x11, [x0, #16]
+ stp x12, x13, [x1]
+ stp x14, x15, [x1, #16]
+ ldr x1, [x29, #24]
+ ldr x2, [x29, #32]
+ add x2, x2, #0x60
+ add x1, x1, #0x60
+ add x0, x0, #0x40
+ ; Multiply
+ ldp x21, x22, [x1]
+ ldp x23, x24, [x1, #16]
+ ldp x4, x5, [x2]
+ ldp x6, x7, [x2, #16]
+ ; A[0] * B[0]
+ umulh x17, x21, x4
+ mul x16, x21, x4
+ ; A[2] * B[0]
+ umulh x20, x23, x4
+ mul x19, x23, x4
+ ; A[1] * B[0]
+ mul x25, x22, x4
+ adds x17, x17, x25
+ umulh x26, x22, x4
+ adcs x19, x19, x26
+ ; A[1] * B[3]
+ umulh x9, x22, x7
+ adc x20, x20, xzr
+ mul x8, x22, x7
+ ; A[0] * B[1]
+ mul x25, x21, x5
+ adds x17, x17, x25
+ umulh x26, x21, x5
+ adcs x19, x19, x26
+ ; A[2] * B[1]
+ mul x25, x23, x5
+ adcs x20, x20, x25
+ umulh x26, x23, x5
+ adcs x8, x8, x26
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x25, x22, x6
+ adds x20, x20, x25
+ umulh x26, x22, x6
+ adcs x8, x8, x26
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x21, x6
+ adds x19, x19, x25
+ umulh x26, x21, x6
+ adcs x20, x20, x26
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x25, x22, x5
+ adds x19, x19, x25
+ umulh x26, x22, x5
+ adcs x20, x20, x26
+ ; A[3] * B[1]
+ mul x25, x24, x5
+ adcs x8, x8, x25
+ umulh x26, x24, x5
+ adcs x9, x9, x26
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x25, x23, x6
+ adds x8, x8, x25
+ umulh x26, x23, x6
+ adcs x9, x9, x26
+ ; A[3] * B[3]
+ mul x25, x24, x7
+ adcs x10, x10, x25
+ umulh x11, x24, x7
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x25, x21, x7
+ adds x20, x20, x25
+ umulh x26, x21, x7
+ adcs x8, x8, x26
+ ; A[2] * B[3]
+ mul x25, x23, x7
+ adcs x9, x9, x25
+ umulh x26, x23, x7
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x25, x24, x4
+ adds x20, x20, x25
+ umulh x26, x24, x4
+ adcs x8, x8, x26
+ ; A[3] * B[2]
+ mul x25, x24, x6
+ adcs x9, x9, x25
+ umulh x26, x24, x6
+ adcs x10, x10, x26
+ adc x11, x11, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x11
+ adds x20, x20, x26
+ umulh x27, x25, x11
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x20, #63
+ mul x27, x27, x25
+ and x20, x20, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x8
+ adds x16, x16, x26
+ umulh x8, x25, x8
+ mul x26, x25, x9
+ adcs x17, x17, x26
+ umulh x9, x25, x9
+ mul x26, x25, x10
+ adcs x19, x19, x26
+ umulh x10, x25, x10
+ adc x20, x20, xzr
+ ; Add high product results in
+ adds x16, x16, x27
+ adcs x17, x17, x8
+ adcs x19, x19, x9
+ adc x20, x20, x10
+ ; Reduce if top bit set
+ mov x25, #19
+ and x26, x25, x20, asr 63
+ adds x16, x16, x26
+ adcs x17, x17, xzr
+ and x20, x20, #0x7fffffffffffffff
+ adcs x19, x19, xzr
+ adc x20, x20, xzr
+ ; Store
+ stp x16, x17, [x0]
+ stp x19, x20, [x0, #16]
+ sub x3, x2, #32
+ sub x2, x1, #32
+ sub x1, x0, #32
+ ; Multiply
+ ldp x4, x5, [x2]
+ ldp x6, x7, [x2, #16]
+ ldp x12, x13, [x3]
+ ldp x14, x15, [x3, #16]
+ ; A[0] * B[0]
+ umulh x9, x4, x12
+ mul x8, x4, x12
+ ; A[2] * B[0]
+ umulh x11, x6, x12
+ mul x10, x6, x12
+ ; A[1] * B[0]
+ mul x25, x5, x12
+ adds x9, x9, x25
+ umulh x26, x5, x12
+ adcs x10, x10, x26
+ ; A[1] * B[3]
+ umulh x17, x5, x15
+ adc x11, x11, xzr
+ mul x16, x5, x15
+ ; A[0] * B[1]
+ mul x25, x4, x13
+ adds x9, x9, x25
+ umulh x26, x4, x13
+ adcs x10, x10, x26
+ ; A[2] * B[1]
+ mul x25, x6, x13
+ adcs x11, x11, x25
+ umulh x26, x6, x13
+ adcs x16, x16, x26
+ adc x17, x17, xzr
+ ; A[1] * B[2]
+ mul x25, x5, x14
+ adds x11, x11, x25
+ umulh x26, x5, x14
+ adcs x16, x16, x26
+ adcs x17, x17, xzr
+ adc x19, xzr, xzr
+ ; A[0] * B[2]
+ mul x25, x4, x14
+ adds x10, x10, x25
+ umulh x26, x4, x14
+ adcs x11, x11, x26
+ adcs x16, x16, xzr
+ adcs x17, x17, xzr
+ adc x19, x19, xzr
+ ; A[1] * B[1]
+ mul x25, x5, x13
+ adds x10, x10, x25
+ umulh x26, x5, x13
+ adcs x11, x11, x26
+ ; A[3] * B[1]
+ mul x25, x7, x13
+ adcs x16, x16, x25
+ umulh x26, x7, x13
+ adcs x17, x17, x26
+ adc x19, x19, xzr
+ ; A[2] * B[2]
+ mul x25, x6, x14
+ adds x16, x16, x25
+ umulh x26, x6, x14
+ adcs x17, x17, x26
+ ; A[3] * B[3]
+ mul x25, x7, x15
+ adcs x19, x19, x25
+ umulh x20, x7, x15
+ adc x20, x20, xzr
+ ; A[0] * B[3]
+ mul x25, x4, x15
+ adds x11, x11, x25
+ umulh x26, x4, x15
+ adcs x16, x16, x26
+ ; A[2] * B[3]
+ mul x25, x6, x15
+ adcs x17, x17, x25
+ umulh x26, x6, x15
+ adcs x19, x19, x26
+ adc x20, x20, xzr
+ ; A[3] * B[0]
+ mul x25, x7, x12
+ adds x11, x11, x25
+ umulh x26, x7, x12
+ adcs x16, x16, x26
+ ; A[3] * B[2]
+ mul x25, x7, x14
+ adcs x17, x17, x25
+ umulh x26, x7, x14
+ adcs x19, x19, x26
+ adc x20, x20, xzr
+ ; Reduce
+ mov x25, #38
+ mul x26, x25, x20
+ adds x11, x11, x26
+ umulh x27, x25, x20
+ adc x27, x27, xzr
+ mov x25, #19
+ extr x27, x27, x11, #63
+ mul x27, x27, x25
+ and x11, x11, #0x7fffffffffffffff
+ mov x25, #38
+ mul x26, x25, x16
+ adds x8, x8, x26
+ umulh x16, x25, x16
+ mul x26, x25, x17
+ adcs x9, x9, x26
+ umulh x17, x25, x17
+ mul x26, x25, x19
+ adcs x10, x10, x26
+ umulh x19, x25, x19
+ adc x11, x11, xzr
+ ; Add high product results in
+ adds x8, x8, x27
+ adcs x9, x9, x16
+ adcs x10, x10, x17
+ adc x11, x11, x19
+ ; Double
+ adds x8, x8, x8
+ adcs x9, x9, x9
+ adcs x10, x10, x10
+ adc x11, x11, x11
+ mov x25, #-19
+ asr x28, x11, #63
+ ; Mask the modulus
+ and x25, x28, x25
+ and x26, x28, #0x7fffffffffffffff
+ ; Sub modulus (if overflow)
+ subs x8, x8, x25
+ sbcs x9, x9, x28
+ sbcs x10, x10, x28
+ sbc x11, x11, x26
+ mov x3, x0
+ sub x2, x0, #32
+ ; Add
+ ldp x4, x5, [x3]
+ ldp x6, x7, [x3, #16]
+ adds x12, x8, x4
+ adcs x13, x9, x5
+ adcs x14, x10, x6
+ adcs x15, x11, x7
+ cset x28, cs
+ mov x25, #19
+ extr x28, x28, x15, #63
+ mul x25, x28, x25
+ ; Sub modulus (if overflow)
+ adds x12, x12, x25
+ adcs x13, x13, xzr
+ and x15, x15, #0x7fffffffffffffff
+ adcs x14, x14, xzr
+ adc x15, x15, xzr
+ ; Sub
+ subs x21, x8, x4
+ sbcs x22, x9, x5
+ sbcs x23, x10, x6
+ sbcs x24, x11, x7
+ csetm x28, cc
+ mov x25, #-19
+ extr x28, x28, x24, #63
+ mul x25, x28, x25
+ ; Add modulus (if underflow)
+ subs x21, x21, x25
+ sbcs x22, x22, xzr
+ and x24, x24, #0x7fffffffffffffff
+ sbcs x23, x23, xzr
+ sbc x24, x24, xzr
+ stp x12, x13, [x0]
+ stp x14, x15, [x0, #16]
+ stp x21, x22, [x1]
+ stp x23, x24, [x1, #16]
+ ldp x17, x19, [x29, #56]
+ ldp x20, x21, [x29, #72]
+ ldp x22, x23, [x29, #88]
+ ldp x24, x25, [x29, #104]
+ ldp x26, x27, [x29, #120]
+ ldr x28, [x29, #136]
+ ldp x29, x30, [sp], #0x90
+ ret
+ ENDP
+ IF :DEF:HAVE_ED25519
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT sc_reduce
+sc_reduce PROC
+ stp x29, x30, [sp, #-64]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ stp x20, x21, [x29, #32]
+ stp x22, x23, [x29, #48]
+ ldp x2, x3, [x0]
+ ldp x4, x5, [x0, #16]
+ ldp x6, x7, [x0, #32]
+ ldp x8, x9, [x0, #48]
+ lsr x23, x9, #56
+ lsl x9, x9, #4
+ orr x9, x9, x8, lsr 60
+ lsl x8, x8, #4
+ orr x8, x8, x7, lsr 60
+ lsl x7, x7, #4
+ orr x7, x7, x6, lsr 60
+ lsl x6, x6, #4
+ mov x1, #15
+ orr x6, x6, x5, lsr 60
+ bic x5, x5, x1, lsl 60
+ bic x9, x9, x1, lsl 60
+ ; Add order times bits 504..511
+ mov x11, #0x2c13
+ movk x11, #0xa30a, lsl 16
+ movk x11, #0x9ce5, lsl 32
+ movk x11, #0xa7ed, lsl 48
+ mov x13, #0x6329
+ movk x13, #0x5d08, lsl 16
+ movk x13, #0x621, lsl 32
+ movk x13, #0xeb21, lsl 48
+ mul x10, x23, x11
+ umulh x11, x23, x11
+ mul x12, x23, x13
+ umulh x13, x23, x13
+ adds x6, x6, x10
+ adcs x7, x7, x11
+ adcs x8, x8, xzr
+ adc x9, x9, xzr
+ adds x7, x7, x12
+ adcs x8, x8, x13
+ adc x9, x9, xzr
+ subs x8, x8, x23
+ sbc x9, x9, xzr
+ ; Sub product of top 4 words and order
+ mov x1, #0x2c13
+ movk x1, #0xa30a, lsl 16
+ movk x1, #0x9ce5, lsl 32
+ movk x1, #0xa7ed, lsl 48
+ mul x10, x6, x1
+ umulh x11, x6, x1
+ mul x12, x7, x1
+ umulh x13, x7, x1
+ mul x14, x8, x1
+ umulh x15, x8, x1
+ mul x16, x9, x1
+ umulh x17, x9, x1
+ adds x2, x2, x10
+ adcs x3, x3, x11
+ adcs x4, x4, x14
+ adcs x5, x5, x15
+ adc x19, xzr, xzr
+ adds x3, x3, x12
+ adcs x4, x4, x13
+ adcs x5, x5, x16
+ adc x19, x19, x17
+ mov x1, #0x6329
+ movk x1, #0x5d08, lsl 16
+ movk x1, #0x621, lsl 32
+ movk x1, #0xeb21, lsl 48
+ mul x10, x6, x1
+ umulh x11, x6, x1
+ mul x12, x7, x1
+ umulh x13, x7, x1
+ mul x14, x8, x1
+ umulh x15, x8, x1
+ mul x16, x9, x1
+ umulh x17, x9, x1
+ adds x3, x3, x10
+ adcs x4, x4, x11
+ adcs x5, x5, x14
+ adcs x19, x19, x15
+ adc x20, xzr, xzr
+ adds x4, x4, x12
+ adcs x5, x5, x13
+ adcs x19, x19, x16
+ adc x20, x20, x17
+ subs x4, x4, x6
+ sbcs x5, x5, x7
+ sbcs x6, x19, x8
+ sbc x7, x20, x9
+ asr x23, x7, #57
+ ; Conditionally subtract order starting at bit 125
+ mov x10, xzr
+ mov x13, xzr
+ mov x11, #0xba7d
+ movk x11, #0x4b9e, lsl 16
+ movk x11, #0x4c63, lsl 32
+ movk x11, #0xcb02, lsl 48
+ mov x12, #0xf39a
+ movk x12, #0xd45e, lsl 16
+ movk x12, #0xdf3b, lsl 32
+ movk x12, #0x29b, lsl 48
+ movk x10, #0xa000, lsl 48
+ movk x13, #0x200, lsl 48
+ and x10, x10, x23
+ and x11, x11, x23
+ and x12, x12, x23
+ and x13, x13, x23
+ adds x3, x3, x10
+ adcs x4, x4, x11
+ adcs x5, x5, x12
+ adcs x6, x6, xzr
+ adc x7, x7, x13
+ ; Move bits 252-376 to own registers
+ lsl x7, x7, #4
+ orr x7, x7, x6, lsr 60
+ lsl x6, x6, #4
+ mov x23, #15
+ orr x6, x6, x5, lsr 60
+ bic x5, x5, x23, lsl 60
+ ; Sub product of top 2 words and order
+ ; * -5812631a5cf5d3ed
+ mov x1, #0x2c13
+ movk x1, #0xa30a, lsl 16
+ movk x1, #0x9ce5, lsl 32
+ movk x1, #0xa7ed, lsl 48
+ mul x10, x6, x1
+ umulh x11, x6, x1
+ mul x12, x7, x1
+ umulh x13, x7, x1
+ adds x2, x2, x10
+ adcs x3, x3, x11
+ adc x19, xzr, xzr
+ adds x3, x3, x12
+ adc x19, x19, x13
+ ; * -14def9dea2f79cd7
+ mov x1, #0x6329
+ movk x1, #0x5d08, lsl 16
+ movk x1, #0x621, lsl 32
+ movk x1, #0xeb21, lsl 48
+ mul x10, x6, x1
+ umulh x11, x6, x1
+ mul x12, x7, x1
+ umulh x13, x7, x1
+ adds x3, x3, x10
+ adcs x4, x4, x11
+ adc x20, xzr, xzr
+ adds x4, x4, x12
+ adc x20, x20, x13
+ ; Add overflows at 2 * 64
+ mov x1, #15
+ bic x5, x5, x1, lsl 60
+ adds x4, x4, x19
+ adc x5, x5, x20
+ ; Subtract top at 2 * 64
+ subs x4, x4, x6
+ sbcs x5, x5, x7
+ sbc x1, x1, x1
+ ; Conditional sub order
+ mov x10, #0xd3ed
+ movk x10, #0x5cf5, lsl 16
+ movk x10, #0x631a, lsl 32
+ movk x10, #0x5812, lsl 48
+ mov x11, #0x9cd6
+ movk x11, #0xa2f7, lsl 16
+ movk x11, #0xf9de, lsl 32
+ movk x11, #0x14de, lsl 48
+ and x10, x10, x1
+ and x11, x11, x1
+ adds x2, x2, x10
+ adcs x3, x3, x11
+ and x1, x1, #0x1000000000000000
+ adcs x4, x4, xzr
+ mov x23, #15
+ adc x5, x5, x1
+ bic x5, x5, x23, lsl 60
+ ; Store result
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ ldp x17, x19, [x29, #16]
+ ldp x20, x21, [x29, #32]
+ ldp x22, x23, [x29, #48]
+ ldp x29, x30, [sp], #0x40
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT sc_muladd
+sc_muladd PROC
+ stp x29, x30, [sp, #-96]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ stp x24, x25, [x29, #72]
+ str x26, [x29, #88]
+ ; Multiply
+ ldp x12, x13, [x1]
+ ldp x14, x15, [x1, #16]
+ ldp x16, x17, [x2]
+ ldp x19, x20, [x2, #16]
+ ; A[0] * B[0]
+ umulh x5, x12, x16
+ mul x4, x12, x16
+ ; A[2] * B[0]
+ umulh x7, x14, x16
+ mul x6, x14, x16
+ ; A[1] * B[0]
+ mul x21, x13, x16
+ adds x5, x5, x21
+ umulh x22, x13, x16
+ adcs x6, x6, x22
+ ; A[1] * B[3]
+ umulh x9, x13, x20
+ adc x7, x7, xzr
+ mul x8, x13, x20
+ ; A[0] * B[1]
+ mul x21, x12, x17
+ adds x5, x5, x21
+ umulh x22, x12, x17
+ adcs x6, x6, x22
+ ; A[2] * B[1]
+ mul x21, x14, x17
+ adcs x7, x7, x21
+ umulh x22, x14, x17
+ adcs x8, x8, x22
+ adc x9, x9, xzr
+ ; A[1] * B[2]
+ mul x21, x13, x19
+ adds x7, x7, x21
+ umulh x22, x13, x19
+ adcs x8, x8, x22
+ adcs x9, x9, xzr
+ adc x10, xzr, xzr
+ ; A[0] * B[2]
+ mul x21, x12, x19
+ adds x6, x6, x21
+ umulh x22, x12, x19
+ adcs x7, x7, x22
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adc x10, x10, xzr
+ ; A[1] * B[1]
+ mul x21, x13, x17
+ adds x6, x6, x21
+ umulh x22, x13, x17
+ adcs x7, x7, x22
+ ; A[3] * B[1]
+ mul x21, x15, x17
+ adcs x8, x8, x21
+ umulh x22, x15, x17
+ adcs x9, x9, x22
+ adc x10, x10, xzr
+ ; A[2] * B[2]
+ mul x21, x14, x19
+ adds x8, x8, x21
+ umulh x22, x14, x19
+ adcs x9, x9, x22
+ ; A[3] * B[3]
+ mul x21, x15, x20
+ adcs x10, x10, x21
+ umulh x11, x15, x20
+ adc x11, x11, xzr
+ ; A[0] * B[3]
+ mul x21, x12, x20
+ adds x7, x7, x21
+ umulh x22, x12, x20
+ adcs x8, x8, x22
+ ; A[2] * B[3]
+ mul x21, x14, x20
+ adcs x9, x9, x21
+ umulh x22, x14, x20
+ adcs x10, x10, x22
+ adc x11, x11, xzr
+ ; A[3] * B[0]
+ mul x21, x15, x16
+ adds x7, x7, x21
+ umulh x22, x15, x16
+ adcs x8, x8, x22
+ ; A[3] * B[2]
+ mul x21, x15, x19
+ adcs x9, x9, x21
+ umulh x22, x15, x19
+ adcs x10, x10, x22
+ adc x11, x11, xzr
+ ; Add c to a * b
+ ldp x12, x13, [x3]
+ ldp x14, x15, [x3, #16]
+ adds x4, x4, x12
+ adcs x5, x5, x13
+ adcs x6, x6, x14
+ adcs x7, x7, x15
+ adcs x8, x8, xzr
+ adcs x9, x9, xzr
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ lsr x25, x11, #56
+ lsl x11, x11, #4
+ orr x11, x11, x10, lsr 60
+ lsl x10, x10, #4
+ orr x10, x10, x9, lsr 60
+ lsl x9, x9, #4
+ orr x9, x9, x8, lsr 60
+ lsl x8, x8, #4
+ mov x26, #15
+ orr x8, x8, x7, lsr 60
+ bic x7, x7, x26, lsl 60
+ bic x11, x11, x26, lsl 60
+ ; Add order times bits 504..507
+ mov x22, #0x2c13
+ movk x22, #0xa30a, lsl 16
+ movk x22, #0x9ce5, lsl 32
+ movk x22, #0xa7ed, lsl 48
+ mov x24, #0x6329
+ movk x24, #0x5d08, lsl 16
+ movk x24, #0x621, lsl 32
+ movk x24, #0xeb21, lsl 48
+ mul x21, x25, x22
+ umulh x22, x25, x22
+ mul x23, x25, x24
+ umulh x24, x25, x24
+ adds x8, x8, x21
+ adcs x9, x9, x22
+ adcs x10, x10, xzr
+ adc x11, x11, xzr
+ adds x9, x9, x23
+ adcs x10, x10, x24
+ adc x11, x11, xzr
+ subs x10, x10, x25
+ sbc x11, x11, xzr
+ ; Sub product of top 4 words and order
+ mov x26, #0x2c13
+ movk x26, #0xa30a, lsl 16
+ movk x26, #0x9ce5, lsl 32
+ movk x26, #0xa7ed, lsl 48
+ mul x16, x8, x26
+ umulh x17, x8, x26
+ mul x19, x9, x26
+ umulh x20, x9, x26
+ mul x21, x10, x26
+ umulh x22, x10, x26
+ mul x23, x11, x26
+ umulh x24, x11, x26
+ adds x4, x4, x16
+ adcs x5, x5, x17
+ adcs x6, x6, x21
+ adcs x7, x7, x22
+ adc x12, xzr, xzr
+ adds x5, x5, x19
+ adcs x6, x6, x20
+ adcs x7, x7, x23
+ adc x12, x12, x24
+ mov x26, #0x6329
+ movk x26, #0x5d08, lsl 16
+ movk x26, #0x621, lsl 32
+ movk x26, #0xeb21, lsl 48
+ mul x16, x8, x26
+ umulh x17, x8, x26
+ mul x19, x9, x26
+ umulh x20, x9, x26
+ mul x21, x10, x26
+ umulh x22, x10, x26
+ mul x23, x11, x26
+ umulh x24, x11, x26
+ adds x5, x5, x16
+ adcs x6, x6, x17
+ adcs x7, x7, x21
+ adcs x12, x12, x22
+ adc x13, xzr, xzr
+ adds x6, x6, x19
+ adcs x7, x7, x20
+ adcs x12, x12, x23
+ adc x13, x13, x24
+ subs x6, x6, x8
+ sbcs x7, x7, x9
+ sbcs x8, x12, x10
+ sbc x9, x13, x11
+ asr x25, x9, #57
+ ; Conditionally subtract order starting at bit 125
+ mov x16, xzr
+ mov x20, xzr
+ mov x17, #0xba7d
+ movk x17, #0x4b9e, lsl 16
+ movk x17, #0x4c63, lsl 32
+ movk x17, #0xcb02, lsl 48
+ mov x19, #0xf39a
+ movk x19, #0xd45e, lsl 16
+ movk x19, #0xdf3b, lsl 32
+ movk x19, #0x29b, lsl 48
+ movk x16, #0xa000, lsl 48
+ movk x20, #0x200, lsl 48
+ and x16, x16, x25
+ and x17, x17, x25
+ and x19, x19, x25
+ and x20, x20, x25
+ adds x5, x5, x16
+ adcs x6, x6, x17
+ adcs x7, x7, x19
+ adcs x8, x8, xzr
+ adc x9, x9, x20
+ ; Move bits 252-376 to own registers
+ lsl x9, x9, #4
+ orr x9, x9, x8, lsr 60
+ lsl x8, x8, #4
+ mov x25, #15
+ orr x8, x8, x7, lsr 60
+ bic x7, x7, x25, lsl 60
+ ; Sub product of top 2 words and order
+ ; * -5812631a5cf5d3ed
+ mov x26, #0x2c13
+ movk x26, #0xa30a, lsl 16
+ movk x26, #0x9ce5, lsl 32
+ movk x26, #0xa7ed, lsl 48
+ mul x16, x8, x26
+ umulh x17, x8, x26
+ mul x19, x9, x26
+ umulh x20, x9, x26
+ adds x4, x4, x16
+ adcs x5, x5, x17
+ adc x12, xzr, xzr
+ adds x5, x5, x19
+ adc x12, x12, x20
+ ; * -14def9dea2f79cd7
+ mov x26, #0x6329
+ movk x26, #0x5d08, lsl 16
+ movk x26, #0x621, lsl 32
+ movk x26, #0xeb21, lsl 48
+ mul x16, x8, x26
+ umulh x17, x8, x26
+ mul x19, x9, x26
+ umulh x20, x9, x26
+ adds x5, x5, x16
+ adcs x6, x6, x17
+ adc x13, xzr, xzr
+ adds x6, x6, x19
+ adc x13, x13, x20
+ ; Add overflows at 2 * 64
+ mov x26, #15
+ bic x7, x7, x26, lsl 60
+ adds x6, x6, x12
+ adc x7, x7, x13
+ ; Subtract top at 2 * 64
+ subs x6, x6, x8
+ sbcs x7, x7, x9
+ sbc x26, x26, x26
+ ; Conditional sub order
+ mov x16, #0xd3ed
+ movk x16, #0x5cf5, lsl 16
+ movk x16, #0x631a, lsl 32
+ movk x16, #0x5812, lsl 48
+ mov x17, #0x9cd6
+ movk x17, #0xa2f7, lsl 16
+ movk x17, #0xf9de, lsl 32
+ movk x17, #0x14de, lsl 48
+ and x16, x16, x26
+ and x17, x17, x26
+ adds x4, x4, x16
+ adcs x5, x5, x17
+ and x26, x26, #0x1000000000000000
+ adcs x6, x6, xzr
+ mov x25, #15
+ adc x7, x7, x26
+ bic x7, x7, x25, lsl 60
+ ; Store result
+ stp x4, x5, [x0]
+ stp x6, x7, [x0, #16]
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldp x24, x25, [x29, #72]
+ ldr x26, [x29, #88]
+ ldp x29, x30, [sp], #0x60
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ ENDIF
+ END
diff --git a/wolfcrypt/src/port/arm/armv8-mlkem-asm.asm b/wolfcrypt/src/port/arm/armv8-mlkem-asm.asm
new file mode 100644
index 0000000000..cc8271d85e
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-mlkem-asm.asm
@@ -0,0 +1,11426 @@
+; /* armv8-mlkem-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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./kyber/kyber.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-mlkem-asm.asm
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_aarch64_consts
+ DCW 0x0d01, 0xf301, 0x4ebf, 0x0549, 0x5049, 0x0000, 0x0000, 0x0000
+ IF :DEF:WOLFSSL_HAVE_MLKEM
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_aarch64_zetas
+ DCW 0x08ed, 0x0a0b, 0x0b9a, 0x0714, 0x05d5, 0x058e, 0x011f, 0x00ca
+ DCW 0x0c56, 0x026e, 0x0629, 0x00b6, 0x03c2, 0x084f, 0x073f, 0x05bc
+ DCW 0x023d, 0x07d4, 0x0108, 0x017f, 0x09c4, 0x05b2, 0x06bf, 0x0c7f
+ DCW 0x0a58, 0x03f9, 0x02dc, 0x0260, 0x06fb, 0x019b, 0x0c34, 0x06de
+ DCW 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x028c, 0x028c, 0x028c, 0x028c
+ DCW 0x0ad9, 0x0ad9, 0x0ad9, 0x0ad9, 0x03f7, 0x03f7, 0x03f7, 0x03f7
+ DCW 0x07f4, 0x07f4, 0x07f4, 0x07f4, 0x05d3, 0x05d3, 0x05d3, 0x05d3
+ DCW 0x0be7, 0x0be7, 0x0be7, 0x0be7, 0x06f9, 0x06f9, 0x06f9, 0x06f9
+ DCW 0x0204, 0x0204, 0x0204, 0x0204, 0x0cf9, 0x0cf9, 0x0cf9, 0x0cf9
+ DCW 0x0bc1, 0x0bc1, 0x0bc1, 0x0bc1, 0x0a67, 0x0a67, 0x0a67, 0x0a67
+ DCW 0x06af, 0x06af, 0x06af, 0x06af, 0x0877, 0x0877, 0x0877, 0x0877
+ DCW 0x007e, 0x007e, 0x007e, 0x007e, 0x05bd, 0x05bd, 0x05bd, 0x05bd
+ DCW 0x09ac, 0x09ac, 0x09ac, 0x09ac, 0x0ca7, 0x0ca7, 0x0ca7, 0x0ca7
+ DCW 0x0bf2, 0x0bf2, 0x0bf2, 0x0bf2, 0x033e, 0x033e, 0x033e, 0x033e
+ DCW 0x006b, 0x006b, 0x006b, 0x006b, 0x0774, 0x0774, 0x0774, 0x0774
+ DCW 0x0c0a, 0x0c0a, 0x0c0a, 0x0c0a, 0x094a, 0x094a, 0x094a, 0x094a
+ DCW 0x0b73, 0x0b73, 0x0b73, 0x0b73, 0x03c1, 0x03c1, 0x03c1, 0x03c1
+ DCW 0x071d, 0x071d, 0x071d, 0x071d, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c
+ DCW 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x08d8, 0x08d8, 0x08d8, 0x08d8
+ DCW 0x02a5, 0x02a5, 0x02a5, 0x02a5, 0x0806, 0x0806, 0x0806, 0x0806
+ DCW 0x08b2, 0x08b2, 0x01ae, 0x01ae, 0x022b, 0x022b, 0x034b, 0x034b
+ DCW 0x081e, 0x081e, 0x0367, 0x0367, 0x060e, 0x060e, 0x0069, 0x0069
+ DCW 0x01a6, 0x01a6, 0x024b, 0x024b, 0x00b1, 0x00b1, 0x0c16, 0x0c16
+ DCW 0x0bde, 0x0bde, 0x0b35, 0x0b35, 0x0626, 0x0626, 0x0675, 0x0675
+ DCW 0x0c0b, 0x0c0b, 0x030a, 0x030a, 0x0487, 0x0487, 0x0c6e, 0x0c6e
+ DCW 0x09f8, 0x09f8, 0x05cb, 0x05cb, 0x0aa7, 0x0aa7, 0x045f, 0x045f
+ DCW 0x06cb, 0x06cb, 0x0284, 0x0284, 0x0999, 0x0999, 0x015d, 0x015d
+ DCW 0x01a2, 0x01a2, 0x0149, 0x0149, 0x0c65, 0x0c65, 0x0cb6, 0x0cb6
+ DCW 0x0331, 0x0331, 0x0449, 0x0449, 0x025b, 0x025b, 0x0262, 0x0262
+ DCW 0x052a, 0x052a, 0x07fc, 0x07fc, 0x0748, 0x0748, 0x0180, 0x0180
+ DCW 0x0842, 0x0842, 0x0c79, 0x0c79, 0x04c2, 0x04c2, 0x07ca, 0x07ca
+ DCW 0x0997, 0x0997, 0x00dc, 0x00dc, 0x085e, 0x085e, 0x0686, 0x0686
+ DCW 0x0860, 0x0860, 0x0707, 0x0707, 0x0803, 0x0803, 0x031a, 0x031a
+ DCW 0x071b, 0x071b, 0x09ab, 0x09ab, 0x099b, 0x099b, 0x01de, 0x01de
+ DCW 0x0c95, 0x0c95, 0x0bcd, 0x0bcd, 0x03e4, 0x03e4, 0x03df, 0x03df
+ DCW 0x03be, 0x03be, 0x074d, 0x074d, 0x05f2, 0x05f2, 0x065c, 0x065c
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_aarch64_zetas_qinv
+ DCW 0xffed, 0x7b0b, 0x399a, 0x0314, 0x34d5, 0xcf8e, 0x6e1f, 0xbeca
+ DCW 0xae56, 0x6c6e, 0xf129, 0xc2b6, 0x29c2, 0x054f, 0xd43f, 0x79bc
+ DCW 0xe93d, 0x43d4, 0x9908, 0x8e7f, 0x15c4, 0xfbb2, 0x53bf, 0x997f
+ DCW 0x9258, 0x5ef9, 0xd6dc, 0x2260, 0x47fb, 0x229b, 0x6834, 0xc0de
+ DCW 0xe9c7, 0xe9c7, 0xe9c7, 0xe9c7, 0xe68c, 0xe68c, 0xe68c, 0xe68c
+ DCW 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x78f7, 0x78f7, 0x78f7, 0x78f7
+ DCW 0xa3f4, 0xa3f4, 0xa3f4, 0xa3f4, 0x4ed3, 0x4ed3, 0x4ed3, 0x4ed3
+ DCW 0x50e7, 0x50e7, 0x50e7, 0x50e7, 0x61f9, 0x61f9, 0x61f9, 0x61f9
+ DCW 0xce04, 0xce04, 0xce04, 0xce04, 0x67f9, 0x67f9, 0x67f9, 0x67f9
+ DCW 0x3ec1, 0x3ec1, 0x3ec1, 0x3ec1, 0xcf67, 0xcf67, 0xcf67, 0xcf67
+ DCW 0x23af, 0x23af, 0x23af, 0x23af, 0xfd77, 0xfd77, 0xfd77, 0xfd77
+ DCW 0x9a7e, 0x9a7e, 0x9a7e, 0x9a7e, 0x6cbd, 0x6cbd, 0x6cbd, 0x6cbd
+ DCW 0x4dac, 0x4dac, 0x4dac, 0x4dac, 0x91a7, 0x91a7, 0x91a7, 0x91a7
+ DCW 0xc1f2, 0xc1f2, 0xc1f2, 0xc1f2, 0xdd3e, 0xdd3e, 0xdd3e, 0xdd3e
+ DCW 0x916b, 0x916b, 0x916b, 0x916b, 0x2374, 0x2374, 0x2374, 0x2374
+ DCW 0x8a0a, 0x8a0a, 0x8a0a, 0x8a0a, 0x474a, 0x474a, 0x474a, 0x474a
+ DCW 0x3473, 0x3473, 0x3473, 0x3473, 0x36c1, 0x36c1, 0x36c1, 0x36c1
+ DCW 0x8e1d, 0x8e1d, 0x8e1d, 0x8e1d, 0xce2c, 0xce2c, 0xce2c, 0xce2c
+ DCW 0x41c0, 0x41c0, 0x41c0, 0x41c0, 0x10d8, 0x10d8, 0x10d8, 0x10d8
+ DCW 0xa1a5, 0xa1a5, 0xa1a5, 0xa1a5, 0xba06, 0xba06, 0xba06, 0xba06
+ DCW 0xfeb2, 0xfeb2, 0x2bae, 0x2bae, 0xd32b, 0xd32b, 0x344b, 0x344b
+ DCW 0x821e, 0x821e, 0xc867, 0xc867, 0x500e, 0x500e, 0xab69, 0xab69
+ DCW 0x93a6, 0x93a6, 0x334b, 0x334b, 0x03b1, 0x03b1, 0xee16, 0xee16
+ DCW 0xc5de, 0xc5de, 0x5a35, 0x5a35, 0x1826, 0x1826, 0x1575, 0x1575
+ DCW 0x7d0b, 0x7d0b, 0x810a, 0x810a, 0x2987, 0x2987, 0x766e, 0x766e
+ DCW 0x71f8, 0x71f8, 0xb6cb, 0xb6cb, 0x8fa7, 0x8fa7, 0x315f, 0x315f
+ DCW 0xb7cb, 0xb7cb, 0x4e84, 0x4e84, 0x4499, 0x4499, 0x485d, 0x485d
+ DCW 0xc7a2, 0xc7a2, 0x4c49, 0x4c49, 0xeb65, 0xeb65, 0xceb6, 0xceb6
+ DCW 0x8631, 0x8631, 0x4f49, 0x4f49, 0x635b, 0x635b, 0x0862, 0x0862
+ DCW 0xe32a, 0xe32a, 0x3bfc, 0x3bfc, 0x5f48, 0x5f48, 0x8180, 0x8180
+ DCW 0xae42, 0xae42, 0xe779, 0xe779, 0x2ac2, 0x2ac2, 0xc5ca, 0xc5ca
+ DCW 0x5e97, 0x5e97, 0xd4dc, 0xd4dc, 0x425e, 0x425e, 0x3886, 0x3886
+ DCW 0x2860, 0x2860, 0xac07, 0xac07, 0xe103, 0xe103, 0xb11a, 0xb11a
+ DCW 0xa81b, 0xa81b, 0x5aab, 0x5aab, 0x2a9b, 0x2a9b, 0xbbde, 0xbbde
+ DCW 0x7b95, 0x7b95, 0xa2cd, 0xa2cd, 0x6fe4, 0x6fe4, 0xb0df, 0xb0df
+ DCW 0x5dbe, 0x5dbe, 0x1e4d, 0x1e4d, 0xbbf2, 0xbbf2, 0x5a5c, 0x5a5c
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_ntt
+mlkem_ntt PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x2, L_mlkem_aarch64_zetas
+ add x2, x2, L_mlkem_aarch64_zetas
+ adrp x3, L_mlkem_aarch64_zetas_qinv
+ add x3, x3, L_mlkem_aarch64_zetas_qinv
+ adrp x4, L_mlkem_aarch64_consts
+ add x4, x4, L_mlkem_aarch64_consts
+ add x1, x0, #0x100
+ ldr q4, [x4]
+ ldr q5, [x0]
+ ldr q6, [x0, #32]
+ ldr q7, [x0, #64]
+ ldr q8, [x0, #96]
+ ldr q9, [x0, #128]
+ ldr q10, [x0, #160]
+ ldr q11, [x0, #192]
+ ldr q12, [x0, #224]
+ ldr q13, [x1]
+ ldr q14, [x1, #32]
+ ldr q15, [x1, #64]
+ ldr q16, [x1, #96]
+ ldr q17, [x1, #128]
+ ldr q18, [x1, #160]
+ ldr q19, [x1, #192]
+ ldr q20, [x1, #224]
+ ldr q0, [x2]
+ ldr q1, [x3]
+ mul v29.8h, v13.8h, v1.h[1]
+ mul v30.8h, v14.8h, v1.h[1]
+ sqrdmulh v21.8h, v13.8h, v0.h[1]
+ sqrdmulh v22.8h, v14.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v15.8h, v1.h[1]
+ mul v30.8h, v16.8h, v1.h[1]
+ sqrdmulh v23.8h, v15.8h, v0.h[1]
+ sqrdmulh v24.8h, v16.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[1]
+ mul v30.8h, v18.8h, v1.h[1]
+ sqrdmulh v25.8h, v17.8h, v0.h[1]
+ sqrdmulh v26.8h, v18.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[1]
+ mul v30.8h, v20.8h, v1.h[1]
+ sqrdmulh v27.8h, v19.8h, v0.h[1]
+ sqrdmulh v28.8h, v20.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v13.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v14.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v15.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v16.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v9.8h, v25.8h
+ add v9.8h, v9.8h, v25.8h
+ sub v18.8h, v10.8h, v26.8h
+ add v10.8h, v10.8h, v26.8h
+ sub v19.8h, v11.8h, v27.8h
+ add v11.8h, v11.8h, v27.8h
+ sub v20.8h, v12.8h, v28.8h
+ add v12.8h, v12.8h, v28.8h
+ mul v29.8h, v9.8h, v1.h[2]
+ mul v30.8h, v10.8h, v1.h[2]
+ sqrdmulh v21.8h, v9.8h, v0.h[2]
+ sqrdmulh v22.8h, v10.8h, v0.h[2]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[2]
+ sqrdmulh v23.8h, v11.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[2]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[3]
+ mul v30.8h, v18.8h, v1.h[3]
+ sqrdmulh v25.8h, v17.8h, v0.h[3]
+ sqrdmulh v26.8h, v18.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[3]
+ mul v30.8h, v20.8h, v1.h[3]
+ sqrdmulh v27.8h, v19.8h, v0.h[3]
+ sqrdmulh v28.8h, v20.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v9.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v10.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v12.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v18.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v15.8h, v27.8h
+ add v15.8h, v15.8h, v27.8h
+ sub v20.8h, v16.8h, v28.8h
+ add v16.8h, v16.8h, v28.8h
+ mul v29.8h, v7.8h, v1.h[4]
+ mul v30.8h, v8.8h, v1.h[4]
+ sqrdmulh v21.8h, v7.8h, v0.h[4]
+ sqrdmulh v22.8h, v8.8h, v0.h[4]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[5]
+ mul v30.8h, v12.8h, v1.h[5]
+ sqrdmulh v23.8h, v11.8h, v0.h[5]
+ sqrdmulh v24.8h, v12.8h, v0.h[5]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v15.8h, v1.h[6]
+ mul v30.8h, v16.8h, v1.h[6]
+ sqrdmulh v25.8h, v15.8h, v0.h[6]
+ sqrdmulh v26.8h, v16.8h, v0.h[6]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[7]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v19.8h, v0.h[7]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v7.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v10.8h, v24.8h
+ add v10.8h, v10.8h, v24.8h
+ sub v15.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v18.8h, v28.8h
+ add v18.8h, v18.8h, v28.8h
+ ldr q0, [x2, #16]
+ ldr q1, [x3, #16]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ str q5, [x0]
+ str q6, [x0, #32]
+ str q7, [x0, #64]
+ str q8, [x0, #96]
+ str q9, [x0, #128]
+ str q10, [x0, #160]
+ str q11, [x0, #192]
+ str q12, [x0, #224]
+ str q13, [x1]
+ str q14, [x1, #32]
+ str q15, [x1, #64]
+ str q16, [x1, #96]
+ str q17, [x1, #128]
+ str q18, [x1, #160]
+ str q19, [x1, #192]
+ str q20, [x1, #224]
+ ldr q5, [x0, #16]
+ ldr q6, [x0, #48]
+ ldr q7, [x0, #80]
+ ldr q8, [x0, #112]
+ ldr q9, [x0, #144]
+ ldr q10, [x0, #176]
+ ldr q11, [x0, #208]
+ ldr q12, [x0, #240]
+ ldr q13, [x1, #16]
+ ldr q14, [x1, #48]
+ ldr q15, [x1, #80]
+ ldr q16, [x1, #112]
+ ldr q17, [x1, #144]
+ ldr q18, [x1, #176]
+ ldr q19, [x1, #208]
+ ldr q20, [x1, #240]
+ ldr q0, [x2]
+ ldr q1, [x3]
+ mul v29.8h, v13.8h, v1.h[1]
+ mul v30.8h, v14.8h, v1.h[1]
+ sqrdmulh v21.8h, v13.8h, v0.h[1]
+ sqrdmulh v22.8h, v14.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v15.8h, v1.h[1]
+ mul v30.8h, v16.8h, v1.h[1]
+ sqrdmulh v23.8h, v15.8h, v0.h[1]
+ sqrdmulh v24.8h, v16.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[1]
+ mul v30.8h, v18.8h, v1.h[1]
+ sqrdmulh v25.8h, v17.8h, v0.h[1]
+ sqrdmulh v26.8h, v18.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[1]
+ mul v30.8h, v20.8h, v1.h[1]
+ sqrdmulh v27.8h, v19.8h, v0.h[1]
+ sqrdmulh v28.8h, v20.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v13.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v14.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v15.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v16.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v9.8h, v25.8h
+ add v9.8h, v9.8h, v25.8h
+ sub v18.8h, v10.8h, v26.8h
+ add v10.8h, v10.8h, v26.8h
+ sub v19.8h, v11.8h, v27.8h
+ add v11.8h, v11.8h, v27.8h
+ sub v20.8h, v12.8h, v28.8h
+ add v12.8h, v12.8h, v28.8h
+ mul v29.8h, v9.8h, v1.h[2]
+ mul v30.8h, v10.8h, v1.h[2]
+ sqrdmulh v21.8h, v9.8h, v0.h[2]
+ sqrdmulh v22.8h, v10.8h, v0.h[2]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[2]
+ sqrdmulh v23.8h, v11.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[2]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[3]
+ mul v30.8h, v18.8h, v1.h[3]
+ sqrdmulh v25.8h, v17.8h, v0.h[3]
+ sqrdmulh v26.8h, v18.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[3]
+ mul v30.8h, v20.8h, v1.h[3]
+ sqrdmulh v27.8h, v19.8h, v0.h[3]
+ sqrdmulh v28.8h, v20.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v9.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v10.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v12.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v18.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v15.8h, v27.8h
+ add v15.8h, v15.8h, v27.8h
+ sub v20.8h, v16.8h, v28.8h
+ add v16.8h, v16.8h, v28.8h
+ mul v29.8h, v7.8h, v1.h[4]
+ mul v30.8h, v8.8h, v1.h[4]
+ sqrdmulh v21.8h, v7.8h, v0.h[4]
+ sqrdmulh v22.8h, v8.8h, v0.h[4]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[5]
+ mul v30.8h, v12.8h, v1.h[5]
+ sqrdmulh v23.8h, v11.8h, v0.h[5]
+ sqrdmulh v24.8h, v12.8h, v0.h[5]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v15.8h, v1.h[6]
+ mul v30.8h, v16.8h, v1.h[6]
+ sqrdmulh v25.8h, v15.8h, v0.h[6]
+ sqrdmulh v26.8h, v16.8h, v0.h[6]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[7]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v19.8h, v0.h[7]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v7.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v10.8h, v24.8h
+ add v10.8h, v10.8h, v24.8h
+ sub v15.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v18.8h, v28.8h
+ add v18.8h, v18.8h, v28.8h
+ ldr q0, [x2, #16]
+ ldr q1, [x3, #16]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ str q5, [x0, #16]
+ str q6, [x0, #48]
+ str q7, [x0, #80]
+ str q8, [x0, #112]
+ str q9, [x0, #144]
+ str q10, [x0, #176]
+ str q11, [x0, #208]
+ str q12, [x0, #240]
+ str q13, [x1, #16]
+ str q14, [x1, #48]
+ str q15, [x1, #80]
+ str q16, [x1, #112]
+ str q17, [x1, #144]
+ str q18, [x1, #176]
+ str q19, [x1, #208]
+ str q20, [x1, #240]
+ ldp q5, q6, [x0]
+ ldp q7, q8, [x0, #32]
+ ldp q9, q10, [x0, #64]
+ ldp q11, q12, [x0, #96]
+ ldp q13, q14, [x0, #128]
+ ldp q15, q16, [x0, #160]
+ ldp q17, q18, [x0, #192]
+ ldp q19, q20, [x0, #224]
+ ldr q0, [x2, #32]
+ ldr q1, [x3, #32]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #64]
+ ldr q2, [x2, #80]
+ ldr q1, [x3, #64]
+ ldr q3, [x3, #80]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ trn2 v8.2d, v30.2d, v8.2d
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #96]
+ ldr q2, [x2, #112]
+ ldr q1, [x3, #96]
+ ldr q3, [x3, #112]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ trn2 v12.2d, v30.2d, v12.2d
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #128]
+ ldr q2, [x2, #144]
+ ldr q1, [x3, #128]
+ ldr q3, [x3, #144]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ trn2 v16.2d, v30.2d, v16.2d
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #160]
+ ldr q2, [x2, #176]
+ ldr q1, [x3, #160]
+ ldr q3, [x3, #176]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ trn2 v20.2d, v30.2d, v20.2d
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #320]
+ ldr q2, [x2, #336]
+ ldr q1, [x3, #320]
+ ldr q3, [x3, #336]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ trn2 v8.4s, v30.4s, v8.4s
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #352]
+ ldr q2, [x2, #368]
+ ldr q1, [x3, #352]
+ ldr q3, [x3, #368]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ trn2 v12.4s, v30.4s, v12.4s
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #384]
+ ldr q2, [x2, #400]
+ ldr q1, [x3, #384]
+ ldr q3, [x3, #400]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ trn2 v16.4s, v30.4s, v16.4s
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #416]
+ ldr q2, [x2, #432]
+ ldr q1, [x3, #416]
+ ldr q3, [x3, #432]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ trn2 v20.4s, v30.4s, v20.4s
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ sqdmulh v21.8h, v5.8h, v4.h[2]
+ sqdmulh v22.8h, v6.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v5.8h, v21.8h, v4.h[0]
+ mls v6.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v7.8h, v4.h[2]
+ sqdmulh v22.8h, v8.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v7.8h, v21.8h, v4.h[0]
+ mls v8.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v9.8h, v4.h[2]
+ sqdmulh v22.8h, v10.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v9.8h, v21.8h, v4.h[0]
+ mls v10.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v11.8h, v4.h[2]
+ sqdmulh v22.8h, v12.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v11.8h, v21.8h, v4.h[0]
+ mls v12.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v13.8h, v4.h[2]
+ sqdmulh v22.8h, v14.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v13.8h, v21.8h, v4.h[0]
+ mls v14.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v15.8h, v4.h[2]
+ sqdmulh v22.8h, v16.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v15.8h, v21.8h, v4.h[0]
+ mls v16.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v17.8h, v4.h[2]
+ sqdmulh v22.8h, v18.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v17.8h, v21.8h, v4.h[0]
+ mls v18.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v19.8h, v4.h[2]
+ sqdmulh v22.8h, v20.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v19.8h, v21.8h, v4.h[0]
+ mls v20.8h, v22.8h, v4.h[0]
+ mov v29.16b, v5.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ mov v29.16b, v5.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ mov v29.16b, v7.16b
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v8.4s, v29.4s, v8.4s
+ mov v29.16b, v7.16b
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v8.2d, v29.2d, v8.2d
+ mov v29.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ mov v29.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ mov v29.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v29.4s, v12.4s
+ mov v29.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v29.2d, v12.2d
+ mov v29.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ mov v29.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ mov v29.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v29.4s, v16.4s
+ mov v29.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v29.2d, v16.2d
+ mov v29.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ mov v29.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ mov v29.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v29.4s, v20.4s
+ mov v29.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v29.2d, v20.2d
+ stp q5, q6, [x0]
+ stp q7, q8, [x0, #32]
+ stp q9, q10, [x0, #64]
+ stp q11, q12, [x0, #96]
+ stp q13, q14, [x0, #128]
+ stp q15, q16, [x0, #160]
+ stp q17, q18, [x0, #192]
+ stp q19, q20, [x0, #224]
+ ldp q5, q6, [x1]
+ ldp q7, q8, [x1, #32]
+ ldp q9, q10, [x1, #64]
+ ldp q11, q12, [x1, #96]
+ ldp q13, q14, [x1, #128]
+ ldp q15, q16, [x1, #160]
+ ldp q17, q18, [x1, #192]
+ ldp q19, q20, [x1, #224]
+ ldr q0, [x2, #48]
+ ldr q1, [x3, #48]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #192]
+ ldr q2, [x2, #208]
+ ldr q1, [x3, #192]
+ ldr q3, [x3, #208]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ trn2 v8.2d, v30.2d, v8.2d
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #224]
+ ldr q2, [x2, #240]
+ ldr q1, [x3, #224]
+ ldr q3, [x3, #240]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ trn2 v12.2d, v30.2d, v12.2d
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #256]
+ ldr q2, [x2, #272]
+ ldr q1, [x3, #256]
+ ldr q3, [x3, #272]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ trn2 v16.2d, v30.2d, v16.2d
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #288]
+ ldr q2, [x2, #304]
+ ldr q1, [x3, #288]
+ ldr q3, [x3, #304]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ trn2 v20.2d, v30.2d, v20.2d
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #448]
+ ldr q2, [x2, #464]
+ ldr q1, [x3, #448]
+ ldr q3, [x3, #464]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ trn2 v8.4s, v30.4s, v8.4s
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v21.8h, v21.8h, v29.8h
+ sub v22.8h, v22.8h, v30.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #480]
+ ldr q2, [x2, #496]
+ ldr q1, [x3, #480]
+ ldr q3, [x3, #496]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ trn2 v12.4s, v30.4s, v12.4s
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v23.8h, v23.8h, v29.8h
+ sub v24.8h, v24.8h, v30.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #512]
+ ldr q2, [x2, #528]
+ ldr q1, [x3, #512]
+ ldr q3, [x3, #528]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ trn2 v16.4s, v30.4s, v16.4s
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v25.8h, v25.8h, v29.8h
+ sub v26.8h, v26.8h, v30.8h
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #544]
+ ldr q2, [x2, #560]
+ ldr q1, [x3, #544]
+ ldr q3, [x3, #560]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ trn2 v20.4s, v30.4s, v20.4s
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmulh v29.8h, v29.8h, v4.h[0]
+ sqrdmulh v30.8h, v30.8h, v4.h[0]
+ sub v27.8h, v27.8h, v29.8h
+ sub v28.8h, v28.8h, v30.8h
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ sqdmulh v21.8h, v5.8h, v4.h[2]
+ sqdmulh v22.8h, v6.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v5.8h, v21.8h, v4.h[0]
+ mls v6.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v7.8h, v4.h[2]
+ sqdmulh v22.8h, v8.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v7.8h, v21.8h, v4.h[0]
+ mls v8.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v9.8h, v4.h[2]
+ sqdmulh v22.8h, v10.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v9.8h, v21.8h, v4.h[0]
+ mls v10.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v11.8h, v4.h[2]
+ sqdmulh v22.8h, v12.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v11.8h, v21.8h, v4.h[0]
+ mls v12.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v13.8h, v4.h[2]
+ sqdmulh v22.8h, v14.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v13.8h, v21.8h, v4.h[0]
+ mls v14.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v15.8h, v4.h[2]
+ sqdmulh v22.8h, v16.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v15.8h, v21.8h, v4.h[0]
+ mls v16.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v17.8h, v4.h[2]
+ sqdmulh v22.8h, v18.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v17.8h, v21.8h, v4.h[0]
+ mls v18.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v19.8h, v4.h[2]
+ sqdmulh v22.8h, v20.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v19.8h, v21.8h, v4.h[0]
+ mls v20.8h, v22.8h, v4.h[0]
+ mov v29.16b, v5.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ mov v29.16b, v5.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ mov v29.16b, v7.16b
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v8.4s, v29.4s, v8.4s
+ mov v29.16b, v7.16b
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v8.2d, v29.2d, v8.2d
+ mov v29.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ mov v29.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ mov v29.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v29.4s, v12.4s
+ mov v29.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v29.2d, v12.2d
+ mov v29.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ mov v29.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ mov v29.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v29.4s, v16.4s
+ mov v29.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v29.2d, v16.2d
+ mov v29.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ mov v29.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ mov v29.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v29.4s, v20.4s
+ mov v29.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v29.2d, v20.2d
+ stp q5, q6, [x1]
+ stp q7, q8, [x1, #32]
+ stp q9, q10, [x1, #64]
+ stp q11, q12, [x1, #96]
+ stp q13, q14, [x1, #128]
+ stp q15, q16, [x1, #160]
+ stp q17, q18, [x1, #192]
+ stp q19, q20, [x1, #224]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_aarch64_zetas_inv
+ DCW 0x06a5, 0x06a5, 0x070f, 0x070f, 0x05b4, 0x05b4, 0x0943, 0x0943
+ DCW 0x0922, 0x0922, 0x091d, 0x091d, 0x0134, 0x0134, 0x006c, 0x006c
+ DCW 0x0b23, 0x0b23, 0x0366, 0x0366, 0x0356, 0x0356, 0x05e6, 0x05e6
+ DCW 0x09e7, 0x09e7, 0x04fe, 0x04fe, 0x05fa, 0x05fa, 0x04a1, 0x04a1
+ DCW 0x067b, 0x067b, 0x04a3, 0x04a3, 0x0c25, 0x0c25, 0x036a, 0x036a
+ DCW 0x0537, 0x0537, 0x083f, 0x083f, 0x0088, 0x0088, 0x04bf, 0x04bf
+ DCW 0x0b81, 0x0b81, 0x05b9, 0x05b9, 0x0505, 0x0505, 0x07d7, 0x07d7
+ DCW 0x0a9f, 0x0a9f, 0x0aa6, 0x0aa6, 0x08b8, 0x08b8, 0x09d0, 0x09d0
+ DCW 0x004b, 0x004b, 0x009c, 0x009c, 0x0bb8, 0x0bb8, 0x0b5f, 0x0b5f
+ DCW 0x0ba4, 0x0ba4, 0x0368, 0x0368, 0x0a7d, 0x0a7d, 0x0636, 0x0636
+ DCW 0x08a2, 0x08a2, 0x025a, 0x025a, 0x0736, 0x0736, 0x0309, 0x0309
+ DCW 0x0093, 0x0093, 0x087a, 0x087a, 0x09f7, 0x09f7, 0x00f6, 0x00f6
+ DCW 0x068c, 0x068c, 0x06db, 0x06db, 0x01cc, 0x01cc, 0x0123, 0x0123
+ DCW 0x00eb, 0x00eb, 0x0c50, 0x0c50, 0x0ab6, 0x0ab6, 0x0b5b, 0x0b5b
+ DCW 0x0c98, 0x0c98, 0x06f3, 0x06f3, 0x099a, 0x099a, 0x04e3, 0x04e3
+ DCW 0x09b6, 0x09b6, 0x0ad6, 0x0ad6, 0x0b53, 0x0b53, 0x044f, 0x044f
+ DCW 0x04fb, 0x04fb, 0x04fb, 0x04fb, 0x0a5c, 0x0a5c, 0x0a5c, 0x0a5c
+ DCW 0x0429, 0x0429, 0x0429, 0x0429, 0x0b41, 0x0b41, 0x0b41, 0x0b41
+ DCW 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x05e4, 0x05e4, 0x05e4, 0x05e4
+ DCW 0x0940, 0x0940, 0x0940, 0x0940, 0x018e, 0x018e, 0x018e, 0x018e
+ DCW 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x00f7, 0x00f7, 0x00f7, 0x00f7
+ DCW 0x058d, 0x058d, 0x058d, 0x058d, 0x0c96, 0x0c96, 0x0c96, 0x0c96
+ DCW 0x09c3, 0x09c3, 0x09c3, 0x09c3, 0x010f, 0x010f, 0x010f, 0x010f
+ DCW 0x005a, 0x005a, 0x005a, 0x005a, 0x0355, 0x0355, 0x0355, 0x0355
+ DCW 0x0744, 0x0744, 0x0744, 0x0744, 0x0c83, 0x0c83, 0x0c83, 0x0c83
+ DCW 0x048a, 0x048a, 0x048a, 0x048a, 0x0652, 0x0652, 0x0652, 0x0652
+ DCW 0x029a, 0x029a, 0x029a, 0x029a, 0x0140, 0x0140, 0x0140, 0x0140
+ DCW 0x0008, 0x0008, 0x0008, 0x0008, 0x0afd, 0x0afd, 0x0afd, 0x0afd
+ DCW 0x0608, 0x0608, 0x0608, 0x0608, 0x011a, 0x011a, 0x011a, 0x011a
+ DCW 0x072e, 0x072e, 0x072e, 0x072e, 0x050d, 0x050d, 0x050d, 0x050d
+ DCW 0x090a, 0x090a, 0x090a, 0x090a, 0x0228, 0x0228, 0x0228, 0x0228
+ DCW 0x0a75, 0x0a75, 0x0a75, 0x0a75, 0x083a, 0x083a, 0x083a, 0x083a
+ DCW 0x0623, 0x00cd, 0x0b66, 0x0606, 0x0aa1, 0x0a25, 0x0908, 0x02a9
+ DCW 0x0082, 0x0642, 0x074f, 0x033d, 0x0b82, 0x0bf9, 0x052d, 0x0ac4
+ DCW 0x0745, 0x05c2, 0x04b2, 0x093f, 0x0c4b, 0x06d8, 0x0a93, 0x00ab
+ DCW 0x0c37, 0x0be2, 0x0773, 0x072c, 0x05ed, 0x0167, 0x02f6, 0x05a1
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_aarch64_zetas_inv_qinv
+ DCW 0xa5a5, 0xa5a5, 0x440f, 0x440f, 0xe1b4, 0xe1b4, 0xa243, 0xa243
+ DCW 0x4f22, 0x4f22, 0x901d, 0x901d, 0x5d34, 0x5d34, 0x846c, 0x846c
+ DCW 0x4423, 0x4423, 0xd566, 0xd566, 0xa556, 0xa556, 0x57e6, 0x57e6
+ DCW 0x4ee7, 0x4ee7, 0x1efe, 0x1efe, 0x53fa, 0x53fa, 0xd7a1, 0xd7a1
+ DCW 0xc77b, 0xc77b, 0xbda3, 0xbda3, 0x2b25, 0x2b25, 0xa16a, 0xa16a
+ DCW 0x3a37, 0x3a37, 0xd53f, 0xd53f, 0x1888, 0x1888, 0x51bf, 0x51bf
+ DCW 0x7e81, 0x7e81, 0xa0b9, 0xa0b9, 0xc405, 0xc405, 0x1cd7, 0x1cd7
+ DCW 0xf79f, 0xf79f, 0x9ca6, 0x9ca6, 0xb0b8, 0xb0b8, 0x79d0, 0x79d0
+ DCW 0x314b, 0x314b, 0x149c, 0x149c, 0xb3b8, 0xb3b8, 0x385f, 0x385f
+ DCW 0xb7a4, 0xb7a4, 0xbb68, 0xbb68, 0xb17d, 0xb17d, 0x4836, 0x4836
+ DCW 0xcea2, 0xcea2, 0x705a, 0x705a, 0x4936, 0x4936, 0x8e09, 0x8e09
+ DCW 0x8993, 0x8993, 0xd67a, 0xd67a, 0x7ef7, 0x7ef7, 0x82f6, 0x82f6
+ DCW 0xea8c, 0xea8c, 0xe7db, 0xe7db, 0xa5cc, 0xa5cc, 0x3a23, 0x3a23
+ DCW 0x11eb, 0x11eb, 0xfc50, 0xfc50, 0xccb6, 0xccb6, 0x6c5b, 0x6c5b
+ DCW 0x5498, 0x5498, 0xaff3, 0xaff3, 0x379a, 0x379a, 0x7de3, 0x7de3
+ DCW 0xcbb6, 0xcbb6, 0x2cd6, 0x2cd6, 0xd453, 0xd453, 0x014f, 0x014f
+ DCW 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x5e5c, 0x5e5c, 0x5e5c, 0x5e5c
+ DCW 0xef29, 0xef29, 0xef29, 0xef29, 0xbe41, 0xbe41, 0xbe41, 0xbe41
+ DCW 0x31d5, 0x31d5, 0x31d5, 0x31d5, 0x71e4, 0x71e4, 0x71e4, 0x71e4
+ DCW 0xc940, 0xc940, 0xc940, 0xc940, 0xcb8e, 0xcb8e, 0xcb8e, 0xcb8e
+ DCW 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0x75f7, 0x75f7, 0x75f7, 0x75f7
+ DCW 0xdc8d, 0xdc8d, 0xdc8d, 0xdc8d, 0x6e96, 0x6e96, 0x6e96, 0x6e96
+ DCW 0x22c3, 0x22c3, 0x22c3, 0x22c3, 0x3e0f, 0x3e0f, 0x3e0f, 0x3e0f
+ DCW 0x6e5a, 0x6e5a, 0x6e5a, 0x6e5a, 0xb255, 0xb255, 0xb255, 0xb255
+ DCW 0x9344, 0x9344, 0x9344, 0x9344, 0x6583, 0x6583, 0x6583, 0x6583
+ DCW 0x028a, 0x028a, 0x028a, 0x028a, 0xdc52, 0xdc52, 0xdc52, 0xdc52
+ DCW 0x309a, 0x309a, 0x309a, 0x309a, 0xc140, 0xc140, 0xc140, 0xc140
+ DCW 0x9808, 0x9808, 0x9808, 0x9808, 0x31fd, 0x31fd, 0x31fd, 0x31fd
+ DCW 0x9e08, 0x9e08, 0x9e08, 0x9e08, 0xaf1a, 0xaf1a, 0xaf1a, 0xaf1a
+ DCW 0xb12e, 0xb12e, 0xb12e, 0xb12e, 0x5c0d, 0x5c0d, 0x5c0d, 0x5c0d
+ DCW 0x870a, 0x870a, 0x870a, 0x870a, 0xfa28, 0xfa28, 0xfa28, 0xfa28
+ DCW 0x1975, 0x1975, 0x1975, 0x1975, 0x163a, 0x163a, 0x163a, 0x163a
+ DCW 0x3f23, 0x97cd, 0xdd66, 0xb806, 0xdda1, 0x2925, 0xa108, 0x6da9
+ DCW 0x6682, 0xac42, 0x044f, 0xea3d, 0x7182, 0x66f9, 0xbc2d, 0x16c4
+ DCW 0x8645, 0x2bc2, 0xfab2, 0xd63f, 0x3d4b, 0x0ed8, 0x9393, 0x51ab
+ DCW 0x4137, 0x91e2, 0x3073, 0xcb2c, 0xfced, 0xc667, 0x84f6, 0xd8a1
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_invntt
+mlkem_invntt PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x2, L_mlkem_aarch64_zetas_inv
+ add x2, x2, L_mlkem_aarch64_zetas_inv
+ adrp x3, L_mlkem_aarch64_zetas_inv_qinv
+ add x3, x3, L_mlkem_aarch64_zetas_inv_qinv
+ adrp x4, L_mlkem_aarch64_consts
+ add x4, x4, L_mlkem_aarch64_consts
+ add x1, x0, #0x100
+ ldr q8, [x4]
+ ldp q9, q10, [x0]
+ ldp q11, q12, [x0, #32]
+ ldp q13, q14, [x0, #64]
+ ldp q15, q16, [x0, #96]
+ ldp q17, q18, [x0, #128]
+ ldp q19, q20, [x0, #160]
+ ldp q21, q22, [x0, #192]
+ ldp q23, q24, [x0, #224]
+ mov v25.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ mov v25.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ mov v25.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v25.2d, v12.2d
+ mov v25.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v25.4s, v12.4s
+ mov v25.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ mov v25.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ mov v25.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v25.2d, v16.2d
+ mov v25.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v25.4s, v16.4s
+ mov v25.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ mov v25.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ mov v25.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v25.2d, v20.2d
+ mov v25.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v25.4s, v20.4s
+ mov v25.16b, v21.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ mov v25.16b, v21.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ mov v25.16b, v23.16b
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v24.2d, v25.2d, v24.2d
+ mov v25.16b, v23.16b
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v24.4s, v25.4s, v24.4s
+ ldr q0, [x2]
+ ldr q1, [x2, #16]
+ ldr q2, [x3]
+ ldr q3, [x3, #16]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #32]
+ ldr q1, [x2, #48]
+ ldr q2, [x3, #32]
+ ldr q3, [x3, #48]
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #64]
+ ldr q1, [x2, #80]
+ ldr q2, [x3, #64]
+ ldr q3, [x3, #80]
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #96]
+ ldr q1, [x2, #112]
+ ldr q2, [x3, #96]
+ ldr q3, [x3, #112]
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #256]
+ ldr q1, [x2, #272]
+ ldr q2, [x3, #256]
+ ldr q3, [x3, #272]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ trn2 v12.4s, v26.4s, v12.4s
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #288]
+ ldr q1, [x2, #304]
+ ldr q2, [x3, #288]
+ ldr q3, [x3, #304]
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ trn2 v16.4s, v26.4s, v16.4s
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #320]
+ ldr q1, [x2, #336]
+ ldr q2, [x3, #320]
+ ldr q3, [x3, #336]
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ trn2 v20.4s, v26.4s, v20.4s
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #352]
+ ldr q1, [x2, #368]
+ ldr q2, [x3, #352]
+ ldr q3, [x3, #368]
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ trn2 v24.4s, v26.4s, v24.4s
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #512]
+ ldr q2, [x3, #512]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ trn2 v12.2d, v26.2d, v12.2d
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.h[0]
+ mul v27.8h, v28.8h, v2.h[1]
+ sqrdmulh v10.8h, v26.8h, v0.h[0]
+ sqrdmulh v12.8h, v28.8h, v0.h[1]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ trn2 v16.2d, v26.2d, v16.2d
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.h[2]
+ mul v27.8h, v28.8h, v2.h[3]
+ sqrdmulh v14.8h, v26.8h, v0.h[2]
+ sqrdmulh v16.8h, v28.8h, v0.h[3]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ trn2 v20.2d, v26.2d, v20.2d
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.h[4]
+ mul v27.8h, v28.8h, v2.h[5]
+ sqrdmulh v18.8h, v26.8h, v0.h[4]
+ sqrdmulh v20.8h, v28.8h, v0.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ trn2 v24.2d, v26.2d, v24.2d
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.h[6]
+ mul v27.8h, v28.8h, v2.h[7]
+ sqrdmulh v22.8h, v26.8h, v0.h[6]
+ sqrdmulh v24.8h, v28.8h, v0.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v11.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v11.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v13.8h, v8.h[2]
+ sqdmulh v26.8h, v15.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v13.8h, v25.8h, v8.h[0]
+ mls v15.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v19.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v19.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v21.8h, v8.h[2]
+ sqdmulh v26.8h, v23.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v21.8h, v25.8h, v8.h[0]
+ mls v23.8h, v26.8h, v8.h[0]
+ stp q9, q10, [x0]
+ stp q11, q12, [x0, #32]
+ stp q13, q14, [x0, #64]
+ stp q15, q16, [x0, #96]
+ stp q17, q18, [x0, #128]
+ stp q19, q20, [x0, #160]
+ stp q21, q22, [x0, #192]
+ stp q23, q24, [x0, #224]
+ ldp q9, q10, [x1]
+ ldp q11, q12, [x1, #32]
+ ldp q13, q14, [x1, #64]
+ ldp q15, q16, [x1, #96]
+ ldp q17, q18, [x1, #128]
+ ldp q19, q20, [x1, #160]
+ ldp q21, q22, [x1, #192]
+ ldp q23, q24, [x1, #224]
+ mov v25.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ mov v25.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ mov v25.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v25.2d, v12.2d
+ mov v25.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v25.4s, v12.4s
+ mov v25.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ mov v25.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ mov v25.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v25.2d, v16.2d
+ mov v25.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v25.4s, v16.4s
+ mov v25.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ mov v25.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ mov v25.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v25.2d, v20.2d
+ mov v25.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v25.4s, v20.4s
+ mov v25.16b, v21.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ mov v25.16b, v21.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ mov v25.16b, v23.16b
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v24.2d, v25.2d, v24.2d
+ mov v25.16b, v23.16b
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v24.4s, v25.4s, v24.4s
+ ldr q0, [x2, #128]
+ ldr q1, [x2, #144]
+ ldr q2, [x3, #128]
+ ldr q3, [x3, #144]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #160]
+ ldr q1, [x2, #176]
+ ldr q2, [x3, #160]
+ ldr q3, [x3, #176]
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #192]
+ ldr q1, [x2, #208]
+ ldr q2, [x3, #192]
+ ldr q3, [x3, #208]
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #224]
+ ldr q1, [x2, #240]
+ ldr q2, [x3, #224]
+ ldr q3, [x3, #240]
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #384]
+ ldr q1, [x2, #400]
+ ldr q2, [x3, #384]
+ ldr q3, [x3, #400]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ trn2 v12.4s, v26.4s, v12.4s
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #416]
+ ldr q1, [x2, #432]
+ ldr q2, [x3, #416]
+ ldr q3, [x3, #432]
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ trn2 v16.4s, v26.4s, v16.4s
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #448]
+ ldr q1, [x2, #464]
+ ldr q2, [x3, #448]
+ ldr q3, [x3, #464]
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ trn2 v20.4s, v26.4s, v20.4s
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #480]
+ ldr q1, [x2, #496]
+ ldr q2, [x3, #480]
+ ldr q3, [x3, #496]
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ trn2 v24.4s, v26.4s, v24.4s
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #528]
+ ldr q2, [x3, #528]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ trn2 v12.2d, v26.2d, v12.2d
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.h[0]
+ mul v27.8h, v28.8h, v2.h[1]
+ sqrdmulh v10.8h, v26.8h, v0.h[0]
+ sqrdmulh v12.8h, v28.8h, v0.h[1]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ trn2 v16.2d, v26.2d, v16.2d
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.h[2]
+ mul v27.8h, v28.8h, v2.h[3]
+ sqrdmulh v14.8h, v26.8h, v0.h[2]
+ sqrdmulh v16.8h, v28.8h, v0.h[3]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ trn2 v20.2d, v26.2d, v20.2d
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.h[4]
+ mul v27.8h, v28.8h, v2.h[5]
+ sqrdmulh v18.8h, v26.8h, v0.h[4]
+ sqrdmulh v20.8h, v28.8h, v0.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ trn2 v24.2d, v26.2d, v24.2d
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.h[6]
+ mul v27.8h, v28.8h, v2.h[7]
+ sqrdmulh v22.8h, v26.8h, v0.h[6]
+ sqrdmulh v24.8h, v28.8h, v0.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v11.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v11.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v13.8h, v8.h[2]
+ sqdmulh v26.8h, v15.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v13.8h, v25.8h, v8.h[0]
+ mls v15.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v19.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v19.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v21.8h, v8.h[2]
+ sqdmulh v26.8h, v23.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v21.8h, v25.8h, v8.h[0]
+ mls v23.8h, v26.8h, v8.h[0]
+ stp q9, q10, [x1]
+ stp q11, q12, [x1, #32]
+ stp q13, q14, [x1, #64]
+ stp q15, q16, [x1, #96]
+ stp q17, q18, [x1, #128]
+ stp q19, q20, [x1, #160]
+ stp q21, q22, [x1, #192]
+ stp q23, q24, [x1, #224]
+ ldr q4, [x2, #544]
+ ldr q5, [x2, #560]
+ ldr q6, [x3, #544]
+ ldr q7, [x3, #560]
+ ldr q9, [x0]
+ ldr q10, [x0, #32]
+ ldr q11, [x0, #64]
+ ldr q12, [x0, #96]
+ ldr q13, [x0, #128]
+ ldr q14, [x0, #160]
+ ldr q15, [x0, #192]
+ ldr q16, [x0, #224]
+ ldr q17, [x1]
+ ldr q18, [x1, #32]
+ ldr q19, [x1, #64]
+ ldr q20, [x1, #96]
+ ldr q21, [x1, #128]
+ ldr q22, [x1, #160]
+ ldr q23, [x1, #192]
+ ldr q24, [x1, #224]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v6.h[0]
+ mul v27.8h, v28.8h, v6.h[1]
+ sqrdmulh v10.8h, v26.8h, v4.h[0]
+ sqrdmulh v12.8h, v28.8h, v4.h[1]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v6.h[2]
+ mul v27.8h, v28.8h, v6.h[3]
+ sqrdmulh v14.8h, v26.8h, v4.h[2]
+ sqrdmulh v16.8h, v28.8h, v4.h[3]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v6.h[4]
+ mul v27.8h, v28.8h, v6.h[5]
+ sqrdmulh v18.8h, v26.8h, v4.h[4]
+ sqrdmulh v20.8h, v28.8h, v4.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v6.h[6]
+ mul v27.8h, v28.8h, v6.h[7]
+ sqrdmulh v22.8h, v26.8h, v4.h[6]
+ sqrdmulh v24.8h, v28.8h, v4.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v11.8h
+ sub v28.8h, v10.8h, v12.8h
+ add v9.8h, v9.8h, v11.8h
+ add v10.8h, v10.8h, v12.8h
+ mul v25.8h, v26.8h, v7.h[0]
+ mul v27.8h, v28.8h, v7.h[0]
+ sqrdmulh v11.8h, v26.8h, v5.h[0]
+ sqrdmulh v12.8h, v28.8h, v5.h[0]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v11.8h, v11.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v15.8h
+ sub v28.8h, v14.8h, v16.8h
+ add v13.8h, v13.8h, v15.8h
+ add v14.8h, v14.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[1]
+ mul v27.8h, v28.8h, v7.h[1]
+ sqrdmulh v15.8h, v26.8h, v5.h[1]
+ sqrdmulh v16.8h, v28.8h, v5.h[1]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v15.8h, v15.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v19.8h
+ sub v28.8h, v18.8h, v20.8h
+ add v17.8h, v17.8h, v19.8h
+ add v18.8h, v18.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[2]
+ mul v27.8h, v28.8h, v7.h[2]
+ sqrdmulh v19.8h, v26.8h, v5.h[2]
+ sqrdmulh v20.8h, v28.8h, v5.h[2]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v19.8h, v19.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v23.8h
+ sub v28.8h, v22.8h, v24.8h
+ add v21.8h, v21.8h, v23.8h
+ add v22.8h, v22.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[3]
+ mul v27.8h, v28.8h, v7.h[3]
+ sqrdmulh v23.8h, v26.8h, v5.h[3]
+ sqrdmulh v24.8h, v28.8h, v5.h[3]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v13.8h
+ sub v28.8h, v10.8h, v14.8h
+ add v9.8h, v9.8h, v13.8h
+ add v10.8h, v10.8h, v14.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v13.8h, v26.8h, v5.h[4]
+ sqrdmulh v14.8h, v28.8h, v5.h[4]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v13.8h, v13.8h, v25.8h
+ sub v14.8h, v14.8h, v27.8h
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ sub v26.8h, v11.8h, v15.8h
+ sub v28.8h, v12.8h, v16.8h
+ add v11.8h, v11.8h, v15.8h
+ add v12.8h, v12.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v15.8h, v26.8h, v5.h[4]
+ sqrdmulh v16.8h, v28.8h, v5.h[4]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v15.8h, v15.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v21.8h
+ sub v28.8h, v18.8h, v22.8h
+ add v17.8h, v17.8h, v21.8h
+ add v18.8h, v18.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v21.8h, v26.8h, v5.h[5]
+ sqrdmulh v22.8h, v28.8h, v5.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v21.8h, v21.8h, v25.8h
+ sub v22.8h, v22.8h, v27.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v19.8h, v23.8h
+ sub v28.8h, v20.8h, v24.8h
+ add v19.8h, v19.8h, v23.8h
+ add v20.8h, v20.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v23.8h, v26.8h, v5.h[5]
+ sqrdmulh v24.8h, v28.8h, v5.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v10.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v10.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v11.8h, v8.h[2]
+ sqdmulh v26.8h, v12.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v11.8h, v25.8h, v8.h[0]
+ mls v12.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v18.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v18.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v19.8h, v8.h[2]
+ sqdmulh v26.8h, v20.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v19.8h, v25.8h, v8.h[0]
+ mls v20.8h, v26.8h, v8.h[0]
+ sub v26.8h, v9.8h, v17.8h
+ sub v28.8h, v10.8h, v18.8h
+ add v9.8h, v9.8h, v17.8h
+ add v10.8h, v10.8h, v18.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v17.8h, v26.8h, v5.h[6]
+ sqrdmulh v18.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v17.8h, v17.8h, v25.8h
+ sub v18.8h, v18.8h, v27.8h
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ sub v26.8h, v11.8h, v19.8h
+ sub v28.8h, v12.8h, v20.8h
+ add v11.8h, v11.8h, v19.8h
+ add v12.8h, v12.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v19.8h, v26.8h, v5.h[6]
+ sqrdmulh v20.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v19.8h, v19.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v13.8h, v21.8h
+ sub v28.8h, v14.8h, v22.8h
+ add v13.8h, v13.8h, v21.8h
+ add v14.8h, v14.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v21.8h, v26.8h, v5.h[6]
+ sqrdmulh v22.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v21.8h, v21.8h, v25.8h
+ sub v22.8h, v22.8h, v27.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v15.8h, v23.8h
+ sub v28.8h, v16.8h, v24.8h
+ add v15.8h, v15.8h, v23.8h
+ add v16.8h, v16.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v23.8h, v26.8h, v5.h[6]
+ sqrdmulh v24.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v25.8h, v9.8h, v7.h[7]
+ mul v26.8h, v10.8h, v7.h[7]
+ sqrdmulh v9.8h, v9.8h, v5.h[7]
+ sqrdmulh v10.8h, v10.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v9.8h, v9.8h, v25.8h
+ sub v10.8h, v10.8h, v26.8h
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v25.8h, v11.8h, v7.h[7]
+ mul v26.8h, v12.8h, v7.h[7]
+ sqrdmulh v11.8h, v11.8h, v5.h[7]
+ sqrdmulh v12.8h, v12.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v11.8h, v11.8h, v25.8h
+ sub v12.8h, v12.8h, v26.8h
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v25.8h, v13.8h, v7.h[7]
+ mul v26.8h, v14.8h, v7.h[7]
+ sqrdmulh v13.8h, v13.8h, v5.h[7]
+ sqrdmulh v14.8h, v14.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v13.8h, v13.8h, v25.8h
+ sub v14.8h, v14.8h, v26.8h
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v25.8h, v15.8h, v7.h[7]
+ mul v26.8h, v16.8h, v7.h[7]
+ sqrdmulh v15.8h, v15.8h, v5.h[7]
+ sqrdmulh v16.8h, v16.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v15.8h, v15.8h, v25.8h
+ sub v16.8h, v16.8h, v26.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mul v25.8h, v17.8h, v7.h[7]
+ mul v26.8h, v18.8h, v7.h[7]
+ sqrdmulh v17.8h, v17.8h, v5.h[7]
+ sqrdmulh v18.8h, v18.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v17.8h, v17.8h, v25.8h
+ sub v18.8h, v18.8h, v26.8h
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ mul v25.8h, v19.8h, v7.h[7]
+ mul v26.8h, v20.8h, v7.h[7]
+ sqrdmulh v19.8h, v19.8h, v5.h[7]
+ sqrdmulh v20.8h, v20.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v19.8h, v19.8h, v25.8h
+ sub v20.8h, v20.8h, v26.8h
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mul v25.8h, v21.8h, v7.h[7]
+ mul v26.8h, v22.8h, v7.h[7]
+ sqrdmulh v21.8h, v21.8h, v5.h[7]
+ sqrdmulh v22.8h, v22.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v21.8h, v21.8h, v25.8h
+ sub v22.8h, v22.8h, v26.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v25.8h, v23.8h, v7.h[7]
+ mul v26.8h, v24.8h, v7.h[7]
+ sqrdmulh v23.8h, v23.8h, v5.h[7]
+ sqrdmulh v24.8h, v24.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v26.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ str q9, [x0]
+ str q10, [x0, #32]
+ str q11, [x0, #64]
+ str q12, [x0, #96]
+ str q13, [x0, #128]
+ str q14, [x0, #160]
+ str q15, [x0, #192]
+ str q16, [x0, #224]
+ str q17, [x1]
+ str q18, [x1, #32]
+ str q19, [x1, #64]
+ str q20, [x1, #96]
+ str q21, [x1, #128]
+ str q22, [x1, #160]
+ str q23, [x1, #192]
+ str q24, [x1, #224]
+ ldr q9, [x0, #16]
+ ldr q10, [x0, #48]
+ ldr q11, [x0, #80]
+ ldr q12, [x0, #112]
+ ldr q13, [x0, #144]
+ ldr q14, [x0, #176]
+ ldr q15, [x0, #208]
+ ldr q16, [x0, #240]
+ ldr q17, [x1, #16]
+ ldr q18, [x1, #48]
+ ldr q19, [x1, #80]
+ ldr q20, [x1, #112]
+ ldr q21, [x1, #144]
+ ldr q22, [x1, #176]
+ ldr q23, [x1, #208]
+ ldr q24, [x1, #240]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v6.h[0]
+ mul v27.8h, v28.8h, v6.h[1]
+ sqrdmulh v10.8h, v26.8h, v4.h[0]
+ sqrdmulh v12.8h, v28.8h, v4.h[1]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v10.8h, v10.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v6.h[2]
+ mul v27.8h, v28.8h, v6.h[3]
+ sqrdmulh v14.8h, v26.8h, v4.h[2]
+ sqrdmulh v16.8h, v28.8h, v4.h[3]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v14.8h, v14.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v6.h[4]
+ mul v27.8h, v28.8h, v6.h[5]
+ sqrdmulh v18.8h, v26.8h, v4.h[4]
+ sqrdmulh v20.8h, v28.8h, v4.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v18.8h, v18.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v6.h[6]
+ mul v27.8h, v28.8h, v6.h[7]
+ sqrdmulh v22.8h, v26.8h, v4.h[6]
+ sqrdmulh v24.8h, v28.8h, v4.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v22.8h, v22.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v11.8h
+ sub v28.8h, v10.8h, v12.8h
+ add v9.8h, v9.8h, v11.8h
+ add v10.8h, v10.8h, v12.8h
+ mul v25.8h, v26.8h, v7.h[0]
+ mul v27.8h, v28.8h, v7.h[0]
+ sqrdmulh v11.8h, v26.8h, v5.h[0]
+ sqrdmulh v12.8h, v28.8h, v5.h[0]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v11.8h, v11.8h, v25.8h
+ sub v12.8h, v12.8h, v27.8h
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v15.8h
+ sub v28.8h, v14.8h, v16.8h
+ add v13.8h, v13.8h, v15.8h
+ add v14.8h, v14.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[1]
+ mul v27.8h, v28.8h, v7.h[1]
+ sqrdmulh v15.8h, v26.8h, v5.h[1]
+ sqrdmulh v16.8h, v28.8h, v5.h[1]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v15.8h, v15.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v19.8h
+ sub v28.8h, v18.8h, v20.8h
+ add v17.8h, v17.8h, v19.8h
+ add v18.8h, v18.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[2]
+ mul v27.8h, v28.8h, v7.h[2]
+ sqrdmulh v19.8h, v26.8h, v5.h[2]
+ sqrdmulh v20.8h, v28.8h, v5.h[2]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v19.8h, v19.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v23.8h
+ sub v28.8h, v22.8h, v24.8h
+ add v21.8h, v21.8h, v23.8h
+ add v22.8h, v22.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[3]
+ mul v27.8h, v28.8h, v7.h[3]
+ sqrdmulh v23.8h, v26.8h, v5.h[3]
+ sqrdmulh v24.8h, v28.8h, v5.h[3]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v13.8h
+ sub v28.8h, v10.8h, v14.8h
+ add v9.8h, v9.8h, v13.8h
+ add v10.8h, v10.8h, v14.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v13.8h, v26.8h, v5.h[4]
+ sqrdmulh v14.8h, v28.8h, v5.h[4]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v13.8h, v13.8h, v25.8h
+ sub v14.8h, v14.8h, v27.8h
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ sub v26.8h, v11.8h, v15.8h
+ sub v28.8h, v12.8h, v16.8h
+ add v11.8h, v11.8h, v15.8h
+ add v12.8h, v12.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v15.8h, v26.8h, v5.h[4]
+ sqrdmulh v16.8h, v28.8h, v5.h[4]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v15.8h, v15.8h, v25.8h
+ sub v16.8h, v16.8h, v27.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v21.8h
+ sub v28.8h, v18.8h, v22.8h
+ add v17.8h, v17.8h, v21.8h
+ add v18.8h, v18.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v21.8h, v26.8h, v5.h[5]
+ sqrdmulh v22.8h, v28.8h, v5.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v21.8h, v21.8h, v25.8h
+ sub v22.8h, v22.8h, v27.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v19.8h, v23.8h
+ sub v28.8h, v20.8h, v24.8h
+ add v19.8h, v19.8h, v23.8h
+ add v20.8h, v20.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v23.8h, v26.8h, v5.h[5]
+ sqrdmulh v24.8h, v28.8h, v5.h[5]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v10.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v10.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v11.8h, v8.h[2]
+ sqdmulh v26.8h, v12.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v11.8h, v25.8h, v8.h[0]
+ mls v12.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v18.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v18.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v19.8h, v8.h[2]
+ sqdmulh v26.8h, v20.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v19.8h, v25.8h, v8.h[0]
+ mls v20.8h, v26.8h, v8.h[0]
+ sub v26.8h, v9.8h, v17.8h
+ sub v28.8h, v10.8h, v18.8h
+ add v9.8h, v9.8h, v17.8h
+ add v10.8h, v10.8h, v18.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v17.8h, v26.8h, v5.h[6]
+ sqrdmulh v18.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v17.8h, v17.8h, v25.8h
+ sub v18.8h, v18.8h, v27.8h
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ sub v26.8h, v11.8h, v19.8h
+ sub v28.8h, v12.8h, v20.8h
+ add v11.8h, v11.8h, v19.8h
+ add v12.8h, v12.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v19.8h, v26.8h, v5.h[6]
+ sqrdmulh v20.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v19.8h, v19.8h, v25.8h
+ sub v20.8h, v20.8h, v27.8h
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v13.8h, v21.8h
+ sub v28.8h, v14.8h, v22.8h
+ add v13.8h, v13.8h, v21.8h
+ add v14.8h, v14.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v21.8h, v26.8h, v5.h[6]
+ sqrdmulh v22.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v21.8h, v21.8h, v25.8h
+ sub v22.8h, v22.8h, v27.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v15.8h, v23.8h
+ sub v28.8h, v16.8h, v24.8h
+ add v15.8h, v15.8h, v23.8h
+ add v16.8h, v16.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v23.8h, v26.8h, v5.h[6]
+ sqrdmulh v24.8h, v28.8h, v5.h[6]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v27.8h, v27.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v27.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v25.8h, v9.8h, v7.h[7]
+ mul v26.8h, v10.8h, v7.h[7]
+ sqrdmulh v9.8h, v9.8h, v5.h[7]
+ sqrdmulh v10.8h, v10.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v9.8h, v9.8h, v25.8h
+ sub v10.8h, v10.8h, v26.8h
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v25.8h, v11.8h, v7.h[7]
+ mul v26.8h, v12.8h, v7.h[7]
+ sqrdmulh v11.8h, v11.8h, v5.h[7]
+ sqrdmulh v12.8h, v12.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v11.8h, v11.8h, v25.8h
+ sub v12.8h, v12.8h, v26.8h
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v25.8h, v13.8h, v7.h[7]
+ mul v26.8h, v14.8h, v7.h[7]
+ sqrdmulh v13.8h, v13.8h, v5.h[7]
+ sqrdmulh v14.8h, v14.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v13.8h, v13.8h, v25.8h
+ sub v14.8h, v14.8h, v26.8h
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v25.8h, v15.8h, v7.h[7]
+ mul v26.8h, v16.8h, v7.h[7]
+ sqrdmulh v15.8h, v15.8h, v5.h[7]
+ sqrdmulh v16.8h, v16.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v15.8h, v15.8h, v25.8h
+ sub v16.8h, v16.8h, v26.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mul v25.8h, v17.8h, v7.h[7]
+ mul v26.8h, v18.8h, v7.h[7]
+ sqrdmulh v17.8h, v17.8h, v5.h[7]
+ sqrdmulh v18.8h, v18.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v17.8h, v17.8h, v25.8h
+ sub v18.8h, v18.8h, v26.8h
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ mul v25.8h, v19.8h, v7.h[7]
+ mul v26.8h, v20.8h, v7.h[7]
+ sqrdmulh v19.8h, v19.8h, v5.h[7]
+ sqrdmulh v20.8h, v20.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v19.8h, v19.8h, v25.8h
+ sub v20.8h, v20.8h, v26.8h
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mul v25.8h, v21.8h, v7.h[7]
+ mul v26.8h, v22.8h, v7.h[7]
+ sqrdmulh v21.8h, v21.8h, v5.h[7]
+ sqrdmulh v22.8h, v22.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v21.8h, v21.8h, v25.8h
+ sub v22.8h, v22.8h, v26.8h
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v25.8h, v23.8h, v7.h[7]
+ mul v26.8h, v24.8h, v7.h[7]
+ sqrdmulh v23.8h, v23.8h, v5.h[7]
+ sqrdmulh v24.8h, v24.8h, v5.h[7]
+ sqrdmulh v25.8h, v25.8h, v8.h[0]
+ sqrdmulh v26.8h, v26.8h, v8.h[0]
+ sub v23.8h, v23.8h, v25.8h
+ sub v24.8h, v24.8h, v26.8h
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ str q9, [x0, #16]
+ str q10, [x0, #48]
+ str q11, [x0, #80]
+ str q12, [x0, #112]
+ str q13, [x0, #144]
+ str q14, [x0, #176]
+ str q15, [x0, #208]
+ str q16, [x0, #240]
+ str q17, [x1, #16]
+ str q18, [x1, #48]
+ str q19, [x1, #80]
+ str q20, [x1, #112]
+ str q21, [x1, #144]
+ str q22, [x1, #176]
+ str q23, [x1, #208]
+ str q24, [x1, #240]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ IF :LNOT::DEF:WOLFSSL_AARCH64_NO_SQRDMLSH
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_ntt_sqrdmlsh
+mlkem_ntt_sqrdmlsh PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x2, L_mlkem_aarch64_zetas
+ add x2, x2, L_mlkem_aarch64_zetas
+ adrp x3, L_mlkem_aarch64_zetas_qinv
+ add x3, x3, L_mlkem_aarch64_zetas_qinv
+ adrp x4, L_mlkem_aarch64_consts
+ add x4, x4, L_mlkem_aarch64_consts
+ add x1, x0, #0x100
+ ldr q4, [x4]
+ ldr q5, [x0]
+ ldr q6, [x0, #32]
+ ldr q7, [x0, #64]
+ ldr q8, [x0, #96]
+ ldr q9, [x0, #128]
+ ldr q10, [x0, #160]
+ ldr q11, [x0, #192]
+ ldr q12, [x0, #224]
+ ldr q13, [x1]
+ ldr q14, [x1, #32]
+ ldr q15, [x1, #64]
+ ldr q16, [x1, #96]
+ ldr q17, [x1, #128]
+ ldr q18, [x1, #160]
+ ldr q19, [x1, #192]
+ ldr q20, [x1, #224]
+ ldr q0, [x2]
+ ldr q1, [x3]
+ mul v29.8h, v13.8h, v1.h[1]
+ mul v30.8h, v14.8h, v1.h[1]
+ sqrdmulh v21.8h, v13.8h, v0.h[1]
+ sqrdmulh v22.8h, v14.8h, v0.h[1]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v15.8h, v1.h[1]
+ mul v30.8h, v16.8h, v1.h[1]
+ sqrdmulh v23.8h, v15.8h, v0.h[1]
+ sqrdmulh v24.8h, v16.8h, v0.h[1]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[1]
+ mul v30.8h, v18.8h, v1.h[1]
+ sqrdmulh v25.8h, v17.8h, v0.h[1]
+ sqrdmulh v26.8h, v18.8h, v0.h[1]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[1]
+ mul v30.8h, v20.8h, v1.h[1]
+ sqrdmulh v27.8h, v19.8h, v0.h[1]
+ sqrdmulh v28.8h, v20.8h, v0.h[1]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v13.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v14.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v15.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v16.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v9.8h, v25.8h
+ add v9.8h, v9.8h, v25.8h
+ sub v18.8h, v10.8h, v26.8h
+ add v10.8h, v10.8h, v26.8h
+ sub v19.8h, v11.8h, v27.8h
+ add v11.8h, v11.8h, v27.8h
+ sub v20.8h, v12.8h, v28.8h
+ add v12.8h, v12.8h, v28.8h
+ mul v29.8h, v9.8h, v1.h[2]
+ mul v30.8h, v10.8h, v1.h[2]
+ sqrdmulh v21.8h, v9.8h, v0.h[2]
+ sqrdmulh v22.8h, v10.8h, v0.h[2]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[2]
+ sqrdmulh v23.8h, v11.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[2]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[3]
+ mul v30.8h, v18.8h, v1.h[3]
+ sqrdmulh v25.8h, v17.8h, v0.h[3]
+ sqrdmulh v26.8h, v18.8h, v0.h[3]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[3]
+ mul v30.8h, v20.8h, v1.h[3]
+ sqrdmulh v27.8h, v19.8h, v0.h[3]
+ sqrdmulh v28.8h, v20.8h, v0.h[3]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v9.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v10.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v12.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v18.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v15.8h, v27.8h
+ add v15.8h, v15.8h, v27.8h
+ sub v20.8h, v16.8h, v28.8h
+ add v16.8h, v16.8h, v28.8h
+ mul v29.8h, v7.8h, v1.h[4]
+ mul v30.8h, v8.8h, v1.h[4]
+ sqrdmulh v21.8h, v7.8h, v0.h[4]
+ sqrdmulh v22.8h, v8.8h, v0.h[4]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[5]
+ mul v30.8h, v12.8h, v1.h[5]
+ sqrdmulh v23.8h, v11.8h, v0.h[5]
+ sqrdmulh v24.8h, v12.8h, v0.h[5]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v15.8h, v1.h[6]
+ mul v30.8h, v16.8h, v1.h[6]
+ sqrdmulh v25.8h, v15.8h, v0.h[6]
+ sqrdmulh v26.8h, v16.8h, v0.h[6]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[7]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v19.8h, v0.h[7]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v7.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v10.8h, v24.8h
+ add v10.8h, v10.8h, v24.8h
+ sub v15.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v18.8h, v28.8h
+ add v18.8h, v18.8h, v28.8h
+ ldr q0, [x2, #16]
+ ldr q1, [x3, #16]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ str q5, [x0]
+ str q6, [x0, #32]
+ str q7, [x0, #64]
+ str q8, [x0, #96]
+ str q9, [x0, #128]
+ str q10, [x0, #160]
+ str q11, [x0, #192]
+ str q12, [x0, #224]
+ str q13, [x1]
+ str q14, [x1, #32]
+ str q15, [x1, #64]
+ str q16, [x1, #96]
+ str q17, [x1, #128]
+ str q18, [x1, #160]
+ str q19, [x1, #192]
+ str q20, [x1, #224]
+ ldr q5, [x0, #16]
+ ldr q6, [x0, #48]
+ ldr q7, [x0, #80]
+ ldr q8, [x0, #112]
+ ldr q9, [x0, #144]
+ ldr q10, [x0, #176]
+ ldr q11, [x0, #208]
+ ldr q12, [x0, #240]
+ ldr q13, [x1, #16]
+ ldr q14, [x1, #48]
+ ldr q15, [x1, #80]
+ ldr q16, [x1, #112]
+ ldr q17, [x1, #144]
+ ldr q18, [x1, #176]
+ ldr q19, [x1, #208]
+ ldr q20, [x1, #240]
+ ldr q0, [x2]
+ ldr q1, [x3]
+ mul v29.8h, v13.8h, v1.h[1]
+ mul v30.8h, v14.8h, v1.h[1]
+ sqrdmulh v21.8h, v13.8h, v0.h[1]
+ sqrdmulh v22.8h, v14.8h, v0.h[1]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v15.8h, v1.h[1]
+ mul v30.8h, v16.8h, v1.h[1]
+ sqrdmulh v23.8h, v15.8h, v0.h[1]
+ sqrdmulh v24.8h, v16.8h, v0.h[1]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[1]
+ mul v30.8h, v18.8h, v1.h[1]
+ sqrdmulh v25.8h, v17.8h, v0.h[1]
+ sqrdmulh v26.8h, v18.8h, v0.h[1]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[1]
+ mul v30.8h, v20.8h, v1.h[1]
+ sqrdmulh v27.8h, v19.8h, v0.h[1]
+ sqrdmulh v28.8h, v20.8h, v0.h[1]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v13.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v14.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v15.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v16.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v9.8h, v25.8h
+ add v9.8h, v9.8h, v25.8h
+ sub v18.8h, v10.8h, v26.8h
+ add v10.8h, v10.8h, v26.8h
+ sub v19.8h, v11.8h, v27.8h
+ add v11.8h, v11.8h, v27.8h
+ sub v20.8h, v12.8h, v28.8h
+ add v12.8h, v12.8h, v28.8h
+ mul v29.8h, v9.8h, v1.h[2]
+ mul v30.8h, v10.8h, v1.h[2]
+ sqrdmulh v21.8h, v9.8h, v0.h[2]
+ sqrdmulh v22.8h, v10.8h, v0.h[2]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[2]
+ sqrdmulh v23.8h, v11.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[2]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v17.8h, v1.h[3]
+ mul v30.8h, v18.8h, v1.h[3]
+ sqrdmulh v25.8h, v17.8h, v0.h[3]
+ sqrdmulh v26.8h, v18.8h, v0.h[3]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[3]
+ mul v30.8h, v20.8h, v1.h[3]
+ sqrdmulh v27.8h, v19.8h, v0.h[3]
+ sqrdmulh v28.8h, v20.8h, v0.h[3]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v9.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v10.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v7.8h, v23.8h
+ add v7.8h, v7.8h, v23.8h
+ sub v12.8h, v8.8h, v24.8h
+ add v8.8h, v8.8h, v24.8h
+ sub v17.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v18.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v15.8h, v27.8h
+ add v15.8h, v15.8h, v27.8h
+ sub v20.8h, v16.8h, v28.8h
+ add v16.8h, v16.8h, v28.8h
+ mul v29.8h, v7.8h, v1.h[4]
+ mul v30.8h, v8.8h, v1.h[4]
+ sqrdmulh v21.8h, v7.8h, v0.h[4]
+ sqrdmulh v22.8h, v8.8h, v0.h[4]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v11.8h, v1.h[5]
+ mul v30.8h, v12.8h, v1.h[5]
+ sqrdmulh v23.8h, v11.8h, v0.h[5]
+ sqrdmulh v24.8h, v12.8h, v0.h[5]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v15.8h, v1.h[6]
+ mul v30.8h, v16.8h, v1.h[6]
+ sqrdmulh v25.8h, v15.8h, v0.h[6]
+ sqrdmulh v26.8h, v16.8h, v0.h[6]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v19.8h, v1.h[7]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v19.8h, v0.h[7]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v7.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v6.8h, v22.8h
+ add v6.8h, v6.8h, v22.8h
+ sub v11.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v10.8h, v24.8h
+ add v10.8h, v10.8h, v24.8h
+ sub v15.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v14.8h, v26.8h
+ add v14.8h, v14.8h, v26.8h
+ sub v19.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v18.8h, v28.8h
+ add v18.8h, v18.8h, v28.8h
+ ldr q0, [x2, #16]
+ ldr q1, [x3, #16]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ str q5, [x0, #16]
+ str q6, [x0, #48]
+ str q7, [x0, #80]
+ str q8, [x0, #112]
+ str q9, [x0, #144]
+ str q10, [x0, #176]
+ str q11, [x0, #208]
+ str q12, [x0, #240]
+ str q13, [x1, #16]
+ str q14, [x1, #48]
+ str q15, [x1, #80]
+ str q16, [x1, #112]
+ str q17, [x1, #144]
+ str q18, [x1, #176]
+ str q19, [x1, #208]
+ str q20, [x1, #240]
+ ldp q5, q6, [x0]
+ ldp q7, q8, [x0, #32]
+ ldp q9, q10, [x0, #64]
+ ldp q11, q12, [x0, #96]
+ ldp q13, q14, [x0, #128]
+ ldp q15, q16, [x0, #160]
+ ldp q17, q18, [x0, #192]
+ ldp q19, q20, [x0, #224]
+ ldr q0, [x2, #32]
+ ldr q1, [x3, #32]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #64]
+ ldr q2, [x2, #80]
+ ldr q1, [x3, #64]
+ ldr q3, [x3, #80]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ trn2 v8.2d, v30.2d, v8.2d
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #96]
+ ldr q2, [x2, #112]
+ ldr q1, [x3, #96]
+ ldr q3, [x3, #112]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ trn2 v12.2d, v30.2d, v12.2d
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #128]
+ ldr q2, [x2, #144]
+ ldr q1, [x3, #128]
+ ldr q3, [x3, #144]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ trn2 v16.2d, v30.2d, v16.2d
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #160]
+ ldr q2, [x2, #176]
+ ldr q1, [x3, #160]
+ ldr q3, [x3, #176]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ trn2 v20.2d, v30.2d, v20.2d
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #320]
+ ldr q2, [x2, #336]
+ ldr q1, [x3, #320]
+ ldr q3, [x3, #336]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ trn2 v8.4s, v30.4s, v8.4s
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #352]
+ ldr q2, [x2, #368]
+ ldr q1, [x3, #352]
+ ldr q3, [x3, #368]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ trn2 v12.4s, v30.4s, v12.4s
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #384]
+ ldr q2, [x2, #400]
+ ldr q1, [x3, #384]
+ ldr q3, [x3, #400]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ trn2 v16.4s, v30.4s, v16.4s
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #416]
+ ldr q2, [x2, #432]
+ ldr q1, [x3, #416]
+ ldr q3, [x3, #432]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ trn2 v20.4s, v30.4s, v20.4s
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ sqdmulh v21.8h, v5.8h, v4.h[2]
+ sqdmulh v22.8h, v6.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v5.8h, v21.8h, v4.h[0]
+ mls v6.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v7.8h, v4.h[2]
+ sqdmulh v22.8h, v8.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v7.8h, v21.8h, v4.h[0]
+ mls v8.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v9.8h, v4.h[2]
+ sqdmulh v22.8h, v10.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v9.8h, v21.8h, v4.h[0]
+ mls v10.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v11.8h, v4.h[2]
+ sqdmulh v22.8h, v12.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v11.8h, v21.8h, v4.h[0]
+ mls v12.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v13.8h, v4.h[2]
+ sqdmulh v22.8h, v14.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v13.8h, v21.8h, v4.h[0]
+ mls v14.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v15.8h, v4.h[2]
+ sqdmulh v22.8h, v16.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v15.8h, v21.8h, v4.h[0]
+ mls v16.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v17.8h, v4.h[2]
+ sqdmulh v22.8h, v18.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v17.8h, v21.8h, v4.h[0]
+ mls v18.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v19.8h, v4.h[2]
+ sqdmulh v22.8h, v20.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v19.8h, v21.8h, v4.h[0]
+ mls v20.8h, v22.8h, v4.h[0]
+ mov v29.16b, v5.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ mov v29.16b, v5.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ mov v29.16b, v7.16b
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v8.4s, v29.4s, v8.4s
+ mov v29.16b, v7.16b
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v8.2d, v29.2d, v8.2d
+ mov v29.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ mov v29.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ mov v29.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v29.4s, v12.4s
+ mov v29.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v29.2d, v12.2d
+ mov v29.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ mov v29.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ mov v29.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v29.4s, v16.4s
+ mov v29.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v29.2d, v16.2d
+ mov v29.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ mov v29.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ mov v29.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v29.4s, v20.4s
+ mov v29.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v29.2d, v20.2d
+ stp q5, q6, [x0]
+ stp q7, q8, [x0, #32]
+ stp q9, q10, [x0, #64]
+ stp q11, q12, [x0, #96]
+ stp q13, q14, [x0, #128]
+ stp q15, q16, [x0, #160]
+ stp q17, q18, [x0, #192]
+ stp q19, q20, [x0, #224]
+ ldp q5, q6, [x1]
+ ldp q7, q8, [x1, #32]
+ ldp q9, q10, [x1, #64]
+ ldp q11, q12, [x1, #96]
+ ldp q13, q14, [x1, #128]
+ ldp q15, q16, [x1, #160]
+ ldp q17, q18, [x1, #192]
+ ldp q19, q20, [x1, #224]
+ ldr q0, [x2, #48]
+ ldr q1, [x3, #48]
+ mul v29.8h, v6.8h, v1.h[0]
+ mul v30.8h, v8.8h, v1.h[1]
+ sqrdmulh v21.8h, v6.8h, v0.h[0]
+ sqrdmulh v22.8h, v8.8h, v0.h[1]
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v29.8h, v10.8h, v1.h[2]
+ mul v30.8h, v12.8h, v1.h[3]
+ sqrdmulh v23.8h, v10.8h, v0.h[2]
+ sqrdmulh v24.8h, v12.8h, v0.h[3]
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v29.8h, v14.8h, v1.h[4]
+ mul v30.8h, v16.8h, v1.h[5]
+ sqrdmulh v25.8h, v14.8h, v0.h[4]
+ sqrdmulh v26.8h, v16.8h, v0.h[5]
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ mul v29.8h, v18.8h, v1.h[6]
+ mul v30.8h, v20.8h, v1.h[7]
+ sqrdmulh v27.8h, v18.8h, v0.h[6]
+ sqrdmulh v28.8h, v20.8h, v0.h[7]
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #192]
+ ldr q2, [x2, #208]
+ ldr q1, [x3, #192]
+ ldr q3, [x3, #208]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ trn2 v8.2d, v30.2d, v8.2d
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #224]
+ ldr q2, [x2, #240]
+ ldr q1, [x3, #224]
+ ldr q3, [x3, #240]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ trn2 v12.2d, v30.2d, v12.2d
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #256]
+ ldr q2, [x2, #272]
+ ldr q1, [x3, #256]
+ ldr q3, [x3, #272]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ trn2 v16.2d, v30.2d, v16.2d
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #288]
+ ldr q2, [x2, #304]
+ ldr q1, [x3, #288]
+ ldr q3, [x3, #304]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ trn2 v20.2d, v30.2d, v20.2d
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ ldr q0, [x2, #448]
+ ldr q2, [x2, #464]
+ ldr q1, [x3, #448]
+ ldr q3, [x3, #464]
+ mov v29.16b, v5.16b
+ mov v30.16b, v7.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ trn2 v8.4s, v30.4s, v8.4s
+ mul v29.8h, v6.8h, v1.8h
+ mul v30.8h, v8.8h, v3.8h
+ sqrdmulh v21.8h, v6.8h, v0.8h
+ sqrdmulh v22.8h, v8.8h, v2.8h
+ sqrdmlsh v21.8h, v29.8h, v4.h[0]
+ sqrdmlsh v22.8h, v30.8h, v4.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ ldr q0, [x2, #480]
+ ldr q2, [x2, #496]
+ ldr q1, [x3, #480]
+ ldr q3, [x3, #496]
+ mov v29.16b, v9.16b
+ mov v30.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ trn2 v12.4s, v30.4s, v12.4s
+ mul v29.8h, v10.8h, v1.8h
+ mul v30.8h, v12.8h, v3.8h
+ sqrdmulh v23.8h, v10.8h, v0.8h
+ sqrdmulh v24.8h, v12.8h, v2.8h
+ sqrdmlsh v23.8h, v29.8h, v4.h[0]
+ sqrdmlsh v24.8h, v30.8h, v4.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #512]
+ ldr q2, [x2, #528]
+ ldr q1, [x3, #512]
+ ldr q3, [x3, #528]
+ mov v29.16b, v13.16b
+ mov v30.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ trn2 v16.4s, v30.4s, v16.4s
+ mul v29.8h, v14.8h, v1.8h
+ mul v30.8h, v16.8h, v3.8h
+ sqrdmulh v25.8h, v14.8h, v0.8h
+ sqrdmulh v26.8h, v16.8h, v2.8h
+ sqrdmlsh v25.8h, v29.8h, v4.h[0]
+ sqrdmlsh v26.8h, v30.8h, v4.h[0]
+ sshr v25.8h, v25.8h, #1
+ sshr v26.8h, v26.8h, #1
+ ldr q0, [x2, #544]
+ ldr q2, [x2, #560]
+ ldr q1, [x3, #544]
+ ldr q3, [x3, #560]
+ mov v29.16b, v17.16b
+ mov v30.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ trn2 v20.4s, v30.4s, v20.4s
+ mul v29.8h, v18.8h, v1.8h
+ mul v30.8h, v20.8h, v3.8h
+ sqrdmulh v27.8h, v18.8h, v0.8h
+ sqrdmulh v28.8h, v20.8h, v2.8h
+ sqrdmlsh v27.8h, v29.8h, v4.h[0]
+ sqrdmlsh v28.8h, v30.8h, v4.h[0]
+ sshr v27.8h, v27.8h, #1
+ sshr v28.8h, v28.8h, #1
+ sub v6.8h, v5.8h, v21.8h
+ add v5.8h, v5.8h, v21.8h
+ sub v8.8h, v7.8h, v22.8h
+ add v7.8h, v7.8h, v22.8h
+ sub v10.8h, v9.8h, v23.8h
+ add v9.8h, v9.8h, v23.8h
+ sub v12.8h, v11.8h, v24.8h
+ add v11.8h, v11.8h, v24.8h
+ sub v14.8h, v13.8h, v25.8h
+ add v13.8h, v13.8h, v25.8h
+ sub v16.8h, v15.8h, v26.8h
+ add v15.8h, v15.8h, v26.8h
+ sub v18.8h, v17.8h, v27.8h
+ add v17.8h, v17.8h, v27.8h
+ sub v20.8h, v19.8h, v28.8h
+ add v19.8h, v19.8h, v28.8h
+ sqdmulh v21.8h, v5.8h, v4.h[2]
+ sqdmulh v22.8h, v6.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v5.8h, v21.8h, v4.h[0]
+ mls v6.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v7.8h, v4.h[2]
+ sqdmulh v22.8h, v8.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v7.8h, v21.8h, v4.h[0]
+ mls v8.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v9.8h, v4.h[2]
+ sqdmulh v22.8h, v10.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v9.8h, v21.8h, v4.h[0]
+ mls v10.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v11.8h, v4.h[2]
+ sqdmulh v22.8h, v12.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v11.8h, v21.8h, v4.h[0]
+ mls v12.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v13.8h, v4.h[2]
+ sqdmulh v22.8h, v14.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v13.8h, v21.8h, v4.h[0]
+ mls v14.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v15.8h, v4.h[2]
+ sqdmulh v22.8h, v16.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v15.8h, v21.8h, v4.h[0]
+ mls v16.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v17.8h, v4.h[2]
+ sqdmulh v22.8h, v18.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v17.8h, v21.8h, v4.h[0]
+ mls v18.8h, v22.8h, v4.h[0]
+ sqdmulh v21.8h, v19.8h, v4.h[2]
+ sqdmulh v22.8h, v20.8h, v4.h[2]
+ sshr v21.8h, v21.8h, #11
+ sshr v22.8h, v22.8h, #11
+ mls v19.8h, v21.8h, v4.h[0]
+ mls v20.8h, v22.8h, v4.h[0]
+ mov v29.16b, v5.16b
+ trn1 v5.4s, v5.4s, v6.4s
+ trn2 v6.4s, v29.4s, v6.4s
+ mov v29.16b, v5.16b
+ trn1 v5.2d, v5.2d, v6.2d
+ trn2 v6.2d, v29.2d, v6.2d
+ mov v29.16b, v7.16b
+ trn1 v7.4s, v7.4s, v8.4s
+ trn2 v8.4s, v29.4s, v8.4s
+ mov v29.16b, v7.16b
+ trn1 v7.2d, v7.2d, v8.2d
+ trn2 v8.2d, v29.2d, v8.2d
+ mov v29.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v29.4s, v10.4s
+ mov v29.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v29.2d, v10.2d
+ mov v29.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v29.4s, v12.4s
+ mov v29.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v29.2d, v12.2d
+ mov v29.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v29.4s, v14.4s
+ mov v29.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v29.2d, v14.2d
+ mov v29.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v29.4s, v16.4s
+ mov v29.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v29.2d, v16.2d
+ mov v29.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v29.4s, v18.4s
+ mov v29.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v29.2d, v18.2d
+ mov v29.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v29.4s, v20.4s
+ mov v29.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v29.2d, v20.2d
+ stp q5, q6, [x1]
+ stp q7, q8, [x1, #32]
+ stp q9, q10, [x1, #64]
+ stp q11, q12, [x1, #96]
+ stp q13, q14, [x1, #128]
+ stp q15, q16, [x1, #160]
+ stp q17, q18, [x1, #192]
+ stp q19, q20, [x1, #224]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_invntt_sqrdmlsh
+mlkem_invntt_sqrdmlsh PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x2, L_mlkem_aarch64_zetas_inv
+ add x2, x2, L_mlkem_aarch64_zetas_inv
+ adrp x3, L_mlkem_aarch64_zetas_inv_qinv
+ add x3, x3, L_mlkem_aarch64_zetas_inv_qinv
+ adrp x4, L_mlkem_aarch64_consts
+ add x4, x4, L_mlkem_aarch64_consts
+ add x1, x0, #0x100
+ ldr q8, [x4]
+ ldp q9, q10, [x0]
+ ldp q11, q12, [x0, #32]
+ ldp q13, q14, [x0, #64]
+ ldp q15, q16, [x0, #96]
+ ldp q17, q18, [x0, #128]
+ ldp q19, q20, [x0, #160]
+ ldp q21, q22, [x0, #192]
+ ldp q23, q24, [x0, #224]
+ mov v25.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ mov v25.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ mov v25.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v25.2d, v12.2d
+ mov v25.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v25.4s, v12.4s
+ mov v25.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ mov v25.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ mov v25.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v25.2d, v16.2d
+ mov v25.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v25.4s, v16.4s
+ mov v25.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ mov v25.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ mov v25.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v25.2d, v20.2d
+ mov v25.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v25.4s, v20.4s
+ mov v25.16b, v21.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ mov v25.16b, v21.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ mov v25.16b, v23.16b
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v24.2d, v25.2d, v24.2d
+ mov v25.16b, v23.16b
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v24.4s, v25.4s, v24.4s
+ ldr q0, [x2]
+ ldr q1, [x2, #16]
+ ldr q2, [x3]
+ ldr q3, [x3, #16]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #32]
+ ldr q1, [x2, #48]
+ ldr q2, [x3, #32]
+ ldr q3, [x3, #48]
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #64]
+ ldr q1, [x2, #80]
+ ldr q2, [x3, #64]
+ ldr q3, [x3, #80]
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #96]
+ ldr q1, [x2, #112]
+ ldr q2, [x3, #96]
+ ldr q3, [x3, #112]
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #256]
+ ldr q1, [x2, #272]
+ ldr q2, [x3, #256]
+ ldr q3, [x3, #272]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ trn2 v12.4s, v26.4s, v12.4s
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #288]
+ ldr q1, [x2, #304]
+ ldr q2, [x3, #288]
+ ldr q3, [x3, #304]
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ trn2 v16.4s, v26.4s, v16.4s
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #320]
+ ldr q1, [x2, #336]
+ ldr q2, [x3, #320]
+ ldr q3, [x3, #336]
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ trn2 v20.4s, v26.4s, v20.4s
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #352]
+ ldr q1, [x2, #368]
+ ldr q2, [x3, #352]
+ ldr q3, [x3, #368]
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ trn2 v24.4s, v26.4s, v24.4s
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #512]
+ ldr q2, [x3, #512]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ trn2 v12.2d, v26.2d, v12.2d
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.h[0]
+ mul v27.8h, v28.8h, v2.h[1]
+ sqrdmulh v10.8h, v26.8h, v0.h[0]
+ sqrdmulh v12.8h, v28.8h, v0.h[1]
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ trn2 v16.2d, v26.2d, v16.2d
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.h[2]
+ mul v27.8h, v28.8h, v2.h[3]
+ sqrdmulh v14.8h, v26.8h, v0.h[2]
+ sqrdmulh v16.8h, v28.8h, v0.h[3]
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ trn2 v20.2d, v26.2d, v20.2d
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.h[4]
+ mul v27.8h, v28.8h, v2.h[5]
+ sqrdmulh v18.8h, v26.8h, v0.h[4]
+ sqrdmulh v20.8h, v28.8h, v0.h[5]
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ trn2 v24.2d, v26.2d, v24.2d
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.h[6]
+ mul v27.8h, v28.8h, v2.h[7]
+ sqrdmulh v22.8h, v26.8h, v0.h[6]
+ sqrdmulh v24.8h, v28.8h, v0.h[7]
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v11.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v11.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v13.8h, v8.h[2]
+ sqdmulh v26.8h, v15.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v13.8h, v25.8h, v8.h[0]
+ mls v15.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v19.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v19.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v21.8h, v8.h[2]
+ sqdmulh v26.8h, v23.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v21.8h, v25.8h, v8.h[0]
+ mls v23.8h, v26.8h, v8.h[0]
+ stp q9, q10, [x0]
+ stp q11, q12, [x0, #32]
+ stp q13, q14, [x0, #64]
+ stp q15, q16, [x0, #96]
+ stp q17, q18, [x0, #128]
+ stp q19, q20, [x0, #160]
+ stp q21, q22, [x0, #192]
+ stp q23, q24, [x0, #224]
+ ldp q9, q10, [x1]
+ ldp q11, q12, [x1, #32]
+ ldp q13, q14, [x1, #64]
+ ldp q15, q16, [x1, #96]
+ ldp q17, q18, [x1, #128]
+ ldp q19, q20, [x1, #160]
+ ldp q21, q22, [x1, #192]
+ ldp q23, q24, [x1, #224]
+ mov v25.16b, v9.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ mov v25.16b, v9.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ mov v25.16b, v11.16b
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v12.2d, v25.2d, v12.2d
+ mov v25.16b, v11.16b
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v12.4s, v25.4s, v12.4s
+ mov v25.16b, v13.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ mov v25.16b, v13.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ mov v25.16b, v15.16b
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v16.2d, v25.2d, v16.2d
+ mov v25.16b, v15.16b
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v16.4s, v25.4s, v16.4s
+ mov v25.16b, v17.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ mov v25.16b, v17.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ mov v25.16b, v19.16b
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v20.2d, v25.2d, v20.2d
+ mov v25.16b, v19.16b
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v20.4s, v25.4s, v20.4s
+ mov v25.16b, v21.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ mov v25.16b, v21.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ mov v25.16b, v23.16b
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v24.2d, v25.2d, v24.2d
+ mov v25.16b, v23.16b
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v24.4s, v25.4s, v24.4s
+ ldr q0, [x2, #128]
+ ldr q1, [x2, #144]
+ ldr q2, [x3, #128]
+ ldr q3, [x3, #144]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #160]
+ ldr q1, [x2, #176]
+ ldr q2, [x3, #160]
+ ldr q3, [x3, #176]
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #192]
+ ldr q1, [x2, #208]
+ ldr q2, [x3, #192]
+ ldr q3, [x3, #208]
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #224]
+ ldr q1, [x2, #240]
+ ldr q2, [x3, #224]
+ ldr q3, [x3, #240]
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #384]
+ ldr q1, [x2, #400]
+ ldr q2, [x3, #384]
+ ldr q3, [x3, #400]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.4s, v9.4s, v10.4s
+ trn1 v11.4s, v11.4s, v12.4s
+ trn2 v10.4s, v25.4s, v10.4s
+ trn2 v12.4s, v26.4s, v12.4s
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v10.8h, v26.8h, v0.8h
+ sqrdmulh v12.8h, v28.8h, v1.8h
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ ldr q0, [x2, #416]
+ ldr q1, [x2, #432]
+ ldr q2, [x3, #416]
+ ldr q3, [x3, #432]
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.4s, v13.4s, v14.4s
+ trn1 v15.4s, v15.4s, v16.4s
+ trn2 v14.4s, v25.4s, v14.4s
+ trn2 v16.4s, v26.4s, v16.4s
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v14.8h, v26.8h, v0.8h
+ sqrdmulh v16.8h, v28.8h, v1.8h
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ ldr q0, [x2, #448]
+ ldr q1, [x2, #464]
+ ldr q2, [x3, #448]
+ ldr q3, [x3, #464]
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.4s, v17.4s, v18.4s
+ trn1 v19.4s, v19.4s, v20.4s
+ trn2 v18.4s, v25.4s, v18.4s
+ trn2 v20.4s, v26.4s, v20.4s
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v18.8h, v26.8h, v0.8h
+ sqrdmulh v20.8h, v28.8h, v1.8h
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ ldr q0, [x2, #480]
+ ldr q1, [x2, #496]
+ ldr q2, [x3, #480]
+ ldr q3, [x3, #496]
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.4s, v21.4s, v22.4s
+ trn1 v23.4s, v23.4s, v24.4s
+ trn2 v22.4s, v25.4s, v22.4s
+ trn2 v24.4s, v26.4s, v24.4s
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.8h
+ mul v27.8h, v28.8h, v3.8h
+ sqrdmulh v22.8h, v26.8h, v0.8h
+ sqrdmulh v24.8h, v28.8h, v1.8h
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ ldr q0, [x2, #528]
+ ldr q2, [x3, #528]
+ mov v25.16b, v9.16b
+ mov v26.16b, v11.16b
+ trn1 v9.2d, v9.2d, v10.2d
+ trn1 v11.2d, v11.2d, v12.2d
+ trn2 v10.2d, v25.2d, v10.2d
+ trn2 v12.2d, v26.2d, v12.2d
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v2.h[0]
+ mul v27.8h, v28.8h, v2.h[1]
+ sqrdmulh v10.8h, v26.8h, v0.h[0]
+ sqrdmulh v12.8h, v28.8h, v0.h[1]
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mov v25.16b, v13.16b
+ mov v26.16b, v15.16b
+ trn1 v13.2d, v13.2d, v14.2d
+ trn1 v15.2d, v15.2d, v16.2d
+ trn2 v14.2d, v25.2d, v14.2d
+ trn2 v16.2d, v26.2d, v16.2d
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v2.h[2]
+ mul v27.8h, v28.8h, v2.h[3]
+ sqrdmulh v14.8h, v26.8h, v0.h[2]
+ sqrdmulh v16.8h, v28.8h, v0.h[3]
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mov v25.16b, v17.16b
+ mov v26.16b, v19.16b
+ trn1 v17.2d, v17.2d, v18.2d
+ trn1 v19.2d, v19.2d, v20.2d
+ trn2 v18.2d, v25.2d, v18.2d
+ trn2 v20.2d, v26.2d, v20.2d
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v2.h[4]
+ mul v27.8h, v28.8h, v2.h[5]
+ sqrdmulh v18.8h, v26.8h, v0.h[4]
+ sqrdmulh v20.8h, v28.8h, v0.h[5]
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mov v25.16b, v21.16b
+ mov v26.16b, v23.16b
+ trn1 v21.2d, v21.2d, v22.2d
+ trn1 v23.2d, v23.2d, v24.2d
+ trn2 v22.2d, v25.2d, v22.2d
+ trn2 v24.2d, v26.2d, v24.2d
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v2.h[6]
+ mul v27.8h, v28.8h, v2.h[7]
+ sqrdmulh v22.8h, v26.8h, v0.h[6]
+ sqrdmulh v24.8h, v28.8h, v0.h[7]
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v11.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v11.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v13.8h, v8.h[2]
+ sqdmulh v26.8h, v15.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v13.8h, v25.8h, v8.h[0]
+ mls v15.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v19.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v19.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v21.8h, v8.h[2]
+ sqdmulh v26.8h, v23.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v21.8h, v25.8h, v8.h[0]
+ mls v23.8h, v26.8h, v8.h[0]
+ stp q9, q10, [x1]
+ stp q11, q12, [x1, #32]
+ stp q13, q14, [x1, #64]
+ stp q15, q16, [x1, #96]
+ stp q17, q18, [x1, #128]
+ stp q19, q20, [x1, #160]
+ stp q21, q22, [x1, #192]
+ stp q23, q24, [x1, #224]
+ ldr q4, [x2, #544]
+ ldr q5, [x2, #560]
+ ldr q6, [x3, #544]
+ ldr q7, [x3, #560]
+ ldr q9, [x0]
+ ldr q10, [x0, #32]
+ ldr q11, [x0, #64]
+ ldr q12, [x0, #96]
+ ldr q13, [x0, #128]
+ ldr q14, [x0, #160]
+ ldr q15, [x0, #192]
+ ldr q16, [x0, #224]
+ ldr q17, [x1]
+ ldr q18, [x1, #32]
+ ldr q19, [x1, #64]
+ ldr q20, [x1, #96]
+ ldr q21, [x1, #128]
+ ldr q22, [x1, #160]
+ ldr q23, [x1, #192]
+ ldr q24, [x1, #224]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v6.h[0]
+ mul v27.8h, v28.8h, v6.h[1]
+ sqrdmulh v10.8h, v26.8h, v4.h[0]
+ sqrdmulh v12.8h, v28.8h, v4.h[1]
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v6.h[2]
+ mul v27.8h, v28.8h, v6.h[3]
+ sqrdmulh v14.8h, v26.8h, v4.h[2]
+ sqrdmulh v16.8h, v28.8h, v4.h[3]
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v6.h[4]
+ mul v27.8h, v28.8h, v6.h[5]
+ sqrdmulh v18.8h, v26.8h, v4.h[4]
+ sqrdmulh v20.8h, v28.8h, v4.h[5]
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v6.h[6]
+ mul v27.8h, v28.8h, v6.h[7]
+ sqrdmulh v22.8h, v26.8h, v4.h[6]
+ sqrdmulh v24.8h, v28.8h, v4.h[7]
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v11.8h
+ sub v28.8h, v10.8h, v12.8h
+ add v9.8h, v9.8h, v11.8h
+ add v10.8h, v10.8h, v12.8h
+ mul v25.8h, v26.8h, v7.h[0]
+ mul v27.8h, v28.8h, v7.h[0]
+ sqrdmulh v11.8h, v26.8h, v5.h[0]
+ sqrdmulh v12.8h, v28.8h, v5.h[0]
+ sqrdmlsh v11.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v15.8h
+ sub v28.8h, v14.8h, v16.8h
+ add v13.8h, v13.8h, v15.8h
+ add v14.8h, v14.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[1]
+ mul v27.8h, v28.8h, v7.h[1]
+ sqrdmulh v15.8h, v26.8h, v5.h[1]
+ sqrdmulh v16.8h, v28.8h, v5.h[1]
+ sqrdmlsh v15.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v19.8h
+ sub v28.8h, v18.8h, v20.8h
+ add v17.8h, v17.8h, v19.8h
+ add v18.8h, v18.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[2]
+ mul v27.8h, v28.8h, v7.h[2]
+ sqrdmulh v19.8h, v26.8h, v5.h[2]
+ sqrdmulh v20.8h, v28.8h, v5.h[2]
+ sqrdmlsh v19.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v23.8h
+ sub v28.8h, v22.8h, v24.8h
+ add v21.8h, v21.8h, v23.8h
+ add v22.8h, v22.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[3]
+ mul v27.8h, v28.8h, v7.h[3]
+ sqrdmulh v23.8h, v26.8h, v5.h[3]
+ sqrdmulh v24.8h, v28.8h, v5.h[3]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v13.8h
+ sub v28.8h, v10.8h, v14.8h
+ add v9.8h, v9.8h, v13.8h
+ add v10.8h, v10.8h, v14.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v13.8h, v26.8h, v5.h[4]
+ sqrdmulh v14.8h, v28.8h, v5.h[4]
+ sqrdmlsh v13.8h, v25.8h, v8.h[0]
+ sqrdmlsh v14.8h, v27.8h, v8.h[0]
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ sub v26.8h, v11.8h, v15.8h
+ sub v28.8h, v12.8h, v16.8h
+ add v11.8h, v11.8h, v15.8h
+ add v12.8h, v12.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v15.8h, v26.8h, v5.h[4]
+ sqrdmulh v16.8h, v28.8h, v5.h[4]
+ sqrdmlsh v15.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v21.8h
+ sub v28.8h, v18.8h, v22.8h
+ add v17.8h, v17.8h, v21.8h
+ add v18.8h, v18.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v21.8h, v26.8h, v5.h[5]
+ sqrdmulh v22.8h, v28.8h, v5.h[5]
+ sqrdmlsh v21.8h, v25.8h, v8.h[0]
+ sqrdmlsh v22.8h, v27.8h, v8.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v19.8h, v23.8h
+ sub v28.8h, v20.8h, v24.8h
+ add v19.8h, v19.8h, v23.8h
+ add v20.8h, v20.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v23.8h, v26.8h, v5.h[5]
+ sqrdmulh v24.8h, v28.8h, v5.h[5]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v10.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v10.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v11.8h, v8.h[2]
+ sqdmulh v26.8h, v12.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v11.8h, v25.8h, v8.h[0]
+ mls v12.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v18.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v18.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v19.8h, v8.h[2]
+ sqdmulh v26.8h, v20.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v19.8h, v25.8h, v8.h[0]
+ mls v20.8h, v26.8h, v8.h[0]
+ sub v26.8h, v9.8h, v17.8h
+ sub v28.8h, v10.8h, v18.8h
+ add v9.8h, v9.8h, v17.8h
+ add v10.8h, v10.8h, v18.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v17.8h, v26.8h, v5.h[6]
+ sqrdmulh v18.8h, v28.8h, v5.h[6]
+ sqrdmlsh v17.8h, v25.8h, v8.h[0]
+ sqrdmlsh v18.8h, v27.8h, v8.h[0]
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ sub v26.8h, v11.8h, v19.8h
+ sub v28.8h, v12.8h, v20.8h
+ add v11.8h, v11.8h, v19.8h
+ add v12.8h, v12.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v19.8h, v26.8h, v5.h[6]
+ sqrdmulh v20.8h, v28.8h, v5.h[6]
+ sqrdmlsh v19.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v13.8h, v21.8h
+ sub v28.8h, v14.8h, v22.8h
+ add v13.8h, v13.8h, v21.8h
+ add v14.8h, v14.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v21.8h, v26.8h, v5.h[6]
+ sqrdmulh v22.8h, v28.8h, v5.h[6]
+ sqrdmlsh v21.8h, v25.8h, v8.h[0]
+ sqrdmlsh v22.8h, v27.8h, v8.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v15.8h, v23.8h
+ sub v28.8h, v16.8h, v24.8h
+ add v15.8h, v15.8h, v23.8h
+ add v16.8h, v16.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v23.8h, v26.8h, v5.h[6]
+ sqrdmulh v24.8h, v28.8h, v5.h[6]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v25.8h, v9.8h, v7.h[7]
+ mul v26.8h, v10.8h, v7.h[7]
+ sqrdmulh v9.8h, v9.8h, v5.h[7]
+ sqrdmulh v10.8h, v10.8h, v5.h[7]
+ sqrdmlsh v9.8h, v25.8h, v8.h[0]
+ sqrdmlsh v10.8h, v26.8h, v8.h[0]
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v25.8h, v11.8h, v7.h[7]
+ mul v26.8h, v12.8h, v7.h[7]
+ sqrdmulh v11.8h, v11.8h, v5.h[7]
+ sqrdmulh v12.8h, v12.8h, v5.h[7]
+ sqrdmlsh v11.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v26.8h, v8.h[0]
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v25.8h, v13.8h, v7.h[7]
+ mul v26.8h, v14.8h, v7.h[7]
+ sqrdmulh v13.8h, v13.8h, v5.h[7]
+ sqrdmulh v14.8h, v14.8h, v5.h[7]
+ sqrdmlsh v13.8h, v25.8h, v8.h[0]
+ sqrdmlsh v14.8h, v26.8h, v8.h[0]
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v25.8h, v15.8h, v7.h[7]
+ mul v26.8h, v16.8h, v7.h[7]
+ sqrdmulh v15.8h, v15.8h, v5.h[7]
+ sqrdmulh v16.8h, v16.8h, v5.h[7]
+ sqrdmlsh v15.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v26.8h, v8.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mul v25.8h, v17.8h, v7.h[7]
+ mul v26.8h, v18.8h, v7.h[7]
+ sqrdmulh v17.8h, v17.8h, v5.h[7]
+ sqrdmulh v18.8h, v18.8h, v5.h[7]
+ sqrdmlsh v17.8h, v25.8h, v8.h[0]
+ sqrdmlsh v18.8h, v26.8h, v8.h[0]
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ mul v25.8h, v19.8h, v7.h[7]
+ mul v26.8h, v20.8h, v7.h[7]
+ sqrdmulh v19.8h, v19.8h, v5.h[7]
+ sqrdmulh v20.8h, v20.8h, v5.h[7]
+ sqrdmlsh v19.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v26.8h, v8.h[0]
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mul v25.8h, v21.8h, v7.h[7]
+ mul v26.8h, v22.8h, v7.h[7]
+ sqrdmulh v21.8h, v21.8h, v5.h[7]
+ sqrdmulh v22.8h, v22.8h, v5.h[7]
+ sqrdmlsh v21.8h, v25.8h, v8.h[0]
+ sqrdmlsh v22.8h, v26.8h, v8.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v25.8h, v23.8h, v7.h[7]
+ mul v26.8h, v24.8h, v7.h[7]
+ sqrdmulh v23.8h, v23.8h, v5.h[7]
+ sqrdmulh v24.8h, v24.8h, v5.h[7]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v26.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ str q9, [x0]
+ str q10, [x0, #32]
+ str q11, [x0, #64]
+ str q12, [x0, #96]
+ str q13, [x0, #128]
+ str q14, [x0, #160]
+ str q15, [x0, #192]
+ str q16, [x0, #224]
+ str q17, [x1]
+ str q18, [x1, #32]
+ str q19, [x1, #64]
+ str q20, [x1, #96]
+ str q21, [x1, #128]
+ str q22, [x1, #160]
+ str q23, [x1, #192]
+ str q24, [x1, #224]
+ ldr q9, [x0, #16]
+ ldr q10, [x0, #48]
+ ldr q11, [x0, #80]
+ ldr q12, [x0, #112]
+ ldr q13, [x0, #144]
+ ldr q14, [x0, #176]
+ ldr q15, [x0, #208]
+ ldr q16, [x0, #240]
+ ldr q17, [x1, #16]
+ ldr q18, [x1, #48]
+ ldr q19, [x1, #80]
+ ldr q20, [x1, #112]
+ ldr q21, [x1, #144]
+ ldr q22, [x1, #176]
+ ldr q23, [x1, #208]
+ ldr q24, [x1, #240]
+ sub v26.8h, v9.8h, v10.8h
+ sub v28.8h, v11.8h, v12.8h
+ add v9.8h, v9.8h, v10.8h
+ add v11.8h, v11.8h, v12.8h
+ mul v25.8h, v26.8h, v6.h[0]
+ mul v27.8h, v28.8h, v6.h[1]
+ sqrdmulh v10.8h, v26.8h, v4.h[0]
+ sqrdmulh v12.8h, v28.8h, v4.h[1]
+ sqrdmlsh v10.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v10.8h, v10.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v14.8h
+ sub v28.8h, v15.8h, v16.8h
+ add v13.8h, v13.8h, v14.8h
+ add v15.8h, v15.8h, v16.8h
+ mul v25.8h, v26.8h, v6.h[2]
+ mul v27.8h, v28.8h, v6.h[3]
+ sqrdmulh v14.8h, v26.8h, v4.h[2]
+ sqrdmulh v16.8h, v28.8h, v4.h[3]
+ sqrdmlsh v14.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v14.8h, v14.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v18.8h
+ sub v28.8h, v19.8h, v20.8h
+ add v17.8h, v17.8h, v18.8h
+ add v19.8h, v19.8h, v20.8h
+ mul v25.8h, v26.8h, v6.h[4]
+ mul v27.8h, v28.8h, v6.h[5]
+ sqrdmulh v18.8h, v26.8h, v4.h[4]
+ sqrdmulh v20.8h, v28.8h, v4.h[5]
+ sqrdmlsh v18.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v18.8h, v18.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v22.8h
+ sub v28.8h, v23.8h, v24.8h
+ add v21.8h, v21.8h, v22.8h
+ add v23.8h, v23.8h, v24.8h
+ mul v25.8h, v26.8h, v6.h[6]
+ mul v27.8h, v28.8h, v6.h[7]
+ sqrdmulh v22.8h, v26.8h, v4.h[6]
+ sqrdmulh v24.8h, v28.8h, v4.h[7]
+ sqrdmlsh v22.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v22.8h, v22.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v11.8h
+ sub v28.8h, v10.8h, v12.8h
+ add v9.8h, v9.8h, v11.8h
+ add v10.8h, v10.8h, v12.8h
+ mul v25.8h, v26.8h, v7.h[0]
+ mul v27.8h, v28.8h, v7.h[0]
+ sqrdmulh v11.8h, v26.8h, v5.h[0]
+ sqrdmulh v12.8h, v28.8h, v5.h[0]
+ sqrdmlsh v11.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v27.8h, v8.h[0]
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ sub v26.8h, v13.8h, v15.8h
+ sub v28.8h, v14.8h, v16.8h
+ add v13.8h, v13.8h, v15.8h
+ add v14.8h, v14.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[1]
+ mul v27.8h, v28.8h, v7.h[1]
+ sqrdmulh v15.8h, v26.8h, v5.h[1]
+ sqrdmulh v16.8h, v28.8h, v5.h[1]
+ sqrdmlsh v15.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v19.8h
+ sub v28.8h, v18.8h, v20.8h
+ add v17.8h, v17.8h, v19.8h
+ add v18.8h, v18.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[2]
+ mul v27.8h, v28.8h, v7.h[2]
+ sqrdmulh v19.8h, v26.8h, v5.h[2]
+ sqrdmulh v20.8h, v28.8h, v5.h[2]
+ sqrdmlsh v19.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v21.8h, v23.8h
+ sub v28.8h, v22.8h, v24.8h
+ add v21.8h, v21.8h, v23.8h
+ add v22.8h, v22.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[3]
+ mul v27.8h, v28.8h, v7.h[3]
+ sqrdmulh v23.8h, v26.8h, v5.h[3]
+ sqrdmulh v24.8h, v28.8h, v5.h[3]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sub v26.8h, v9.8h, v13.8h
+ sub v28.8h, v10.8h, v14.8h
+ add v9.8h, v9.8h, v13.8h
+ add v10.8h, v10.8h, v14.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v13.8h, v26.8h, v5.h[4]
+ sqrdmulh v14.8h, v28.8h, v5.h[4]
+ sqrdmlsh v13.8h, v25.8h, v8.h[0]
+ sqrdmlsh v14.8h, v27.8h, v8.h[0]
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ sub v26.8h, v11.8h, v15.8h
+ sub v28.8h, v12.8h, v16.8h
+ add v11.8h, v11.8h, v15.8h
+ add v12.8h, v12.8h, v16.8h
+ mul v25.8h, v26.8h, v7.h[4]
+ mul v27.8h, v28.8h, v7.h[4]
+ sqrdmulh v15.8h, v26.8h, v5.h[4]
+ sqrdmulh v16.8h, v28.8h, v5.h[4]
+ sqrdmlsh v15.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v27.8h, v8.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ sub v26.8h, v17.8h, v21.8h
+ sub v28.8h, v18.8h, v22.8h
+ add v17.8h, v17.8h, v21.8h
+ add v18.8h, v18.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v21.8h, v26.8h, v5.h[5]
+ sqrdmulh v22.8h, v28.8h, v5.h[5]
+ sqrdmlsh v21.8h, v25.8h, v8.h[0]
+ sqrdmlsh v22.8h, v27.8h, v8.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v19.8h, v23.8h
+ sub v28.8h, v20.8h, v24.8h
+ add v19.8h, v19.8h, v23.8h
+ add v20.8h, v20.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[5]
+ mul v27.8h, v28.8h, v7.h[5]
+ sqrdmulh v23.8h, v26.8h, v5.h[5]
+ sqrdmulh v24.8h, v28.8h, v5.h[5]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ sqdmulh v25.8h, v9.8h, v8.h[2]
+ sqdmulh v26.8h, v10.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v9.8h, v25.8h, v8.h[0]
+ mls v10.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v11.8h, v8.h[2]
+ sqdmulh v26.8h, v12.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v11.8h, v25.8h, v8.h[0]
+ mls v12.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v17.8h, v8.h[2]
+ sqdmulh v26.8h, v18.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v17.8h, v25.8h, v8.h[0]
+ mls v18.8h, v26.8h, v8.h[0]
+ sqdmulh v25.8h, v19.8h, v8.h[2]
+ sqdmulh v26.8h, v20.8h, v8.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v19.8h, v25.8h, v8.h[0]
+ mls v20.8h, v26.8h, v8.h[0]
+ sub v26.8h, v9.8h, v17.8h
+ sub v28.8h, v10.8h, v18.8h
+ add v9.8h, v9.8h, v17.8h
+ add v10.8h, v10.8h, v18.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v17.8h, v26.8h, v5.h[6]
+ sqrdmulh v18.8h, v28.8h, v5.h[6]
+ sqrdmlsh v17.8h, v25.8h, v8.h[0]
+ sqrdmlsh v18.8h, v27.8h, v8.h[0]
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ sub v26.8h, v11.8h, v19.8h
+ sub v28.8h, v12.8h, v20.8h
+ add v11.8h, v11.8h, v19.8h
+ add v12.8h, v12.8h, v20.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v19.8h, v26.8h, v5.h[6]
+ sqrdmulh v20.8h, v28.8h, v5.h[6]
+ sqrdmlsh v19.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v27.8h, v8.h[0]
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ sub v26.8h, v13.8h, v21.8h
+ sub v28.8h, v14.8h, v22.8h
+ add v13.8h, v13.8h, v21.8h
+ add v14.8h, v14.8h, v22.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v21.8h, v26.8h, v5.h[6]
+ sqrdmulh v22.8h, v28.8h, v5.h[6]
+ sqrdmlsh v21.8h, v25.8h, v8.h[0]
+ sqrdmlsh v22.8h, v27.8h, v8.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ sub v26.8h, v15.8h, v23.8h
+ sub v28.8h, v16.8h, v24.8h
+ add v15.8h, v15.8h, v23.8h
+ add v16.8h, v16.8h, v24.8h
+ mul v25.8h, v26.8h, v7.h[6]
+ mul v27.8h, v28.8h, v7.h[6]
+ sqrdmulh v23.8h, v26.8h, v5.h[6]
+ sqrdmulh v24.8h, v28.8h, v5.h[6]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v27.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ mul v25.8h, v9.8h, v7.h[7]
+ mul v26.8h, v10.8h, v7.h[7]
+ sqrdmulh v9.8h, v9.8h, v5.h[7]
+ sqrdmulh v10.8h, v10.8h, v5.h[7]
+ sqrdmlsh v9.8h, v25.8h, v8.h[0]
+ sqrdmlsh v10.8h, v26.8h, v8.h[0]
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v25.8h, v11.8h, v7.h[7]
+ mul v26.8h, v12.8h, v7.h[7]
+ sqrdmulh v11.8h, v11.8h, v5.h[7]
+ sqrdmulh v12.8h, v12.8h, v5.h[7]
+ sqrdmlsh v11.8h, v25.8h, v8.h[0]
+ sqrdmlsh v12.8h, v26.8h, v8.h[0]
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v25.8h, v13.8h, v7.h[7]
+ mul v26.8h, v14.8h, v7.h[7]
+ sqrdmulh v13.8h, v13.8h, v5.h[7]
+ sqrdmulh v14.8h, v14.8h, v5.h[7]
+ sqrdmlsh v13.8h, v25.8h, v8.h[0]
+ sqrdmlsh v14.8h, v26.8h, v8.h[0]
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v25.8h, v15.8h, v7.h[7]
+ mul v26.8h, v16.8h, v7.h[7]
+ sqrdmulh v15.8h, v15.8h, v5.h[7]
+ sqrdmulh v16.8h, v16.8h, v5.h[7]
+ sqrdmlsh v15.8h, v25.8h, v8.h[0]
+ sqrdmlsh v16.8h, v26.8h, v8.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ mul v25.8h, v17.8h, v7.h[7]
+ mul v26.8h, v18.8h, v7.h[7]
+ sqrdmulh v17.8h, v17.8h, v5.h[7]
+ sqrdmulh v18.8h, v18.8h, v5.h[7]
+ sqrdmlsh v17.8h, v25.8h, v8.h[0]
+ sqrdmlsh v18.8h, v26.8h, v8.h[0]
+ sshr v17.8h, v17.8h, #1
+ sshr v18.8h, v18.8h, #1
+ mul v25.8h, v19.8h, v7.h[7]
+ mul v26.8h, v20.8h, v7.h[7]
+ sqrdmulh v19.8h, v19.8h, v5.h[7]
+ sqrdmulh v20.8h, v20.8h, v5.h[7]
+ sqrdmlsh v19.8h, v25.8h, v8.h[0]
+ sqrdmlsh v20.8h, v26.8h, v8.h[0]
+ sshr v19.8h, v19.8h, #1
+ sshr v20.8h, v20.8h, #1
+ mul v25.8h, v21.8h, v7.h[7]
+ mul v26.8h, v22.8h, v7.h[7]
+ sqrdmulh v21.8h, v21.8h, v5.h[7]
+ sqrdmulh v22.8h, v22.8h, v5.h[7]
+ sqrdmlsh v21.8h, v25.8h, v8.h[0]
+ sqrdmlsh v22.8h, v26.8h, v8.h[0]
+ sshr v21.8h, v21.8h, #1
+ sshr v22.8h, v22.8h, #1
+ mul v25.8h, v23.8h, v7.h[7]
+ mul v26.8h, v24.8h, v7.h[7]
+ sqrdmulh v23.8h, v23.8h, v5.h[7]
+ sqrdmulh v24.8h, v24.8h, v5.h[7]
+ sqrdmlsh v23.8h, v25.8h, v8.h[0]
+ sqrdmlsh v24.8h, v26.8h, v8.h[0]
+ sshr v23.8h, v23.8h, #1
+ sshr v24.8h, v24.8h, #1
+ str q9, [x0, #16]
+ str q10, [x0, #48]
+ str q11, [x0, #80]
+ str q12, [x0, #112]
+ str q13, [x0, #144]
+ str q14, [x0, #176]
+ str q15, [x0, #208]
+ str q16, [x0, #240]
+ str q17, [x1, #16]
+ str q18, [x1, #48]
+ str q19, [x1, #80]
+ str q20, [x1, #112]
+ str q21, [x1, #144]
+ str q22, [x1, #176]
+ str q23, [x1, #208]
+ str q24, [x1, #240]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_aarch64_zetas_mul
+ DCW 0x08b2, 0xf74e, 0x01ae, 0xfe52, 0x022b, 0xfdd5, 0x034b, 0xfcb5
+ DCW 0x081e, 0xf7e2, 0x0367, 0xfc99, 0x060e, 0xf9f2, 0x0069, 0xff97
+ DCW 0x01a6, 0xfe5a, 0x024b, 0xfdb5, 0x00b1, 0xff4f, 0x0c16, 0xf3ea
+ DCW 0x0bde, 0xf422, 0x0b35, 0xf4cb, 0x0626, 0xf9da, 0x0675, 0xf98b
+ DCW 0x0c0b, 0xf3f5, 0x030a, 0xfcf6, 0x0487, 0xfb79, 0x0c6e, 0xf392
+ DCW 0x09f8, 0xf608, 0x05cb, 0xfa35, 0x0aa7, 0xf559, 0x045f, 0xfba1
+ DCW 0x06cb, 0xf935, 0x0284, 0xfd7c, 0x0999, 0xf667, 0x015d, 0xfea3
+ DCW 0x01a2, 0xfe5e, 0x0149, 0xfeb7, 0x0c65, 0xf39b, 0x0cb6, 0xf34a
+ DCW 0x0331, 0xfccf, 0x0449, 0xfbb7, 0x025b, 0xfda5, 0x0262, 0xfd9e
+ DCW 0x052a, 0xfad6, 0x07fc, 0xf804, 0x0748, 0xf8b8, 0x0180, 0xfe80
+ DCW 0x0842, 0xf7be, 0x0c79, 0xf387, 0x04c2, 0xfb3e, 0x07ca, 0xf836
+ DCW 0x0997, 0xf669, 0x00dc, 0xff24, 0x085e, 0xf7a2, 0x0686, 0xf97a
+ DCW 0x0860, 0xf7a0, 0x0707, 0xf8f9, 0x0803, 0xf7fd, 0x031a, 0xfce6
+ DCW 0x071b, 0xf8e5, 0x09ab, 0xf655, 0x099b, 0xf665, 0x01de, 0xfe22
+ DCW 0x0c95, 0xf36b, 0x0bcd, 0xf433, 0x03e4, 0xfc1c, 0x03df, 0xfc21
+ DCW 0x03be, 0xfc42, 0x074d, 0xf8b3, 0x05f2, 0xfa0e, 0x065c, 0xf9a4
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_basemul_mont
+mlkem_basemul_mont PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x3, L_mlkem_aarch64_zetas_mul
+ add x3, x3, L_mlkem_aarch64_zetas_mul
+ adrp x4, L_mlkem_aarch64_consts
+ add x4, x4, L_mlkem_aarch64_consts
+ ldr q1, [x4]
+ ldp q2, q3, [x1]
+ ldp q4, q5, [x1, #32]
+ ldp q6, q7, [x1, #64]
+ ldp q8, q9, [x1, #96]
+ ldp q10, q11, [x2]
+ ldp q12, q13, [x2, #32]
+ ldp q14, q15, [x2, #64]
+ ldp q16, q17, [x2, #96]
+ ldr q0, [x3]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0]
+ ldr q0, [x3, #16]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #32]
+ ldr q0, [x3, #32]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #64]
+ ldr q0, [x3, #48]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #96]
+ ldp q2, q3, [x1, #128]
+ ldp q4, q5, [x1, #160]
+ ldp q6, q7, [x1, #192]
+ ldp q8, q9, [x1, #224]
+ ldp q10, q11, [x2, #128]
+ ldp q12, q13, [x2, #160]
+ ldp q14, q15, [x2, #192]
+ ldp q16, q17, [x2, #224]
+ ldr q0, [x3, #64]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #128]
+ ldr q0, [x3, #80]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #160]
+ ldr q0, [x3, #96]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #192]
+ ldr q0, [x3, #112]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #224]
+ ldp q2, q3, [x1, #256]
+ ldp q4, q5, [x1, #288]
+ ldp q6, q7, [x1, #320]
+ ldp q8, q9, [x1, #352]
+ ldp q10, q11, [x2, #256]
+ ldp q12, q13, [x2, #288]
+ ldp q14, q15, [x2, #320]
+ ldp q16, q17, [x2, #352]
+ ldr q0, [x3, #128]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #256]
+ ldr q0, [x3, #144]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #288]
+ ldr q0, [x3, #160]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #320]
+ ldr q0, [x3, #176]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #352]
+ ldp q2, q3, [x1, #384]
+ ldp q4, q5, [x1, #416]
+ ldp q6, q7, [x1, #448]
+ ldp q8, q9, [x1, #480]
+ ldp q10, q11, [x2, #384]
+ ldp q12, q13, [x2, #416]
+ ldp q14, q15, [x2, #448]
+ ldp q16, q17, [x2, #480]
+ ldr q0, [x3, #192]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #384]
+ ldr q0, [x3, #208]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #416]
+ ldr q0, [x3, #224]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #448]
+ ldr q0, [x3, #240]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ stp q24, q25, [x0, #480]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_basemul_mont_add
+mlkem_basemul_mont_add PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x3, L_mlkem_aarch64_zetas_mul
+ add x3, x3, L_mlkem_aarch64_zetas_mul
+ adrp x4, L_mlkem_aarch64_consts
+ add x4, x4, L_mlkem_aarch64_consts
+ ldr q1, [x4]
+ ldp q2, q3, [x1]
+ ldp q4, q5, [x1, #32]
+ ldp q6, q7, [x1, #64]
+ ldp q8, q9, [x1, #96]
+ ldp q10, q11, [x2]
+ ldp q12, q13, [x2, #32]
+ ldp q14, q15, [x2, #64]
+ ldp q16, q17, [x2, #96]
+ ldp q28, q29, [x0]
+ ldr q0, [x3]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0]
+ ldp q28, q29, [x0, #32]
+ ldr q0, [x3, #16]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #32]
+ ldp q28, q29, [x0, #64]
+ ldr q0, [x3, #32]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #64]
+ ldp q28, q29, [x0, #96]
+ ldr q0, [x3, #48]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #96]
+ ldp q2, q3, [x1, #128]
+ ldp q4, q5, [x1, #160]
+ ldp q6, q7, [x1, #192]
+ ldp q8, q9, [x1, #224]
+ ldp q10, q11, [x2, #128]
+ ldp q12, q13, [x2, #160]
+ ldp q14, q15, [x2, #192]
+ ldp q16, q17, [x2, #224]
+ ldp q28, q29, [x0, #128]
+ ldr q0, [x3, #64]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #128]
+ ldp q28, q29, [x0, #160]
+ ldr q0, [x3, #80]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #160]
+ ldp q28, q29, [x0, #192]
+ ldr q0, [x3, #96]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #192]
+ ldp q28, q29, [x0, #224]
+ ldr q0, [x3, #112]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #224]
+ ldp q2, q3, [x1, #256]
+ ldp q4, q5, [x1, #288]
+ ldp q6, q7, [x1, #320]
+ ldp q8, q9, [x1, #352]
+ ldp q10, q11, [x2, #256]
+ ldp q12, q13, [x2, #288]
+ ldp q14, q15, [x2, #320]
+ ldp q16, q17, [x2, #352]
+ ldp q28, q29, [x0, #256]
+ ldr q0, [x3, #128]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #256]
+ ldp q28, q29, [x0, #288]
+ ldr q0, [x3, #144]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #288]
+ ldp q28, q29, [x0, #320]
+ ldr q0, [x3, #160]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #320]
+ ldp q28, q29, [x0, #352]
+ ldr q0, [x3, #176]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #352]
+ ldp q2, q3, [x1, #384]
+ ldp q4, q5, [x1, #416]
+ ldp q6, q7, [x1, #448]
+ ldp q8, q9, [x1, #480]
+ ldp q10, q11, [x2, #384]
+ ldp q12, q13, [x2, #416]
+ ldp q14, q15, [x2, #448]
+ ldp q16, q17, [x2, #480]
+ ldp q28, q29, [x0, #384]
+ ldr q0, [x3, #192]
+ uzp1 v18.8h, v2.8h, v3.8h
+ uzp2 v19.8h, v2.8h, v3.8h
+ uzp1 v20.8h, v10.8h, v11.8h
+ uzp2 v21.8h, v10.8h, v11.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #384]
+ ldp q28, q29, [x0, #416]
+ ldr q0, [x3, #208]
+ uzp1 v18.8h, v4.8h, v5.8h
+ uzp2 v19.8h, v4.8h, v5.8h
+ uzp1 v20.8h, v12.8h, v13.8h
+ uzp2 v21.8h, v12.8h, v13.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #416]
+ ldp q28, q29, [x0, #448]
+ ldr q0, [x3, #224]
+ uzp1 v18.8h, v6.8h, v7.8h
+ uzp2 v19.8h, v6.8h, v7.8h
+ uzp1 v20.8h, v14.8h, v15.8h
+ uzp2 v21.8h, v14.8h, v15.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #448]
+ ldp q28, q29, [x0, #480]
+ ldr q0, [x3, #240]
+ uzp1 v18.8h, v8.8h, v9.8h
+ uzp2 v19.8h, v8.8h, v9.8h
+ uzp1 v20.8h, v16.8h, v17.8h
+ uzp2 v21.8h, v16.8h, v17.8h
+ smull v26.4s, v18.4h, v20.4h
+ smull2 v27.4s, v18.8h, v20.8h
+ smull v23.4s, v19.4h, v21.4h
+ smull2 v24.4s, v19.8h, v21.8h
+ xtn v25.4h, v23.4s
+ xtn2 v25.8h, v24.4s
+ mul v25.8h, v25.8h, v1.h[1]
+ smlsl v23.4s, v25.4h, v1.h[0]
+ smlsl2 v24.4s, v25.8h, v1.h[0]
+ shrn v22.4h, v23.4s, #16
+ shrn2 v22.8h, v24.4s, #16
+ smlal v26.4s, v22.4h, v0.4h
+ smlal2 v27.4s, v22.8h, v0.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v22.4h, v26.4s, #16
+ shrn2 v22.8h, v27.4s, #16
+ smull v26.4s, v18.4h, v21.4h
+ smull2 v27.4s, v18.8h, v21.8h
+ smlal v26.4s, v19.4h, v20.4h
+ smlal2 v27.4s, v19.8h, v20.8h
+ xtn v24.4h, v26.4s
+ xtn2 v24.8h, v27.4s
+ mul v24.8h, v24.8h, v1.h[1]
+ smlsl v26.4s, v24.4h, v1.h[0]
+ smlsl2 v27.4s, v24.8h, v1.h[0]
+ shrn v23.4h, v26.4s, #16
+ shrn2 v23.8h, v27.4s, #16
+ zip1 v24.8h, v22.8h, v23.8h
+ zip2 v25.8h, v22.8h, v23.8h
+ add v28.8h, v28.8h, v24.8h
+ add v29.8h, v29.8h, v25.8h
+ stp q28, q29, [x0, #480]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_aarch64_q
+ DCW 0x0d01, 0x0d01, 0x0d01, 0x0d01, 0x0d01, 0x0d01, 0x0d01, 0x0d01
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_csubq_neon
+mlkem_csubq_neon PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x1, L_mlkem_aarch64_q
+ add x1, x1, L_mlkem_aarch64_q
+ ldr q20, [x1]
+ ld4 {v0.8h, v1.8h, v2.8h, v3.8h}, [x0], #0x40
+ ld4 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ ld4 {v8.8h, v9.8h, v10.8h, v11.8h}, [x0], #0x40
+ ld4 {v12.8h, v13.8h, v14.8h, v15.8h}, [x0], #0x40
+ sub x0, x0, #0x100
+ sub v0.8h, v0.8h, v20.8h
+ sub v1.8h, v1.8h, v20.8h
+ sub v2.8h, v2.8h, v20.8h
+ sub v3.8h, v3.8h, v20.8h
+ sub v4.8h, v4.8h, v20.8h
+ sub v5.8h, v5.8h, v20.8h
+ sub v6.8h, v6.8h, v20.8h
+ sub v7.8h, v7.8h, v20.8h
+ sub v8.8h, v8.8h, v20.8h
+ sub v9.8h, v9.8h, v20.8h
+ sub v10.8h, v10.8h, v20.8h
+ sub v11.8h, v11.8h, v20.8h
+ sub v12.8h, v12.8h, v20.8h
+ sub v13.8h, v13.8h, v20.8h
+ sub v14.8h, v14.8h, v20.8h
+ sub v15.8h, v15.8h, v20.8h
+ sshr v16.8h, v0.8h, #15
+ sshr v17.8h, v1.8h, #15
+ sshr v18.8h, v2.8h, #15
+ sshr v19.8h, v3.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v0.8h, v0.8h, v16.8h
+ add v1.8h, v1.8h, v17.8h
+ add v2.8h, v2.8h, v18.8h
+ add v3.8h, v3.8h, v19.8h
+ sshr v16.8h, v4.8h, #15
+ sshr v17.8h, v5.8h, #15
+ sshr v18.8h, v6.8h, #15
+ sshr v19.8h, v7.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v4.8h, v4.8h, v16.8h
+ add v5.8h, v5.8h, v17.8h
+ add v6.8h, v6.8h, v18.8h
+ add v7.8h, v7.8h, v19.8h
+ sshr v16.8h, v8.8h, #15
+ sshr v17.8h, v9.8h, #15
+ sshr v18.8h, v10.8h, #15
+ sshr v19.8h, v11.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v8.8h, v8.8h, v16.8h
+ add v9.8h, v9.8h, v17.8h
+ add v10.8h, v10.8h, v18.8h
+ add v11.8h, v11.8h, v19.8h
+ sshr v16.8h, v12.8h, #15
+ sshr v17.8h, v13.8h, #15
+ sshr v18.8h, v14.8h, #15
+ sshr v19.8h, v15.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v12.8h, v12.8h, v16.8h
+ add v13.8h, v13.8h, v17.8h
+ add v14.8h, v14.8h, v18.8h
+ add v15.8h, v15.8h, v19.8h
+ st4 {v0.8h, v1.8h, v2.8h, v3.8h}, [x0], #0x40
+ st4 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ st4 {v8.8h, v9.8h, v10.8h, v11.8h}, [x0], #0x40
+ st4 {v12.8h, v13.8h, v14.8h, v15.8h}, [x0], #0x40
+ ld4 {v0.8h, v1.8h, v2.8h, v3.8h}, [x0], #0x40
+ ld4 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ ld4 {v8.8h, v9.8h, v10.8h, v11.8h}, [x0], #0x40
+ ld4 {v12.8h, v13.8h, v14.8h, v15.8h}, [x0], #0x40
+ sub x0, x0, #0x100
+ sub v0.8h, v0.8h, v20.8h
+ sub v1.8h, v1.8h, v20.8h
+ sub v2.8h, v2.8h, v20.8h
+ sub v3.8h, v3.8h, v20.8h
+ sub v4.8h, v4.8h, v20.8h
+ sub v5.8h, v5.8h, v20.8h
+ sub v6.8h, v6.8h, v20.8h
+ sub v7.8h, v7.8h, v20.8h
+ sub v8.8h, v8.8h, v20.8h
+ sub v9.8h, v9.8h, v20.8h
+ sub v10.8h, v10.8h, v20.8h
+ sub v11.8h, v11.8h, v20.8h
+ sub v12.8h, v12.8h, v20.8h
+ sub v13.8h, v13.8h, v20.8h
+ sub v14.8h, v14.8h, v20.8h
+ sub v15.8h, v15.8h, v20.8h
+ sshr v16.8h, v0.8h, #15
+ sshr v17.8h, v1.8h, #15
+ sshr v18.8h, v2.8h, #15
+ sshr v19.8h, v3.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v0.8h, v0.8h, v16.8h
+ add v1.8h, v1.8h, v17.8h
+ add v2.8h, v2.8h, v18.8h
+ add v3.8h, v3.8h, v19.8h
+ sshr v16.8h, v4.8h, #15
+ sshr v17.8h, v5.8h, #15
+ sshr v18.8h, v6.8h, #15
+ sshr v19.8h, v7.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v4.8h, v4.8h, v16.8h
+ add v5.8h, v5.8h, v17.8h
+ add v6.8h, v6.8h, v18.8h
+ add v7.8h, v7.8h, v19.8h
+ sshr v16.8h, v8.8h, #15
+ sshr v17.8h, v9.8h, #15
+ sshr v18.8h, v10.8h, #15
+ sshr v19.8h, v11.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v8.8h, v8.8h, v16.8h
+ add v9.8h, v9.8h, v17.8h
+ add v10.8h, v10.8h, v18.8h
+ add v11.8h, v11.8h, v19.8h
+ sshr v16.8h, v12.8h, #15
+ sshr v17.8h, v13.8h, #15
+ sshr v18.8h, v14.8h, #15
+ sshr v19.8h, v15.8h, #15
+ and v16.16b, v16.16b, v20.16b
+ and v17.16b, v17.16b, v20.16b
+ and v18.16b, v18.16b, v20.16b
+ and v19.16b, v19.16b, v20.16b
+ add v12.8h, v12.8h, v16.8h
+ add v13.8h, v13.8h, v17.8h
+ add v14.8h, v14.8h, v18.8h
+ add v15.8h, v15.8h, v19.8h
+ st4 {v0.8h, v1.8h, v2.8h, v3.8h}, [x0], #0x40
+ st4 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ st4 {v8.8h, v9.8h, v10.8h, v11.8h}, [x0], #0x40
+ st4 {v12.8h, v13.8h, v14.8h, v15.8h}, [x0], #0x40
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_add_reduce
+mlkem_add_reduce PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x2, L_mlkem_aarch64_consts
+ add x2, x2, L_mlkem_aarch64_consts
+ ldr q0, [x2]
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_add3_reduce
+mlkem_add3_reduce PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x3, L_mlkem_aarch64_consts
+ add x3, x3, L_mlkem_aarch64_consts
+ ldr q0, [x3]
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ ld4 {v17.8h, v18.8h, v19.8h, v20.8h}, [x2], #0x40
+ ld4 {v21.8h, v22.8h, v23.8h, v24.8h}, [x2], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ add v1.8h, v1.8h, v17.8h
+ add v2.8h, v2.8h, v18.8h
+ add v3.8h, v3.8h, v19.8h
+ add v4.8h, v4.8h, v20.8h
+ add v5.8h, v5.8h, v21.8h
+ add v6.8h, v6.8h, v22.8h
+ add v7.8h, v7.8h, v23.8h
+ add v8.8h, v8.8h, v24.8h
+ sqdmulh v25.8h, v1.8h, v0.h[2]
+ sqdmulh v26.8h, v2.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v1.8h, v25.8h, v0.h[0]
+ mls v2.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v3.8h, v0.h[2]
+ sqdmulh v26.8h, v4.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v3.8h, v25.8h, v0.h[0]
+ mls v4.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v5.8h, v0.h[2]
+ sqdmulh v26.8h, v6.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v5.8h, v25.8h, v0.h[0]
+ mls v6.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v7.8h, v0.h[2]
+ sqdmulh v26.8h, v8.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v7.8h, v25.8h, v0.h[0]
+ mls v8.8h, v26.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ ld4 {v17.8h, v18.8h, v19.8h, v20.8h}, [x2], #0x40
+ ld4 {v21.8h, v22.8h, v23.8h, v24.8h}, [x2], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ add v1.8h, v1.8h, v17.8h
+ add v2.8h, v2.8h, v18.8h
+ add v3.8h, v3.8h, v19.8h
+ add v4.8h, v4.8h, v20.8h
+ add v5.8h, v5.8h, v21.8h
+ add v6.8h, v6.8h, v22.8h
+ add v7.8h, v7.8h, v23.8h
+ add v8.8h, v8.8h, v24.8h
+ sqdmulh v25.8h, v1.8h, v0.h[2]
+ sqdmulh v26.8h, v2.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v1.8h, v25.8h, v0.h[0]
+ mls v2.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v3.8h, v0.h[2]
+ sqdmulh v26.8h, v4.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v3.8h, v25.8h, v0.h[0]
+ mls v4.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v5.8h, v0.h[2]
+ sqdmulh v26.8h, v6.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v5.8h, v25.8h, v0.h[0]
+ mls v6.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v7.8h, v0.h[2]
+ sqdmulh v26.8h, v8.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v7.8h, v25.8h, v0.h[0]
+ mls v8.8h, v26.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ ld4 {v17.8h, v18.8h, v19.8h, v20.8h}, [x2], #0x40
+ ld4 {v21.8h, v22.8h, v23.8h, v24.8h}, [x2], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ add v1.8h, v1.8h, v17.8h
+ add v2.8h, v2.8h, v18.8h
+ add v3.8h, v3.8h, v19.8h
+ add v4.8h, v4.8h, v20.8h
+ add v5.8h, v5.8h, v21.8h
+ add v6.8h, v6.8h, v22.8h
+ add v7.8h, v7.8h, v23.8h
+ add v8.8h, v8.8h, v24.8h
+ sqdmulh v25.8h, v1.8h, v0.h[2]
+ sqdmulh v26.8h, v2.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v1.8h, v25.8h, v0.h[0]
+ mls v2.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v3.8h, v0.h[2]
+ sqdmulh v26.8h, v4.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v3.8h, v25.8h, v0.h[0]
+ mls v4.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v5.8h, v0.h[2]
+ sqdmulh v26.8h, v6.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v5.8h, v25.8h, v0.h[0]
+ mls v6.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v7.8h, v0.h[2]
+ sqdmulh v26.8h, v8.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v7.8h, v25.8h, v0.h[0]
+ mls v8.8h, v26.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ ld4 {v17.8h, v18.8h, v19.8h, v20.8h}, [x2], #0x40
+ ld4 {v21.8h, v22.8h, v23.8h, v24.8h}, [x2], #0x40
+ sub x0, x0, #0x80
+ add v1.8h, v1.8h, v9.8h
+ add v2.8h, v2.8h, v10.8h
+ add v3.8h, v3.8h, v11.8h
+ add v4.8h, v4.8h, v12.8h
+ add v5.8h, v5.8h, v13.8h
+ add v6.8h, v6.8h, v14.8h
+ add v7.8h, v7.8h, v15.8h
+ add v8.8h, v8.8h, v16.8h
+ add v1.8h, v1.8h, v17.8h
+ add v2.8h, v2.8h, v18.8h
+ add v3.8h, v3.8h, v19.8h
+ add v4.8h, v4.8h, v20.8h
+ add v5.8h, v5.8h, v21.8h
+ add v6.8h, v6.8h, v22.8h
+ add v7.8h, v7.8h, v23.8h
+ add v8.8h, v8.8h, v24.8h
+ sqdmulh v25.8h, v1.8h, v0.h[2]
+ sqdmulh v26.8h, v2.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v1.8h, v25.8h, v0.h[0]
+ mls v2.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v3.8h, v0.h[2]
+ sqdmulh v26.8h, v4.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v3.8h, v25.8h, v0.h[0]
+ mls v4.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v5.8h, v0.h[2]
+ sqdmulh v26.8h, v6.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v5.8h, v25.8h, v0.h[0]
+ mls v6.8h, v26.8h, v0.h[0]
+ sqdmulh v25.8h, v7.8h, v0.h[2]
+ sqdmulh v26.8h, v8.8h, v0.h[2]
+ sshr v25.8h, v25.8h, #11
+ sshr v26.8h, v26.8h, #11
+ mls v7.8h, v25.8h, v0.h[0]
+ mls v8.8h, v26.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_rsub_reduce
+mlkem_rsub_reduce PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x2, L_mlkem_aarch64_consts
+ add x2, x2, L_mlkem_aarch64_consts
+ ldr q0, [x2]
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ sub v1.8h, v9.8h, v1.8h
+ sub v2.8h, v10.8h, v2.8h
+ sub v3.8h, v11.8h, v3.8h
+ sub v4.8h, v12.8h, v4.8h
+ sub v5.8h, v13.8h, v5.8h
+ sub v6.8h, v14.8h, v6.8h
+ sub v7.8h, v15.8h, v7.8h
+ sub v8.8h, v16.8h, v8.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ sub v1.8h, v9.8h, v1.8h
+ sub v2.8h, v10.8h, v2.8h
+ sub v3.8h, v11.8h, v3.8h
+ sub v4.8h, v12.8h, v4.8h
+ sub v5.8h, v13.8h, v5.8h
+ sub v6.8h, v14.8h, v6.8h
+ sub v7.8h, v15.8h, v7.8h
+ sub v8.8h, v16.8h, v8.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ sub v1.8h, v9.8h, v1.8h
+ sub v2.8h, v10.8h, v2.8h
+ sub v3.8h, v11.8h, v3.8h
+ sub v4.8h, v12.8h, v4.8h
+ sub v5.8h, v13.8h, v5.8h
+ sub v6.8h, v14.8h, v6.8h
+ sub v7.8h, v15.8h, v7.8h
+ sub v8.8h, v16.8h, v8.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x1], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x1], #0x40
+ sub x0, x0, #0x80
+ sub v1.8h, v9.8h, v1.8h
+ sub v2.8h, v10.8h, v2.8h
+ sub v3.8h, v11.8h, v3.8h
+ sub v4.8h, v12.8h, v4.8h
+ sub v5.8h, v13.8h, v5.8h
+ sub v6.8h, v14.8h, v6.8h
+ sub v7.8h, v15.8h, v7.8h
+ sub v8.8h, v16.8h, v8.8h
+ sqdmulh v17.8h, v1.8h, v0.h[2]
+ sqdmulh v18.8h, v2.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v1.8h, v17.8h, v0.h[0]
+ mls v2.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v3.8h, v0.h[2]
+ sqdmulh v18.8h, v4.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v3.8h, v17.8h, v0.h[0]
+ mls v4.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v5.8h, v0.h[2]
+ sqdmulh v18.8h, v6.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v5.8h, v17.8h, v0.h[0]
+ mls v6.8h, v18.8h, v0.h[0]
+ sqdmulh v17.8h, v7.8h, v0.h[2]
+ sqdmulh v18.8h, v8.8h, v0.h[2]
+ sshr v17.8h, v17.8h, #11
+ sshr v18.8h, v18.8h, #11
+ mls v7.8h, v17.8h, v0.h[0]
+ mls v8.8h, v18.8h, v0.h[0]
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_to_mont
+mlkem_to_mont PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x1, L_mlkem_aarch64_consts
+ add x1, x1, L_mlkem_aarch64_consts
+ ldr q0, [x1]
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ sub x0, x0, #0x100
+ mul v17.8h, v1.8h, v0.h[4]
+ mul v18.8h, v2.8h, v0.h[4]
+ sqrdmulh v1.8h, v1.8h, v0.h[3]
+ sqrdmulh v2.8h, v2.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v1.8h, v1.8h, v17.8h
+ sub v2.8h, v2.8h, v18.8h
+ sshr v1.8h, v1.8h, #1
+ sshr v2.8h, v2.8h, #1
+ mul v17.8h, v3.8h, v0.h[4]
+ mul v18.8h, v4.8h, v0.h[4]
+ sqrdmulh v3.8h, v3.8h, v0.h[3]
+ sqrdmulh v4.8h, v4.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v3.8h, v3.8h, v17.8h
+ sub v4.8h, v4.8h, v18.8h
+ sshr v3.8h, v3.8h, #1
+ sshr v4.8h, v4.8h, #1
+ mul v17.8h, v5.8h, v0.h[4]
+ mul v18.8h, v6.8h, v0.h[4]
+ sqrdmulh v5.8h, v5.8h, v0.h[3]
+ sqrdmulh v6.8h, v6.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v5.8h, v5.8h, v17.8h
+ sub v6.8h, v6.8h, v18.8h
+ sshr v5.8h, v5.8h, #1
+ sshr v6.8h, v6.8h, #1
+ mul v17.8h, v7.8h, v0.h[4]
+ mul v18.8h, v8.8h, v0.h[4]
+ sqrdmulh v7.8h, v7.8h, v0.h[3]
+ sqrdmulh v8.8h, v8.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v7.8h, v7.8h, v17.8h
+ sub v8.8h, v8.8h, v18.8h
+ sshr v7.8h, v7.8h, #1
+ sshr v8.8h, v8.8h, #1
+ mul v17.8h, v9.8h, v0.h[4]
+ mul v18.8h, v10.8h, v0.h[4]
+ sqrdmulh v9.8h, v9.8h, v0.h[3]
+ sqrdmulh v10.8h, v10.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v9.8h, v9.8h, v17.8h
+ sub v10.8h, v10.8h, v18.8h
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v17.8h, v11.8h, v0.h[4]
+ mul v18.8h, v12.8h, v0.h[4]
+ sqrdmulh v11.8h, v11.8h, v0.h[3]
+ sqrdmulh v12.8h, v12.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v11.8h, v11.8h, v17.8h
+ sub v12.8h, v12.8h, v18.8h
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v17.8h, v13.8h, v0.h[4]
+ mul v18.8h, v14.8h, v0.h[4]
+ sqrdmulh v13.8h, v13.8h, v0.h[3]
+ sqrdmulh v14.8h, v14.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v13.8h, v13.8h, v17.8h
+ sub v14.8h, v14.8h, v18.8h
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v17.8h, v15.8h, v0.h[4]
+ mul v18.8h, v16.8h, v0.h[4]
+ sqrdmulh v15.8h, v15.8h, v0.h[3]
+ sqrdmulh v16.8h, v16.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v15.8h, v15.8h, v17.8h
+ sub v16.8h, v16.8h, v18.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ st4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ st4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ sub x0, x0, #0x100
+ mul v17.8h, v1.8h, v0.h[4]
+ mul v18.8h, v2.8h, v0.h[4]
+ sqrdmulh v1.8h, v1.8h, v0.h[3]
+ sqrdmulh v2.8h, v2.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v1.8h, v1.8h, v17.8h
+ sub v2.8h, v2.8h, v18.8h
+ sshr v1.8h, v1.8h, #1
+ sshr v2.8h, v2.8h, #1
+ mul v17.8h, v3.8h, v0.h[4]
+ mul v18.8h, v4.8h, v0.h[4]
+ sqrdmulh v3.8h, v3.8h, v0.h[3]
+ sqrdmulh v4.8h, v4.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v3.8h, v3.8h, v17.8h
+ sub v4.8h, v4.8h, v18.8h
+ sshr v3.8h, v3.8h, #1
+ sshr v4.8h, v4.8h, #1
+ mul v17.8h, v5.8h, v0.h[4]
+ mul v18.8h, v6.8h, v0.h[4]
+ sqrdmulh v5.8h, v5.8h, v0.h[3]
+ sqrdmulh v6.8h, v6.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v5.8h, v5.8h, v17.8h
+ sub v6.8h, v6.8h, v18.8h
+ sshr v5.8h, v5.8h, #1
+ sshr v6.8h, v6.8h, #1
+ mul v17.8h, v7.8h, v0.h[4]
+ mul v18.8h, v8.8h, v0.h[4]
+ sqrdmulh v7.8h, v7.8h, v0.h[3]
+ sqrdmulh v8.8h, v8.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v7.8h, v7.8h, v17.8h
+ sub v8.8h, v8.8h, v18.8h
+ sshr v7.8h, v7.8h, #1
+ sshr v8.8h, v8.8h, #1
+ mul v17.8h, v9.8h, v0.h[4]
+ mul v18.8h, v10.8h, v0.h[4]
+ sqrdmulh v9.8h, v9.8h, v0.h[3]
+ sqrdmulh v10.8h, v10.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v9.8h, v9.8h, v17.8h
+ sub v10.8h, v10.8h, v18.8h
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v17.8h, v11.8h, v0.h[4]
+ mul v18.8h, v12.8h, v0.h[4]
+ sqrdmulh v11.8h, v11.8h, v0.h[3]
+ sqrdmulh v12.8h, v12.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v11.8h, v11.8h, v17.8h
+ sub v12.8h, v12.8h, v18.8h
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v17.8h, v13.8h, v0.h[4]
+ mul v18.8h, v14.8h, v0.h[4]
+ sqrdmulh v13.8h, v13.8h, v0.h[3]
+ sqrdmulh v14.8h, v14.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v13.8h, v13.8h, v17.8h
+ sub v14.8h, v14.8h, v18.8h
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v17.8h, v15.8h, v0.h[4]
+ mul v18.8h, v16.8h, v0.h[4]
+ sqrdmulh v15.8h, v15.8h, v0.h[3]
+ sqrdmulh v16.8h, v16.8h, v0.h[3]
+ sqrdmulh v17.8h, v17.8h, v0.h[0]
+ sqrdmulh v18.8h, v18.8h, v0.h[0]
+ sub v15.8h, v15.8h, v17.8h
+ sub v16.8h, v16.8h, v18.8h
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ st4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ st4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ IF :LNOT::DEF:WOLFSSL_AARCH64_NO_SQRDMLSH
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_to_mont_sqrdmlsh
+mlkem_to_mont_sqrdmlsh PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x1, L_mlkem_aarch64_consts
+ add x1, x1, L_mlkem_aarch64_consts
+ ldr q0, [x1]
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ sub x0, x0, #0x100
+ mul v17.8h, v1.8h, v0.h[4]
+ mul v18.8h, v2.8h, v0.h[4]
+ sqrdmulh v1.8h, v1.8h, v0.h[3]
+ sqrdmulh v2.8h, v2.8h, v0.h[3]
+ sqrdmlsh v1.8h, v17.8h, v0.h[0]
+ sqrdmlsh v2.8h, v18.8h, v0.h[0]
+ sshr v1.8h, v1.8h, #1
+ sshr v2.8h, v2.8h, #1
+ mul v17.8h, v3.8h, v0.h[4]
+ mul v18.8h, v4.8h, v0.h[4]
+ sqrdmulh v3.8h, v3.8h, v0.h[3]
+ sqrdmulh v4.8h, v4.8h, v0.h[3]
+ sqrdmlsh v3.8h, v17.8h, v0.h[0]
+ sqrdmlsh v4.8h, v18.8h, v0.h[0]
+ sshr v3.8h, v3.8h, #1
+ sshr v4.8h, v4.8h, #1
+ mul v17.8h, v5.8h, v0.h[4]
+ mul v18.8h, v6.8h, v0.h[4]
+ sqrdmulh v5.8h, v5.8h, v0.h[3]
+ sqrdmulh v6.8h, v6.8h, v0.h[3]
+ sqrdmlsh v5.8h, v17.8h, v0.h[0]
+ sqrdmlsh v6.8h, v18.8h, v0.h[0]
+ sshr v5.8h, v5.8h, #1
+ sshr v6.8h, v6.8h, #1
+ mul v17.8h, v7.8h, v0.h[4]
+ mul v18.8h, v8.8h, v0.h[4]
+ sqrdmulh v7.8h, v7.8h, v0.h[3]
+ sqrdmulh v8.8h, v8.8h, v0.h[3]
+ sqrdmlsh v7.8h, v17.8h, v0.h[0]
+ sqrdmlsh v8.8h, v18.8h, v0.h[0]
+ sshr v7.8h, v7.8h, #1
+ sshr v8.8h, v8.8h, #1
+ mul v17.8h, v9.8h, v0.h[4]
+ mul v18.8h, v10.8h, v0.h[4]
+ sqrdmulh v9.8h, v9.8h, v0.h[3]
+ sqrdmulh v10.8h, v10.8h, v0.h[3]
+ sqrdmlsh v9.8h, v17.8h, v0.h[0]
+ sqrdmlsh v10.8h, v18.8h, v0.h[0]
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v17.8h, v11.8h, v0.h[4]
+ mul v18.8h, v12.8h, v0.h[4]
+ sqrdmulh v11.8h, v11.8h, v0.h[3]
+ sqrdmulh v12.8h, v12.8h, v0.h[3]
+ sqrdmlsh v11.8h, v17.8h, v0.h[0]
+ sqrdmlsh v12.8h, v18.8h, v0.h[0]
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v17.8h, v13.8h, v0.h[4]
+ mul v18.8h, v14.8h, v0.h[4]
+ sqrdmulh v13.8h, v13.8h, v0.h[3]
+ sqrdmulh v14.8h, v14.8h, v0.h[3]
+ sqrdmlsh v13.8h, v17.8h, v0.h[0]
+ sqrdmlsh v14.8h, v18.8h, v0.h[0]
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v17.8h, v15.8h, v0.h[4]
+ mul v18.8h, v16.8h, v0.h[4]
+ sqrdmulh v15.8h, v15.8h, v0.h[3]
+ sqrdmulh v16.8h, v16.8h, v0.h[3]
+ sqrdmlsh v15.8h, v17.8h, v0.h[0]
+ sqrdmlsh v16.8h, v18.8h, v0.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ st4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ st4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ ld4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ ld4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ ld4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ ld4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ sub x0, x0, #0x100
+ mul v17.8h, v1.8h, v0.h[4]
+ mul v18.8h, v2.8h, v0.h[4]
+ sqrdmulh v1.8h, v1.8h, v0.h[3]
+ sqrdmulh v2.8h, v2.8h, v0.h[3]
+ sqrdmlsh v1.8h, v17.8h, v0.h[0]
+ sqrdmlsh v2.8h, v18.8h, v0.h[0]
+ sshr v1.8h, v1.8h, #1
+ sshr v2.8h, v2.8h, #1
+ mul v17.8h, v3.8h, v0.h[4]
+ mul v18.8h, v4.8h, v0.h[4]
+ sqrdmulh v3.8h, v3.8h, v0.h[3]
+ sqrdmulh v4.8h, v4.8h, v0.h[3]
+ sqrdmlsh v3.8h, v17.8h, v0.h[0]
+ sqrdmlsh v4.8h, v18.8h, v0.h[0]
+ sshr v3.8h, v3.8h, #1
+ sshr v4.8h, v4.8h, #1
+ mul v17.8h, v5.8h, v0.h[4]
+ mul v18.8h, v6.8h, v0.h[4]
+ sqrdmulh v5.8h, v5.8h, v0.h[3]
+ sqrdmulh v6.8h, v6.8h, v0.h[3]
+ sqrdmlsh v5.8h, v17.8h, v0.h[0]
+ sqrdmlsh v6.8h, v18.8h, v0.h[0]
+ sshr v5.8h, v5.8h, #1
+ sshr v6.8h, v6.8h, #1
+ mul v17.8h, v7.8h, v0.h[4]
+ mul v18.8h, v8.8h, v0.h[4]
+ sqrdmulh v7.8h, v7.8h, v0.h[3]
+ sqrdmulh v8.8h, v8.8h, v0.h[3]
+ sqrdmlsh v7.8h, v17.8h, v0.h[0]
+ sqrdmlsh v8.8h, v18.8h, v0.h[0]
+ sshr v7.8h, v7.8h, #1
+ sshr v8.8h, v8.8h, #1
+ mul v17.8h, v9.8h, v0.h[4]
+ mul v18.8h, v10.8h, v0.h[4]
+ sqrdmulh v9.8h, v9.8h, v0.h[3]
+ sqrdmulh v10.8h, v10.8h, v0.h[3]
+ sqrdmlsh v9.8h, v17.8h, v0.h[0]
+ sqrdmlsh v10.8h, v18.8h, v0.h[0]
+ sshr v9.8h, v9.8h, #1
+ sshr v10.8h, v10.8h, #1
+ mul v17.8h, v11.8h, v0.h[4]
+ mul v18.8h, v12.8h, v0.h[4]
+ sqrdmulh v11.8h, v11.8h, v0.h[3]
+ sqrdmulh v12.8h, v12.8h, v0.h[3]
+ sqrdmlsh v11.8h, v17.8h, v0.h[0]
+ sqrdmlsh v12.8h, v18.8h, v0.h[0]
+ sshr v11.8h, v11.8h, #1
+ sshr v12.8h, v12.8h, #1
+ mul v17.8h, v13.8h, v0.h[4]
+ mul v18.8h, v14.8h, v0.h[4]
+ sqrdmulh v13.8h, v13.8h, v0.h[3]
+ sqrdmulh v14.8h, v14.8h, v0.h[3]
+ sqrdmlsh v13.8h, v17.8h, v0.h[0]
+ sqrdmlsh v14.8h, v18.8h, v0.h[0]
+ sshr v13.8h, v13.8h, #1
+ sshr v14.8h, v14.8h, #1
+ mul v17.8h, v15.8h, v0.h[4]
+ mul v18.8h, v16.8h, v0.h[4]
+ sqrdmulh v15.8h, v15.8h, v0.h[3]
+ sqrdmulh v16.8h, v16.8h, v0.h[3]
+ sqrdmlsh v15.8h, v17.8h, v0.h[0]
+ sqrdmlsh v16.8h, v18.8h, v0.h[0]
+ sshr v15.8h, v15.8h, #1
+ sshr v16.8h, v16.8h, #1
+ st4 {v1.8h, v2.8h, v3.8h, v4.8h}, [x0], #0x40
+ st4 {v5.8h, v6.8h, v7.8h, v8.8h}, [x0], #0x40
+ st4 {v9.8h, v10.8h, v11.8h, v12.8h}, [x0], #0x40
+ st4 {v13.8h, v14.8h, v15.8h, v16.8h}, [x0], #0x40
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_to_msg_low
+ DCW 0x0373, 0x0373, 0x0373, 0x0373, 0x0373, 0x0373, 0x0373, 0x0373
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_to_msg_high
+ DCW 0x09c0, 0x09c0, 0x09c0, 0x09c0, 0x09c0, 0x09c0, 0x09c0, 0x09c0
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_to_msg_bits
+ DCW 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_to_msg_neon
+mlkem_to_msg_neon PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x2, L_mlkem_to_msg_low
+ add x2, x2, L_mlkem_to_msg_low
+ adrp x3, L_mlkem_to_msg_high
+ add x3, x3, L_mlkem_to_msg_high
+ adrp x4, L_mlkem_to_msg_bits
+ add x4, x4, L_mlkem_to_msg_bits
+ ldr q0, [x2]
+ ldr q1, [x3]
+ ldr q26, [x4]
+ ld1 {v2.8h, v3.8h, v4.8h, v5.8h}, [x1], #0x40
+ ld1 {v6.8h, v7.8h, v8.8h, v9.8h}, [x1], #0x40
+ cmge v10.8h, v2.8h, v0.8h
+ cmge v18.8h, v1.8h, v2.8h
+ cmge v11.8h, v3.8h, v0.8h
+ cmge v19.8h, v1.8h, v3.8h
+ cmge v12.8h, v4.8h, v0.8h
+ cmge v20.8h, v1.8h, v4.8h
+ cmge v13.8h, v5.8h, v0.8h
+ cmge v21.8h, v1.8h, v5.8h
+ cmge v14.8h, v6.8h, v0.8h
+ cmge v22.8h, v1.8h, v6.8h
+ cmge v15.8h, v7.8h, v0.8h
+ cmge v23.8h, v1.8h, v7.8h
+ cmge v16.8h, v8.8h, v0.8h
+ cmge v24.8h, v1.8h, v8.8h
+ cmge v17.8h, v9.8h, v0.8h
+ cmge v25.8h, v1.8h, v9.8h
+ and v18.16b, v18.16b, v10.16b
+ and v19.16b, v19.16b, v11.16b
+ and v20.16b, v20.16b, v12.16b
+ and v21.16b, v21.16b, v13.16b
+ and v22.16b, v22.16b, v14.16b
+ and v23.16b, v23.16b, v15.16b
+ and v24.16b, v24.16b, v16.16b
+ and v25.16b, v25.16b, v17.16b
+ and v18.16b, v18.16b, v26.16b
+ and v19.16b, v19.16b, v26.16b
+ and v20.16b, v20.16b, v26.16b
+ and v21.16b, v21.16b, v26.16b
+ and v22.16b, v22.16b, v26.16b
+ and v23.16b, v23.16b, v26.16b
+ and v24.16b, v24.16b, v26.16b
+ and v25.16b, v25.16b, v26.16b
+ addv h18, v18.8h
+ addv h19, v19.8h
+ addv h20, v20.8h
+ addv h21, v21.8h
+ addv h22, v22.8h
+ addv h23, v23.8h
+ addv h24, v24.8h
+ addv h25, v25.8h
+ ins v18.b[1], v19.b[0]
+ ins v18.b[2], v20.b[0]
+ ins v18.b[3], v21.b[0]
+ ins v18.b[4], v22.b[0]
+ ins v18.b[5], v23.b[0]
+ ins v18.b[6], v24.b[0]
+ ins v18.b[7], v25.b[0]
+ st1 {v18.8b}, [x0], #8
+ ld1 {v2.8h, v3.8h, v4.8h, v5.8h}, [x1], #0x40
+ ld1 {v6.8h, v7.8h, v8.8h, v9.8h}, [x1], #0x40
+ cmge v10.8h, v2.8h, v0.8h
+ cmge v18.8h, v1.8h, v2.8h
+ cmge v11.8h, v3.8h, v0.8h
+ cmge v19.8h, v1.8h, v3.8h
+ cmge v12.8h, v4.8h, v0.8h
+ cmge v20.8h, v1.8h, v4.8h
+ cmge v13.8h, v5.8h, v0.8h
+ cmge v21.8h, v1.8h, v5.8h
+ cmge v14.8h, v6.8h, v0.8h
+ cmge v22.8h, v1.8h, v6.8h
+ cmge v15.8h, v7.8h, v0.8h
+ cmge v23.8h, v1.8h, v7.8h
+ cmge v16.8h, v8.8h, v0.8h
+ cmge v24.8h, v1.8h, v8.8h
+ cmge v17.8h, v9.8h, v0.8h
+ cmge v25.8h, v1.8h, v9.8h
+ and v18.16b, v18.16b, v10.16b
+ and v19.16b, v19.16b, v11.16b
+ and v20.16b, v20.16b, v12.16b
+ and v21.16b, v21.16b, v13.16b
+ and v22.16b, v22.16b, v14.16b
+ and v23.16b, v23.16b, v15.16b
+ and v24.16b, v24.16b, v16.16b
+ and v25.16b, v25.16b, v17.16b
+ and v18.16b, v18.16b, v26.16b
+ and v19.16b, v19.16b, v26.16b
+ and v20.16b, v20.16b, v26.16b
+ and v21.16b, v21.16b, v26.16b
+ and v22.16b, v22.16b, v26.16b
+ and v23.16b, v23.16b, v26.16b
+ and v24.16b, v24.16b, v26.16b
+ and v25.16b, v25.16b, v26.16b
+ addv h18, v18.8h
+ addv h19, v19.8h
+ addv h20, v20.8h
+ addv h21, v21.8h
+ addv h22, v22.8h
+ addv h23, v23.8h
+ addv h24, v24.8h
+ addv h25, v25.8h
+ ins v18.b[1], v19.b[0]
+ ins v18.b[2], v20.b[0]
+ ins v18.b[3], v21.b[0]
+ ins v18.b[4], v22.b[0]
+ ins v18.b[5], v23.b[0]
+ ins v18.b[6], v24.b[0]
+ ins v18.b[7], v25.b[0]
+ st1 {v18.8b}, [x0], #8
+ ld1 {v2.8h, v3.8h, v4.8h, v5.8h}, [x1], #0x40
+ ld1 {v6.8h, v7.8h, v8.8h, v9.8h}, [x1], #0x40
+ cmge v10.8h, v2.8h, v0.8h
+ cmge v18.8h, v1.8h, v2.8h
+ cmge v11.8h, v3.8h, v0.8h
+ cmge v19.8h, v1.8h, v3.8h
+ cmge v12.8h, v4.8h, v0.8h
+ cmge v20.8h, v1.8h, v4.8h
+ cmge v13.8h, v5.8h, v0.8h
+ cmge v21.8h, v1.8h, v5.8h
+ cmge v14.8h, v6.8h, v0.8h
+ cmge v22.8h, v1.8h, v6.8h
+ cmge v15.8h, v7.8h, v0.8h
+ cmge v23.8h, v1.8h, v7.8h
+ cmge v16.8h, v8.8h, v0.8h
+ cmge v24.8h, v1.8h, v8.8h
+ cmge v17.8h, v9.8h, v0.8h
+ cmge v25.8h, v1.8h, v9.8h
+ and v18.16b, v18.16b, v10.16b
+ and v19.16b, v19.16b, v11.16b
+ and v20.16b, v20.16b, v12.16b
+ and v21.16b, v21.16b, v13.16b
+ and v22.16b, v22.16b, v14.16b
+ and v23.16b, v23.16b, v15.16b
+ and v24.16b, v24.16b, v16.16b
+ and v25.16b, v25.16b, v17.16b
+ and v18.16b, v18.16b, v26.16b
+ and v19.16b, v19.16b, v26.16b
+ and v20.16b, v20.16b, v26.16b
+ and v21.16b, v21.16b, v26.16b
+ and v22.16b, v22.16b, v26.16b
+ and v23.16b, v23.16b, v26.16b
+ and v24.16b, v24.16b, v26.16b
+ and v25.16b, v25.16b, v26.16b
+ addv h18, v18.8h
+ addv h19, v19.8h
+ addv h20, v20.8h
+ addv h21, v21.8h
+ addv h22, v22.8h
+ addv h23, v23.8h
+ addv h24, v24.8h
+ addv h25, v25.8h
+ ins v18.b[1], v19.b[0]
+ ins v18.b[2], v20.b[0]
+ ins v18.b[3], v21.b[0]
+ ins v18.b[4], v22.b[0]
+ ins v18.b[5], v23.b[0]
+ ins v18.b[6], v24.b[0]
+ ins v18.b[7], v25.b[0]
+ st1 {v18.8b}, [x0], #8
+ ld1 {v2.8h, v3.8h, v4.8h, v5.8h}, [x1], #0x40
+ ld1 {v6.8h, v7.8h, v8.8h, v9.8h}, [x1], #0x40
+ cmge v10.8h, v2.8h, v0.8h
+ cmge v18.8h, v1.8h, v2.8h
+ cmge v11.8h, v3.8h, v0.8h
+ cmge v19.8h, v1.8h, v3.8h
+ cmge v12.8h, v4.8h, v0.8h
+ cmge v20.8h, v1.8h, v4.8h
+ cmge v13.8h, v5.8h, v0.8h
+ cmge v21.8h, v1.8h, v5.8h
+ cmge v14.8h, v6.8h, v0.8h
+ cmge v22.8h, v1.8h, v6.8h
+ cmge v15.8h, v7.8h, v0.8h
+ cmge v23.8h, v1.8h, v7.8h
+ cmge v16.8h, v8.8h, v0.8h
+ cmge v24.8h, v1.8h, v8.8h
+ cmge v17.8h, v9.8h, v0.8h
+ cmge v25.8h, v1.8h, v9.8h
+ and v18.16b, v18.16b, v10.16b
+ and v19.16b, v19.16b, v11.16b
+ and v20.16b, v20.16b, v12.16b
+ and v21.16b, v21.16b, v13.16b
+ and v22.16b, v22.16b, v14.16b
+ and v23.16b, v23.16b, v15.16b
+ and v24.16b, v24.16b, v16.16b
+ and v25.16b, v25.16b, v17.16b
+ and v18.16b, v18.16b, v26.16b
+ and v19.16b, v19.16b, v26.16b
+ and v20.16b, v20.16b, v26.16b
+ and v21.16b, v21.16b, v26.16b
+ and v22.16b, v22.16b, v26.16b
+ and v23.16b, v23.16b, v26.16b
+ and v24.16b, v24.16b, v26.16b
+ and v25.16b, v25.16b, v26.16b
+ addv h18, v18.8h
+ addv h19, v19.8h
+ addv h20, v20.8h
+ addv h21, v21.8h
+ addv h22, v22.8h
+ addv h23, v23.8h
+ addv h24, v24.8h
+ addv h25, v25.8h
+ ins v18.b[1], v19.b[0]
+ ins v18.b[2], v20.b[0]
+ ins v18.b[3], v21.b[0]
+ ins v18.b[4], v22.b[0]
+ ins v18.b[5], v23.b[0]
+ ins v18.b[6], v24.b[0]
+ ins v18.b[7], v25.b[0]
+ st1 {v18.8b}, [x0], #8
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_from_msg_q1half
+ DCW 0x0681, 0x0681, 0x0681, 0x0681, 0x0681, 0x0681, 0x0681, 0x0681
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_from_msg_bits
+ DCB 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
+ DCB 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_from_msg_neon
+mlkem_from_msg_neon PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ adrp x2, L_mlkem_from_msg_q1half
+ add x2, x2, L_mlkem_from_msg_q1half
+ adrp x3, L_mlkem_from_msg_bits
+ add x3, x3, L_mlkem_from_msg_bits
+ ld1 {v2.16b, v3.16b}, [x1]
+ ldr q1, [x2]
+ ldr q0, [x3]
+ dup v4.8b, v2.b[0]
+ dup v5.8b, v2.b[1]
+ dup v6.8b, v2.b[2]
+ dup v7.8b, v2.b[3]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ dup v4.8b, v2.b[4]
+ dup v5.8b, v2.b[5]
+ dup v6.8b, v2.b[6]
+ dup v7.8b, v2.b[7]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ dup v4.8b, v2.b[8]
+ dup v5.8b, v2.b[9]
+ dup v6.8b, v2.b[10]
+ dup v7.8b, v2.b[11]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ dup v4.8b, v2.b[12]
+ dup v5.8b, v2.b[13]
+ dup v6.8b, v2.b[14]
+ dup v7.8b, v2.b[15]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ dup v4.8b, v3.b[0]
+ dup v5.8b, v3.b[1]
+ dup v6.8b, v3.b[2]
+ dup v7.8b, v3.b[3]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ dup v4.8b, v3.b[4]
+ dup v5.8b, v3.b[5]
+ dup v6.8b, v3.b[6]
+ dup v7.8b, v3.b[7]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ dup v4.8b, v3.b[8]
+ dup v5.8b, v3.b[9]
+ dup v6.8b, v3.b[10]
+ dup v7.8b, v3.b[11]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ dup v4.8b, v3.b[12]
+ dup v5.8b, v3.b[13]
+ dup v6.8b, v3.b[14]
+ dup v7.8b, v3.b[15]
+ cmtst v4.8b, v4.8b, v0.8b
+ cmtst v5.8b, v5.8b, v0.8b
+ cmtst v6.8b, v6.8b, v0.8b
+ cmtst v7.8b, v7.8b, v0.8b
+ zip1 v4.16b, v4.16b, v4.16b
+ zip1 v5.16b, v5.16b, v5.16b
+ zip1 v6.16b, v6.16b, v6.16b
+ zip1 v7.16b, v7.16b, v7.16b
+ and v4.16b, v4.16b, v1.16b
+ and v5.16b, v5.16b, v1.16b
+ and v6.16b, v6.16b, v1.16b
+ and v7.16b, v7.16b, v1.16b
+ st1 {v4.8h, v5.8h, v6.8h, v7.8h}, [x0], #0x40
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_cmp_neon
+mlkem_cmp_neon PROC
+ stp x29, x30, [sp, #-48]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v8.16b, v0.16b, v4.16b
+ eor v9.16b, v1.16b, v5.16b
+ eor v10.16b, v2.16b, v6.16b
+ eor v11.16b, v3.16b, v7.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ subs w2, w2, #0x300
+ beq L_mlkem_aarch64_cmp_neon_done
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ subs w2, w2, #0x140
+ beq L_mlkem_aarch64_cmp_neon_done
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [x0], #0x40
+ ld4 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ eor v2.16b, v2.16b, v6.16b
+ eor v3.16b, v3.16b, v7.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+ orr v10.16b, v10.16b, v2.16b
+ orr v11.16b, v11.16b, v3.16b
+ ld2 {v0.16b, v1.16b}, [x0]
+ ld2 {v4.16b, v5.16b}, [x1]
+ eor v0.16b, v0.16b, v4.16b
+ eor v1.16b, v1.16b, v5.16b
+ orr v8.16b, v8.16b, v0.16b
+ orr v9.16b, v9.16b, v1.16b
+L_mlkem_aarch64_cmp_neon_done
+ orr v8.16b, v8.16b, v9.16b
+ orr v10.16b, v10.16b, v11.16b
+ orr v8.16b, v8.16b, v10.16b
+ ext v9.16b, v8.16b, v8.16b, #8
+ orr v8.16b, v8.16b, v9.16b
+ mov x0, v8.d[0]
+ subs x0, x0, xzr
+ csetm w0, ne
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp x29, x30, [sp], #48
+ ret
+ ENDP
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_rej_uniform_mask
+ DCW 0x0fff, 0x0fff, 0x0fff, 0x0fff, 0x0fff, 0x0fff, 0x0fff, 0x0fff
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_rej_uniform_bits
+ DCW 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_mlkem_rej_uniform_indices
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xff, 0xff, 0xff
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x08, 0x09, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x08, 0x09, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x08, 0x09, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ DCB 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d
+ DCB 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ DCB 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff
+ DCB 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
+ DCB 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff
+ DCB 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ DCB 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_rej_uniform_neon
+mlkem_rej_uniform_neon PROC
+ stp x29, x30, [sp, #-64]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ adrp x4, L_mlkem_rej_uniform_mask
+ add x4, x4, L_mlkem_rej_uniform_mask
+ adrp x5, L_mlkem_aarch64_q
+ add x5, x5, L_mlkem_aarch64_q
+ adrp x6, L_mlkem_rej_uniform_bits
+ add x6, x6, L_mlkem_rej_uniform_bits
+ adrp x7, L_mlkem_rej_uniform_indices
+ add x7, x7, L_mlkem_rej_uniform_indices
+ eor v1.16b, v1.16b, v1.16b
+ eor v12.16b, v12.16b, v12.16b
+ eor v13.16b, v13.16b, v13.16b
+ eor x12, x12, x12
+ eor v10.16b, v10.16b, v10.16b
+ eor v11.16b, v11.16b, v11.16b
+ mov x13, #0xd01
+ ldr q0, [x4]
+ ldr q3, [x5]
+ ldr q2, [x6]
+ subs wzr, w1, #0
+ beq L_mlkem_rej_uniform_done
+ subs wzr, w1, #16
+ blt L_mlkem_rej_uniform_loop_4
+L_mlkem_rej_uniform_loop_16
+ ld3 {v4.8b, v5.8b, v6.8b}, [x2], #24
+ zip1 v4.16b, v4.16b, v1.16b
+ zip1 v5.16b, v5.16b, v1.16b
+ zip1 v6.16b, v6.16b, v1.16b
+ shl v7.8h, v5.8h, #8
+ ushr v8.8h, v5.8h, #4
+ shl v6.8h, v6.8h, #4
+ orr v4.16b, v4.16b, v7.16b
+ orr v5.16b, v8.16b, v6.16b
+ and v7.16b, v4.16b, v0.16b
+ and v8.16b, v5.16b, v0.16b
+ zip1 v4.8h, v7.8h, v8.8h
+ zip2 v5.8h, v7.8h, v8.8h
+ cmgt v7.8h, v3.8h, v4.8h
+ cmgt v8.8h, v3.8h, v5.8h
+ ushr v12.8h, v7.8h, #15
+ ushr v13.8h, v8.8h, #15
+ addv h12, v12.8h
+ addv h13, v13.8h
+ mov x10, v12.d[0]
+ mov x11, v13.d[0]
+ and v10.16b, v7.16b, v2.16b
+ and v11.16b, v8.16b, v2.16b
+ addv h10, v10.8h
+ addv h11, v11.8h
+ mov w8, v10.s[0]
+ mov w9, v11.s[0]
+ lsl w8, w8, #4
+ lsl w9, w9, #4
+ ldr q10, [x7, x8]
+ ldr q11, [x7, x9]
+ tbl v7.16b, {v4.16b}, v10.16b
+ tbl v8.16b, {v5.16b}, v11.16b
+ str q7, [x0]
+ add x0, x0, x10, lsl 1
+ add x12, x12, x10
+ str q8, [x0]
+ add x0, x0, x11, lsl 1
+ add x12, x12, x11
+ subs w3, w3, #24
+ beq L_mlkem_rej_uniform_done
+ sub w10, w1, w12
+ subs x10, x10, #16
+ blt L_mlkem_rej_uniform_loop_4
+ b L_mlkem_rej_uniform_loop_16
+L_mlkem_rej_uniform_loop_4
+ subs w10, w1, w12
+ beq L_mlkem_rej_uniform_done
+ subs x10, x10, #4
+ blt L_mlkem_rej_uniform_loop_lt_4
+ ldr x4, [x2], #6
+ lsr x5, x4, #12
+ lsr x6, x4, #24
+ lsr x7, x4, #36
+ and x4, x4, #0xfff
+ and x5, x5, #0xfff
+ and x6, x6, #0xfff
+ and x7, x7, #0xfff
+ strh w4, [x0]
+ subs xzr, x4, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ strh w5, [x0]
+ subs xzr, x5, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ strh w6, [x0]
+ subs xzr, x6, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ strh w7, [x0]
+ subs xzr, x7, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ subs w3, w3, #6
+ beq L_mlkem_rej_uniform_done
+ b L_mlkem_rej_uniform_loop_4
+L_mlkem_rej_uniform_loop_lt_4
+ ldr x4, [x2], #6
+ lsr x5, x4, #12
+ lsr x6, x4, #24
+ lsr x7, x4, #36
+ and x4, x4, #0xfff
+ and x5, x5, #0xfff
+ and x6, x6, #0xfff
+ and x7, x7, #0xfff
+ strh w4, [x0]
+ subs xzr, x4, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ subs wzr, w1, w12
+ beq L_mlkem_rej_uniform_done
+ strh w5, [x0]
+ subs xzr, x5, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ subs wzr, w1, w12
+ beq L_mlkem_rej_uniform_done
+ strh w6, [x0]
+ subs xzr, x6, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ subs wzr, w1, w12
+ beq L_mlkem_rej_uniform_done
+ strh w7, [x0]
+ subs xzr, x7, x13
+ cinc x0, x0, lt
+ cinc x0, x0, lt
+ cinc x12, x12, lt
+ subs wzr, w1, w12
+ beq L_mlkem_rej_uniform_done
+ subs w3, w3, #6
+ beq L_mlkem_rej_uniform_done
+ b L_mlkem_rej_uniform_loop_lt_4
+L_mlkem_rej_uniform_done
+ mov x0, x12
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp x29, x30, [sp], #0x40
+ ret
+ ENDP
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 16
+L_sha3_aarch64_r
+ DCQ 0x0000000000000001, 0x0000000000008082
+ DCQ 0x800000000000808a, 0x8000000080008000
+ DCQ 0x000000000000808b, 0x0000000080000001
+ DCQ 0x8000000080008081, 0x8000000000008009
+ DCQ 0x000000000000008a, 0x0000000000000088
+ DCQ 0x0000000080008009, 0x000000008000000a
+ DCQ 0x000000008000808b, 0x800000000000008b
+ DCQ 0x8000000000008089, 0x8000000000008003
+ DCQ 0x8000000000008002, 0x8000000000000080
+ DCQ 0x000000000000800a, 0x800000008000000a
+ DCQ 0x8000000080008081, 0x8000000000008080
+ DCQ 0x0000000080000001, 0x8000000080008008
+ IF :DEF:WOLFSSL_ARMASM_CRYPTO_SHA3
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_sha3_blocksx3_neon
+mlkem_sha3_blocksx3_neon PROC
+ stp x29, x30, [sp, #-224]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #72]
+ stp x20, x21, [x29, #88]
+ stp x22, x23, [x29, #104]
+ stp x24, x25, [x29, #120]
+ stp x26, x27, [x29, #136]
+ str x28, [x29, #152]
+ stp d8, d9, [x29, #160]
+ stp d10, d11, [x29, #176]
+ stp d12, d13, [x29, #192]
+ stp d14, d15, [x29, #208]
+ adrp x27, L_sha3_aarch64_r
+ add x27, x27, L_sha3_aarch64_r
+ str x0, [x29, #40]
+ ld4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ ld4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ ld4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ ld4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ ld4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ ld4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ ld1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ ld4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ ld4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ ld4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ ld4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ ld4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ ld4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ ld1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ ldp x1, x2, [x0]
+ ldp x3, x4, [x0, #16]
+ ldp x5, x6, [x0, #32]
+ ldp x7, x8, [x0, #48]
+ ldp x9, x10, [x0, #64]
+ ldp x11, x12, [x0, #80]
+ ldp x13, x14, [x0, #96]
+ ldp x15, x16, [x0, #112]
+ ldp x17, x19, [x0, #128]
+ ldp x20, x21, [x0, #144]
+ ldp x22, x23, [x0, #160]
+ ldp x24, x25, [x0, #176]
+ ldr x26, [x0, #192]
+ mov x28, #24
+ ; Start of 24 rounds
+L_SHA3_transform_blocksx3_neon_begin
+ stp x27, x28, [x29, #48]
+ ; Col Mix
+ eor3 v31.16b, v0.16b, v5.16b, v10.16b
+ eor x0, x5, x10
+ eor3 v27.16b, v1.16b, v6.16b, v11.16b
+ eor x30, x1, x6
+ eor3 v28.16b, v2.16b, v7.16b, v12.16b
+ eor x28, x3, x8
+ eor3 v29.16b, v3.16b, v8.16b, v13.16b
+ eor x0, x0, x15
+ eor3 v30.16b, v4.16b, v9.16b, v14.16b
+ eor x30, x30, x11
+ eor3 v31.16b, v31.16b, v15.16b, v20.16b
+ eor x28, x28, x13
+ eor3 v27.16b, v27.16b, v16.16b, v21.16b
+ eor x0, x0, x21
+ eor3 v28.16b, v28.16b, v17.16b, v22.16b
+ eor x30, x30, x16
+ eor3 v29.16b, v29.16b, v18.16b, v23.16b
+ eor x28, x28, x19
+ eor3 v30.16b, v30.16b, v19.16b, v24.16b
+ eor x0, x0, x26
+ rax1 v25.2d, v30.2d, v27.2d
+ eor x30, x30, x22
+ rax1 v26.2d, v31.2d, v28.2d
+ eor x28, x28, x24
+ rax1 v27.2d, v27.2d, v29.2d
+ str x0, [x29, #32]
+ rax1 v28.2d, v28.2d, v30.2d
+ str x28, [x29, #24]
+ rax1 v29.2d, v29.2d, v31.2d
+ eor x27, x2, x7
+ eor v0.16b, v0.16b, v25.16b
+ xar v30.2d, v1.2d, v26.2d, #63
+ eor x28, x4, x9
+ xar v1.2d, v6.2d, v26.2d, #20
+ eor x27, x27, x12
+ xar v6.2d, v9.2d, v29.2d, #44
+ eor x28, x28, x14
+ xar v9.2d, v22.2d, v27.2d, #3
+ eor x27, x27, x17
+ xar v22.2d, v14.2d, v29.2d, #25
+ eor x28, x28, x20
+ xar v14.2d, v20.2d, v25.2d, #46
+ eor x27, x27, x23
+ xar v20.2d, v2.2d, v27.2d, #2
+ eor x28, x28, x25
+ xar v2.2d, v12.2d, v27.2d, #21
+ eor x0, x0, x27, ror 63
+ xar v12.2d, v13.2d, v28.2d, #39
+ eor x27, x27, x28, ror 63
+ xar v13.2d, v19.2d, v29.2d, #56
+ eor x1, x1, x0
+ xar v19.2d, v23.2d, v28.2d, #8
+ eor x6, x6, x0
+ xar v23.2d, v15.2d, v25.2d, #23
+ eor x11, x11, x0
+ xar v15.2d, v4.2d, v29.2d, #37
+ eor x16, x16, x0
+ xar v4.2d, v24.2d, v29.2d, #50
+ eor x22, x22, x0
+ xar v24.2d, v21.2d, v26.2d, #62
+ eor x3, x3, x27
+ xar v21.2d, v8.2d, v28.2d, #9
+ eor x8, x8, x27
+ xar v8.2d, v16.2d, v26.2d, #19
+ eor x13, x13, x27
+ xar v16.2d, v5.2d, v25.2d, #28
+ eor x19, x19, x27
+ xar v5.2d, v3.2d, v28.2d, #36
+ eor x24, x24, x27
+ xar v3.2d, v18.2d, v28.2d, #43
+ ldr x0, [x29, #32]
+ xar v18.2d, v17.2d, v27.2d, #49
+ ldr x27, [x29, #24]
+ xar v17.2d, v11.2d, v26.2d, #54
+ eor x28, x28, x30, ror 63
+ xar v11.2d, v7.2d, v27.2d, #58
+ eor x30, x30, x27, ror 63
+ xar v7.2d, v10.2d, v25.2d, #61
+ eor x27, x27, x0, ror 63
+ ; Row Mix
+ mov v25.16b, v0.16b
+ eor x5, x5, x28
+ mov v26.16b, v1.16b
+ eor x10, x10, x28
+ bcax v0.16b, v25.16b, v2.16b, v26.16b
+ eor x15, x15, x28
+ bcax v1.16b, v26.16b, v3.16b, v2.16b
+ eor x21, x21, x28
+ bcax v2.16b, v2.16b, v4.16b, v3.16b
+ eor x26, x26, x28
+ bcax v3.16b, v3.16b, v25.16b, v4.16b
+ eor x2, x2, x30
+ bcax v4.16b, v4.16b, v26.16b, v25.16b
+ eor x7, x7, x30
+ mov v25.16b, v5.16b
+ eor x12, x12, x30
+ mov v26.16b, v6.16b
+ eor x17, x17, x30
+ bcax v5.16b, v25.16b, v7.16b, v26.16b
+ eor x23, x23, x30
+ bcax v6.16b, v26.16b, v8.16b, v7.16b
+ eor x4, x4, x27
+ bcax v7.16b, v7.16b, v9.16b, v8.16b
+ eor x9, x9, x27
+ bcax v8.16b, v8.16b, v25.16b, v9.16b
+ eor x14, x14, x27
+ bcax v9.16b, v9.16b, v26.16b, v25.16b
+ eor x20, x20, x27
+ mov v26.16b, v11.16b
+ eor x25, x25, x27
+ ; Swap Rotate Base
+ bcax v10.16b, v30.16b, v12.16b, v26.16b
+ ror x0, x2, #63
+ bcax v11.16b, v26.16b, v13.16b, v12.16b
+ ror x2, x7, #20
+ bcax v12.16b, v12.16b, v14.16b, v13.16b
+ ror x7, x10, #44
+ bcax v13.16b, v13.16b, v30.16b, v14.16b
+ ror x10, x24, #3
+ bcax v14.16b, v14.16b, v26.16b, v30.16b
+ ror x24, x15, #25
+ mov v25.16b, v15.16b
+ ror x15, x22, #46
+ mov v26.16b, v16.16b
+ ror x22, x3, #2
+ bcax v15.16b, v25.16b, v17.16b, v26.16b
+ ror x3, x13, #21
+ bcax v16.16b, v26.16b, v18.16b, v17.16b
+ ror x13, x14, #39
+ bcax v17.16b, v17.16b, v19.16b, v18.16b
+ ror x14, x21, #56
+ bcax v18.16b, v18.16b, v25.16b, v19.16b
+ ror x21, x25, #8
+ bcax v19.16b, v19.16b, v26.16b, v25.16b
+ ror x25, x16, #23
+ mov v25.16b, v20.16b
+ ror x16, x5, #37
+ mov v26.16b, v21.16b
+ ror x5, x26, #50
+ bcax v20.16b, v25.16b, v22.16b, v26.16b
+ ror x26, x23, #62
+ bcax v21.16b, v26.16b, v23.16b, v22.16b
+ ror x23, x9, #9
+ bcax v22.16b, v22.16b, v24.16b, v23.16b
+ ror x9, x17, #19
+ bcax v23.16b, v23.16b, v25.16b, v24.16b
+ ror x17, x6, #28
+ bcax v24.16b, v24.16b, v26.16b, v25.16b
+ ror x6, x4, #36
+ ror x4, x20, #43
+ ror x20, x19, #49
+ ror x19, x12, #54
+ ror x12, x8, #58
+ ror x8, x11, #61
+ ; Row Mix Base
+ bic x11, x3, x2
+ bic x27, x4, x3
+ bic x28, x1, x5
+ bic x30, x2, x1
+ eor x1, x1, x11
+ eor x2, x2, x27
+ bic x11, x5, x4
+ eor x4, x4, x28
+ eor x3, x3, x11
+ eor x5, x5, x30
+ bic x11, x8, x7
+ bic x27, x9, x8
+ bic x28, x6, x10
+ bic x30, x7, x6
+ eor x6, x6, x11
+ eor x7, x7, x27
+ bic x11, x10, x9
+ eor x9, x9, x28
+ eor x8, x8, x11
+ eor x10, x10, x30
+ bic x11, x13, x12
+ bic x27, x14, x13
+ bic x28, x0, x15
+ bic x30, x12, x0
+ eor x11, x0, x11
+ eor x12, x12, x27
+ bic x0, x15, x14
+ eor x14, x14, x28
+ eor x13, x13, x0
+ eor x15, x15, x30
+ bic x0, x19, x17
+ bic x27, x20, x19
+ bic x28, x16, x21
+ bic x30, x17, x16
+ eor x16, x16, x0
+ eor x17, x17, x27
+ bic x0, x21, x20
+ eor x20, x20, x28
+ eor x19, x19, x0
+ eor x21, x21, x30
+ bic x0, x24, x23
+ bic x27, x25, x24
+ bic x28, x22, x26
+ bic x30, x23, x22
+ eor x22, x22, x0
+ eor x23, x23, x27
+ bic x0, x26, x25
+ eor x25, x25, x28
+ eor x24, x24, x0
+ eor x26, x26, x30
+ ; Done transforming
+ ldp x27, x28, [x29, #48]
+ ldr x0, [x27], #8
+ subs x28, x28, #1
+ mov v30.d[0], x0
+ mov v30.d[1], x0
+ eor x1, x1, x0
+ eor v0.16b, v0.16b, v30.16b
+ bne L_SHA3_transform_blocksx3_neon_begin
+ ldr x0, [x29, #40]
+ st4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ st1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ st4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ st1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ stp x1, x2, [x0]
+ stp x3, x4, [x0, #16]
+ stp x5, x6, [x0, #32]
+ stp x7, x8, [x0, #48]
+ stp x9, x10, [x0, #64]
+ stp x11, x12, [x0, #80]
+ stp x13, x14, [x0, #96]
+ stp x15, x16, [x0, #112]
+ stp x17, x19, [x0, #128]
+ stp x20, x21, [x0, #144]
+ stp x22, x23, [x0, #160]
+ stp x24, x25, [x0, #176]
+ str x26, [x0, #192]
+ ldp x17, x19, [x29, #72]
+ ldp x20, x21, [x29, #88]
+ ldp x22, x23, [x29, #104]
+ ldp x24, x25, [x29, #120]
+ ldp x26, x27, [x29, #136]
+ ldr x28, [x29, #152]
+ ldp d8, d9, [x29, #160]
+ ldp d10, d11, [x29, #176]
+ ldp d12, d13, [x29, #192]
+ ldp d14, d15, [x29, #208]
+ ldp x29, x30, [sp], #0xe0
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_shake128_blocksx3_seed_neon
+mlkem_shake128_blocksx3_seed_neon PROC
+ stp x29, x30, [sp, #-224]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #72]
+ stp x20, x21, [x29, #88]
+ stp x22, x23, [x29, #104]
+ stp x24, x25, [x29, #120]
+ stp x26, x27, [x29, #136]
+ str x28, [x29, #152]
+ stp d8, d9, [x29, #160]
+ stp d10, d11, [x29, #176]
+ stp d12, d13, [x29, #192]
+ stp d14, d15, [x29, #208]
+ adrp x28, L_sha3_aarch64_r
+ add x28, x28, L_sha3_aarch64_r
+ str x0, [x29, #40]
+ add x0, x0, #32
+ ld1 {v4.d}[0], [x0]
+ ldp x2, x3, [x1], #16
+ add x0, x0, #0xc8
+ ld1 {v4.d}[1], [x0]
+ ldp x4, x5, [x1], #16
+ ldr x6, [x0, #200]
+ eor v5.16b, v5.16b, v5.16b
+ eor x7, x7, x7
+ eor v6.16b, v6.16b, v6.16b
+ eor x8, x8, x8
+ eor v7.16b, v7.16b, v7.16b
+ eor x9, x9, x9
+ eor v8.16b, v8.16b, v8.16b
+ eor x10, x10, x10
+ eor v9.16b, v9.16b, v9.16b
+ eor x11, x11, x11
+ eor v10.16b, v10.16b, v10.16b
+ eor x12, x12, x12
+ eor v11.16b, v11.16b, v11.16b
+ eor x13, x13, x13
+ eor v12.16b, v12.16b, v12.16b
+ eor x14, x14, x14
+ eor v13.16b, v13.16b, v13.16b
+ eor x15, x15, x15
+ eor v14.16b, v14.16b, v14.16b
+ eor x16, x16, x16
+ eor v15.16b, v15.16b, v15.16b
+ eor x17, x17, x17
+ eor v16.16b, v16.16b, v16.16b
+ eor x19, x19, x19
+ eor v17.16b, v17.16b, v17.16b
+ eor x20, x20, x20
+ eor v18.16b, v18.16b, v18.16b
+ eor x21, x21, x21
+ eor v19.16b, v19.16b, v19.16b
+ eor x22, x22, x22
+ movz x23, #0x8000, lsl 48
+ eor v21.16b, v21.16b, v21.16b
+ eor x24, x24, x24
+ eor v22.16b, v22.16b, v22.16b
+ eor x25, x25, x25
+ eor v23.16b, v23.16b, v23.16b
+ eor x26, x26, x26
+ eor v24.16b, v24.16b, v24.16b
+ eor x27, x27, x27
+ dup v0.2d, x2
+ dup v1.2d, x3
+ dup v2.2d, x4
+ dup v3.2d, x5
+ dup v20.2d, x23
+ mov x1, #24
+ ; Start of 24 rounds
+L_SHA3_shake128_blocksx3_seed_neon_begin
+ stp x28, x1, [x29, #48]
+ ; Col Mix
+ eor3 v31.16b, v0.16b, v5.16b, v10.16b
+ eor x0, x6, x11
+ eor3 v27.16b, v1.16b, v6.16b, v11.16b
+ eor x30, x2, x7
+ eor3 v28.16b, v2.16b, v7.16b, v12.16b
+ eor x28, x4, x9
+ eor3 v29.16b, v3.16b, v8.16b, v13.16b
+ eor x0, x0, x16
+ eor3 v30.16b, v4.16b, v9.16b, v14.16b
+ eor x30, x30, x12
+ eor3 v31.16b, v31.16b, v15.16b, v20.16b
+ eor x28, x28, x14
+ eor3 v27.16b, v27.16b, v16.16b, v21.16b
+ eor x0, x0, x22
+ eor3 v28.16b, v28.16b, v17.16b, v22.16b
+ eor x30, x30, x17
+ eor3 v29.16b, v29.16b, v18.16b, v23.16b
+ eor x28, x28, x20
+ eor3 v30.16b, v30.16b, v19.16b, v24.16b
+ eor x0, x0, x27
+ rax1 v25.2d, v30.2d, v27.2d
+ eor x30, x30, x23
+ rax1 v26.2d, v31.2d, v28.2d
+ eor x28, x28, x25
+ rax1 v27.2d, v27.2d, v29.2d
+ str x0, [x29, #32]
+ rax1 v28.2d, v28.2d, v30.2d
+ str x28, [x29, #24]
+ rax1 v29.2d, v29.2d, v31.2d
+ eor x1, x3, x8
+ eor v0.16b, v0.16b, v25.16b
+ xar v30.2d, v1.2d, v26.2d, #63
+ eor x28, x5, x10
+ xar v1.2d, v6.2d, v26.2d, #20
+ eor x1, x1, x13
+ xar v6.2d, v9.2d, v29.2d, #44
+ eor x28, x28, x15
+ xar v9.2d, v22.2d, v27.2d, #3
+ eor x1, x1, x19
+ xar v22.2d, v14.2d, v29.2d, #25
+ eor x28, x28, x21
+ xar v14.2d, v20.2d, v25.2d, #46
+ eor x1, x1, x24
+ xar v20.2d, v2.2d, v27.2d, #2
+ eor x28, x28, x26
+ xar v2.2d, v12.2d, v27.2d, #21
+ eor x0, x0, x1, ror 63
+ xar v12.2d, v13.2d, v28.2d, #39
+ eor x1, x1, x28, ror 63
+ xar v13.2d, v19.2d, v29.2d, #56
+ eor x2, x2, x0
+ xar v19.2d, v23.2d, v28.2d, #8
+ eor x7, x7, x0
+ xar v23.2d, v15.2d, v25.2d, #23
+ eor x12, x12, x0
+ xar v15.2d, v4.2d, v29.2d, #37
+ eor x17, x17, x0
+ xar v4.2d, v24.2d, v29.2d, #50
+ eor x23, x23, x0
+ xar v24.2d, v21.2d, v26.2d, #62
+ eor x4, x4, x1
+ xar v21.2d, v8.2d, v28.2d, #9
+ eor x9, x9, x1
+ xar v8.2d, v16.2d, v26.2d, #19
+ eor x14, x14, x1
+ xar v16.2d, v5.2d, v25.2d, #28
+ eor x20, x20, x1
+ xar v5.2d, v3.2d, v28.2d, #36
+ eor x25, x25, x1
+ xar v3.2d, v18.2d, v28.2d, #43
+ ldr x0, [x29, #32]
+ xar v18.2d, v17.2d, v27.2d, #49
+ ldr x1, [x29, #24]
+ xar v17.2d, v11.2d, v26.2d, #54
+ eor x28, x28, x30, ror 63
+ xar v11.2d, v7.2d, v27.2d, #58
+ eor x30, x30, x1, ror 63
+ xar v7.2d, v10.2d, v25.2d, #61
+ eor x1, x1, x0, ror 63
+ ; Row Mix
+ mov v25.16b, v0.16b
+ eor x6, x6, x28
+ mov v26.16b, v1.16b
+ eor x11, x11, x28
+ bcax v0.16b, v25.16b, v2.16b, v26.16b
+ eor x16, x16, x28
+ bcax v1.16b, v26.16b, v3.16b, v2.16b
+ eor x22, x22, x28
+ bcax v2.16b, v2.16b, v4.16b, v3.16b
+ eor x27, x27, x28
+ bcax v3.16b, v3.16b, v25.16b, v4.16b
+ eor x3, x3, x30
+ bcax v4.16b, v4.16b, v26.16b, v25.16b
+ eor x8, x8, x30
+ mov v25.16b, v5.16b
+ eor x13, x13, x30
+ mov v26.16b, v6.16b
+ eor x19, x19, x30
+ bcax v5.16b, v25.16b, v7.16b, v26.16b
+ eor x24, x24, x30
+ bcax v6.16b, v26.16b, v8.16b, v7.16b
+ eor x5, x5, x1
+ bcax v7.16b, v7.16b, v9.16b, v8.16b
+ eor x10, x10, x1
+ bcax v8.16b, v8.16b, v25.16b, v9.16b
+ eor x15, x15, x1
+ bcax v9.16b, v9.16b, v26.16b, v25.16b
+ eor x21, x21, x1
+ mov v26.16b, v11.16b
+ eor x26, x26, x1
+ ; Swap Rotate Base
+ bcax v10.16b, v30.16b, v12.16b, v26.16b
+ ror x0, x3, #63
+ bcax v11.16b, v26.16b, v13.16b, v12.16b
+ ror x3, x8, #20
+ bcax v12.16b, v12.16b, v14.16b, v13.16b
+ ror x8, x11, #44
+ bcax v13.16b, v13.16b, v30.16b, v14.16b
+ ror x11, x25, #3
+ bcax v14.16b, v14.16b, v26.16b, v30.16b
+ ror x25, x16, #25
+ mov v25.16b, v15.16b
+ ror x16, x23, #46
+ mov v26.16b, v16.16b
+ ror x23, x4, #2
+ bcax v15.16b, v25.16b, v17.16b, v26.16b
+ ror x4, x14, #21
+ bcax v16.16b, v26.16b, v18.16b, v17.16b
+ ror x14, x15, #39
+ bcax v17.16b, v17.16b, v19.16b, v18.16b
+ ror x15, x22, #56
+ bcax v18.16b, v18.16b, v25.16b, v19.16b
+ ror x22, x26, #8
+ bcax v19.16b, v19.16b, v26.16b, v25.16b
+ ror x26, x17, #23
+ mov v25.16b, v20.16b
+ ror x17, x6, #37
+ mov v26.16b, v21.16b
+ ror x6, x27, #50
+ bcax v20.16b, v25.16b, v22.16b, v26.16b
+ ror x27, x24, #62
+ bcax v21.16b, v26.16b, v23.16b, v22.16b
+ ror x24, x10, #9
+ bcax v22.16b, v22.16b, v24.16b, v23.16b
+ ror x10, x19, #19
+ bcax v23.16b, v23.16b, v25.16b, v24.16b
+ ror x19, x7, #28
+ bcax v24.16b, v24.16b, v26.16b, v25.16b
+ ror x7, x5, #36
+ ror x5, x21, #43
+ ror x21, x20, #49
+ ror x20, x13, #54
+ ror x13, x9, #58
+ ror x9, x12, #61
+ ; Row Mix Base
+ bic x12, x4, x3
+ bic x1, x5, x4
+ bic x28, x2, x6
+ bic x30, x3, x2
+ eor x2, x2, x12
+ eor x3, x3, x1
+ bic x12, x6, x5
+ eor x5, x5, x28
+ eor x4, x4, x12
+ eor x6, x6, x30
+ bic x12, x9, x8
+ bic x1, x10, x9
+ bic x28, x7, x11
+ bic x30, x8, x7
+ eor x7, x7, x12
+ eor x8, x8, x1
+ bic x12, x11, x10
+ eor x10, x10, x28
+ eor x9, x9, x12
+ eor x11, x11, x30
+ bic x12, x14, x13
+ bic x1, x15, x14
+ bic x28, x0, x16
+ bic x30, x13, x0
+ eor x12, x0, x12
+ eor x13, x13, x1
+ bic x0, x16, x15
+ eor x15, x15, x28
+ eor x14, x14, x0
+ eor x16, x16, x30
+ bic x0, x20, x19
+ bic x1, x21, x20
+ bic x28, x17, x22
+ bic x30, x19, x17
+ eor x17, x17, x0
+ eor x19, x19, x1
+ bic x0, x22, x21
+ eor x21, x21, x28
+ eor x20, x20, x0
+ eor x22, x22, x30
+ bic x0, x25, x24
+ bic x1, x26, x25
+ bic x28, x23, x27
+ bic x30, x24, x23
+ eor x23, x23, x0
+ eor x24, x24, x1
+ bic x0, x27, x26
+ eor x26, x26, x28
+ eor x25, x25, x0
+ eor x27, x27, x30
+ ; Done transforming
+ ldp x28, x1, [x29, #48]
+ ldr x0, [x28], #8
+ subs x1, x1, #1
+ mov v30.d[0], x0
+ mov v30.d[1], x0
+ eor x2, x2, x0
+ eor v0.16b, v0.16b, v30.16b
+ bne L_SHA3_shake128_blocksx3_seed_neon_begin
+ ldr x0, [x29, #40]
+ st4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ st1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ st4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ st1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ stp x6, x7, [x0, #32]
+ stp x8, x9, [x0, #48]
+ stp x10, x11, [x0, #64]
+ stp x12, x13, [x0, #80]
+ stp x14, x15, [x0, #96]
+ stp x16, x17, [x0, #112]
+ stp x19, x20, [x0, #128]
+ stp x21, x22, [x0, #144]
+ stp x23, x24, [x0, #160]
+ stp x25, x26, [x0, #176]
+ str x27, [x0, #192]
+ ldp x17, x19, [x29, #72]
+ ldp x20, x21, [x29, #88]
+ ldp x22, x23, [x29, #104]
+ ldp x24, x25, [x29, #120]
+ ldp x26, x27, [x29, #136]
+ ldr x28, [x29, #152]
+ ldp d8, d9, [x29, #160]
+ ldp d10, d11, [x29, #176]
+ ldp d12, d13, [x29, #192]
+ ldp d14, d15, [x29, #208]
+ ldp x29, x30, [sp], #0xe0
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_shake256_blocksx3_seed_neon
+mlkem_shake256_blocksx3_seed_neon PROC
+ stp x29, x30, [sp, #-224]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #72]
+ stp x20, x21, [x29, #88]
+ stp x22, x23, [x29, #104]
+ stp x24, x25, [x29, #120]
+ stp x26, x27, [x29, #136]
+ str x28, [x29, #152]
+ stp d8, d9, [x29, #160]
+ stp d10, d11, [x29, #176]
+ stp d12, d13, [x29, #192]
+ stp d14, d15, [x29, #208]
+ adrp x28, L_sha3_aarch64_r
+ add x28, x28, L_sha3_aarch64_r
+ str x0, [x29, #40]
+ add x0, x0, #32
+ ld1 {v4.d}[0], [x0]
+ ldp x2, x3, [x1], #16
+ add x0, x0, #0xc8
+ ld1 {v4.d}[1], [x0]
+ ldp x4, x5, [x1], #16
+ ldr x6, [x0, #200]
+ eor v5.16b, v5.16b, v5.16b
+ eor x7, x7, x7
+ eor v6.16b, v6.16b, v6.16b
+ eor x8, x8, x8
+ eor v7.16b, v7.16b, v7.16b
+ eor x9, x9, x9
+ eor v8.16b, v8.16b, v8.16b
+ eor x10, x10, x10
+ eor v9.16b, v9.16b, v9.16b
+ eor x11, x11, x11
+ eor v10.16b, v10.16b, v10.16b
+ eor x12, x12, x12
+ eor v11.16b, v11.16b, v11.16b
+ eor x13, x13, x13
+ eor v12.16b, v12.16b, v12.16b
+ eor x14, x14, x14
+ eor v13.16b, v13.16b, v13.16b
+ eor x15, x15, x15
+ eor v14.16b, v14.16b, v14.16b
+ eor x16, x16, x16
+ eor v15.16b, v15.16b, v15.16b
+ eor x17, x17, x17
+ movz x19, #0x8000, lsl 48
+ eor v17.16b, v17.16b, v17.16b
+ eor x20, x20, x20
+ eor v18.16b, v18.16b, v18.16b
+ eor x21, x21, x21
+ eor v19.16b, v19.16b, v19.16b
+ eor x22, x22, x22
+ eor v20.16b, v20.16b, v20.16b
+ eor x23, x23, x23
+ eor v21.16b, v21.16b, v21.16b
+ eor x24, x24, x24
+ eor v22.16b, v22.16b, v22.16b
+ eor x25, x25, x25
+ eor v23.16b, v23.16b, v23.16b
+ eor x26, x26, x26
+ eor v24.16b, v24.16b, v24.16b
+ eor x27, x27, x27
+ dup v0.2d, x2
+ dup v1.2d, x3
+ dup v2.2d, x4
+ dup v3.2d, x5
+ dup v16.2d, x19
+ mov x1, #24
+ ; Start of 24 rounds
+L_SHA3_shake256_blocksx3_seed_neon_begin
+ stp x28, x1, [x29, #48]
+ ; Col Mix
+ eor3 v31.16b, v0.16b, v5.16b, v10.16b
+ eor x0, x6, x11
+ eor3 v27.16b, v1.16b, v6.16b, v11.16b
+ eor x30, x2, x7
+ eor3 v28.16b, v2.16b, v7.16b, v12.16b
+ eor x28, x4, x9
+ eor3 v29.16b, v3.16b, v8.16b, v13.16b
+ eor x0, x0, x16
+ eor3 v30.16b, v4.16b, v9.16b, v14.16b
+ eor x30, x30, x12
+ eor3 v31.16b, v31.16b, v15.16b, v20.16b
+ eor x28, x28, x14
+ eor3 v27.16b, v27.16b, v16.16b, v21.16b
+ eor x0, x0, x22
+ eor3 v28.16b, v28.16b, v17.16b, v22.16b
+ eor x30, x30, x17
+ eor3 v29.16b, v29.16b, v18.16b, v23.16b
+ eor x28, x28, x20
+ eor3 v30.16b, v30.16b, v19.16b, v24.16b
+ eor x0, x0, x27
+ rax1 v25.2d, v30.2d, v27.2d
+ eor x30, x30, x23
+ rax1 v26.2d, v31.2d, v28.2d
+ eor x28, x28, x25
+ rax1 v27.2d, v27.2d, v29.2d
+ str x0, [x29, #32]
+ rax1 v28.2d, v28.2d, v30.2d
+ str x28, [x29, #24]
+ rax1 v29.2d, v29.2d, v31.2d
+ eor x1, x3, x8
+ eor v0.16b, v0.16b, v25.16b
+ xar v30.2d, v1.2d, v26.2d, #63
+ eor x28, x5, x10
+ xar v1.2d, v6.2d, v26.2d, #20
+ eor x1, x1, x13
+ xar v6.2d, v9.2d, v29.2d, #44
+ eor x28, x28, x15
+ xar v9.2d, v22.2d, v27.2d, #3
+ eor x1, x1, x19
+ xar v22.2d, v14.2d, v29.2d, #25
+ eor x28, x28, x21
+ xar v14.2d, v20.2d, v25.2d, #46
+ eor x1, x1, x24
+ xar v20.2d, v2.2d, v27.2d, #2
+ eor x28, x28, x26
+ xar v2.2d, v12.2d, v27.2d, #21
+ eor x0, x0, x1, ror 63
+ xar v12.2d, v13.2d, v28.2d, #39
+ eor x1, x1, x28, ror 63
+ xar v13.2d, v19.2d, v29.2d, #56
+ eor x2, x2, x0
+ xar v19.2d, v23.2d, v28.2d, #8
+ eor x7, x7, x0
+ xar v23.2d, v15.2d, v25.2d, #23
+ eor x12, x12, x0
+ xar v15.2d, v4.2d, v29.2d, #37
+ eor x17, x17, x0
+ xar v4.2d, v24.2d, v29.2d, #50
+ eor x23, x23, x0
+ xar v24.2d, v21.2d, v26.2d, #62
+ eor x4, x4, x1
+ xar v21.2d, v8.2d, v28.2d, #9
+ eor x9, x9, x1
+ xar v8.2d, v16.2d, v26.2d, #19
+ eor x14, x14, x1
+ xar v16.2d, v5.2d, v25.2d, #28
+ eor x20, x20, x1
+ xar v5.2d, v3.2d, v28.2d, #36
+ eor x25, x25, x1
+ xar v3.2d, v18.2d, v28.2d, #43
+ ldr x0, [x29, #32]
+ xar v18.2d, v17.2d, v27.2d, #49
+ ldr x1, [x29, #24]
+ xar v17.2d, v11.2d, v26.2d, #54
+ eor x28, x28, x30, ror 63
+ xar v11.2d, v7.2d, v27.2d, #58
+ eor x30, x30, x1, ror 63
+ xar v7.2d, v10.2d, v25.2d, #61
+ eor x1, x1, x0, ror 63
+ ; Row Mix
+ mov v25.16b, v0.16b
+ eor x6, x6, x28
+ mov v26.16b, v1.16b
+ eor x11, x11, x28
+ bcax v0.16b, v25.16b, v2.16b, v26.16b
+ eor x16, x16, x28
+ bcax v1.16b, v26.16b, v3.16b, v2.16b
+ eor x22, x22, x28
+ bcax v2.16b, v2.16b, v4.16b, v3.16b
+ eor x27, x27, x28
+ bcax v3.16b, v3.16b, v25.16b, v4.16b
+ eor x3, x3, x30
+ bcax v4.16b, v4.16b, v26.16b, v25.16b
+ eor x8, x8, x30
+ mov v25.16b, v5.16b
+ eor x13, x13, x30
+ mov v26.16b, v6.16b
+ eor x19, x19, x30
+ bcax v5.16b, v25.16b, v7.16b, v26.16b
+ eor x24, x24, x30
+ bcax v6.16b, v26.16b, v8.16b, v7.16b
+ eor x5, x5, x1
+ bcax v7.16b, v7.16b, v9.16b, v8.16b
+ eor x10, x10, x1
+ bcax v8.16b, v8.16b, v25.16b, v9.16b
+ eor x15, x15, x1
+ bcax v9.16b, v9.16b, v26.16b, v25.16b
+ eor x21, x21, x1
+ mov v26.16b, v11.16b
+ eor x26, x26, x1
+ ; Swap Rotate Base
+ bcax v10.16b, v30.16b, v12.16b, v26.16b
+ ror x0, x3, #63
+ bcax v11.16b, v26.16b, v13.16b, v12.16b
+ ror x3, x8, #20
+ bcax v12.16b, v12.16b, v14.16b, v13.16b
+ ror x8, x11, #44
+ bcax v13.16b, v13.16b, v30.16b, v14.16b
+ ror x11, x25, #3
+ bcax v14.16b, v14.16b, v26.16b, v30.16b
+ ror x25, x16, #25
+ mov v25.16b, v15.16b
+ ror x16, x23, #46
+ mov v26.16b, v16.16b
+ ror x23, x4, #2
+ bcax v15.16b, v25.16b, v17.16b, v26.16b
+ ror x4, x14, #21
+ bcax v16.16b, v26.16b, v18.16b, v17.16b
+ ror x14, x15, #39
+ bcax v17.16b, v17.16b, v19.16b, v18.16b
+ ror x15, x22, #56
+ bcax v18.16b, v18.16b, v25.16b, v19.16b
+ ror x22, x26, #8
+ bcax v19.16b, v19.16b, v26.16b, v25.16b
+ ror x26, x17, #23
+ mov v25.16b, v20.16b
+ ror x17, x6, #37
+ mov v26.16b, v21.16b
+ ror x6, x27, #50
+ bcax v20.16b, v25.16b, v22.16b, v26.16b
+ ror x27, x24, #62
+ bcax v21.16b, v26.16b, v23.16b, v22.16b
+ ror x24, x10, #9
+ bcax v22.16b, v22.16b, v24.16b, v23.16b
+ ror x10, x19, #19
+ bcax v23.16b, v23.16b, v25.16b, v24.16b
+ ror x19, x7, #28
+ bcax v24.16b, v24.16b, v26.16b, v25.16b
+ ror x7, x5, #36
+ ror x5, x21, #43
+ ror x21, x20, #49
+ ror x20, x13, #54
+ ror x13, x9, #58
+ ror x9, x12, #61
+ ; Row Mix Base
+ bic x12, x4, x3
+ bic x1, x5, x4
+ bic x28, x2, x6
+ bic x30, x3, x2
+ eor x2, x2, x12
+ eor x3, x3, x1
+ bic x12, x6, x5
+ eor x5, x5, x28
+ eor x4, x4, x12
+ eor x6, x6, x30
+ bic x12, x9, x8
+ bic x1, x10, x9
+ bic x28, x7, x11
+ bic x30, x8, x7
+ eor x7, x7, x12
+ eor x8, x8, x1
+ bic x12, x11, x10
+ eor x10, x10, x28
+ eor x9, x9, x12
+ eor x11, x11, x30
+ bic x12, x14, x13
+ bic x1, x15, x14
+ bic x28, x0, x16
+ bic x30, x13, x0
+ eor x12, x0, x12
+ eor x13, x13, x1
+ bic x0, x16, x15
+ eor x15, x15, x28
+ eor x14, x14, x0
+ eor x16, x16, x30
+ bic x0, x20, x19
+ bic x1, x21, x20
+ bic x28, x17, x22
+ bic x30, x19, x17
+ eor x17, x17, x0
+ eor x19, x19, x1
+ bic x0, x22, x21
+ eor x21, x21, x28
+ eor x20, x20, x0
+ eor x22, x22, x30
+ bic x0, x25, x24
+ bic x1, x26, x25
+ bic x28, x23, x27
+ bic x30, x24, x23
+ eor x23, x23, x0
+ eor x24, x24, x1
+ bic x0, x27, x26
+ eor x26, x26, x28
+ eor x25, x25, x0
+ eor x27, x27, x30
+ ; Done transforming
+ ldp x28, x1, [x29, #48]
+ ldr x0, [x28], #8
+ subs x1, x1, #1
+ mov v30.d[0], x0
+ mov v30.d[1], x0
+ eor x2, x2, x0
+ eor v0.16b, v0.16b, v30.16b
+ bne L_SHA3_shake256_blocksx3_seed_neon_begin
+ ldr x0, [x29, #40]
+ st4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ st1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ st4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ st1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ stp x6, x7, [x0, #32]
+ stp x8, x9, [x0, #48]
+ stp x10, x11, [x0, #64]
+ stp x12, x13, [x0, #80]
+ stp x14, x15, [x0, #96]
+ stp x16, x17, [x0, #112]
+ stp x19, x20, [x0, #128]
+ stp x21, x22, [x0, #144]
+ stp x23, x24, [x0, #160]
+ stp x25, x26, [x0, #176]
+ str x27, [x0, #192]
+ ldp x17, x19, [x29, #72]
+ ldp x20, x21, [x29, #88]
+ ldp x22, x23, [x29, #104]
+ ldp x24, x25, [x29, #120]
+ ldp x26, x27, [x29, #136]
+ ldr x28, [x29, #152]
+ ldp d8, d9, [x29, #160]
+ ldp d10, d11, [x29, #176]
+ ldp d12, d13, [x29, #192]
+ ldp d14, d15, [x29, #208]
+ ldp x29, x30, [sp], #0xe0
+ ret
+ ENDP
+ ELSE
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_sha3_blocksx3_neon
+mlkem_sha3_blocksx3_neon PROC
+ stp x29, x30, [sp, #-224]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #72]
+ stp x20, x21, [x29, #88]
+ stp x22, x23, [x29, #104]
+ stp x24, x25, [x29, #120]
+ stp x26, x27, [x29, #136]
+ str x28, [x29, #152]
+ stp d8, d9, [x29, #160]
+ stp d10, d11, [x29, #176]
+ stp d12, d13, [x29, #192]
+ stp d14, d15, [x29, #208]
+ adrp x27, L_sha3_aarch64_r
+ add x27, x27, L_sha3_aarch64_r
+ str x0, [x29, #40]
+ ld4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ ld4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ ld4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ ld4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ ld4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ ld4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ ld1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ ld4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ ld4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ ld4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ ld4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ ld4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ ld4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ ld1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ ldp x1, x2, [x0]
+ ldp x3, x4, [x0, #16]
+ ldp x5, x6, [x0, #32]
+ ldp x7, x8, [x0, #48]
+ ldp x9, x10, [x0, #64]
+ ldp x11, x12, [x0, #80]
+ ldp x13, x14, [x0, #96]
+ ldp x15, x16, [x0, #112]
+ ldp x17, x19, [x0, #128]
+ ldp x20, x21, [x0, #144]
+ ldp x22, x23, [x0, #160]
+ ldp x24, x25, [x0, #176]
+ ldr x26, [x0, #192]
+ mov x28, #24
+ ; Start of 24 rounds
+L_SHA3_transform_blocksx3_neon_begin
+ stp x27, x28, [x29, #48]
+ ; Col Mix NEON
+ eor v30.16b, v4.16b, v9.16b
+ eor x0, x5, x10
+ eor v27.16b, v1.16b, v6.16b
+ eor x30, x1, x6
+ eor v30.16b, v30.16b, v14.16b
+ eor x28, x3, x8
+ eor v27.16b, v27.16b, v11.16b
+ eor x0, x0, x15
+ eor v30.16b, v30.16b, v19.16b
+ eor x30, x30, x11
+ eor v27.16b, v27.16b, v16.16b
+ eor x28, x28, x13
+ eor v30.16b, v30.16b, v24.16b
+ eor x0, x0, x21
+ eor v27.16b, v27.16b, v21.16b
+ eor x30, x30, x16
+ ushr v25.2d, v27.2d, #63
+ eor x28, x28, x19
+ sli v25.2d, v27.2d, #1
+ eor x0, x0, x26
+ eor v25.16b, v25.16b, v30.16b
+ eor x30, x30, x22
+ eor v31.16b, v0.16b, v5.16b
+ eor x28, x28, x24
+ eor v28.16b, v2.16b, v7.16b
+ str x0, [x29, #32]
+ eor v31.16b, v31.16b, v10.16b
+ str x28, [x29, #24]
+ eor v28.16b, v28.16b, v12.16b
+ eor x27, x2, x7
+ eor v31.16b, v31.16b, v15.16b
+ eor x28, x4, x9
+ eor v28.16b, v28.16b, v17.16b
+ eor x27, x27, x12
+ eor v31.16b, v31.16b, v20.16b
+ eor x28, x28, x14
+ eor v28.16b, v28.16b, v22.16b
+ eor x27, x27, x17
+ ushr v29.2d, v30.2d, #63
+ eor x28, x28, x20
+ ushr v26.2d, v28.2d, #63
+ eor x27, x27, x23
+ sli v29.2d, v30.2d, #1
+ eor x28, x28, x25
+ sli v26.2d, v28.2d, #1
+ eor x0, x0, x27, ror 63
+ eor v28.16b, v28.16b, v29.16b
+ eor x27, x27, x28, ror 63
+ eor v29.16b, v3.16b, v8.16b
+ eor x1, x1, x0
+ eor v26.16b, v26.16b, v31.16b
+ eor x6, x6, x0
+ eor v29.16b, v29.16b, v13.16b
+ eor x11, x11, x0
+ eor v29.16b, v29.16b, v18.16b
+ eor x16, x16, x0
+ eor v29.16b, v29.16b, v23.16b
+ eor x22, x22, x0
+ ushr v30.2d, v29.2d, #63
+ eor x3, x3, x27
+ sli v30.2d, v29.2d, #1
+ eor x8, x8, x27
+ eor v27.16b, v27.16b, v30.16b
+ eor x13, x13, x27
+ ushr v30.2d, v31.2d, #63
+ eor x19, x19, x27
+ sli v30.2d, v31.2d, #1
+ eor x24, x24, x27
+ eor v29.16b, v29.16b, v30.16b
+ ldr x0, [x29, #32]
+ ; Swap Rotate NEON
+ eor v0.16b, v0.16b, v25.16b
+ eor v31.16b, v1.16b, v26.16b
+ ldr x27, [x29, #24]
+ eor v6.16b, v6.16b, v26.16b
+ eor x28, x28, x30, ror 63
+ ushr v30.2d, v31.2d, #63
+ eor x30, x30, x27, ror 63
+ ushr v1.2d, v6.2d, #20
+ eor x27, x27, x0, ror 63
+ sli v30.2d, v31.2d, #1
+ eor x5, x5, x28
+ sli v1.2d, v6.2d, #44
+ eor x10, x10, x28
+ eor v31.16b, v9.16b, v29.16b
+ eor x15, x15, x28
+ eor v22.16b, v22.16b, v27.16b
+ eor x21, x21, x28
+ ushr v6.2d, v31.2d, #44
+ eor x26, x26, x28
+ ushr v9.2d, v22.2d, #3
+ eor x2, x2, x30
+ sli v6.2d, v31.2d, #20
+ eor x7, x7, x30
+ sli v9.2d, v22.2d, #61
+ eor x12, x12, x30
+ eor v31.16b, v14.16b, v29.16b
+ eor x17, x17, x30
+ eor v20.16b, v20.16b, v25.16b
+ eor x23, x23, x30
+ ushr v22.2d, v31.2d, #25
+ eor x4, x4, x27
+ ushr v14.2d, v20.2d, #46
+ eor x9, x9, x27
+ sli v22.2d, v31.2d, #39
+ eor x14, x14, x27
+ sli v14.2d, v20.2d, #18
+ eor x20, x20, x27
+ eor v31.16b, v2.16b, v27.16b
+ eor x25, x25, x27
+ ; Swap Rotate Base
+ eor v12.16b, v12.16b, v27.16b
+ ror x0, x2, #63
+ ushr v20.2d, v31.2d, #2
+ ror x2, x7, #20
+ ushr v2.2d, v12.2d, #21
+ ror x7, x10, #44
+ sli v20.2d, v31.2d, #62
+ ror x10, x24, #3
+ sli v2.2d, v12.2d, #43
+ ror x24, x15, #25
+ eor v31.16b, v13.16b, v28.16b
+ ror x15, x22, #46
+ eor v19.16b, v19.16b, v29.16b
+ ror x22, x3, #2
+ ushr v12.2d, v31.2d, #39
+ ror x3, x13, #21
+ ushr v13.2d, v19.2d, #56
+ ror x13, x14, #39
+ sli v12.2d, v31.2d, #25
+ ror x14, x21, #56
+ sli v13.2d, v19.2d, #8
+ ror x21, x25, #8
+ eor v31.16b, v23.16b, v28.16b
+ ror x25, x16, #23
+ eor v15.16b, v15.16b, v25.16b
+ ror x16, x5, #37
+ ushr v19.2d, v31.2d, #8
+ ror x5, x26, #50
+ ushr v23.2d, v15.2d, #23
+ ror x26, x23, #62
+ sli v19.2d, v31.2d, #56
+ ror x23, x9, #9
+ sli v23.2d, v15.2d, #41
+ ror x9, x17, #19
+ eor v31.16b, v4.16b, v29.16b
+ ror x17, x6, #28
+ eor v24.16b, v24.16b, v29.16b
+ ror x6, x4, #36
+ ushr v15.2d, v31.2d, #37
+ ror x4, x20, #43
+ ushr v4.2d, v24.2d, #50
+ ror x20, x19, #49
+ sli v15.2d, v31.2d, #27
+ ror x19, x12, #54
+ sli v4.2d, v24.2d, #14
+ ror x12, x8, #58
+ eor v31.16b, v21.16b, v26.16b
+ ror x8, x11, #61
+ ; Row Mix Base
+ eor v8.16b, v8.16b, v28.16b
+ bic x11, x3, x2
+ ushr v24.2d, v31.2d, #62
+ bic x27, x4, x3
+ ushr v21.2d, v8.2d, #9
+ bic x28, x1, x5
+ sli v24.2d, v31.2d, #2
+ bic x30, x2, x1
+ sli v21.2d, v8.2d, #55
+ eor x1, x1, x11
+ eor v31.16b, v16.16b, v26.16b
+ eor x2, x2, x27
+ eor v5.16b, v5.16b, v25.16b
+ bic x11, x5, x4
+ ushr v8.2d, v31.2d, #19
+ eor x4, x4, x28
+ ushr v16.2d, v5.2d, #28
+ eor x3, x3, x11
+ sli v8.2d, v31.2d, #45
+ eor x5, x5, x30
+ sli v16.2d, v5.2d, #36
+ bic x11, x8, x7
+ eor v31.16b, v3.16b, v28.16b
+ bic x27, x9, x8
+ eor v18.16b, v18.16b, v28.16b
+ bic x28, x6, x10
+ ushr v5.2d, v31.2d, #36
+ bic x30, x7, x6
+ ushr v3.2d, v18.2d, #43
+ eor x6, x6, x11
+ sli v5.2d, v31.2d, #28
+ eor x7, x7, x27
+ sli v3.2d, v18.2d, #21
+ bic x11, x10, x9
+ eor v31.16b, v17.16b, v27.16b
+ eor x9, x9, x28
+ eor v11.16b, v11.16b, v26.16b
+ eor x8, x8, x11
+ ushr v18.2d, v31.2d, #49
+ eor x10, x10, x30
+ ushr v17.2d, v11.2d, #54
+ bic x11, x13, x12
+ sli v18.2d, v31.2d, #15
+ bic x27, x14, x13
+ sli v17.2d, v11.2d, #10
+ bic x28, x0, x15
+ eor v31.16b, v7.16b, v27.16b
+ bic x30, x12, x0
+ eor v10.16b, v10.16b, v25.16b
+ eor x11, x0, x11
+ ushr v11.2d, v31.2d, #58
+ eor x12, x12, x27
+ ushr v7.2d, v10.2d, #61
+ bic x0, x15, x14
+ sli v11.2d, v31.2d, #6
+ eor x14, x14, x28
+ sli v7.2d, v10.2d, #3
+ eor x13, x13, x0
+ ; Row Mix NEON
+ bic v25.16b, v2.16b, v1.16b
+ eor x15, x15, x30
+ bic v26.16b, v3.16b, v2.16b
+ bic x0, x19, x17
+ bic v27.16b, v4.16b, v3.16b
+ bic x27, x20, x19
+ bic v28.16b, v0.16b, v4.16b
+ bic x28, x16, x21
+ bic v29.16b, v1.16b, v0.16b
+ bic x30, x17, x16
+ eor v0.16b, v0.16b, v25.16b
+ eor x16, x16, x0
+ eor v1.16b, v1.16b, v26.16b
+ eor x17, x17, x27
+ eor v2.16b, v2.16b, v27.16b
+ bic x0, x21, x20
+ eor v3.16b, v3.16b, v28.16b
+ eor x20, x20, x28
+ eor v4.16b, v4.16b, v29.16b
+ eor x19, x19, x0
+ bic v25.16b, v7.16b, v6.16b
+ eor x21, x21, x30
+ bic v26.16b, v8.16b, v7.16b
+ bic x0, x24, x23
+ bic v27.16b, v9.16b, v8.16b
+ bic x27, x25, x24
+ bic v28.16b, v5.16b, v9.16b
+ bic x28, x22, x26
+ bic v29.16b, v6.16b, v5.16b
+ bic x30, x23, x22
+ eor v5.16b, v5.16b, v25.16b
+ eor x22, x22, x0
+ eor v6.16b, v6.16b, v26.16b
+ eor x23, x23, x27
+ eor v7.16b, v7.16b, v27.16b
+ bic x0, x26, x25
+ eor v8.16b, v8.16b, v28.16b
+ eor x25, x25, x28
+ eor v9.16b, v9.16b, v29.16b
+ eor x24, x24, x0
+ bic v25.16b, v12.16b, v11.16b
+ eor x26, x26, x30
+ bic v26.16b, v13.16b, v12.16b
+ bic v27.16b, v14.16b, v13.16b
+ bic v28.16b, v30.16b, v14.16b
+ bic v29.16b, v11.16b, v30.16b
+ eor v10.16b, v30.16b, v25.16b
+ eor v11.16b, v11.16b, v26.16b
+ eor v12.16b, v12.16b, v27.16b
+ eor v13.16b, v13.16b, v28.16b
+ eor v14.16b, v14.16b, v29.16b
+ bic v25.16b, v17.16b, v16.16b
+ bic v26.16b, v18.16b, v17.16b
+ bic v27.16b, v19.16b, v18.16b
+ bic v28.16b, v15.16b, v19.16b
+ bic v29.16b, v16.16b, v15.16b
+ eor v15.16b, v15.16b, v25.16b
+ eor v16.16b, v16.16b, v26.16b
+ eor v17.16b, v17.16b, v27.16b
+ eor v18.16b, v18.16b, v28.16b
+ eor v19.16b, v19.16b, v29.16b
+ bic v25.16b, v22.16b, v21.16b
+ bic v26.16b, v23.16b, v22.16b
+ bic v27.16b, v24.16b, v23.16b
+ bic v28.16b, v20.16b, v24.16b
+ bic v29.16b, v21.16b, v20.16b
+ eor v20.16b, v20.16b, v25.16b
+ eor v21.16b, v21.16b, v26.16b
+ eor v22.16b, v22.16b, v27.16b
+ eor v23.16b, v23.16b, v28.16b
+ eor v24.16b, v24.16b, v29.16b
+ ; Done transforming
+ ldp x27, x28, [x29, #48]
+ ldr x0, [x27], #8
+ subs x28, x28, #1
+ mov v30.d[0], x0
+ mov v30.d[1], x0
+ eor x1, x1, x0
+ eor v0.16b, v0.16b, v30.16b
+ bne L_SHA3_transform_blocksx3_neon_begin
+ ldr x0, [x29, #40]
+ st4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ st1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ st4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ st1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ stp x1, x2, [x0]
+ stp x3, x4, [x0, #16]
+ stp x5, x6, [x0, #32]
+ stp x7, x8, [x0, #48]
+ stp x9, x10, [x0, #64]
+ stp x11, x12, [x0, #80]
+ stp x13, x14, [x0, #96]
+ stp x15, x16, [x0, #112]
+ stp x17, x19, [x0, #128]
+ stp x20, x21, [x0, #144]
+ stp x22, x23, [x0, #160]
+ stp x24, x25, [x0, #176]
+ str x26, [x0, #192]
+ ldp x17, x19, [x29, #72]
+ ldp x20, x21, [x29, #88]
+ ldp x22, x23, [x29, #104]
+ ldp x24, x25, [x29, #120]
+ ldp x26, x27, [x29, #136]
+ ldr x28, [x29, #152]
+ ldp d8, d9, [x29, #160]
+ ldp d10, d11, [x29, #176]
+ ldp d12, d13, [x29, #192]
+ ldp d14, d15, [x29, #208]
+ ldp x29, x30, [sp], #0xe0
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_shake128_blocksx3_seed_neon
+mlkem_shake128_blocksx3_seed_neon PROC
+ stp x29, x30, [sp, #-224]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #72]
+ stp x20, x21, [x29, #88]
+ stp x22, x23, [x29, #104]
+ stp x24, x25, [x29, #120]
+ stp x26, x27, [x29, #136]
+ str x28, [x29, #152]
+ stp d8, d9, [x29, #160]
+ stp d10, d11, [x29, #176]
+ stp d12, d13, [x29, #192]
+ stp d14, d15, [x29, #208]
+ adrp x28, L_sha3_aarch64_r
+ add x28, x28, L_sha3_aarch64_r
+ str x0, [x29, #40]
+ add x0, x0, #32
+ ld1 {v4.d}[0], [x0]
+ ldp x2, x3, [x1], #16
+ add x0, x0, #0xc8
+ ld1 {v4.d}[1], [x0]
+ ldp x4, x5, [x1], #16
+ ldr x6, [x0, #200]
+ eor v5.16b, v5.16b, v5.16b
+ eor x7, x7, x7
+ eor v6.16b, v6.16b, v6.16b
+ eor x8, x8, x8
+ eor v7.16b, v7.16b, v7.16b
+ eor x9, x9, x9
+ eor v8.16b, v8.16b, v8.16b
+ eor x10, x10, x10
+ eor v9.16b, v9.16b, v9.16b
+ eor x11, x11, x11
+ eor v10.16b, v10.16b, v10.16b
+ eor x12, x12, x12
+ eor v11.16b, v11.16b, v11.16b
+ eor x13, x13, x13
+ eor v12.16b, v12.16b, v12.16b
+ eor x14, x14, x14
+ eor v13.16b, v13.16b, v13.16b
+ eor x15, x15, x15
+ eor v14.16b, v14.16b, v14.16b
+ eor x16, x16, x16
+ eor v15.16b, v15.16b, v15.16b
+ eor x17, x17, x17
+ eor v16.16b, v16.16b, v16.16b
+ eor x19, x19, x19
+ eor v17.16b, v17.16b, v17.16b
+ eor x20, x20, x20
+ eor v18.16b, v18.16b, v18.16b
+ eor x21, x21, x21
+ eor v19.16b, v19.16b, v19.16b
+ eor x22, x22, x22
+ movz x23, #0x8000, lsl 48
+ eor v21.16b, v21.16b, v21.16b
+ eor x24, x24, x24
+ eor v22.16b, v22.16b, v22.16b
+ eor x25, x25, x25
+ eor v23.16b, v23.16b, v23.16b
+ eor x26, x26, x26
+ eor v24.16b, v24.16b, v24.16b
+ eor x27, x27, x27
+ dup v0.2d, x2
+ dup v1.2d, x3
+ dup v2.2d, x4
+ dup v3.2d, x5
+ dup v20.2d, x23
+ mov x1, #24
+ ; Start of 24 rounds
+L_SHA3_shake128_blocksx3_seed_neon_begin
+ stp x28, x1, [x29, #48]
+ ; Col Mix NEON
+ eor v30.16b, v4.16b, v9.16b
+ eor x0, x6, x11
+ eor v27.16b, v1.16b, v6.16b
+ eor x30, x2, x7
+ eor v30.16b, v30.16b, v14.16b
+ eor x28, x4, x9
+ eor v27.16b, v27.16b, v11.16b
+ eor x0, x0, x16
+ eor v30.16b, v30.16b, v19.16b
+ eor x30, x30, x12
+ eor v27.16b, v27.16b, v16.16b
+ eor x28, x28, x14
+ eor v30.16b, v30.16b, v24.16b
+ eor x0, x0, x22
+ eor v27.16b, v27.16b, v21.16b
+ eor x30, x30, x17
+ ushr v25.2d, v27.2d, #63
+ eor x28, x28, x20
+ sli v25.2d, v27.2d, #1
+ eor x0, x0, x27
+ eor v25.16b, v25.16b, v30.16b
+ eor x30, x30, x23
+ eor v31.16b, v0.16b, v5.16b
+ eor x28, x28, x25
+ eor v28.16b, v2.16b, v7.16b
+ str x0, [x29, #32]
+ eor v31.16b, v31.16b, v10.16b
+ str x28, [x29, #24]
+ eor v28.16b, v28.16b, v12.16b
+ eor x1, x3, x8
+ eor v31.16b, v31.16b, v15.16b
+ eor x28, x5, x10
+ eor v28.16b, v28.16b, v17.16b
+ eor x1, x1, x13
+ eor v31.16b, v31.16b, v20.16b
+ eor x28, x28, x15
+ eor v28.16b, v28.16b, v22.16b
+ eor x1, x1, x19
+ ushr v29.2d, v30.2d, #63
+ eor x28, x28, x21
+ ushr v26.2d, v28.2d, #63
+ eor x1, x1, x24
+ sli v29.2d, v30.2d, #1
+ eor x28, x28, x26
+ sli v26.2d, v28.2d, #1
+ eor x0, x0, x1, ror 63
+ eor v28.16b, v28.16b, v29.16b
+ eor x1, x1, x28, ror 63
+ eor v29.16b, v3.16b, v8.16b
+ eor x2, x2, x0
+ eor v26.16b, v26.16b, v31.16b
+ eor x7, x7, x0
+ eor v29.16b, v29.16b, v13.16b
+ eor x12, x12, x0
+ eor v29.16b, v29.16b, v18.16b
+ eor x17, x17, x0
+ eor v29.16b, v29.16b, v23.16b
+ eor x23, x23, x0
+ ushr v30.2d, v29.2d, #63
+ eor x4, x4, x1
+ sli v30.2d, v29.2d, #1
+ eor x9, x9, x1
+ eor v27.16b, v27.16b, v30.16b
+ eor x14, x14, x1
+ ushr v30.2d, v31.2d, #63
+ eor x20, x20, x1
+ sli v30.2d, v31.2d, #1
+ eor x25, x25, x1
+ eor v29.16b, v29.16b, v30.16b
+ ldr x0, [x29, #32]
+ ; Swap Rotate NEON
+ eor v0.16b, v0.16b, v25.16b
+ eor v31.16b, v1.16b, v26.16b
+ ldr x1, [x29, #24]
+ eor v6.16b, v6.16b, v26.16b
+ eor x28, x28, x30, ror 63
+ ushr v30.2d, v31.2d, #63
+ eor x30, x30, x1, ror 63
+ ushr v1.2d, v6.2d, #20
+ eor x1, x1, x0, ror 63
+ sli v30.2d, v31.2d, #1
+ eor x6, x6, x28
+ sli v1.2d, v6.2d, #44
+ eor x11, x11, x28
+ eor v31.16b, v9.16b, v29.16b
+ eor x16, x16, x28
+ eor v22.16b, v22.16b, v27.16b
+ eor x22, x22, x28
+ ushr v6.2d, v31.2d, #44
+ eor x27, x27, x28
+ ushr v9.2d, v22.2d, #3
+ eor x3, x3, x30
+ sli v6.2d, v31.2d, #20
+ eor x8, x8, x30
+ sli v9.2d, v22.2d, #61
+ eor x13, x13, x30
+ eor v31.16b, v14.16b, v29.16b
+ eor x19, x19, x30
+ eor v20.16b, v20.16b, v25.16b
+ eor x24, x24, x30
+ ushr v22.2d, v31.2d, #25
+ eor x5, x5, x1
+ ushr v14.2d, v20.2d, #46
+ eor x10, x10, x1
+ sli v22.2d, v31.2d, #39
+ eor x15, x15, x1
+ sli v14.2d, v20.2d, #18
+ eor x21, x21, x1
+ eor v31.16b, v2.16b, v27.16b
+ eor x26, x26, x1
+ ; Swap Rotate Base
+ eor v12.16b, v12.16b, v27.16b
+ ror x0, x3, #63
+ ushr v20.2d, v31.2d, #2
+ ror x3, x8, #20
+ ushr v2.2d, v12.2d, #21
+ ror x8, x11, #44
+ sli v20.2d, v31.2d, #62
+ ror x11, x25, #3
+ sli v2.2d, v12.2d, #43
+ ror x25, x16, #25
+ eor v31.16b, v13.16b, v28.16b
+ ror x16, x23, #46
+ eor v19.16b, v19.16b, v29.16b
+ ror x23, x4, #2
+ ushr v12.2d, v31.2d, #39
+ ror x4, x14, #21
+ ushr v13.2d, v19.2d, #56
+ ror x14, x15, #39
+ sli v12.2d, v31.2d, #25
+ ror x15, x22, #56
+ sli v13.2d, v19.2d, #8
+ ror x22, x26, #8
+ eor v31.16b, v23.16b, v28.16b
+ ror x26, x17, #23
+ eor v15.16b, v15.16b, v25.16b
+ ror x17, x6, #37
+ ushr v19.2d, v31.2d, #8
+ ror x6, x27, #50
+ ushr v23.2d, v15.2d, #23
+ ror x27, x24, #62
+ sli v19.2d, v31.2d, #56
+ ror x24, x10, #9
+ sli v23.2d, v15.2d, #41
+ ror x10, x19, #19
+ eor v31.16b, v4.16b, v29.16b
+ ror x19, x7, #28
+ eor v24.16b, v24.16b, v29.16b
+ ror x7, x5, #36
+ ushr v15.2d, v31.2d, #37
+ ror x5, x21, #43
+ ushr v4.2d, v24.2d, #50
+ ror x21, x20, #49
+ sli v15.2d, v31.2d, #27
+ ror x20, x13, #54
+ sli v4.2d, v24.2d, #14
+ ror x13, x9, #58
+ eor v31.16b, v21.16b, v26.16b
+ ror x9, x12, #61
+ ; Row Mix Base
+ eor v8.16b, v8.16b, v28.16b
+ bic x12, x4, x3
+ ushr v24.2d, v31.2d, #62
+ bic x1, x5, x4
+ ushr v21.2d, v8.2d, #9
+ bic x28, x2, x6
+ sli v24.2d, v31.2d, #2
+ bic x30, x3, x2
+ sli v21.2d, v8.2d, #55
+ eor x2, x2, x12
+ eor v31.16b, v16.16b, v26.16b
+ eor x3, x3, x1
+ eor v5.16b, v5.16b, v25.16b
+ bic x12, x6, x5
+ ushr v8.2d, v31.2d, #19
+ eor x5, x5, x28
+ ushr v16.2d, v5.2d, #28
+ eor x4, x4, x12
+ sli v8.2d, v31.2d, #45
+ eor x6, x6, x30
+ sli v16.2d, v5.2d, #36
+ bic x12, x9, x8
+ eor v31.16b, v3.16b, v28.16b
+ bic x1, x10, x9
+ eor v18.16b, v18.16b, v28.16b
+ bic x28, x7, x11
+ ushr v5.2d, v31.2d, #36
+ bic x30, x8, x7
+ ushr v3.2d, v18.2d, #43
+ eor x7, x7, x12
+ sli v5.2d, v31.2d, #28
+ eor x8, x8, x1
+ sli v3.2d, v18.2d, #21
+ bic x12, x11, x10
+ eor v31.16b, v17.16b, v27.16b
+ eor x10, x10, x28
+ eor v11.16b, v11.16b, v26.16b
+ eor x9, x9, x12
+ ushr v18.2d, v31.2d, #49
+ eor x11, x11, x30
+ ushr v17.2d, v11.2d, #54
+ bic x12, x14, x13
+ sli v18.2d, v31.2d, #15
+ bic x1, x15, x14
+ sli v17.2d, v11.2d, #10
+ bic x28, x0, x16
+ eor v31.16b, v7.16b, v27.16b
+ bic x30, x13, x0
+ eor v10.16b, v10.16b, v25.16b
+ eor x12, x0, x12
+ ushr v11.2d, v31.2d, #58
+ eor x13, x13, x1
+ ushr v7.2d, v10.2d, #61
+ bic x0, x16, x15
+ sli v11.2d, v31.2d, #6
+ eor x15, x15, x28
+ sli v7.2d, v10.2d, #3
+ eor x14, x14, x0
+ ; Row Mix NEON
+ bic v25.16b, v2.16b, v1.16b
+ eor x16, x16, x30
+ bic v26.16b, v3.16b, v2.16b
+ bic x0, x20, x19
+ bic v27.16b, v4.16b, v3.16b
+ bic x1, x21, x20
+ bic v28.16b, v0.16b, v4.16b
+ bic x28, x17, x22
+ bic v29.16b, v1.16b, v0.16b
+ bic x30, x19, x17
+ eor v0.16b, v0.16b, v25.16b
+ eor x17, x17, x0
+ eor v1.16b, v1.16b, v26.16b
+ eor x19, x19, x1
+ eor v2.16b, v2.16b, v27.16b
+ bic x0, x22, x21
+ eor v3.16b, v3.16b, v28.16b
+ eor x21, x21, x28
+ eor v4.16b, v4.16b, v29.16b
+ eor x20, x20, x0
+ bic v25.16b, v7.16b, v6.16b
+ eor x22, x22, x30
+ bic v26.16b, v8.16b, v7.16b
+ bic x0, x25, x24
+ bic v27.16b, v9.16b, v8.16b
+ bic x1, x26, x25
+ bic v28.16b, v5.16b, v9.16b
+ bic x28, x23, x27
+ bic v29.16b, v6.16b, v5.16b
+ bic x30, x24, x23
+ eor v5.16b, v5.16b, v25.16b
+ eor x23, x23, x0
+ eor v6.16b, v6.16b, v26.16b
+ eor x24, x24, x1
+ eor v7.16b, v7.16b, v27.16b
+ bic x0, x27, x26
+ eor v8.16b, v8.16b, v28.16b
+ eor x26, x26, x28
+ eor v9.16b, v9.16b, v29.16b
+ eor x25, x25, x0
+ bic v25.16b, v12.16b, v11.16b
+ eor x27, x27, x30
+ bic v26.16b, v13.16b, v12.16b
+ bic v27.16b, v14.16b, v13.16b
+ bic v28.16b, v30.16b, v14.16b
+ bic v29.16b, v11.16b, v30.16b
+ eor v10.16b, v30.16b, v25.16b
+ eor v11.16b, v11.16b, v26.16b
+ eor v12.16b, v12.16b, v27.16b
+ eor v13.16b, v13.16b, v28.16b
+ eor v14.16b, v14.16b, v29.16b
+ bic v25.16b, v17.16b, v16.16b
+ bic v26.16b, v18.16b, v17.16b
+ bic v27.16b, v19.16b, v18.16b
+ bic v28.16b, v15.16b, v19.16b
+ bic v29.16b, v16.16b, v15.16b
+ eor v15.16b, v15.16b, v25.16b
+ eor v16.16b, v16.16b, v26.16b
+ eor v17.16b, v17.16b, v27.16b
+ eor v18.16b, v18.16b, v28.16b
+ eor v19.16b, v19.16b, v29.16b
+ bic v25.16b, v22.16b, v21.16b
+ bic v26.16b, v23.16b, v22.16b
+ bic v27.16b, v24.16b, v23.16b
+ bic v28.16b, v20.16b, v24.16b
+ bic v29.16b, v21.16b, v20.16b
+ eor v20.16b, v20.16b, v25.16b
+ eor v21.16b, v21.16b, v26.16b
+ eor v22.16b, v22.16b, v27.16b
+ eor v23.16b, v23.16b, v28.16b
+ eor v24.16b, v24.16b, v29.16b
+ ; Done transforming
+ ldp x28, x1, [x29, #48]
+ ldr x0, [x28], #8
+ subs x1, x1, #1
+ mov v30.d[0], x0
+ mov v30.d[1], x0
+ eor x2, x2, x0
+ eor v0.16b, v0.16b, v30.16b
+ bne L_SHA3_shake128_blocksx3_seed_neon_begin
+ ldr x0, [x29, #40]
+ st4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ st1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ st4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ st1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ stp x6, x7, [x0, #32]
+ stp x8, x9, [x0, #48]
+ stp x10, x11, [x0, #64]
+ stp x12, x13, [x0, #80]
+ stp x14, x15, [x0, #96]
+ stp x16, x17, [x0, #112]
+ stp x19, x20, [x0, #128]
+ stp x21, x22, [x0, #144]
+ stp x23, x24, [x0, #160]
+ stp x25, x26, [x0, #176]
+ str x27, [x0, #192]
+ ldp x17, x19, [x29, #72]
+ ldp x20, x21, [x29, #88]
+ ldp x22, x23, [x29, #104]
+ ldp x24, x25, [x29, #120]
+ ldp x26, x27, [x29, #136]
+ ldr x28, [x29, #152]
+ ldp d8, d9, [x29, #160]
+ ldp d10, d11, [x29, #176]
+ ldp d12, d13, [x29, #192]
+ ldp d14, d15, [x29, #208]
+ ldp x29, x30, [sp], #0xe0
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT mlkem_shake256_blocksx3_seed_neon
+mlkem_shake256_blocksx3_seed_neon PROC
+ stp x29, x30, [sp, #-224]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #72]
+ stp x20, x21, [x29, #88]
+ stp x22, x23, [x29, #104]
+ stp x24, x25, [x29, #120]
+ stp x26, x27, [x29, #136]
+ str x28, [x29, #152]
+ stp d8, d9, [x29, #160]
+ stp d10, d11, [x29, #176]
+ stp d12, d13, [x29, #192]
+ stp d14, d15, [x29, #208]
+ adrp x28, L_sha3_aarch64_r
+ add x28, x28, L_sha3_aarch64_r
+ str x0, [x29, #40]
+ add x0, x0, #32
+ ld1 {v4.d}[0], [x0]
+ ldp x2, x3, [x1], #16
+ add x0, x0, #0xc8
+ ld1 {v4.d}[1], [x0]
+ ldp x4, x5, [x1], #16
+ ldr x6, [x0, #200]
+ eor v5.16b, v5.16b, v5.16b
+ eor x7, x7, x7
+ eor v6.16b, v6.16b, v6.16b
+ eor x8, x8, x8
+ eor v7.16b, v7.16b, v7.16b
+ eor x9, x9, x9
+ eor v8.16b, v8.16b, v8.16b
+ eor x10, x10, x10
+ eor v9.16b, v9.16b, v9.16b
+ eor x11, x11, x11
+ eor v10.16b, v10.16b, v10.16b
+ eor x12, x12, x12
+ eor v11.16b, v11.16b, v11.16b
+ eor x13, x13, x13
+ eor v12.16b, v12.16b, v12.16b
+ eor x14, x14, x14
+ eor v13.16b, v13.16b, v13.16b
+ eor x15, x15, x15
+ eor v14.16b, v14.16b, v14.16b
+ eor x16, x16, x16
+ eor v15.16b, v15.16b, v15.16b
+ eor x17, x17, x17
+ movz x19, #0x8000, lsl 48
+ eor v17.16b, v17.16b, v17.16b
+ eor x20, x20, x20
+ eor v18.16b, v18.16b, v18.16b
+ eor x21, x21, x21
+ eor v19.16b, v19.16b, v19.16b
+ eor x22, x22, x22
+ eor v20.16b, v20.16b, v20.16b
+ eor x23, x23, x23
+ eor v21.16b, v21.16b, v21.16b
+ eor x24, x24, x24
+ eor v22.16b, v22.16b, v22.16b
+ eor x25, x25, x25
+ eor v23.16b, v23.16b, v23.16b
+ eor x26, x26, x26
+ eor v24.16b, v24.16b, v24.16b
+ eor x27, x27, x27
+ dup v0.2d, x2
+ dup v1.2d, x3
+ dup v2.2d, x4
+ dup v3.2d, x5
+ dup v16.2d, x19
+ mov x1, #24
+ ; Start of 24 rounds
+L_SHA3_shake256_blocksx3_seed_neon_begin
+ stp x28, x1, [x29, #48]
+ ; Col Mix NEON
+ eor v30.16b, v4.16b, v9.16b
+ eor x0, x6, x11
+ eor v27.16b, v1.16b, v6.16b
+ eor x30, x2, x7
+ eor v30.16b, v30.16b, v14.16b
+ eor x28, x4, x9
+ eor v27.16b, v27.16b, v11.16b
+ eor x0, x0, x16
+ eor v30.16b, v30.16b, v19.16b
+ eor x30, x30, x12
+ eor v27.16b, v27.16b, v16.16b
+ eor x28, x28, x14
+ eor v30.16b, v30.16b, v24.16b
+ eor x0, x0, x22
+ eor v27.16b, v27.16b, v21.16b
+ eor x30, x30, x17
+ ushr v25.2d, v27.2d, #63
+ eor x28, x28, x20
+ sli v25.2d, v27.2d, #1
+ eor x0, x0, x27
+ eor v25.16b, v25.16b, v30.16b
+ eor x30, x30, x23
+ eor v31.16b, v0.16b, v5.16b
+ eor x28, x28, x25
+ eor v28.16b, v2.16b, v7.16b
+ str x0, [x29, #32]
+ eor v31.16b, v31.16b, v10.16b
+ str x28, [x29, #24]
+ eor v28.16b, v28.16b, v12.16b
+ eor x1, x3, x8
+ eor v31.16b, v31.16b, v15.16b
+ eor x28, x5, x10
+ eor v28.16b, v28.16b, v17.16b
+ eor x1, x1, x13
+ eor v31.16b, v31.16b, v20.16b
+ eor x28, x28, x15
+ eor v28.16b, v28.16b, v22.16b
+ eor x1, x1, x19
+ ushr v29.2d, v30.2d, #63
+ eor x28, x28, x21
+ ushr v26.2d, v28.2d, #63
+ eor x1, x1, x24
+ sli v29.2d, v30.2d, #1
+ eor x28, x28, x26
+ sli v26.2d, v28.2d, #1
+ eor x0, x0, x1, ror 63
+ eor v28.16b, v28.16b, v29.16b
+ eor x1, x1, x28, ror 63
+ eor v29.16b, v3.16b, v8.16b
+ eor x2, x2, x0
+ eor v26.16b, v26.16b, v31.16b
+ eor x7, x7, x0
+ eor v29.16b, v29.16b, v13.16b
+ eor x12, x12, x0
+ eor v29.16b, v29.16b, v18.16b
+ eor x17, x17, x0
+ eor v29.16b, v29.16b, v23.16b
+ eor x23, x23, x0
+ ushr v30.2d, v29.2d, #63
+ eor x4, x4, x1
+ sli v30.2d, v29.2d, #1
+ eor x9, x9, x1
+ eor v27.16b, v27.16b, v30.16b
+ eor x14, x14, x1
+ ushr v30.2d, v31.2d, #63
+ eor x20, x20, x1
+ sli v30.2d, v31.2d, #1
+ eor x25, x25, x1
+ eor v29.16b, v29.16b, v30.16b
+ ldr x0, [x29, #32]
+ ; Swap Rotate NEON
+ eor v0.16b, v0.16b, v25.16b
+ eor v31.16b, v1.16b, v26.16b
+ ldr x1, [x29, #24]
+ eor v6.16b, v6.16b, v26.16b
+ eor x28, x28, x30, ror 63
+ ushr v30.2d, v31.2d, #63
+ eor x30, x30, x1, ror 63
+ ushr v1.2d, v6.2d, #20
+ eor x1, x1, x0, ror 63
+ sli v30.2d, v31.2d, #1
+ eor x6, x6, x28
+ sli v1.2d, v6.2d, #44
+ eor x11, x11, x28
+ eor v31.16b, v9.16b, v29.16b
+ eor x16, x16, x28
+ eor v22.16b, v22.16b, v27.16b
+ eor x22, x22, x28
+ ushr v6.2d, v31.2d, #44
+ eor x27, x27, x28
+ ushr v9.2d, v22.2d, #3
+ eor x3, x3, x30
+ sli v6.2d, v31.2d, #20
+ eor x8, x8, x30
+ sli v9.2d, v22.2d, #61
+ eor x13, x13, x30
+ eor v31.16b, v14.16b, v29.16b
+ eor x19, x19, x30
+ eor v20.16b, v20.16b, v25.16b
+ eor x24, x24, x30
+ ushr v22.2d, v31.2d, #25
+ eor x5, x5, x1
+ ushr v14.2d, v20.2d, #46
+ eor x10, x10, x1
+ sli v22.2d, v31.2d, #39
+ eor x15, x15, x1
+ sli v14.2d, v20.2d, #18
+ eor x21, x21, x1
+ eor v31.16b, v2.16b, v27.16b
+ eor x26, x26, x1
+ ; Swap Rotate Base
+ eor v12.16b, v12.16b, v27.16b
+ ror x0, x3, #63
+ ushr v20.2d, v31.2d, #2
+ ror x3, x8, #20
+ ushr v2.2d, v12.2d, #21
+ ror x8, x11, #44
+ sli v20.2d, v31.2d, #62
+ ror x11, x25, #3
+ sli v2.2d, v12.2d, #43
+ ror x25, x16, #25
+ eor v31.16b, v13.16b, v28.16b
+ ror x16, x23, #46
+ eor v19.16b, v19.16b, v29.16b
+ ror x23, x4, #2
+ ushr v12.2d, v31.2d, #39
+ ror x4, x14, #21
+ ushr v13.2d, v19.2d, #56
+ ror x14, x15, #39
+ sli v12.2d, v31.2d, #25
+ ror x15, x22, #56
+ sli v13.2d, v19.2d, #8
+ ror x22, x26, #8
+ eor v31.16b, v23.16b, v28.16b
+ ror x26, x17, #23
+ eor v15.16b, v15.16b, v25.16b
+ ror x17, x6, #37
+ ushr v19.2d, v31.2d, #8
+ ror x6, x27, #50
+ ushr v23.2d, v15.2d, #23
+ ror x27, x24, #62
+ sli v19.2d, v31.2d, #56
+ ror x24, x10, #9
+ sli v23.2d, v15.2d, #41
+ ror x10, x19, #19
+ eor v31.16b, v4.16b, v29.16b
+ ror x19, x7, #28
+ eor v24.16b, v24.16b, v29.16b
+ ror x7, x5, #36
+ ushr v15.2d, v31.2d, #37
+ ror x5, x21, #43
+ ushr v4.2d, v24.2d, #50
+ ror x21, x20, #49
+ sli v15.2d, v31.2d, #27
+ ror x20, x13, #54
+ sli v4.2d, v24.2d, #14
+ ror x13, x9, #58
+ eor v31.16b, v21.16b, v26.16b
+ ror x9, x12, #61
+ ; Row Mix Base
+ eor v8.16b, v8.16b, v28.16b
+ bic x12, x4, x3
+ ushr v24.2d, v31.2d, #62
+ bic x1, x5, x4
+ ushr v21.2d, v8.2d, #9
+ bic x28, x2, x6
+ sli v24.2d, v31.2d, #2
+ bic x30, x3, x2
+ sli v21.2d, v8.2d, #55
+ eor x2, x2, x12
+ eor v31.16b, v16.16b, v26.16b
+ eor x3, x3, x1
+ eor v5.16b, v5.16b, v25.16b
+ bic x12, x6, x5
+ ushr v8.2d, v31.2d, #19
+ eor x5, x5, x28
+ ushr v16.2d, v5.2d, #28
+ eor x4, x4, x12
+ sli v8.2d, v31.2d, #45
+ eor x6, x6, x30
+ sli v16.2d, v5.2d, #36
+ bic x12, x9, x8
+ eor v31.16b, v3.16b, v28.16b
+ bic x1, x10, x9
+ eor v18.16b, v18.16b, v28.16b
+ bic x28, x7, x11
+ ushr v5.2d, v31.2d, #36
+ bic x30, x8, x7
+ ushr v3.2d, v18.2d, #43
+ eor x7, x7, x12
+ sli v5.2d, v31.2d, #28
+ eor x8, x8, x1
+ sli v3.2d, v18.2d, #21
+ bic x12, x11, x10
+ eor v31.16b, v17.16b, v27.16b
+ eor x10, x10, x28
+ eor v11.16b, v11.16b, v26.16b
+ eor x9, x9, x12
+ ushr v18.2d, v31.2d, #49
+ eor x11, x11, x30
+ ushr v17.2d, v11.2d, #54
+ bic x12, x14, x13
+ sli v18.2d, v31.2d, #15
+ bic x1, x15, x14
+ sli v17.2d, v11.2d, #10
+ bic x28, x0, x16
+ eor v31.16b, v7.16b, v27.16b
+ bic x30, x13, x0
+ eor v10.16b, v10.16b, v25.16b
+ eor x12, x0, x12
+ ushr v11.2d, v31.2d, #58
+ eor x13, x13, x1
+ ushr v7.2d, v10.2d, #61
+ bic x0, x16, x15
+ sli v11.2d, v31.2d, #6
+ eor x15, x15, x28
+ sli v7.2d, v10.2d, #3
+ eor x14, x14, x0
+ ; Row Mix NEON
+ bic v25.16b, v2.16b, v1.16b
+ eor x16, x16, x30
+ bic v26.16b, v3.16b, v2.16b
+ bic x0, x20, x19
+ bic v27.16b, v4.16b, v3.16b
+ bic x1, x21, x20
+ bic v28.16b, v0.16b, v4.16b
+ bic x28, x17, x22
+ bic v29.16b, v1.16b, v0.16b
+ bic x30, x19, x17
+ eor v0.16b, v0.16b, v25.16b
+ eor x17, x17, x0
+ eor v1.16b, v1.16b, v26.16b
+ eor x19, x19, x1
+ eor v2.16b, v2.16b, v27.16b
+ bic x0, x22, x21
+ eor v3.16b, v3.16b, v28.16b
+ eor x21, x21, x28
+ eor v4.16b, v4.16b, v29.16b
+ eor x20, x20, x0
+ bic v25.16b, v7.16b, v6.16b
+ eor x22, x22, x30
+ bic v26.16b, v8.16b, v7.16b
+ bic x0, x25, x24
+ bic v27.16b, v9.16b, v8.16b
+ bic x1, x26, x25
+ bic v28.16b, v5.16b, v9.16b
+ bic x28, x23, x27
+ bic v29.16b, v6.16b, v5.16b
+ bic x30, x24, x23
+ eor v5.16b, v5.16b, v25.16b
+ eor x23, x23, x0
+ eor v6.16b, v6.16b, v26.16b
+ eor x24, x24, x1
+ eor v7.16b, v7.16b, v27.16b
+ bic x0, x27, x26
+ eor v8.16b, v8.16b, v28.16b
+ eor x26, x26, x28
+ eor v9.16b, v9.16b, v29.16b
+ eor x25, x25, x0
+ bic v25.16b, v12.16b, v11.16b
+ eor x27, x27, x30
+ bic v26.16b, v13.16b, v12.16b
+ bic v27.16b, v14.16b, v13.16b
+ bic v28.16b, v30.16b, v14.16b
+ bic v29.16b, v11.16b, v30.16b
+ eor v10.16b, v30.16b, v25.16b
+ eor v11.16b, v11.16b, v26.16b
+ eor v12.16b, v12.16b, v27.16b
+ eor v13.16b, v13.16b, v28.16b
+ eor v14.16b, v14.16b, v29.16b
+ bic v25.16b, v17.16b, v16.16b
+ bic v26.16b, v18.16b, v17.16b
+ bic v27.16b, v19.16b, v18.16b
+ bic v28.16b, v15.16b, v19.16b
+ bic v29.16b, v16.16b, v15.16b
+ eor v15.16b, v15.16b, v25.16b
+ eor v16.16b, v16.16b, v26.16b
+ eor v17.16b, v17.16b, v27.16b
+ eor v18.16b, v18.16b, v28.16b
+ eor v19.16b, v19.16b, v29.16b
+ bic v25.16b, v22.16b, v21.16b
+ bic v26.16b, v23.16b, v22.16b
+ bic v27.16b, v24.16b, v23.16b
+ bic v28.16b, v20.16b, v24.16b
+ bic v29.16b, v21.16b, v20.16b
+ eor v20.16b, v20.16b, v25.16b
+ eor v21.16b, v21.16b, v26.16b
+ eor v22.16b, v22.16b, v27.16b
+ eor v23.16b, v23.16b, v28.16b
+ eor v24.16b, v24.16b, v29.16b
+ ; Done transforming
+ ldp x28, x1, [x29, #48]
+ ldr x0, [x28], #8
+ subs x1, x1, #1
+ mov v30.d[0], x0
+ mov v30.d[1], x0
+ eor x2, x2, x0
+ eor v0.16b, v0.16b, v30.16b
+ bne L_SHA3_shake256_blocksx3_seed_neon_begin
+ ldr x0, [x29, #40]
+ st4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ st1 {v24.d}[0], [x0]
+ add x0, x0, #8
+ st4 {v0.d, v1.d, v2.d, v3.d}[1], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[1], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[1], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[1], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[1], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[1], [x0], #32
+ st1 {v24.d}[1], [x0]
+ add x0, x0, #8
+ stp x2, x3, [x0]
+ stp x4, x5, [x0, #16]
+ stp x6, x7, [x0, #32]
+ stp x8, x9, [x0, #48]
+ stp x10, x11, [x0, #64]
+ stp x12, x13, [x0, #80]
+ stp x14, x15, [x0, #96]
+ stp x16, x17, [x0, #112]
+ stp x19, x20, [x0, #128]
+ stp x21, x22, [x0, #144]
+ stp x23, x24, [x0, #160]
+ stp x25, x26, [x0, #176]
+ str x27, [x0, #192]
+ ldp x17, x19, [x29, #72]
+ ldp x20, x21, [x29, #88]
+ ldp x22, x23, [x29, #104]
+ ldp x24, x25, [x29, #120]
+ ldp x26, x27, [x29, #136]
+ ldr x28, [x29, #152]
+ ldp d8, d9, [x29, #160]
+ ldp d10, d11, [x29, #176]
+ ldp d12, d13, [x29, #192]
+ ldp d14, d15, [x29, #208]
+ ldp x29, x30, [sp], #0xe0
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ END
diff --git a/wolfcrypt/src/port/arm/armv8-poly1305-asm.asm b/wolfcrypt/src/port/arm/armv8-poly1305-asm.asm
new file mode 100644
index 0000000000..61940944b3
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-poly1305-asm.asm
@@ -0,0 +1,645 @@
+; /* armv8-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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./poly1305/poly1305.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-poly1305-asm.asm
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT poly1305_arm64_block_16
+poly1305_arm64_block_16 PROC
+ ; Load h
+ ldp w2, w3, [x0, #96]
+ ldp w4, w11, [x0, #104]
+ ldr w12, [x0, #112]
+ ; Load m
+ ldr x14, [x1]
+ ldr x15, [x1, #8]
+ ; Load r
+ ldp x5, x6, [x0]
+ ; h: Base26 -> Base 64
+ add x2, x2, x3, lsl 26
+ lsr x3, x4, #12
+ add x2, x2, x4, lsl 52
+ add x3, x3, x11, lsl 14
+ lsr x4, x12, #24
+ add x3, x3, x12, lsl 40
+ ; Add m and !finished at bit 128
+ adds x2, x2, x14
+ adcs x3, x3, x15
+ adc x4, x4, xzr
+ ; Multiply h by r
+ ; b[0] * a[0]
+ mul x7, x5, x2
+ umulh x8, x5, x2
+ ; b[0] * a[1]
+ mul x10, x5, x3
+ umulh x9, x5, x3
+ ; b[1] * a[0]
+ mul x11, x6, x2
+ umulh x12, x6, x2
+ adds x8, x8, x10
+ ; b[1] * a[1]
+ mul x13, x6, x3
+ umulh x10, x6, x3
+ adc x9, x9, x12
+ adds x8, x8, x11
+ ; b[0] * a[2]
+ mul x11, x5, x4
+ adcs x9, x9, x13
+ ; b[1] * a[2]
+ mul x12, x6, x4
+ adc x10, x10, xzr
+ adds x9, x9, x11
+ adc x10, x10, x12
+ ; Reduce mod 2^130 - 5
+ ; Get high bits
+ and x11, x9, #-4
+ ; Get top two bits
+ and x9, x9, #3
+ ; Add top bits * 4
+ adds x2, x7, x11
+ ; Move down 2 bits
+ extr x11, x10, x11, #2
+ adcs x3, x8, x10
+ lsr x10, x10, #2
+ adc x4, x9, xzr
+ ; Add top bits.
+ adds x2, x2, x11
+ adcs x3, x3, x10
+ adc x4, x4, xzr
+ extr x12, x4, x3, #40
+ ubfx x4, x2, #52, #12
+ ubfx x11, x3, #14, #26
+ bfi x4, x3, #12, #14
+ ubfx x3, x2, #26, #26
+ ubfx x2, x2, #0, #26
+ stp w2, w3, [x0, #96]
+ stp w4, w11, [x0, #104]
+ str w12, [x0, #112]
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT poly1305_arm64_blocks
+poly1305_arm64_blocks PROC
+ stp x29, x30, [sp, #-96]!
+ add x29, sp, #0
+ str x17, [x29, #24]
+ stp d8, d9, [x29, #32]
+ stp d10, d11, [x29, #48]
+ stp d12, d13, [x29, #64]
+ stp d14, d15, [x29, #80]
+ cmp x2, #0x40
+ blt L_poly1305_arm64_blocks_done
+ ; Set mask (0x3ffffff), hi bit and 5 into vector registers
+ movi v25.16b, #0xff
+ movi v27.4s, #1, lsl 24
+ ushr v25.4s, v25.4s, #6
+ movi v24.4s, #5
+ uxtl v26.2d, v25.2s
+ add x14, x0, #16
+ ld4 {v15.4s, v16.4s, v17.4s, v18.4s}, [x14], #0x40
+ ld1 {v19.4s}, [x14]
+ add x14, x0, #0x60
+ movi v0.4s, #0
+ movi v1.4s, #0
+ movi v2.4s, #0
+ movi v3.4s, #0
+ movi v4.4s, #0
+ ld4 {v0.s, v1.s, v2.s, v3.s}[0], [x14], #16
+ ld1 {v4.s}[0], [x14]
+ mul v20.4s, v16.4s, v24.4s
+ mul v21.4s, v17.4s, v24.4s
+ mul v22.4s, v18.4s, v24.4s
+ mul v23.4s, v19.4s, v24.4s
+L_poly1305_arm64_blocks_loop_64
+ ; Load message of 64 bytes - setting hi bit for not finished
+ ld4 {v5.4s, v6.4s, v7.4s, v8.4s}, [x1], #0x40
+ sub x2, x2, #0x40
+ ushr v9.4s, v8.4s, #8
+ shl v8.4s, v8.4s, #18
+ orr v9.16b, v9.16b, v27.16b
+ sri v8.4s, v7.4s, #14
+ shl v7.4s, v7.4s, #12
+ and v8.16b, v8.16b, v25.16b
+ sri v7.4s, v6.4s, #20
+ shl v6.4s, v6.4s, #6
+ and v7.16b, v7.16b, v25.16b
+ sri v6.4s, v5.4s, #26
+ and v5.16b, v5.16b, v25.16b
+ and v6.16b, v6.16b, v25.16b
+ umull2 v10.2d, v5.4s, v15.4s
+ umull2 v11.2d, v5.4s, v16.4s
+ umull2 v12.2d, v5.4s, v17.4s
+ umull2 v13.2d, v5.4s, v18.4s
+ umull2 v14.2d, v5.4s, v19.4s
+ umlal2 v10.2d, v6.4s, v23.4s
+ umlal2 v11.2d, v6.4s, v15.4s
+ umlal2 v12.2d, v6.4s, v16.4s
+ umlal2 v13.2d, v6.4s, v17.4s
+ umlal2 v14.2d, v6.4s, v18.4s
+ umlal2 v10.2d, v7.4s, v22.4s
+ umlal2 v11.2d, v7.4s, v23.4s
+ umlal2 v12.2d, v7.4s, v15.4s
+ umlal2 v13.2d, v7.4s, v16.4s
+ umlal2 v14.2d, v7.4s, v17.4s
+ umlal2 v10.2d, v8.4s, v21.4s
+ umlal2 v11.2d, v8.4s, v22.4s
+ umlal2 v12.2d, v8.4s, v23.4s
+ umlal2 v13.2d, v8.4s, v15.4s
+ umlal2 v14.2d, v8.4s, v16.4s
+ umlal2 v10.2d, v9.4s, v20.4s
+ umlal2 v11.2d, v9.4s, v21.4s
+ umlal2 v12.2d, v9.4s, v22.4s
+ umlal2 v13.2d, v9.4s, v23.4s
+ umlal2 v14.2d, v9.4s, v15.4s
+ add v5.4s, v5.4s, v0.4s
+ add v6.4s, v6.4s, v1.4s
+ add v7.4s, v7.4s, v2.4s
+ add v8.4s, v8.4s, v3.4s
+ add v9.4s, v9.4s, v4.4s
+ umlal v10.2d, v5.2s, v15.2s
+ umlal v11.2d, v5.2s, v16.2s
+ umlal v12.2d, v5.2s, v17.2s
+ umlal v13.2d, v5.2s, v18.2s
+ umlal v14.2d, v5.2s, v19.2s
+ umlal v10.2d, v6.2s, v23.2s
+ umlal v11.2d, v6.2s, v15.2s
+ umlal v12.2d, v6.2s, v16.2s
+ umlal v13.2d, v6.2s, v17.2s
+ umlal v14.2d, v6.2s, v18.2s
+ umlal v10.2d, v7.2s, v22.2s
+ umlal v11.2d, v7.2s, v23.2s
+ umlal v12.2d, v7.2s, v15.2s
+ umlal v13.2d, v7.2s, v16.2s
+ umlal v14.2d, v7.2s, v17.2s
+ umlal v10.2d, v8.2s, v21.2s
+ umlal v11.2d, v8.2s, v22.2s
+ umlal v12.2d, v8.2s, v23.2s
+ umlal v13.2d, v8.2s, v15.2s
+ umlal v14.2d, v8.2s, v16.2s
+ umlal v10.2d, v9.2s, v20.2s
+ umlal v11.2d, v9.2s, v21.2s
+ umlal v12.2d, v9.2s, v22.2s
+ umlal v13.2d, v9.2s, v23.2s
+ umlal v14.2d, v9.2s, v15.2s
+ addp d10, v10.2d
+ addp d11, v11.2d
+ addp d12, v12.2d
+ addp d13, v13.2d
+ addp d14, v14.2d
+ ; Redistribute and handle overflow
+ usra v11.2d, v10.2d, #26
+ and v10.16b, v10.16b, v26.16b
+ usra v14.2d, v13.2d, #26
+ and v3.16b, v13.16b, v26.16b
+ ushr v2.2d, v14.2d, #26
+ usra v12.2d, v11.2d, #26
+ shl v0.2d, v2.2d, #2
+ and v1.16b, v11.16b, v26.16b
+ add v0.2d, v0.2d, v2.2d
+ and v4.16b, v14.16b, v26.16b
+ add v10.2d, v10.2d, v0.2d
+ usra v3.2d, v12.2d, #26
+ and v2.16b, v12.16b, v26.16b
+ usra v1.2d, v10.2d, #26
+ and v0.16b, v10.16b, v26.16b
+ usra v4.2d, v3.2d, #26
+ and v3.16b, v3.16b, v26.16b
+ cmp x2, #0x40
+ bge L_poly1305_arm64_blocks_loop_64
+ cmp x2, #16
+ ble L_poly1305_arm64_blocks_done_32
+ ; Start 32
+ ld4 {v5.2s, v6.2s, v7.2s, v8.2s}, [x1], #32
+ sub x2, x2, #32
+ mov v15.d[0], v15.d[1]
+ mov v16.d[0], v16.d[1]
+ mov v17.d[0], v17.d[1]
+ mov v18.d[0], v18.d[1]
+ mov v19.d[0], v19.d[1]
+ mov v20.d[0], v20.d[1]
+ mov v21.d[0], v21.d[1]
+ mov v22.d[0], v22.d[1]
+ mov v23.d[0], v23.d[1]
+ ushr v9.2s, v8.2s, #8
+ shl v8.2s, v8.2s, #18
+ orr v9.8b, v9.8b, v27.8b
+ sri v8.2s, v7.2s, #14
+ shl v7.2s, v7.2s, #12
+ and v8.8b, v8.8b, v25.8b
+ sri v7.2s, v6.2s, #20
+ shl v6.2s, v6.2s, #6
+ and v7.8b, v7.8b, v25.8b
+ sri v6.2s, v5.2s, #26
+ and v5.8b, v5.8b, v25.8b
+ and v6.8b, v6.8b, v25.8b
+ add v5.2s, v5.2s, v0.2s
+ add v6.2s, v6.2s, v1.2s
+ add v7.2s, v7.2s, v2.2s
+ add v8.2s, v8.2s, v3.2s
+ add v9.2s, v9.2s, v4.2s
+ umull v10.2d, v5.2s, v15.2s
+ umull v11.2d, v5.2s, v16.2s
+ umull v12.2d, v5.2s, v17.2s
+ umull v13.2d, v5.2s, v18.2s
+ umull v14.2d, v5.2s, v19.2s
+ umlal v10.2d, v6.2s, v23.2s
+ umlal v11.2d, v6.2s, v15.2s
+ umlal v12.2d, v6.2s, v16.2s
+ umlal v13.2d, v6.2s, v17.2s
+ umlal v14.2d, v6.2s, v18.2s
+ umlal v10.2d, v7.2s, v22.2s
+ umlal v11.2d, v7.2s, v23.2s
+ umlal v12.2d, v7.2s, v15.2s
+ umlal v13.2d, v7.2s, v16.2s
+ umlal v14.2d, v7.2s, v17.2s
+ umlal v10.2d, v8.2s, v21.2s
+ umlal v11.2d, v8.2s, v22.2s
+ umlal v12.2d, v8.2s, v23.2s
+ umlal v13.2d, v8.2s, v15.2s
+ umlal v14.2d, v8.2s, v16.2s
+ umlal v10.2d, v9.2s, v20.2s
+ umlal v11.2d, v9.2s, v21.2s
+ umlal v12.2d, v9.2s, v22.2s
+ umlal v13.2d, v9.2s, v23.2s
+ umlal v14.2d, v9.2s, v15.2s
+ addp d10, v10.2d
+ addp d11, v11.2d
+ addp d12, v12.2d
+ addp d13, v13.2d
+ addp d14, v14.2d
+ ; Redistribute and handle overflow
+ usra v11.2d, v10.2d, #26
+ and v10.16b, v10.16b, v26.16b
+ usra v14.2d, v13.2d, #26
+ and v3.16b, v13.16b, v26.16b
+ ushr v2.2d, v14.2d, #26
+ usra v12.2d, v11.2d, #26
+ shl v0.2d, v2.2d, #2
+ and v1.16b, v11.16b, v26.16b
+ add v0.2d, v0.2d, v2.2d
+ and v4.16b, v14.16b, v26.16b
+ add v10.2d, v10.2d, v0.2d
+ usra v3.2d, v12.2d, #26
+ and v2.16b, v12.16b, v26.16b
+ usra v1.2d, v10.2d, #26
+ and v0.16b, v10.16b, v26.16b
+ usra v4.2d, v3.2d, #26
+ and v3.16b, v3.16b, v26.16b
+L_poly1305_arm64_blocks_done_32
+ cmp x2, #16
+ beq L_poly1305_arm64_blocks_transfer
+ add x14, x0, #0x60
+ st4 {v0.s, v1.s, v2.s, v3.s}[0], [x14], #16
+ st1 {v4.s}[0], [x14]
+ b L_poly1305_arm64_blocks_done_all
+L_poly1305_arm64_blocks_transfer
+ mov w3, v0.s[0]
+ mov w4, v1.s[0]
+ mov w5, v2.s[0]
+ mov w6, v3.s[0]
+ mov w7, v4.s[0]
+ b L_poly1305_arm64_blocks_start
+L_poly1305_arm64_blocks_done
+ cmp x2, #16
+ blt L_poly1305_arm64_blocks_done_all
+ ; Load h
+ ldp w3, w4, [x0, #96]
+ ldp w5, w6, [x0, #104]
+ ldr w7, [x0, #112]
+L_poly1305_arm64_blocks_start
+ mov x17, #1
+ ; Load r
+ ldp x8, x9, [x0]
+ ; Base26 -> Base 64
+ add x3, x3, x4, lsl 26
+ lsr x4, x5, #12
+ add x3, x3, x5, lsl 52
+ add x4, x4, x6, lsl 14
+ lsr x5, x7, #24
+ add x4, x4, x7, lsl 40
+L_poly1305_arm64_blocks_loop
+ ; Load m
+ ldr x14, [x1]
+ ldr x15, [x1, #8]
+ ; Add m and !finished at bit 128
+ adds x3, x3, x14
+ adcs x4, x4, x15
+ adc x5, x5, x17
+ ; Multiply h by r
+ ; b[0] * a[0]
+ mul x10, x8, x3
+ umulh x11, x8, x3
+ ; b[0] * a[1]
+ mul x13, x8, x4
+ umulh x12, x8, x4
+ ; b[1] * a[0]
+ mul x14, x9, x3
+ umulh x15, x9, x3
+ adds x11, x11, x13
+ ; b[1] * a[1]
+ mul x16, x9, x4
+ umulh x13, x9, x4
+ adc x12, x12, x15
+ adds x11, x11, x14
+ ; b[0] * a[2]
+ mul x14, x8, x5
+ adcs x12, x12, x16
+ ; b[1] * a[2]
+ mul x15, x9, x5
+ adc x13, x13, xzr
+ adds x12, x12, x14
+ adc x13, x13, x15
+ ; Reduce mod 2^130 - 5
+ ; Get high bits
+ and x14, x12, #-4
+ ; Get top two bits
+ and x12, x12, #3
+ ; Add top bits * 4
+ adds x3, x10, x14
+ ; Move down 2 bits
+ extr x14, x13, x14, #2
+ adcs x4, x11, x13
+ lsr x13, x13, #2
+ adc x5, x12, xzr
+ ; Add top bits.
+ adds x3, x3, x14
+ adcs x4, x4, x13
+ adc x5, x5, xzr
+ ; Sub 16 from length.
+ subs x2, x2, #16
+ add x1, x1, #16
+ ; Loop again if more message to do.
+ bgt L_poly1305_arm64_blocks_loop
+ extr x7, x5, x4, #40
+ ubfx x5, x3, #52, #12
+ ubfx x6, x4, #14, #26
+ bfi x5, x4, #12, #14
+ ubfx x4, x3, #26, #26
+ ubfx x3, x3, #0, #26
+ stp w3, w4, [x0, #96]
+ stp w5, w6, [x0, #104]
+ str w7, [x0, #112]
+L_poly1305_arm64_blocks_done_all
+ ldr x17, [x29, #24]
+ ldp d8, d9, [x29, #32]
+ ldp d10, d11, [x29, #48]
+ ldp d12, d13, [x29, #64]
+ ldp d14, d15, [x29, #80]
+ ldp x29, x30, [sp], #0x60
+ ret
+ ENDP
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_poly1305_set_key_arm64_clamp
+ DCD 0x0fffffff, 0x0ffffffc, 0x0ffffffc, 0x0ffffffc
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT poly1305_set_key
+poly1305_set_key PROC
+ stp x29, x30, [sp, #-32]!
+ add x29, sp, #0
+ str x17, [x29, #24]
+ adrp x2, L_poly1305_set_key_arm64_clamp
+ add x2, x2, L_poly1305_set_key_arm64_clamp
+ ; Load key and pad.
+ ldp x11, x12, [x1]
+ ldp x14, x15, [x1, #16]
+ ; Load mask.
+ ldp x16, x17, [x2]
+ ; Save pad for later
+ stp x14, x15, [x0, #120]
+ ; Apply clamp.
+ ; r &= 0x0ffffffc0ffffffc0ffffffc0fffffff
+ and x11, x11, x16
+ and x12, x12, x17
+ ; Store r - 64-bit version.
+ stp x11, x12, [x0]
+ ; 128-bits: Base 64 -> Base 26
+ lsr x7, x12, #40
+ ubfx x5, x11, #52, #12
+ ubfx x6, x12, #14, #26
+ bfi x5, x12, #12, #14
+ ubfx x4, x11, #26, #26
+ ubfx x3, x11, #0, #26
+ stp w3, w4, [x0, #64]
+ stp w5, w6, [x0, #72]
+ str w7, [x0, #92]
+ ; Compute r^2
+ ; a[0] * a[0]
+ mul x3, x11, x11
+ umulh x4, x11, x11
+ ; 2 * a[0] * a[1]
+ mul x14, x11, x12
+ umulh x5, x11, x12
+ ; a[1] * a[1]
+ mul x15, x12, x12
+ umulh x6, x12, x12
+ adds x4, x4, x14, lsl 1
+ extr x5, x5, x14, #63
+ adcs x5, x5, x15
+ adc x6, x6, xzr
+ ; Reduce mod 2^130 - 5
+ ; Get high bits
+ and x14, x5, #-4
+ ; Get top two bits
+ and x5, x5, #3
+ ; Add top bits * 4
+ adds x8, x3, x14
+ ; Move down 2 bits
+ extr x14, x6, x14, #2
+ adcs x9, x4, x6
+ lsr x6, x6, #2
+ adc x10, x5, xzr
+ ; Add top bits.
+ adds x8, x8, x14
+ adcs x9, x9, x6
+ adc x10, x10, xzr
+ ; 130-bits: Base 64 -> Base 26
+ extr x7, x10, x9, #40
+ ubfx x5, x8, #52, #12
+ ubfx x6, x9, #14, #26
+ bfi x5, x9, #12, #14
+ ubfx x4, x8, #26, #26
+ ubfx x3, x8, #0, #26
+ stp w3, w4, [x0, #48]
+ stp w5, w6, [x0, #56]
+ str w7, [x0, #88]
+ ; Compute r^3
+ ; b[0] * a[0]
+ mul x3, x11, x8
+ umulh x4, x11, x8
+ ; b[0] * a[1]
+ mul x6, x11, x9
+ umulh x5, x11, x9
+ ; b[1] * a[0]
+ mul x14, x12, x8
+ umulh x15, x12, x8
+ adds x4, x4, x6
+ ; b[1] * a[1]
+ mul x16, x12, x9
+ umulh x6, x12, x9
+ adc x5, x5, x15
+ adds x4, x4, x14
+ ; b[0] * a[2]
+ mul x14, x11, x10
+ adcs x5, x5, x16
+ ; b[1] * a[2]
+ mul x15, x12, x10
+ adc x6, x6, xzr
+ adds x5, x5, x14
+ adc x6, x6, x15
+ ; Reduce mod 2^130 - 5
+ ; Get high bits
+ and x14, x5, #-4
+ ; Get top two bits
+ and x5, x5, #3
+ ; Add top bits * 4
+ adds x8, x3, x14
+ ; Move down 2 bits
+ extr x14, x6, x14, #2
+ adcs x9, x4, x6
+ lsr x6, x6, #2
+ adc x10, x5, xzr
+ ; Add top bits.
+ adds x8, x8, x14
+ adcs x9, x9, x6
+ adc x10, x10, xzr
+ ; 130-bits: Base 64 -> Base 26
+ extr x7, x10, x9, #40
+ ubfx x5, x8, #52, #12
+ ubfx x6, x9, #14, #26
+ bfi x5, x9, #12, #14
+ ubfx x4, x8, #26, #26
+ ubfx x3, x8, #0, #26
+ stp w3, w4, [x0, #32]
+ stp w5, w6, [x0, #40]
+ str w7, [x0, #84]
+ ; Compute r^4
+ ; b[0] * a[0]
+ mul x3, x11, x8
+ umulh x4, x11, x8
+ ; b[0] * a[1]
+ mul x6, x11, x9
+ umulh x5, x11, x9
+ ; b[1] * a[0]
+ mul x14, x12, x8
+ umulh x15, x12, x8
+ adds x4, x4, x6
+ ; b[1] * a[1]
+ mul x16, x12, x9
+ umulh x6, x12, x9
+ adc x5, x5, x15
+ adds x4, x4, x14
+ ; b[0] * a[2]
+ mul x14, x11, x10
+ adcs x5, x5, x16
+ ; b[1] * a[2]
+ mul x15, x12, x10
+ adc x6, x6, xzr
+ adds x5, x5, x14
+ adc x6, x6, x15
+ ; Reduce mod 2^130 - 5
+ ; Get high bits
+ and x14, x5, #-4
+ ; Get top two bits
+ and x5, x5, #3
+ ; Add top bits * 4
+ adds x11, x3, x14
+ ; Move down 2 bits
+ extr x14, x6, x14, #2
+ adcs x12, x4, x6
+ lsr x6, x6, #2
+ adc x13, x5, xzr
+ ; Add top bits.
+ adds x11, x11, x14
+ adcs x12, x12, x6
+ adc x13, x13, xzr
+ ; 130-bits: Base 64 -> Base 26
+ extr x7, x13, x12, #40
+ ubfx x5, x11, #52, #12
+ ubfx x6, x12, #14, #26
+ bfi x5, x12, #12, #14
+ ubfx x4, x11, #26, #26
+ ubfx x3, x11, #0, #26
+ stp w3, w4, [x0, #16]
+ stp w5, w6, [x0, #24]
+ str w7, [x0, #80]
+ ; h (accumulator) = 0
+ stp xzr, xzr, [x0, #96]
+ str wzr, [x0, #112]
+ ; Zero leftover
+ str xzr, [x0, #136]
+ ; Zero finished
+ strb wzr, [x0, #160]
+ ldr x17, [x29, #24]
+ ldp x29, x30, [sp], #32
+ ret
+ ENDP
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT poly1305_final
+poly1305_final PROC
+ ldp x8, x9, [x0, #120]
+ ldp w2, w3, [x0, #96]
+ ldp w4, w5, [x0, #104]
+ ldr w6, [x0, #112]
+ add x2, x2, x3, lsl 26
+ lsr x3, x4, #12
+ add x2, x2, x4, lsl 52
+ add x3, x3, x5, lsl 14
+ lsr x4, x6, #24
+ add x3, x3, x6, lsl 40
+ ; Add 5 to h.
+ adds x5, x2, #5
+ adcs x6, x3, xzr
+ adc x7, x4, xzr
+ ; Check if h+5 s larger than p.
+ cmp x7, #3
+ csel x2, x5, x2, hi
+ csel x3, x6, x3, hi
+ ; Add padding
+ adds x2, x2, x8
+ adc x3, x3, x9
+ ; Store MAC
+ stp x2, x3, [x1]
+ ; Zero out h.
+ stp xzr, xzr, [x0, #96]
+ str wzr, [x0, #112]
+ ; Zero out r64.
+ stp xzr, xzr, [x0]
+ ; Zero out r.
+ stp xzr, xzr, [x0, #16]
+ ; Zero out r_2.
+ stp xzr, xzr, [x0, #48]
+ str xzr, [x0, #64]
+ ; Zero out r_4.
+ stp xzr, xzr, [x0, #16]
+ str xzr, [x0, #32]
+ ; Zero out pad.
+ stp xzr, xzr, [x0, #120]
+ ret
+ ENDP
+ END
diff --git a/wolfcrypt/src/port/arm/armv8-sha256-asm.asm b/wolfcrypt/src/port/arm/armv8-sha256-asm.asm
new file mode 100644
index 0000000000..877ff66414
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-sha256-asm.asm
@@ -0,0 +1,1193 @@
+; /* armv8-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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./sha2/sha256.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-sha256-asm.asm
+ IF :LNOT::DEF:NO_SHA256 :LOR: :DEF:WOLFSSL_SHA224
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_SHA256_transform_neon_len_k
+ DCD 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5
+ DCD 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5
+ DCD 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3
+ DCD 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
+ DCD 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc
+ DCD 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da
+ DCD 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7
+ DCD 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967
+ DCD 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13
+ DCD 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85
+ DCD 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3
+ DCD 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070
+ DCD 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5
+ DCD 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3
+ DCD 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208
+ DCD 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT Transform_Sha256_Len_neon
+Transform_Sha256_Len_neon PROC
+ stp x29, x30, [sp, #-112]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #24]
+ stp x20, x21, [x29, #40]
+ stp x22, x23, [x29, #56]
+ str x24, [x29, #72]
+ stp d8, d9, [x29, #80]
+ stp d10, d11, [x29, #96]
+ adrp x3, L_SHA256_transform_neon_len_k
+ add x3, x3, L_SHA256_transform_neon_len_k
+ ; Load digest into working vars
+ ldr w4, [x0]
+ ldr w5, [x0, #4]
+ ldr w6, [x0, #8]
+ ldr w7, [x0, #12]
+ ldr w8, [x0, #16]
+ ldr w9, [x0, #20]
+ ldr w10, [x0, #24]
+ ldr w11, [x0, #28]
+ ; Start of loop processing a block
+L_sha256_len_neon_begin
+ ; Load W
+ ; Copy digest to add in at end
+ ld1 {v0.8b, v1.8b, v2.8b, v3.8b}, [x1], #32
+ mov w15, w4
+ ld1 {v4.8b, v5.8b, v6.8b, v7.8b}, [x1], #32
+ mov w16, w5
+ rev32 v0.8b, v0.8b
+ mov w17, w6
+ rev32 v1.8b, v1.8b
+ mov w19, w7
+ rev32 v2.8b, v2.8b
+ mov w20, w8
+ rev32 v3.8b, v3.8b
+ mov w21, w9
+ rev32 v4.8b, v4.8b
+ mov w22, w10
+ rev32 v5.8b, v5.8b
+ mov w23, w11
+ rev32 v6.8b, v6.8b
+ rev32 v7.8b, v7.8b
+ mov x24, #3
+ ; Start of 16 rounds
+L_sha256_len_neon_start
+ ; Round 0
+ mov w14, v0.s[0]
+ ror w12, w8, #6
+ eor w13, w9, w10
+ eor w12, w12, w8, ror 11
+ and w13, w13, w8
+ eor w12, w12, w8, ror 25
+ eor w13, w13, w10
+ add w11, w11, w12
+ add w11, w11, w13
+ ldr w12, [x3]
+ add w11, w11, w14
+ add w11, w11, w12
+ add w7, w7, w11
+ ror w12, w4, #2
+ eor w13, w4, w5
+ eor w12, w12, w4, ror 13
+ eor w14, w5, w6
+ and w13, w13, w14
+ eor w12, w12, w4, ror 22
+ eor w13, w13, w5
+ add w11, w11, w12
+ add w11, w11, w13
+ ; Round 1
+ mov w14, v0.s[1]
+ ; Calc new W[0]-W[1]
+ ext v10.8b, v0.8b, v1.8b, #4
+ ror w12, w7, #6
+ shl v8.2s, v7.2s, #15
+ eor w13, w8, w9
+ sri v8.2s, v7.2s, #17
+ eor w12, w12, w7, ror 11
+ shl v9.2s, v7.2s, #13
+ and w13, w13, w7
+ sri v9.2s, v7.2s, #19
+ eor w12, w12, w7, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w9
+ ushr v8.2s, v7.2s, #10
+ add w10, w10, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w10, w10, w13
+ add v0.2s, v0.2s, v9.2s
+ ldr w12, [x3, #4]
+ ext v11.8b, v4.8b, v5.8b, #4
+ add w10, w10, w14
+ add v0.2s, v0.2s, v11.2s
+ add w10, w10, w12
+ shl v8.2s, v10.2s, #25
+ add w6, w6, w10
+ sri v8.2s, v10.2s, #7
+ ror w12, w11, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w11, w4
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w11, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w4, w5
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w11, ror 22
+ add v0.2s, v0.2s, v9.2s
+ eor w13, w13, w4
+ add w10, w10, w12
+ add w10, w10, w13
+ ; Round 2
+ mov w14, v1.s[0]
+ ror w12, w6, #6
+ eor w13, w7, w8
+ eor w12, w12, w6, ror 11
+ and w13, w13, w6
+ eor w12, w12, w6, ror 25
+ eor w13, w13, w8
+ add w9, w9, w12
+ add w9, w9, w13
+ ldr w12, [x3, #8]
+ add w9, w9, w14
+ add w9, w9, w12
+ add w5, w5, w9
+ ror w12, w10, #2
+ eor w13, w10, w11
+ eor w12, w12, w10, ror 13
+ eor w14, w11, w4
+ and w13, w13, w14
+ eor w12, w12, w10, ror 22
+ eor w13, w13, w11
+ add w9, w9, w12
+ add w9, w9, w13
+ ; Round 3
+ mov w14, v1.s[1]
+ ; Calc new W[2]-W[3]
+ ext v10.8b, v1.8b, v2.8b, #4
+ ror w12, w5, #6
+ shl v8.2s, v0.2s, #15
+ eor w13, w6, w7
+ sri v8.2s, v0.2s, #17
+ eor w12, w12, w5, ror 11
+ shl v9.2s, v0.2s, #13
+ and w13, w13, w5
+ sri v9.2s, v0.2s, #19
+ eor w12, w12, w5, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w7
+ ushr v8.2s, v0.2s, #10
+ add w8, w8, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w8, w8, w13
+ add v1.2s, v1.2s, v9.2s
+ ldr w12, [x3, #12]
+ ext v11.8b, v5.8b, v6.8b, #4
+ add w8, w8, w14
+ add v1.2s, v1.2s, v11.2s
+ add w8, w8, w12
+ shl v8.2s, v10.2s, #25
+ add w4, w4, w8
+ sri v8.2s, v10.2s, #7
+ ror w12, w9, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w9, w10
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w9, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w10, w11
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w9, ror 22
+ add v1.2s, v1.2s, v9.2s
+ eor w13, w13, w10
+ add w8, w8, w12
+ add w8, w8, w13
+ ; Round 4
+ mov w14, v2.s[0]
+ ror w12, w4, #6
+ eor w13, w5, w6
+ eor w12, w12, w4, ror 11
+ and w13, w13, w4
+ eor w12, w12, w4, ror 25
+ eor w13, w13, w6
+ add w7, w7, w12
+ add w7, w7, w13
+ ldr w12, [x3, #16]
+ add w7, w7, w14
+ add w7, w7, w12
+ add w11, w11, w7
+ ror w12, w8, #2
+ eor w13, w8, w9
+ eor w12, w12, w8, ror 13
+ eor w14, w9, w10
+ and w13, w13, w14
+ eor w12, w12, w8, ror 22
+ eor w13, w13, w9
+ add w7, w7, w12
+ add w7, w7, w13
+ ; Round 5
+ mov w14, v2.s[1]
+ ; Calc new W[4]-W[5]
+ ext v10.8b, v2.8b, v3.8b, #4
+ ror w12, w11, #6
+ shl v8.2s, v1.2s, #15
+ eor w13, w4, w5
+ sri v8.2s, v1.2s, #17
+ eor w12, w12, w11, ror 11
+ shl v9.2s, v1.2s, #13
+ and w13, w13, w11
+ sri v9.2s, v1.2s, #19
+ eor w12, w12, w11, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w5
+ ushr v8.2s, v1.2s, #10
+ add w6, w6, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w6, w6, w13
+ add v2.2s, v2.2s, v9.2s
+ ldr w12, [x3, #20]
+ ext v11.8b, v6.8b, v7.8b, #4
+ add w6, w6, w14
+ add v2.2s, v2.2s, v11.2s
+ add w6, w6, w12
+ shl v8.2s, v10.2s, #25
+ add w10, w10, w6
+ sri v8.2s, v10.2s, #7
+ ror w12, w7, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w7, w8
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w7, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w8, w9
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w7, ror 22
+ add v2.2s, v2.2s, v9.2s
+ eor w13, w13, w8
+ add w6, w6, w12
+ add w6, w6, w13
+ ; Round 6
+ mov w14, v3.s[0]
+ ror w12, w10, #6
+ eor w13, w11, w4
+ eor w12, w12, w10, ror 11
+ and w13, w13, w10
+ eor w12, w12, w10, ror 25
+ eor w13, w13, w4
+ add w5, w5, w12
+ add w5, w5, w13
+ ldr w12, [x3, #24]
+ add w5, w5, w14
+ add w5, w5, w12
+ add w9, w9, w5
+ ror w12, w6, #2
+ eor w13, w6, w7
+ eor w12, w12, w6, ror 13
+ eor w14, w7, w8
+ and w13, w13, w14
+ eor w12, w12, w6, ror 22
+ eor w13, w13, w7
+ add w5, w5, w12
+ add w5, w5, w13
+ ; Round 7
+ mov w14, v3.s[1]
+ ; Calc new W[6]-W[7]
+ ext v10.8b, v3.8b, v4.8b, #4
+ ror w12, w9, #6
+ shl v8.2s, v2.2s, #15
+ eor w13, w10, w11
+ sri v8.2s, v2.2s, #17
+ eor w12, w12, w9, ror 11
+ shl v9.2s, v2.2s, #13
+ and w13, w13, w9
+ sri v9.2s, v2.2s, #19
+ eor w12, w12, w9, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w11
+ ushr v8.2s, v2.2s, #10
+ add w4, w4, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w4, w4, w13
+ add v3.2s, v3.2s, v9.2s
+ ldr w12, [x3, #28]
+ ext v11.8b, v7.8b, v0.8b, #4
+ add w4, w4, w14
+ add v3.2s, v3.2s, v11.2s
+ add w4, w4, w12
+ shl v8.2s, v10.2s, #25
+ add w8, w8, w4
+ sri v8.2s, v10.2s, #7
+ ror w12, w5, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w5, w6
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w5, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w6, w7
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w5, ror 22
+ add v3.2s, v3.2s, v9.2s
+ eor w13, w13, w6
+ add w4, w4, w12
+ add w4, w4, w13
+ ; Round 8
+ mov w14, v4.s[0]
+ ror w12, w8, #6
+ eor w13, w9, w10
+ eor w12, w12, w8, ror 11
+ and w13, w13, w8
+ eor w12, w12, w8, ror 25
+ eor w13, w13, w10
+ add w11, w11, w12
+ add w11, w11, w13
+ ldr w12, [x3, #32]
+ add w11, w11, w14
+ add w11, w11, w12
+ add w7, w7, w11
+ ror w12, w4, #2
+ eor w13, w4, w5
+ eor w12, w12, w4, ror 13
+ eor w14, w5, w6
+ and w13, w13, w14
+ eor w12, w12, w4, ror 22
+ eor w13, w13, w5
+ add w11, w11, w12
+ add w11, w11, w13
+ ; Round 9
+ mov w14, v4.s[1]
+ ; Calc new W[8]-W[9]
+ ext v10.8b, v4.8b, v5.8b, #4
+ ror w12, w7, #6
+ shl v8.2s, v3.2s, #15
+ eor w13, w8, w9
+ sri v8.2s, v3.2s, #17
+ eor w12, w12, w7, ror 11
+ shl v9.2s, v3.2s, #13
+ and w13, w13, w7
+ sri v9.2s, v3.2s, #19
+ eor w12, w12, w7, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w9
+ ushr v8.2s, v3.2s, #10
+ add w10, w10, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w10, w10, w13
+ add v4.2s, v4.2s, v9.2s
+ ldr w12, [x3, #36]
+ ext v11.8b, v0.8b, v1.8b, #4
+ add w10, w10, w14
+ add v4.2s, v4.2s, v11.2s
+ add w10, w10, w12
+ shl v8.2s, v10.2s, #25
+ add w6, w6, w10
+ sri v8.2s, v10.2s, #7
+ ror w12, w11, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w11, w4
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w11, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w4, w5
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w11, ror 22
+ add v4.2s, v4.2s, v9.2s
+ eor w13, w13, w4
+ add w10, w10, w12
+ add w10, w10, w13
+ ; Round 10
+ mov w14, v5.s[0]
+ ror w12, w6, #6
+ eor w13, w7, w8
+ eor w12, w12, w6, ror 11
+ and w13, w13, w6
+ eor w12, w12, w6, ror 25
+ eor w13, w13, w8
+ add w9, w9, w12
+ add w9, w9, w13
+ ldr w12, [x3, #40]
+ add w9, w9, w14
+ add w9, w9, w12
+ add w5, w5, w9
+ ror w12, w10, #2
+ eor w13, w10, w11
+ eor w12, w12, w10, ror 13
+ eor w14, w11, w4
+ and w13, w13, w14
+ eor w12, w12, w10, ror 22
+ eor w13, w13, w11
+ add w9, w9, w12
+ add w9, w9, w13
+ ; Round 11
+ mov w14, v5.s[1]
+ ; Calc new W[10]-W[11]
+ ext v10.8b, v5.8b, v6.8b, #4
+ ror w12, w5, #6
+ shl v8.2s, v4.2s, #15
+ eor w13, w6, w7
+ sri v8.2s, v4.2s, #17
+ eor w12, w12, w5, ror 11
+ shl v9.2s, v4.2s, #13
+ and w13, w13, w5
+ sri v9.2s, v4.2s, #19
+ eor w12, w12, w5, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w7
+ ushr v8.2s, v4.2s, #10
+ add w8, w8, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w8, w8, w13
+ add v5.2s, v5.2s, v9.2s
+ ldr w12, [x3, #44]
+ ext v11.8b, v1.8b, v2.8b, #4
+ add w8, w8, w14
+ add v5.2s, v5.2s, v11.2s
+ add w8, w8, w12
+ shl v8.2s, v10.2s, #25
+ add w4, w4, w8
+ sri v8.2s, v10.2s, #7
+ ror w12, w9, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w9, w10
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w9, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w10, w11
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w9, ror 22
+ add v5.2s, v5.2s, v9.2s
+ eor w13, w13, w10
+ add w8, w8, w12
+ add w8, w8, w13
+ ; Round 12
+ mov w14, v6.s[0]
+ ror w12, w4, #6
+ eor w13, w5, w6
+ eor w12, w12, w4, ror 11
+ and w13, w13, w4
+ eor w12, w12, w4, ror 25
+ eor w13, w13, w6
+ add w7, w7, w12
+ add w7, w7, w13
+ ldr w12, [x3, #48]
+ add w7, w7, w14
+ add w7, w7, w12
+ add w11, w11, w7
+ ror w12, w8, #2
+ eor w13, w8, w9
+ eor w12, w12, w8, ror 13
+ eor w14, w9, w10
+ and w13, w13, w14
+ eor w12, w12, w8, ror 22
+ eor w13, w13, w9
+ add w7, w7, w12
+ add w7, w7, w13
+ ; Round 13
+ mov w14, v6.s[1]
+ ; Calc new W[12]-W[13]
+ ext v10.8b, v6.8b, v7.8b, #4
+ ror w12, w11, #6
+ shl v8.2s, v5.2s, #15
+ eor w13, w4, w5
+ sri v8.2s, v5.2s, #17
+ eor w12, w12, w11, ror 11
+ shl v9.2s, v5.2s, #13
+ and w13, w13, w11
+ sri v9.2s, v5.2s, #19
+ eor w12, w12, w11, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w5
+ ushr v8.2s, v5.2s, #10
+ add w6, w6, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w6, w6, w13
+ add v6.2s, v6.2s, v9.2s
+ ldr w12, [x3, #52]
+ ext v11.8b, v2.8b, v3.8b, #4
+ add w6, w6, w14
+ add v6.2s, v6.2s, v11.2s
+ add w6, w6, w12
+ shl v8.2s, v10.2s, #25
+ add w10, w10, w6
+ sri v8.2s, v10.2s, #7
+ ror w12, w7, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w7, w8
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w7, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w8, w9
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w7, ror 22
+ add v6.2s, v6.2s, v9.2s
+ eor w13, w13, w8
+ add w6, w6, w12
+ add w6, w6, w13
+ ; Round 14
+ mov w14, v7.s[0]
+ ror w12, w10, #6
+ eor w13, w11, w4
+ eor w12, w12, w10, ror 11
+ and w13, w13, w10
+ eor w12, w12, w10, ror 25
+ eor w13, w13, w4
+ add w5, w5, w12
+ add w5, w5, w13
+ ldr w12, [x3, #56]
+ add w5, w5, w14
+ add w5, w5, w12
+ add w9, w9, w5
+ ror w12, w6, #2
+ eor w13, w6, w7
+ eor w12, w12, w6, ror 13
+ eor w14, w7, w8
+ and w13, w13, w14
+ eor w12, w12, w6, ror 22
+ eor w13, w13, w7
+ add w5, w5, w12
+ add w5, w5, w13
+ ; Round 15
+ mov w14, v7.s[1]
+ ; Calc new W[14]-W[15]
+ ext v10.8b, v7.8b, v0.8b, #4
+ ror w12, w9, #6
+ shl v8.2s, v6.2s, #15
+ eor w13, w10, w11
+ sri v8.2s, v6.2s, #17
+ eor w12, w12, w9, ror 11
+ shl v9.2s, v6.2s, #13
+ and w13, w13, w9
+ sri v9.2s, v6.2s, #19
+ eor w12, w12, w9, ror 25
+ eor v9.8b, v9.8b, v8.8b
+ eor w13, w13, w11
+ ushr v8.2s, v6.2s, #10
+ add w4, w4, w12
+ eor v9.8b, v9.8b, v8.8b
+ add w4, w4, w13
+ add v7.2s, v7.2s, v9.2s
+ ldr w12, [x3, #60]
+ ext v11.8b, v3.8b, v4.8b, #4
+ add w4, w4, w14
+ add v7.2s, v7.2s, v11.2s
+ add w4, w4, w12
+ shl v8.2s, v10.2s, #25
+ add w8, w8, w4
+ sri v8.2s, v10.2s, #7
+ ror w12, w5, #2
+ shl v9.2s, v10.2s, #14
+ eor w13, w5, w6
+ sri v9.2s, v10.2s, #18
+ eor w12, w12, w5, ror 13
+ eor v9.8b, v9.8b, v8.8b
+ eor w14, w6, w7
+ ushr v10.2s, v10.2s, #3
+ and w13, w13, w14
+ eor v9.8b, v9.8b, v10.8b
+ eor w12, w12, w5, ror 22
+ add v7.2s, v7.2s, v9.2s
+ eor w13, w13, w6
+ add w4, w4, w12
+ add w4, w4, w13
+ add x3, x3, #0x40
+ subs x24, x24, #1
+ bne L_sha256_len_neon_start
+ ; Round 0
+ mov w14, v0.s[0]
+ ror w12, w8, #6
+ eor w13, w9, w10
+ eor w12, w12, w8, ror 11
+ and w13, w13, w8
+ eor w12, w12, w8, ror 25
+ eor w13, w13, w10
+ add w11, w11, w12
+ add w11, w11, w13
+ ldr w12, [x3]
+ add w11, w11, w14
+ add w11, w11, w12
+ add w7, w7, w11
+ ror w12, w4, #2
+ eor w13, w4, w5
+ eor w12, w12, w4, ror 13
+ eor w14, w5, w6
+ and w13, w13, w14
+ eor w12, w12, w4, ror 22
+ eor w13, w13, w5
+ add w11, w11, w12
+ add w11, w11, w13
+ ; Round 1
+ mov w14, v0.s[1]
+ ror w12, w7, #6
+ eor w13, w8, w9
+ eor w12, w12, w7, ror 11
+ and w13, w13, w7
+ eor w12, w12, w7, ror 25
+ eor w13, w13, w9
+ add w10, w10, w12
+ add w10, w10, w13
+ ldr w12, [x3, #4]
+ add w10, w10, w14
+ add w10, w10, w12
+ add w6, w6, w10
+ ror w12, w11, #2
+ eor w13, w11, w4
+ eor w12, w12, w11, ror 13
+ eor w14, w4, w5
+ and w13, w13, w14
+ eor w12, w12, w11, ror 22
+ eor w13, w13, w4
+ add w10, w10, w12
+ add w10, w10, w13
+ ; Round 2
+ mov w14, v1.s[0]
+ ror w12, w6, #6
+ eor w13, w7, w8
+ eor w12, w12, w6, ror 11
+ and w13, w13, w6
+ eor w12, w12, w6, ror 25
+ eor w13, w13, w8
+ add w9, w9, w12
+ add w9, w9, w13
+ ldr w12, [x3, #8]
+ add w9, w9, w14
+ add w9, w9, w12
+ add w5, w5, w9
+ ror w12, w10, #2
+ eor w13, w10, w11
+ eor w12, w12, w10, ror 13
+ eor w14, w11, w4
+ and w13, w13, w14
+ eor w12, w12, w10, ror 22
+ eor w13, w13, w11
+ add w9, w9, w12
+ add w9, w9, w13
+ ; Round 3
+ mov w14, v1.s[1]
+ ror w12, w5, #6
+ eor w13, w6, w7
+ eor w12, w12, w5, ror 11
+ and w13, w13, w5
+ eor w12, w12, w5, ror 25
+ eor w13, w13, w7
+ add w8, w8, w12
+ add w8, w8, w13
+ ldr w12, [x3, #12]
+ add w8, w8, w14
+ add w8, w8, w12
+ add w4, w4, w8
+ ror w12, w9, #2
+ eor w13, w9, w10
+ eor w12, w12, w9, ror 13
+ eor w14, w10, w11
+ and w13, w13, w14
+ eor w12, w12, w9, ror 22
+ eor w13, w13, w10
+ add w8, w8, w12
+ add w8, w8, w13
+ ; Round 4
+ mov w14, v2.s[0]
+ ror w12, w4, #6
+ eor w13, w5, w6
+ eor w12, w12, w4, ror 11
+ and w13, w13, w4
+ eor w12, w12, w4, ror 25
+ eor w13, w13, w6
+ add w7, w7, w12
+ add w7, w7, w13
+ ldr w12, [x3, #16]
+ add w7, w7, w14
+ add w7, w7, w12
+ add w11, w11, w7
+ ror w12, w8, #2
+ eor w13, w8, w9
+ eor w12, w12, w8, ror 13
+ eor w14, w9, w10
+ and w13, w13, w14
+ eor w12, w12, w8, ror 22
+ eor w13, w13, w9
+ add w7, w7, w12
+ add w7, w7, w13
+ ; Round 5
+ mov w14, v2.s[1]
+ ror w12, w11, #6
+ eor w13, w4, w5
+ eor w12, w12, w11, ror 11
+ and w13, w13, w11
+ eor w12, w12, w11, ror 25
+ eor w13, w13, w5
+ add w6, w6, w12
+ add w6, w6, w13
+ ldr w12, [x3, #20]
+ add w6, w6, w14
+ add w6, w6, w12
+ add w10, w10, w6
+ ror w12, w7, #2
+ eor w13, w7, w8
+ eor w12, w12, w7, ror 13
+ eor w14, w8, w9
+ and w13, w13, w14
+ eor w12, w12, w7, ror 22
+ eor w13, w13, w8
+ add w6, w6, w12
+ add w6, w6, w13
+ ; Round 6
+ mov w14, v3.s[0]
+ ror w12, w10, #6
+ eor w13, w11, w4
+ eor w12, w12, w10, ror 11
+ and w13, w13, w10
+ eor w12, w12, w10, ror 25
+ eor w13, w13, w4
+ add w5, w5, w12
+ add w5, w5, w13
+ ldr w12, [x3, #24]
+ add w5, w5, w14
+ add w5, w5, w12
+ add w9, w9, w5
+ ror w12, w6, #2
+ eor w13, w6, w7
+ eor w12, w12, w6, ror 13
+ eor w14, w7, w8
+ and w13, w13, w14
+ eor w12, w12, w6, ror 22
+ eor w13, w13, w7
+ add w5, w5, w12
+ add w5, w5, w13
+ ; Round 7
+ mov w14, v3.s[1]
+ ror w12, w9, #6
+ eor w13, w10, w11
+ eor w12, w12, w9, ror 11
+ and w13, w13, w9
+ eor w12, w12, w9, ror 25
+ eor w13, w13, w11
+ add w4, w4, w12
+ add w4, w4, w13
+ ldr w12, [x3, #28]
+ add w4, w4, w14
+ add w4, w4, w12
+ add w8, w8, w4
+ ror w12, w5, #2
+ eor w13, w5, w6
+ eor w12, w12, w5, ror 13
+ eor w14, w6, w7
+ and w13, w13, w14
+ eor w12, w12, w5, ror 22
+ eor w13, w13, w6
+ add w4, w4, w12
+ add w4, w4, w13
+ ; Round 8
+ mov w14, v4.s[0]
+ ror w12, w8, #6
+ eor w13, w9, w10
+ eor w12, w12, w8, ror 11
+ and w13, w13, w8
+ eor w12, w12, w8, ror 25
+ eor w13, w13, w10
+ add w11, w11, w12
+ add w11, w11, w13
+ ldr w12, [x3, #32]
+ add w11, w11, w14
+ add w11, w11, w12
+ add w7, w7, w11
+ ror w12, w4, #2
+ eor w13, w4, w5
+ eor w12, w12, w4, ror 13
+ eor w14, w5, w6
+ and w13, w13, w14
+ eor w12, w12, w4, ror 22
+ eor w13, w13, w5
+ add w11, w11, w12
+ add w11, w11, w13
+ ; Round 9
+ mov w14, v4.s[1]
+ ror w12, w7, #6
+ eor w13, w8, w9
+ eor w12, w12, w7, ror 11
+ and w13, w13, w7
+ eor w12, w12, w7, ror 25
+ eor w13, w13, w9
+ add w10, w10, w12
+ add w10, w10, w13
+ ldr w12, [x3, #36]
+ add w10, w10, w14
+ add w10, w10, w12
+ add w6, w6, w10
+ ror w12, w11, #2
+ eor w13, w11, w4
+ eor w12, w12, w11, ror 13
+ eor w14, w4, w5
+ and w13, w13, w14
+ eor w12, w12, w11, ror 22
+ eor w13, w13, w4
+ add w10, w10, w12
+ add w10, w10, w13
+ ; Round 10
+ mov w14, v5.s[0]
+ ror w12, w6, #6
+ eor w13, w7, w8
+ eor w12, w12, w6, ror 11
+ and w13, w13, w6
+ eor w12, w12, w6, ror 25
+ eor w13, w13, w8
+ add w9, w9, w12
+ add w9, w9, w13
+ ldr w12, [x3, #40]
+ add w9, w9, w14
+ add w9, w9, w12
+ add w5, w5, w9
+ ror w12, w10, #2
+ eor w13, w10, w11
+ eor w12, w12, w10, ror 13
+ eor w14, w11, w4
+ and w13, w13, w14
+ eor w12, w12, w10, ror 22
+ eor w13, w13, w11
+ add w9, w9, w12
+ add w9, w9, w13
+ ; Round 11
+ mov w14, v5.s[1]
+ ror w12, w5, #6
+ eor w13, w6, w7
+ eor w12, w12, w5, ror 11
+ and w13, w13, w5
+ eor w12, w12, w5, ror 25
+ eor w13, w13, w7
+ add w8, w8, w12
+ add w8, w8, w13
+ ldr w12, [x3, #44]
+ add w8, w8, w14
+ add w8, w8, w12
+ add w4, w4, w8
+ ror w12, w9, #2
+ eor w13, w9, w10
+ eor w12, w12, w9, ror 13
+ eor w14, w10, w11
+ and w13, w13, w14
+ eor w12, w12, w9, ror 22
+ eor w13, w13, w10
+ add w8, w8, w12
+ add w8, w8, w13
+ ; Round 12
+ mov w14, v6.s[0]
+ ror w12, w4, #6
+ eor w13, w5, w6
+ eor w12, w12, w4, ror 11
+ and w13, w13, w4
+ eor w12, w12, w4, ror 25
+ eor w13, w13, w6
+ add w7, w7, w12
+ add w7, w7, w13
+ ldr w12, [x3, #48]
+ add w7, w7, w14
+ add w7, w7, w12
+ add w11, w11, w7
+ ror w12, w8, #2
+ eor w13, w8, w9
+ eor w12, w12, w8, ror 13
+ eor w14, w9, w10
+ and w13, w13, w14
+ eor w12, w12, w8, ror 22
+ eor w13, w13, w9
+ add w7, w7, w12
+ add w7, w7, w13
+ ; Round 13
+ mov w14, v6.s[1]
+ ror w12, w11, #6
+ eor w13, w4, w5
+ eor w12, w12, w11, ror 11
+ and w13, w13, w11
+ eor w12, w12, w11, ror 25
+ eor w13, w13, w5
+ add w6, w6, w12
+ add w6, w6, w13
+ ldr w12, [x3, #52]
+ add w6, w6, w14
+ add w6, w6, w12
+ add w10, w10, w6
+ ror w12, w7, #2
+ eor w13, w7, w8
+ eor w12, w12, w7, ror 13
+ eor w14, w8, w9
+ and w13, w13, w14
+ eor w12, w12, w7, ror 22
+ eor w13, w13, w8
+ add w6, w6, w12
+ add w6, w6, w13
+ ; Round 14
+ mov w14, v7.s[0]
+ ror w12, w10, #6
+ eor w13, w11, w4
+ eor w12, w12, w10, ror 11
+ and w13, w13, w10
+ eor w12, w12, w10, ror 25
+ eor w13, w13, w4
+ add w5, w5, w12
+ add w5, w5, w13
+ ldr w12, [x3, #56]
+ add w5, w5, w14
+ add w5, w5, w12
+ add w9, w9, w5
+ ror w12, w6, #2
+ eor w13, w6, w7
+ eor w12, w12, w6, ror 13
+ eor w14, w7, w8
+ and w13, w13, w14
+ eor w12, w12, w6, ror 22
+ eor w13, w13, w7
+ add w5, w5, w12
+ add w5, w5, w13
+ ; Round 15
+ mov w14, v7.s[1]
+ ror w12, w9, #6
+ eor w13, w10, w11
+ eor w12, w12, w9, ror 11
+ and w13, w13, w9
+ eor w12, w12, w9, ror 25
+ eor w13, w13, w11
+ add w4, w4, w12
+ add w4, w4, w13
+ ldr w12, [x3, #60]
+ add w4, w4, w14
+ add w4, w4, w12
+ add w8, w8, w4
+ ror w12, w5, #2
+ eor w13, w5, w6
+ eor w12, w12, w5, ror 13
+ eor w14, w6, w7
+ and w13, w13, w14
+ eor w12, w12, w5, ror 22
+ eor w13, w13, w6
+ add w4, w4, w12
+ add w4, w4, w13
+ add w11, w11, w23
+ add w10, w10, w22
+ add w9, w9, w21
+ add w8, w8, w20
+ add w7, w7, w19
+ add w6, w6, w17
+ add w5, w5, w16
+ add w4, w4, w15
+ subs w2, w2, #0x40
+ sub x3, x3, #0xc0
+ bne L_sha256_len_neon_begin
+ str w4, [x0]
+ str w5, [x0, #4]
+ str w6, [x0, #8]
+ str w7, [x0, #12]
+ str w8, [x0, #16]
+ str w9, [x0, #20]
+ str w10, [x0, #24]
+ str w11, [x0, #28]
+ ldp x17, x19, [x29, #24]
+ ldp x20, x21, [x29, #40]
+ ldp x22, x23, [x29, #56]
+ ldr x24, [x29, #72]
+ ldp d8, d9, [x29, #80]
+ ldp d10, d11, [x29, #96]
+ ldp x29, x30, [sp], #0x70
+ ret
+ ENDP
+ IF :LNOT::DEF:WOLFSSL_ARMASM_NO_HW_CRYPTO
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 8
+L_SHA256_trans_crypto_len_k
+ DCD 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5
+ DCD 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5
+ DCD 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3
+ DCD 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
+ DCD 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc
+ DCD 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da
+ DCD 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7
+ DCD 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967
+ DCD 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13
+ DCD 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85
+ DCD 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3
+ DCD 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070
+ DCD 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5
+ DCD 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3
+ DCD 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208
+ DCD 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT Transform_Sha256_Len_crypto
+Transform_Sha256_Len_crypto PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x3, L_SHA256_trans_crypto_len_k
+ add x3, x3, L_SHA256_trans_crypto_len_k
+ ; Load K into vector registers
+ ld1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x3], #0x40
+ ld1 {v12.4s, v13.4s, v14.4s, v15.4s}, [x3], #0x40
+ ld1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x3], #0x40
+ ld1 {v20.4s, v21.4s, v22.4s, v23.4s}, [x3], #0x40
+ ; Load digest into working vars
+ ld1 {v0.4s, v1.4s}, [x0]
+ ; Start of loop processing a block
+L_sha256_len_crypto_begin
+ ; Load W
+ ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x1], #0x40
+ rev32 v4.16b, v4.16b
+ rev32 v5.16b, v5.16b
+ rev32 v6.16b, v6.16b
+ rev32 v7.16b, v7.16b
+ ; Copy digest to add in at end
+ mov v2.16b, v0.16b
+ mov v3.16b, v1.16b
+ ; Start 16 rounds
+ ; Round 1
+ add v24.4s, v4.4s, v8.4s
+ mov v25.16b, v0.16b
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 2
+ sha256su0 v4.4s, v5.4s
+ add v24.4s, v5.4s, v9.4s
+ mov v25.16b, v0.16b
+ sha256su1 v4.4s, v6.4s, v7.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 3
+ sha256su0 v5.4s, v6.4s
+ add v24.4s, v6.4s, v10.4s
+ mov v25.16b, v0.16b
+ sha256su1 v5.4s, v7.4s, v4.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 4
+ sha256su0 v6.4s, v7.4s
+ add v24.4s, v7.4s, v11.4s
+ mov v25.16b, v0.16b
+ sha256su1 v6.4s, v4.4s, v5.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 5
+ sha256su0 v7.4s, v4.4s
+ add v24.4s, v4.4s, v12.4s
+ mov v25.16b, v0.16b
+ sha256su1 v7.4s, v5.4s, v6.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 6
+ sha256su0 v4.4s, v5.4s
+ add v24.4s, v5.4s, v13.4s
+ mov v25.16b, v0.16b
+ sha256su1 v4.4s, v6.4s, v7.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 7
+ sha256su0 v5.4s, v6.4s
+ add v24.4s, v6.4s, v14.4s
+ mov v25.16b, v0.16b
+ sha256su1 v5.4s, v7.4s, v4.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 8
+ sha256su0 v6.4s, v7.4s
+ add v24.4s, v7.4s, v15.4s
+ mov v25.16b, v0.16b
+ sha256su1 v6.4s, v4.4s, v5.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 9
+ sha256su0 v7.4s, v4.4s
+ add v24.4s, v4.4s, v16.4s
+ mov v25.16b, v0.16b
+ sha256su1 v7.4s, v5.4s, v6.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 10
+ sha256su0 v4.4s, v5.4s
+ add v24.4s, v5.4s, v17.4s
+ mov v25.16b, v0.16b
+ sha256su1 v4.4s, v6.4s, v7.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 11
+ sha256su0 v5.4s, v6.4s
+ add v24.4s, v6.4s, v18.4s
+ mov v25.16b, v0.16b
+ sha256su1 v5.4s, v7.4s, v4.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 12
+ sha256su0 v6.4s, v7.4s
+ add v24.4s, v7.4s, v19.4s
+ mov v25.16b, v0.16b
+ sha256su1 v6.4s, v4.4s, v5.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 13
+ sha256su0 v7.4s, v4.4s
+ add v24.4s, v4.4s, v20.4s
+ mov v25.16b, v0.16b
+ sha256su1 v7.4s, v5.4s, v6.4s
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 14
+ add v24.4s, v5.4s, v21.4s
+ mov v25.16b, v0.16b
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 15
+ add v24.4s, v6.4s, v22.4s
+ mov v25.16b, v0.16b
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Round 16
+ add v24.4s, v7.4s, v23.4s
+ mov v25.16b, v0.16b
+ sha256h q0, q1, v24.4s
+ sha256h2 q1, q25, v24.4s
+ ; Done 16 rounds
+ add v0.4s, v0.4s, v2.4s
+ add v1.4s, v1.4s, v3.4s
+ subs w2, w2, #0x40
+ bne L_sha256_len_crypto_begin
+ ; Store digest back
+ st1 {v0.4s, v1.4s}, [x0]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ END
diff --git a/wolfcrypt/src/port/arm/armv8-sha3-asm.asm b/wolfcrypt/src/port/arm/armv8-sha3-asm.asm
new file mode 100644
index 0000000000..fcd1929a36
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-sha3-asm.asm
@@ -0,0 +1,370 @@
+; /* armv8-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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./sha3/sha3.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm.asm
+ IF :DEF:WOLFSSL_SHA3
+ IF :DEF:WOLFSSL_ARMASM_CRYPTO_SHA3
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 16
+L_SHA3_transform_crypto_r
+ DCQ 0x0000000000000001, 0x0000000000008082
+ DCQ 0x800000000000808a, 0x8000000080008000
+ DCQ 0x000000000000808b, 0x0000000080000001
+ DCQ 0x8000000080008081, 0x8000000000008009
+ DCQ 0x000000000000008a, 0x0000000000000088
+ DCQ 0x0000000080008009, 0x000000008000000a
+ DCQ 0x000000008000808b, 0x800000000000008b
+ DCQ 0x8000000000008089, 0x8000000000008003
+ DCQ 0x8000000000008002, 0x8000000000000080
+ DCQ 0x000000000000800a, 0x800000008000000a
+ DCQ 0x8000000080008081, 0x8000000000008080
+ DCQ 0x0000000080000001, 0x8000000080008008
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT BlockSha3_crypto
+BlockSha3_crypto PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x1, L_SHA3_transform_crypto_r
+ add x1, x1, L_SHA3_transform_crypto_r
+; .arch_extension sha3
+ ld4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ ld4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ ld4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ ld4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ ld4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ ld4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ ld1 {v24.1d}, [x0]
+ sub x0, x0, #0xc0
+ mov x2, #24
+ ; Start of 24 rounds
+L_sha3_crypto_begin
+ ; Col Mix
+ eor3 v31.16b, v0.16b, v5.16b, v10.16b
+ eor3 v27.16b, v1.16b, v6.16b, v11.16b
+ eor3 v28.16b, v2.16b, v7.16b, v12.16b
+ eor3 v29.16b, v3.16b, v8.16b, v13.16b
+ eor3 v30.16b, v4.16b, v9.16b, v14.16b
+ eor3 v31.16b, v31.16b, v15.16b, v20.16b
+ eor3 v27.16b, v27.16b, v16.16b, v21.16b
+ eor3 v28.16b, v28.16b, v17.16b, v22.16b
+ eor3 v29.16b, v29.16b, v18.16b, v23.16b
+ eor3 v30.16b, v30.16b, v19.16b, v24.16b
+ rax1 v25.2d, v30.2d, v27.2d
+ rax1 v26.2d, v31.2d, v28.2d
+ rax1 v27.2d, v27.2d, v29.2d
+ rax1 v28.2d, v28.2d, v30.2d
+ rax1 v29.2d, v29.2d, v31.2d
+ eor v0.16b, v0.16b, v25.16b
+ xar v30.2d, v1.2d, v26.2d, #63
+ xar v1.2d, v6.2d, v26.2d, #20
+ xar v6.2d, v9.2d, v29.2d, #44
+ xar v9.2d, v22.2d, v27.2d, #3
+ xar v22.2d, v14.2d, v29.2d, #25
+ xar v14.2d, v20.2d, v25.2d, #46
+ xar v20.2d, v2.2d, v27.2d, #2
+ xar v2.2d, v12.2d, v27.2d, #21
+ xar v12.2d, v13.2d, v28.2d, #39
+ xar v13.2d, v19.2d, v29.2d, #56
+ xar v19.2d, v23.2d, v28.2d, #8
+ xar v23.2d, v15.2d, v25.2d, #23
+ xar v15.2d, v4.2d, v29.2d, #37
+ xar v4.2d, v24.2d, v29.2d, #50
+ xar v24.2d, v21.2d, v26.2d, #62
+ xar v21.2d, v8.2d, v28.2d, #9
+ xar v8.2d, v16.2d, v26.2d, #19
+ xar v16.2d, v5.2d, v25.2d, #28
+ xar v5.2d, v3.2d, v28.2d, #36
+ xar v3.2d, v18.2d, v28.2d, #43
+ xar v18.2d, v17.2d, v27.2d, #49
+ xar v17.2d, v11.2d, v26.2d, #54
+ xar v11.2d, v7.2d, v27.2d, #58
+ xar v7.2d, v10.2d, v25.2d, #61
+ ; Row Mix
+ mov v25.16b, v0.16b
+ mov v26.16b, v1.16b
+ bcax v0.16b, v25.16b, v2.16b, v26.16b
+ bcax v1.16b, v26.16b, v3.16b, v2.16b
+ bcax v2.16b, v2.16b, v4.16b, v3.16b
+ bcax v3.16b, v3.16b, v25.16b, v4.16b
+ bcax v4.16b, v4.16b, v26.16b, v25.16b
+ mov v25.16b, v5.16b
+ mov v26.16b, v6.16b
+ bcax v5.16b, v25.16b, v7.16b, v26.16b
+ bcax v6.16b, v26.16b, v8.16b, v7.16b
+ bcax v7.16b, v7.16b, v9.16b, v8.16b
+ bcax v8.16b, v8.16b, v25.16b, v9.16b
+ bcax v9.16b, v9.16b, v26.16b, v25.16b
+ mov v26.16b, v11.16b
+ bcax v10.16b, v30.16b, v12.16b, v26.16b
+ bcax v11.16b, v26.16b, v13.16b, v12.16b
+ bcax v12.16b, v12.16b, v14.16b, v13.16b
+ bcax v13.16b, v13.16b, v30.16b, v14.16b
+ bcax v14.16b, v14.16b, v26.16b, v30.16b
+ mov v25.16b, v15.16b
+ mov v26.16b, v16.16b
+ bcax v15.16b, v25.16b, v17.16b, v26.16b
+ bcax v16.16b, v26.16b, v18.16b, v17.16b
+ bcax v17.16b, v17.16b, v19.16b, v18.16b
+ bcax v18.16b, v18.16b, v25.16b, v19.16b
+ bcax v19.16b, v19.16b, v26.16b, v25.16b
+ mov v25.16b, v20.16b
+ mov v26.16b, v21.16b
+ bcax v20.16b, v25.16b, v22.16b, v26.16b
+ bcax v21.16b, v26.16b, v23.16b, v22.16b
+ bcax v22.16b, v22.16b, v24.16b, v23.16b
+ bcax v23.16b, v23.16b, v25.16b, v24.16b
+ bcax v24.16b, v24.16b, v26.16b, v25.16b
+ ld1r {v30.2d}, [x1], #8
+ subs x2, x2, #1
+ eor v0.16b, v0.16b, v30.16b
+ bne L_sha3_crypto_begin
+ st4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32
+ st4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32
+ st4 {v8.d, v9.d, v10.d, v11.d}[0], [x0], #32
+ st4 {v12.d, v13.d, v14.d, v15.d}[0], [x0], #32
+ st4 {v16.d, v17.d, v18.d, v19.d}[0], [x0], #32
+ st4 {v20.d, v21.d, v22.d, v23.d}[0], [x0], #32
+ st1 {v24.1d}, [x0]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 16
+L_SHA3_transform_base_r
+ DCQ 0x0000000000000001, 0x0000000000008082
+ DCQ 0x800000000000808a, 0x8000000080008000
+ DCQ 0x000000000000808b, 0x0000000080000001
+ DCQ 0x8000000080008081, 0x8000000000008009
+ DCQ 0x000000000000008a, 0x0000000000000088
+ DCQ 0x0000000080008009, 0x000000008000000a
+ DCQ 0x000000008000808b, 0x800000000000008b
+ DCQ 0x8000000000008089, 0x8000000000008003
+ DCQ 0x8000000000008002, 0x8000000000000080
+ DCQ 0x000000000000800a, 0x800000008000000a
+ DCQ 0x8000000080008081, 0x8000000000008080
+ DCQ 0x0000000080000001, 0x8000000080008008
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT BlockSha3_base
+BlockSha3_base PROC
+ stp x29, x30, [sp, #-160]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #72]
+ stp x20, x21, [x29, #88]
+ stp x22, x23, [x29, #104]
+ stp x24, x25, [x29, #120]
+ stp x26, x27, [x29, #136]
+ str x28, [x29, #152]
+ adrp x27, L_SHA3_transform_base_r
+ add x27, x27, L_SHA3_transform_base_r
+ ldp x1, x2, [x0]
+ ldp x3, x4, [x0, #16]
+ ldp x5, x6, [x0, #32]
+ ldp x7, x8, [x0, #48]
+ ldp x9, x10, [x0, #64]
+ ldp x11, x12, [x0, #80]
+ ldp x13, x14, [x0, #96]
+ ldp x15, x16, [x0, #112]
+ ldp x17, x19, [x0, #128]
+ ldp x20, x21, [x0, #144]
+ ldp x22, x23, [x0, #160]
+ ldp x24, x25, [x0, #176]
+ ldr x26, [x0, #192]
+ str x0, [x29, #40]
+ mov x28, #24
+ ; Start of 24 rounds
+L_SHA3_transform_base_begin
+ stp x27, x28, [x29, #48]
+ eor x0, x5, x10
+ eor x30, x1, x6
+ eor x28, x3, x8
+ eor x0, x0, x15
+ eor x30, x30, x11
+ eor x28, x28, x13
+ eor x0, x0, x21
+ eor x30, x30, x16
+ eor x28, x28, x19
+ eor x0, x0, x26
+ eor x30, x30, x22
+ eor x28, x28, x24
+ str x0, [x29, #32]
+ str x28, [x29, #24]
+ eor x27, x2, x7
+ eor x28, x4, x9
+ eor x27, x27, x12
+ eor x28, x28, x14
+ eor x27, x27, x17
+ eor x28, x28, x20
+ eor x27, x27, x23
+ eor x28, x28, x25
+ eor x0, x0, x27, ror 63
+ eor x27, x27, x28, ror 63
+ eor x1, x1, x0
+ eor x6, x6, x0
+ eor x11, x11, x0
+ eor x16, x16, x0
+ eor x22, x22, x0
+ eor x3, x3, x27
+ eor x8, x8, x27
+ eor x13, x13, x27
+ eor x19, x19, x27
+ eor x24, x24, x27
+ ldr x0, [x29, #32]
+ ldr x27, [x29, #24]
+ eor x28, x28, x30, ror 63
+ eor x30, x30, x27, ror 63
+ eor x27, x27, x0, ror 63
+ eor x5, x5, x28
+ eor x10, x10, x28
+ eor x15, x15, x28
+ eor x21, x21, x28
+ eor x26, x26, x28
+ eor x2, x2, x30
+ eor x7, x7, x30
+ eor x12, x12, x30
+ eor x17, x17, x30
+ eor x23, x23, x30
+ eor x4, x4, x27
+ eor x9, x9, x27
+ eor x14, x14, x27
+ eor x20, x20, x27
+ eor x25, x25, x27
+ ; Swap Rotate
+ ror x0, x2, #63
+ ror x2, x7, #20
+ ror x7, x10, #44
+ ror x10, x24, #3
+ ror x24, x15, #25
+ ror x15, x22, #46
+ ror x22, x3, #2
+ ror x3, x13, #21
+ ror x13, x14, #39
+ ror x14, x21, #56
+ ror x21, x25, #8
+ ror x25, x16, #23
+ ror x16, x5, #37
+ ror x5, x26, #50
+ ror x26, x23, #62
+ ror x23, x9, #9
+ ror x9, x17, #19
+ ror x17, x6, #28
+ ror x6, x4, #36
+ ror x4, x20, #43
+ ror x20, x19, #49
+ ror x19, x12, #54
+ ror x12, x8, #58
+ ror x8, x11, #61
+ ; Row Mix
+ bic x11, x3, x2
+ bic x27, x4, x3
+ bic x28, x1, x5
+ bic x30, x2, x1
+ eor x1, x1, x11
+ eor x2, x2, x27
+ bic x11, x5, x4
+ eor x4, x4, x28
+ eor x3, x3, x11
+ eor x5, x5, x30
+ bic x11, x8, x7
+ bic x27, x9, x8
+ bic x28, x6, x10
+ bic x30, x7, x6
+ eor x6, x6, x11
+ eor x7, x7, x27
+ bic x11, x10, x9
+ eor x9, x9, x28
+ eor x8, x8, x11
+ eor x10, x10, x30
+ bic x11, x13, x12
+ bic x27, x14, x13
+ bic x28, x0, x15
+ bic x30, x12, x0
+ eor x11, x0, x11
+ eor x12, x12, x27
+ bic x0, x15, x14
+ eor x14, x14, x28
+ eor x13, x13, x0
+ eor x15, x15, x30
+ bic x0, x19, x17
+ bic x27, x20, x19
+ bic x28, x16, x21
+ bic x30, x17, x16
+ eor x16, x16, x0
+ eor x17, x17, x27
+ bic x0, x21, x20
+ eor x20, x20, x28
+ eor x19, x19, x0
+ eor x21, x21, x30
+ bic x0, x24, x23
+ bic x27, x25, x24
+ bic x28, x22, x26
+ bic x30, x23, x22
+ eor x22, x22, x0
+ eor x23, x23, x27
+ bic x0, x26, x25
+ eor x25, x25, x28
+ eor x24, x24, x0
+ eor x26, x26, x30
+ ; Done transforming
+ ldp x27, x28, [x29, #48]
+ ldr x0, [x27], #8
+ subs x28, x28, #1
+ eor x1, x1, x0
+ bne L_SHA3_transform_base_begin
+ ldr x0, [x29, #40]
+ stp x1, x2, [x0]
+ stp x3, x4, [x0, #16]
+ stp x5, x6, [x0, #32]
+ stp x7, x8, [x0, #48]
+ stp x9, x10, [x0, #64]
+ stp x11, x12, [x0, #80]
+ stp x13, x14, [x0, #96]
+ stp x15, x16, [x0, #112]
+ stp x17, x19, [x0, #128]
+ stp x20, x21, [x0, #144]
+ stp x22, x23, [x0, #160]
+ stp x24, x25, [x0, #176]
+ str x26, [x0, #192]
+ ldp x17, x19, [x29, #72]
+ ldp x20, x21, [x29, #88]
+ ldp x22, x23, [x29, #104]
+ ldp x24, x25, [x29, #120]
+ ldp x26, x27, [x29, #136]
+ ldr x28, [x29, #152]
+ ldp x29, x30, [sp], #0xa0
+ ret
+ ENDP
+ ENDIF
+ END
diff --git a/wolfcrypt/src/port/arm/armv8-sha512-asm.asm b/wolfcrypt/src/port/arm/armv8-sha512-asm.asm
new file mode 100644
index 0000000000..4c333808e6
--- /dev/null
+++ b/wolfcrypt/src/port/arm/armv8-sha512-asm.asm
@@ -0,0 +1,1571 @@
+; /* armv8-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
+; */
+
+
+; Generated using (from wolfssl):
+; cd ../scripts
+; ruby ./sha2/sha512.rb arm64 \
+; ../wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm.asm
+ IF :DEF:WOLFSSL_SHA512 :LOR: :DEF:WOLFSSL_SHA384
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 16
+L_SHA512_transform_neon_len_k
+ DCQ 0x428a2f98d728ae22, 0x7137449123ef65cd
+ DCQ 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc
+ DCQ 0x3956c25bf348b538, 0x59f111f1b605d019
+ DCQ 0x923f82a4af194f9b, 0xab1c5ed5da6d8118
+ DCQ 0xd807aa98a3030242, 0x12835b0145706fbe
+ DCQ 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2
+ DCQ 0x72be5d74f27b896f, 0x80deb1fe3b1696b1
+ DCQ 0x9bdc06a725c71235, 0xc19bf174cf692694
+ DCQ 0xe49b69c19ef14ad2, 0xefbe4786384f25e3
+ DCQ 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65
+ DCQ 0x2de92c6f592b0275, 0x4a7484aa6ea6e483
+ DCQ 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5
+ DCQ 0x983e5152ee66dfab, 0xa831c66d2db43210
+ DCQ 0xb00327c898fb213f, 0xbf597fc7beef0ee4
+ DCQ 0xc6e00bf33da88fc2, 0xd5a79147930aa725
+ DCQ 0x06ca6351e003826f, 0x142929670a0e6e70
+ DCQ 0x27b70a8546d22ffc, 0x2e1b21385c26c926
+ DCQ 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df
+ DCQ 0x650a73548baf63de, 0x766a0abb3c77b2a8
+ DCQ 0x81c2c92e47edaee6, 0x92722c851482353b
+ DCQ 0xa2bfe8a14cf10364, 0xa81a664bbc423001
+ DCQ 0xc24b8b70d0f89791, 0xc76c51a30654be30
+ DCQ 0xd192e819d6ef5218, 0xd69906245565a910
+ DCQ 0xf40e35855771202a, 0x106aa07032bbd1b8
+ DCQ 0x19a4c116b8d2d0c8, 0x1e376c085141ab53
+ DCQ 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8
+ DCQ 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb
+ DCQ 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3
+ DCQ 0x748f82ee5defb2fc, 0x78a5636f43172f60
+ DCQ 0x84c87814a1f0ab72, 0x8cc702081a6439ec
+ DCQ 0x90befffa23631e28, 0xa4506cebde82bde9
+ DCQ 0xbef9a3f7b2c67915, 0xc67178f2e372532b
+ DCQ 0xca273eceea26619c, 0xd186b8c721c0c207
+ DCQ 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178
+ DCQ 0x06f067aa72176fba, 0x0a637dc5a2c898a6
+ DCQ 0x113f9804bef90dae, 0x1b710b35131c471b
+ DCQ 0x28db77f523047d84, 0x32caab7b40c72493
+ DCQ 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c
+ DCQ 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a
+ DCQ 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 16
+L_SHA512_transform_neon_len_r8
+ DCQ 0x0007060504030201, 0x080f0e0d0c0b0a09
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT Transform_Sha512_Len_neon
+Transform_Sha512_Len_neon PROC
+ stp x29, x30, [sp, #-128]!
+ add x29, sp, #0
+ stp x17, x19, [x29, #16]
+ stp x20, x21, [x29, #32]
+ stp x22, x23, [x29, #48]
+ stp x24, x25, [x29, #64]
+ stp x26, x27, [x29, #80]
+ stp d8, d9, [x29, #96]
+ stp d10, d11, [x29, #112]
+ adrp x3, L_SHA512_transform_neon_len_k
+ add x3, x3, L_SHA512_transform_neon_len_k
+ adrp x27, L_SHA512_transform_neon_len_r8
+ add x27, x27, L_SHA512_transform_neon_len_r8
+ ld1 {v11.16b}, [x27]
+ ; Load digest into working vars
+ ldp x4, x5, [x0]
+ ldp x6, x7, [x0, #16]
+ ldp x8, x9, [x0, #32]
+ ldp x10, x11, [x0, #48]
+ ; Start of loop processing a block
+L_sha512_len_neon_begin
+ ; Load W
+ ; Copy digest to add in at end
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ mov x19, x4
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ mov x20, x5
+ rev64 v0.16b, v0.16b
+ mov x21, x6
+ rev64 v1.16b, v1.16b
+ mov x22, x7
+ rev64 v2.16b, v2.16b
+ mov x23, x8
+ rev64 v3.16b, v3.16b
+ mov x24, x9
+ rev64 v4.16b, v4.16b
+ mov x25, x10
+ rev64 v5.16b, v5.16b
+ mov x26, x11
+ rev64 v6.16b, v6.16b
+ rev64 v7.16b, v7.16b
+ ; Pre-calc: b ^ c
+ eor x16, x5, x6
+ mov x27, #4
+ ; Start of 16 rounds
+L_sha512_len_neon_start
+ ; Round 0
+ mov x13, v0.d[0]
+ ldr x15, [x3], #8
+ ror x12, x8, #14
+ ror x14, x4, #28
+ eor x12, x12, x8, ror 18
+ eor x14, x14, x4, ror 34
+ eor x12, x12, x8, ror 41
+ eor x14, x14, x4, ror 39
+ add x11, x11, x12
+ eor x17, x4, x5
+ eor x12, x9, x10
+ and x16, x17, x16
+ and x12, x12, x8
+ add x11, x11, x13
+ eor x12, x12, x10
+ add x11, x11, x15
+ eor x16, x16, x5
+ add x11, x11, x12
+ add x14, x14, x16
+ add x7, x7, x11
+ add x11, x11, x14
+ ; Round 1
+ mov x13, v0.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v0.16b, v1.16b, #8
+ ror x12, x7, #14
+ shl v8.2d, v7.2d, #45
+ ror x14, x11, #28
+ sri v8.2d, v7.2d, #19
+ eor x12, x12, x7, ror 18
+ shl v9.2d, v7.2d, #3
+ eor x14, x14, x11, ror 34
+ sri v9.2d, v7.2d, #61
+ eor x12, x12, x7, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x11, ror 39
+ ushr v8.2d, v7.2d, #6
+ add x10, x10, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x11, x4
+ add v0.2d, v0.2d, v9.2d
+ eor x12, x8, x9
+ ext v9.16b, v4.16b, v5.16b, #8
+ and x17, x16, x17
+ add v0.2d, v0.2d, v9.2d
+ and x12, x12, x7
+ shl v8.2d, v10.2d, #63
+ add x10, x10, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x9
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x10, x10, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x4
+ ushr v10.2d, v10.2d, #7
+ add x10, x10, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v0.2d, v0.2d, v9.2d
+ add x6, x6, x10
+ add x10, x10, x14
+ ; Round 2
+ mov x13, v1.d[0]
+ ldr x15, [x3], #8
+ ror x12, x6, #14
+ ror x14, x10, #28
+ eor x12, x12, x6, ror 18
+ eor x14, x14, x10, ror 34
+ eor x12, x12, x6, ror 41
+ eor x14, x14, x10, ror 39
+ add x9, x9, x12
+ eor x17, x10, x11
+ eor x12, x7, x8
+ and x16, x17, x16
+ and x12, x12, x6
+ add x9, x9, x13
+ eor x12, x12, x8
+ add x9, x9, x15
+ eor x16, x16, x11
+ add x9, x9, x12
+ add x14, x14, x16
+ add x5, x5, x9
+ add x9, x9, x14
+ ; Round 3
+ mov x13, v1.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v1.16b, v2.16b, #8
+ ror x12, x5, #14
+ shl v8.2d, v0.2d, #45
+ ror x14, x9, #28
+ sri v8.2d, v0.2d, #19
+ eor x12, x12, x5, ror 18
+ shl v9.2d, v0.2d, #3
+ eor x14, x14, x9, ror 34
+ sri v9.2d, v0.2d, #61
+ eor x12, x12, x5, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x9, ror 39
+ ushr v8.2d, v0.2d, #6
+ add x8, x8, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x9, x10
+ add v1.2d, v1.2d, v9.2d
+ eor x12, x6, x7
+ ext v9.16b, v5.16b, v6.16b, #8
+ and x17, x16, x17
+ add v1.2d, v1.2d, v9.2d
+ and x12, x12, x5
+ shl v8.2d, v10.2d, #63
+ add x8, x8, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x7
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x8, x8, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x10
+ ushr v10.2d, v10.2d, #7
+ add x8, x8, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v1.2d, v1.2d, v9.2d
+ add x4, x4, x8
+ add x8, x8, x14
+ ; Round 4
+ mov x13, v2.d[0]
+ ldr x15, [x3], #8
+ ror x12, x4, #14
+ ror x14, x8, #28
+ eor x12, x12, x4, ror 18
+ eor x14, x14, x8, ror 34
+ eor x12, x12, x4, ror 41
+ eor x14, x14, x8, ror 39
+ add x7, x7, x12
+ eor x17, x8, x9
+ eor x12, x5, x6
+ and x16, x17, x16
+ and x12, x12, x4
+ add x7, x7, x13
+ eor x12, x12, x6
+ add x7, x7, x15
+ eor x16, x16, x9
+ add x7, x7, x12
+ add x14, x14, x16
+ add x11, x11, x7
+ add x7, x7, x14
+ ; Round 5
+ mov x13, v2.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v2.16b, v3.16b, #8
+ ror x12, x11, #14
+ shl v8.2d, v1.2d, #45
+ ror x14, x7, #28
+ sri v8.2d, v1.2d, #19
+ eor x12, x12, x11, ror 18
+ shl v9.2d, v1.2d, #3
+ eor x14, x14, x7, ror 34
+ sri v9.2d, v1.2d, #61
+ eor x12, x12, x11, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x7, ror 39
+ ushr v8.2d, v1.2d, #6
+ add x6, x6, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x7, x8
+ add v2.2d, v2.2d, v9.2d
+ eor x12, x4, x5
+ ext v9.16b, v6.16b, v7.16b, #8
+ and x17, x16, x17
+ add v2.2d, v2.2d, v9.2d
+ and x12, x12, x11
+ shl v8.2d, v10.2d, #63
+ add x6, x6, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x5
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x6, x6, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x8
+ ushr v10.2d, v10.2d, #7
+ add x6, x6, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v2.2d, v2.2d, v9.2d
+ add x10, x10, x6
+ add x6, x6, x14
+ ; Round 6
+ mov x13, v3.d[0]
+ ldr x15, [x3], #8
+ ror x12, x10, #14
+ ror x14, x6, #28
+ eor x12, x12, x10, ror 18
+ eor x14, x14, x6, ror 34
+ eor x12, x12, x10, ror 41
+ eor x14, x14, x6, ror 39
+ add x5, x5, x12
+ eor x17, x6, x7
+ eor x12, x11, x4
+ and x16, x17, x16
+ and x12, x12, x10
+ add x5, x5, x13
+ eor x12, x12, x4
+ add x5, x5, x15
+ eor x16, x16, x7
+ add x5, x5, x12
+ add x14, x14, x16
+ add x9, x9, x5
+ add x5, x5, x14
+ ; Round 7
+ mov x13, v3.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v3.16b, v4.16b, #8
+ ror x12, x9, #14
+ shl v8.2d, v2.2d, #45
+ ror x14, x5, #28
+ sri v8.2d, v2.2d, #19
+ eor x12, x12, x9, ror 18
+ shl v9.2d, v2.2d, #3
+ eor x14, x14, x5, ror 34
+ sri v9.2d, v2.2d, #61
+ eor x12, x12, x9, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x5, ror 39
+ ushr v8.2d, v2.2d, #6
+ add x4, x4, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x5, x6
+ add v3.2d, v3.2d, v9.2d
+ eor x12, x10, x11
+ ext v9.16b, v7.16b, v0.16b, #8
+ and x17, x16, x17
+ add v3.2d, v3.2d, v9.2d
+ and x12, x12, x9
+ shl v8.2d, v10.2d, #63
+ add x4, x4, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x11
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x4, x4, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x6
+ ushr v10.2d, v10.2d, #7
+ add x4, x4, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v3.2d, v3.2d, v9.2d
+ add x8, x8, x4
+ add x4, x4, x14
+ ; Round 8
+ mov x13, v4.d[0]
+ ldr x15, [x3], #8
+ ror x12, x8, #14
+ ror x14, x4, #28
+ eor x12, x12, x8, ror 18
+ eor x14, x14, x4, ror 34
+ eor x12, x12, x8, ror 41
+ eor x14, x14, x4, ror 39
+ add x11, x11, x12
+ eor x17, x4, x5
+ eor x12, x9, x10
+ and x16, x17, x16
+ and x12, x12, x8
+ add x11, x11, x13
+ eor x12, x12, x10
+ add x11, x11, x15
+ eor x16, x16, x5
+ add x11, x11, x12
+ add x14, x14, x16
+ add x7, x7, x11
+ add x11, x11, x14
+ ; Round 9
+ mov x13, v4.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v4.16b, v5.16b, #8
+ ror x12, x7, #14
+ shl v8.2d, v3.2d, #45
+ ror x14, x11, #28
+ sri v8.2d, v3.2d, #19
+ eor x12, x12, x7, ror 18
+ shl v9.2d, v3.2d, #3
+ eor x14, x14, x11, ror 34
+ sri v9.2d, v3.2d, #61
+ eor x12, x12, x7, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x11, ror 39
+ ushr v8.2d, v3.2d, #6
+ add x10, x10, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x11, x4
+ add v4.2d, v4.2d, v9.2d
+ eor x12, x8, x9
+ ext v9.16b, v0.16b, v1.16b, #8
+ and x17, x16, x17
+ add v4.2d, v4.2d, v9.2d
+ and x12, x12, x7
+ shl v8.2d, v10.2d, #63
+ add x10, x10, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x9
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x10, x10, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x4
+ ushr v10.2d, v10.2d, #7
+ add x10, x10, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v4.2d, v4.2d, v9.2d
+ add x6, x6, x10
+ add x10, x10, x14
+ ; Round 10
+ mov x13, v5.d[0]
+ ldr x15, [x3], #8
+ ror x12, x6, #14
+ ror x14, x10, #28
+ eor x12, x12, x6, ror 18
+ eor x14, x14, x10, ror 34
+ eor x12, x12, x6, ror 41
+ eor x14, x14, x10, ror 39
+ add x9, x9, x12
+ eor x17, x10, x11
+ eor x12, x7, x8
+ and x16, x17, x16
+ and x12, x12, x6
+ add x9, x9, x13
+ eor x12, x12, x8
+ add x9, x9, x15
+ eor x16, x16, x11
+ add x9, x9, x12
+ add x14, x14, x16
+ add x5, x5, x9
+ add x9, x9, x14
+ ; Round 11
+ mov x13, v5.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v5.16b, v6.16b, #8
+ ror x12, x5, #14
+ shl v8.2d, v4.2d, #45
+ ror x14, x9, #28
+ sri v8.2d, v4.2d, #19
+ eor x12, x12, x5, ror 18
+ shl v9.2d, v4.2d, #3
+ eor x14, x14, x9, ror 34
+ sri v9.2d, v4.2d, #61
+ eor x12, x12, x5, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x9, ror 39
+ ushr v8.2d, v4.2d, #6
+ add x8, x8, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x9, x10
+ add v5.2d, v5.2d, v9.2d
+ eor x12, x6, x7
+ ext v9.16b, v1.16b, v2.16b, #8
+ and x17, x16, x17
+ add v5.2d, v5.2d, v9.2d
+ and x12, x12, x5
+ shl v8.2d, v10.2d, #63
+ add x8, x8, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x7
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x8, x8, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x10
+ ushr v10.2d, v10.2d, #7
+ add x8, x8, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v5.2d, v5.2d, v9.2d
+ add x4, x4, x8
+ add x8, x8, x14
+ ; Round 12
+ mov x13, v6.d[0]
+ ldr x15, [x3], #8
+ ror x12, x4, #14
+ ror x14, x8, #28
+ eor x12, x12, x4, ror 18
+ eor x14, x14, x8, ror 34
+ eor x12, x12, x4, ror 41
+ eor x14, x14, x8, ror 39
+ add x7, x7, x12
+ eor x17, x8, x9
+ eor x12, x5, x6
+ and x16, x17, x16
+ and x12, x12, x4
+ add x7, x7, x13
+ eor x12, x12, x6
+ add x7, x7, x15
+ eor x16, x16, x9
+ add x7, x7, x12
+ add x14, x14, x16
+ add x11, x11, x7
+ add x7, x7, x14
+ ; Round 13
+ mov x13, v6.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v6.16b, v7.16b, #8
+ ror x12, x11, #14
+ shl v8.2d, v5.2d, #45
+ ror x14, x7, #28
+ sri v8.2d, v5.2d, #19
+ eor x12, x12, x11, ror 18
+ shl v9.2d, v5.2d, #3
+ eor x14, x14, x7, ror 34
+ sri v9.2d, v5.2d, #61
+ eor x12, x12, x11, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x7, ror 39
+ ushr v8.2d, v5.2d, #6
+ add x6, x6, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x7, x8
+ add v6.2d, v6.2d, v9.2d
+ eor x12, x4, x5
+ ext v9.16b, v2.16b, v3.16b, #8
+ and x17, x16, x17
+ add v6.2d, v6.2d, v9.2d
+ and x12, x12, x11
+ shl v8.2d, v10.2d, #63
+ add x6, x6, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x5
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x6, x6, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x8
+ ushr v10.2d, v10.2d, #7
+ add x6, x6, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v6.2d, v6.2d, v9.2d
+ add x10, x10, x6
+ add x6, x6, x14
+ ; Round 14
+ mov x13, v7.d[0]
+ ldr x15, [x3], #8
+ ror x12, x10, #14
+ ror x14, x6, #28
+ eor x12, x12, x10, ror 18
+ eor x14, x14, x6, ror 34
+ eor x12, x12, x10, ror 41
+ eor x14, x14, x6, ror 39
+ add x5, x5, x12
+ eor x17, x6, x7
+ eor x12, x11, x4
+ and x16, x17, x16
+ and x12, x12, x10
+ add x5, x5, x13
+ eor x12, x12, x4
+ add x5, x5, x15
+ eor x16, x16, x7
+ add x5, x5, x12
+ add x14, x14, x16
+ add x9, x9, x5
+ add x5, x5, x14
+ ; Round 15
+ mov x13, v7.d[1]
+ ldr x15, [x3], #8
+ ext v10.16b, v7.16b, v0.16b, #8
+ ror x12, x9, #14
+ shl v8.2d, v6.2d, #45
+ ror x14, x5, #28
+ sri v8.2d, v6.2d, #19
+ eor x12, x12, x9, ror 18
+ shl v9.2d, v6.2d, #3
+ eor x14, x14, x5, ror 34
+ sri v9.2d, v6.2d, #61
+ eor x12, x12, x9, ror 41
+ eor v9.16b, v9.16b, v8.16b
+ eor x14, x14, x5, ror 39
+ ushr v8.2d, v6.2d, #6
+ add x4, x4, x12
+ eor v9.16b, v9.16b, v8.16b
+ eor x16, x5, x6
+ add v7.2d, v7.2d, v9.2d
+ eor x12, x10, x11
+ ext v9.16b, v3.16b, v4.16b, #8
+ and x17, x16, x17
+ add v7.2d, v7.2d, v9.2d
+ and x12, x12, x9
+ shl v8.2d, v10.2d, #63
+ add x4, x4, x13
+ sri v8.2d, v10.2d, #1
+ eor x12, x12, x11
+ tbl v9.16b, {v10.16b}, v11.16b
+ add x4, x4, x15
+ eor v9.16b, v9.16b, v8.16b
+ eor x17, x17, x6
+ ushr v10.2d, v10.2d, #7
+ add x4, x4, x12
+ eor v9.16b, v9.16b, v10.16b
+ add x14, x14, x17
+ add v7.2d, v7.2d, v9.2d
+ add x8, x8, x4
+ add x4, x4, x14
+ subs x27, x27, #1
+ bne L_sha512_len_neon_start
+ ; Round 0
+ mov x13, v0.d[0]
+ ldr x15, [x3], #8
+ ror x12, x8, #14
+ ror x14, x4, #28
+ eor x12, x12, x8, ror 18
+ eor x14, x14, x4, ror 34
+ eor x12, x12, x8, ror 41
+ eor x14, x14, x4, ror 39
+ add x11, x11, x12
+ eor x17, x4, x5
+ eor x12, x9, x10
+ and x16, x17, x16
+ and x12, x12, x8
+ add x11, x11, x13
+ eor x12, x12, x10
+ add x11, x11, x15
+ eor x16, x16, x5
+ add x11, x11, x12
+ add x14, x14, x16
+ add x7, x7, x11
+ add x11, x11, x14
+ ; Round 1
+ mov x13, v0.d[1]
+ ldr x15, [x3], #8
+ ror x12, x7, #14
+ ror x14, x11, #28
+ eor x12, x12, x7, ror 18
+ eor x14, x14, x11, ror 34
+ eor x12, x12, x7, ror 41
+ eor x14, x14, x11, ror 39
+ add x10, x10, x12
+ eor x16, x11, x4
+ eor x12, x8, x9
+ and x17, x16, x17
+ and x12, x12, x7
+ add x10, x10, x13
+ eor x12, x12, x9
+ add x10, x10, x15
+ eor x17, x17, x4
+ add x10, x10, x12
+ add x14, x14, x17
+ add x6, x6, x10
+ add x10, x10, x14
+ ; Round 2
+ mov x13, v1.d[0]
+ ldr x15, [x3], #8
+ ror x12, x6, #14
+ ror x14, x10, #28
+ eor x12, x12, x6, ror 18
+ eor x14, x14, x10, ror 34
+ eor x12, x12, x6, ror 41
+ eor x14, x14, x10, ror 39
+ add x9, x9, x12
+ eor x17, x10, x11
+ eor x12, x7, x8
+ and x16, x17, x16
+ and x12, x12, x6
+ add x9, x9, x13
+ eor x12, x12, x8
+ add x9, x9, x15
+ eor x16, x16, x11
+ add x9, x9, x12
+ add x14, x14, x16
+ add x5, x5, x9
+ add x9, x9, x14
+ ; Round 3
+ mov x13, v1.d[1]
+ ldr x15, [x3], #8
+ ror x12, x5, #14
+ ror x14, x9, #28
+ eor x12, x12, x5, ror 18
+ eor x14, x14, x9, ror 34
+ eor x12, x12, x5, ror 41
+ eor x14, x14, x9, ror 39
+ add x8, x8, x12
+ eor x16, x9, x10
+ eor x12, x6, x7
+ and x17, x16, x17
+ and x12, x12, x5
+ add x8, x8, x13
+ eor x12, x12, x7
+ add x8, x8, x15
+ eor x17, x17, x10
+ add x8, x8, x12
+ add x14, x14, x17
+ add x4, x4, x8
+ add x8, x8, x14
+ ; Round 4
+ mov x13, v2.d[0]
+ ldr x15, [x3], #8
+ ror x12, x4, #14
+ ror x14, x8, #28
+ eor x12, x12, x4, ror 18
+ eor x14, x14, x8, ror 34
+ eor x12, x12, x4, ror 41
+ eor x14, x14, x8, ror 39
+ add x7, x7, x12
+ eor x17, x8, x9
+ eor x12, x5, x6
+ and x16, x17, x16
+ and x12, x12, x4
+ add x7, x7, x13
+ eor x12, x12, x6
+ add x7, x7, x15
+ eor x16, x16, x9
+ add x7, x7, x12
+ add x14, x14, x16
+ add x11, x11, x7
+ add x7, x7, x14
+ ; Round 5
+ mov x13, v2.d[1]
+ ldr x15, [x3], #8
+ ror x12, x11, #14
+ ror x14, x7, #28
+ eor x12, x12, x11, ror 18
+ eor x14, x14, x7, ror 34
+ eor x12, x12, x11, ror 41
+ eor x14, x14, x7, ror 39
+ add x6, x6, x12
+ eor x16, x7, x8
+ eor x12, x4, x5
+ and x17, x16, x17
+ and x12, x12, x11
+ add x6, x6, x13
+ eor x12, x12, x5
+ add x6, x6, x15
+ eor x17, x17, x8
+ add x6, x6, x12
+ add x14, x14, x17
+ add x10, x10, x6
+ add x6, x6, x14
+ ; Round 6
+ mov x13, v3.d[0]
+ ldr x15, [x3], #8
+ ror x12, x10, #14
+ ror x14, x6, #28
+ eor x12, x12, x10, ror 18
+ eor x14, x14, x6, ror 34
+ eor x12, x12, x10, ror 41
+ eor x14, x14, x6, ror 39
+ add x5, x5, x12
+ eor x17, x6, x7
+ eor x12, x11, x4
+ and x16, x17, x16
+ and x12, x12, x10
+ add x5, x5, x13
+ eor x12, x12, x4
+ add x5, x5, x15
+ eor x16, x16, x7
+ add x5, x5, x12
+ add x14, x14, x16
+ add x9, x9, x5
+ add x5, x5, x14
+ ; Round 7
+ mov x13, v3.d[1]
+ ldr x15, [x3], #8
+ ror x12, x9, #14
+ ror x14, x5, #28
+ eor x12, x12, x9, ror 18
+ eor x14, x14, x5, ror 34
+ eor x12, x12, x9, ror 41
+ eor x14, x14, x5, ror 39
+ add x4, x4, x12
+ eor x16, x5, x6
+ eor x12, x10, x11
+ and x17, x16, x17
+ and x12, x12, x9
+ add x4, x4, x13
+ eor x12, x12, x11
+ add x4, x4, x15
+ eor x17, x17, x6
+ add x4, x4, x12
+ add x14, x14, x17
+ add x8, x8, x4
+ add x4, x4, x14
+ ; Round 8
+ mov x13, v4.d[0]
+ ldr x15, [x3], #8
+ ror x12, x8, #14
+ ror x14, x4, #28
+ eor x12, x12, x8, ror 18
+ eor x14, x14, x4, ror 34
+ eor x12, x12, x8, ror 41
+ eor x14, x14, x4, ror 39
+ add x11, x11, x12
+ eor x17, x4, x5
+ eor x12, x9, x10
+ and x16, x17, x16
+ and x12, x12, x8
+ add x11, x11, x13
+ eor x12, x12, x10
+ add x11, x11, x15
+ eor x16, x16, x5
+ add x11, x11, x12
+ add x14, x14, x16
+ add x7, x7, x11
+ add x11, x11, x14
+ ; Round 9
+ mov x13, v4.d[1]
+ ldr x15, [x3], #8
+ ror x12, x7, #14
+ ror x14, x11, #28
+ eor x12, x12, x7, ror 18
+ eor x14, x14, x11, ror 34
+ eor x12, x12, x7, ror 41
+ eor x14, x14, x11, ror 39
+ add x10, x10, x12
+ eor x16, x11, x4
+ eor x12, x8, x9
+ and x17, x16, x17
+ and x12, x12, x7
+ add x10, x10, x13
+ eor x12, x12, x9
+ add x10, x10, x15
+ eor x17, x17, x4
+ add x10, x10, x12
+ add x14, x14, x17
+ add x6, x6, x10
+ add x10, x10, x14
+ ; Round 10
+ mov x13, v5.d[0]
+ ldr x15, [x3], #8
+ ror x12, x6, #14
+ ror x14, x10, #28
+ eor x12, x12, x6, ror 18
+ eor x14, x14, x10, ror 34
+ eor x12, x12, x6, ror 41
+ eor x14, x14, x10, ror 39
+ add x9, x9, x12
+ eor x17, x10, x11
+ eor x12, x7, x8
+ and x16, x17, x16
+ and x12, x12, x6
+ add x9, x9, x13
+ eor x12, x12, x8
+ add x9, x9, x15
+ eor x16, x16, x11
+ add x9, x9, x12
+ add x14, x14, x16
+ add x5, x5, x9
+ add x9, x9, x14
+ ; Round 11
+ mov x13, v5.d[1]
+ ldr x15, [x3], #8
+ ror x12, x5, #14
+ ror x14, x9, #28
+ eor x12, x12, x5, ror 18
+ eor x14, x14, x9, ror 34
+ eor x12, x12, x5, ror 41
+ eor x14, x14, x9, ror 39
+ add x8, x8, x12
+ eor x16, x9, x10
+ eor x12, x6, x7
+ and x17, x16, x17
+ and x12, x12, x5
+ add x8, x8, x13
+ eor x12, x12, x7
+ add x8, x8, x15
+ eor x17, x17, x10
+ add x8, x8, x12
+ add x14, x14, x17
+ add x4, x4, x8
+ add x8, x8, x14
+ ; Round 12
+ mov x13, v6.d[0]
+ ldr x15, [x3], #8
+ ror x12, x4, #14
+ ror x14, x8, #28
+ eor x12, x12, x4, ror 18
+ eor x14, x14, x8, ror 34
+ eor x12, x12, x4, ror 41
+ eor x14, x14, x8, ror 39
+ add x7, x7, x12
+ eor x17, x8, x9
+ eor x12, x5, x6
+ and x16, x17, x16
+ and x12, x12, x4
+ add x7, x7, x13
+ eor x12, x12, x6
+ add x7, x7, x15
+ eor x16, x16, x9
+ add x7, x7, x12
+ add x14, x14, x16
+ add x11, x11, x7
+ add x7, x7, x14
+ ; Round 13
+ mov x13, v6.d[1]
+ ldr x15, [x3], #8
+ ror x12, x11, #14
+ ror x14, x7, #28
+ eor x12, x12, x11, ror 18
+ eor x14, x14, x7, ror 34
+ eor x12, x12, x11, ror 41
+ eor x14, x14, x7, ror 39
+ add x6, x6, x12
+ eor x16, x7, x8
+ eor x12, x4, x5
+ and x17, x16, x17
+ and x12, x12, x11
+ add x6, x6, x13
+ eor x12, x12, x5
+ add x6, x6, x15
+ eor x17, x17, x8
+ add x6, x6, x12
+ add x14, x14, x17
+ add x10, x10, x6
+ add x6, x6, x14
+ ; Round 14
+ mov x13, v7.d[0]
+ ldr x15, [x3], #8
+ ror x12, x10, #14
+ ror x14, x6, #28
+ eor x12, x12, x10, ror 18
+ eor x14, x14, x6, ror 34
+ eor x12, x12, x10, ror 41
+ eor x14, x14, x6, ror 39
+ add x5, x5, x12
+ eor x17, x6, x7
+ eor x12, x11, x4
+ and x16, x17, x16
+ and x12, x12, x10
+ add x5, x5, x13
+ eor x12, x12, x4
+ add x5, x5, x15
+ eor x16, x16, x7
+ add x5, x5, x12
+ add x14, x14, x16
+ add x9, x9, x5
+ add x5, x5, x14
+ ; Round 15
+ mov x13, v7.d[1]
+ ldr x15, [x3], #8
+ ror x12, x9, #14
+ ror x14, x5, #28
+ eor x12, x12, x9, ror 18
+ eor x14, x14, x5, ror 34
+ eor x12, x12, x9, ror 41
+ eor x14, x14, x5, ror 39
+ add x4, x4, x12
+ eor x16, x5, x6
+ eor x12, x10, x11
+ and x17, x16, x17
+ and x12, x12, x9
+ add x4, x4, x13
+ eor x12, x12, x11
+ add x4, x4, x15
+ eor x17, x17, x6
+ add x4, x4, x12
+ add x14, x14, x17
+ add x8, x8, x4
+ add x4, x4, x14
+ add x11, x11, x26
+ add x10, x10, x25
+ add x9, x9, x24
+ add x8, x8, x23
+ add x7, x7, x22
+ add x6, x6, x21
+ add x5, x5, x20
+ add x4, x4, x19
+ subs w2, w2, #0x80
+ sub x3, x3, #0x280
+ bne L_sha512_len_neon_begin
+ stp x4, x5, [x0]
+ stp x6, x7, [x0, #16]
+ stp x8, x9, [x0, #32]
+ stp x10, x11, [x0, #48]
+ ldp x17, x19, [x29, #16]
+ ldp x20, x21, [x29, #32]
+ ldp x22, x23, [x29, #48]
+ ldp x24, x25, [x29, #64]
+ ldp x26, x27, [x29, #80]
+ ldp d8, d9, [x29, #96]
+ ldp d10, d11, [x29, #112]
+ ldp x29, x30, [sp], #0x80
+ ret
+ ENDP
+ IF :DEF:WOLFSSL_ARMASM_CRYPTO_SHA512
+ AREA |.rodata|, DATA, READONLY
+ ALIGN 16
+L_SHA512_trans_crypto_len_k
+ DCQ 0x428a2f98d728ae22, 0x7137449123ef65cd
+ DCQ 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc
+ DCQ 0x3956c25bf348b538, 0x59f111f1b605d019
+ DCQ 0x923f82a4af194f9b, 0xab1c5ed5da6d8118
+ DCQ 0xd807aa98a3030242, 0x12835b0145706fbe
+ DCQ 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2
+ DCQ 0x72be5d74f27b896f, 0x80deb1fe3b1696b1
+ DCQ 0x9bdc06a725c71235, 0xc19bf174cf692694
+ DCQ 0xe49b69c19ef14ad2, 0xefbe4786384f25e3
+ DCQ 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65
+ DCQ 0x2de92c6f592b0275, 0x4a7484aa6ea6e483
+ DCQ 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5
+ DCQ 0x983e5152ee66dfab, 0xa831c66d2db43210
+ DCQ 0xb00327c898fb213f, 0xbf597fc7beef0ee4
+ DCQ 0xc6e00bf33da88fc2, 0xd5a79147930aa725
+ DCQ 0x06ca6351e003826f, 0x142929670a0e6e70
+ DCQ 0x27b70a8546d22ffc, 0x2e1b21385c26c926
+ DCQ 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df
+ DCQ 0x650a73548baf63de, 0x766a0abb3c77b2a8
+ DCQ 0x81c2c92e47edaee6, 0x92722c851482353b
+ DCQ 0xa2bfe8a14cf10364, 0xa81a664bbc423001
+ DCQ 0xc24b8b70d0f89791, 0xc76c51a30654be30
+ DCQ 0xd192e819d6ef5218, 0xd69906245565a910
+ DCQ 0xf40e35855771202a, 0x106aa07032bbd1b8
+ DCQ 0x19a4c116b8d2d0c8, 0x1e376c085141ab53
+ DCQ 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8
+ DCQ 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb
+ DCQ 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3
+ DCQ 0x748f82ee5defb2fc, 0x78a5636f43172f60
+ DCQ 0x84c87814a1f0ab72, 0x8cc702081a6439ec
+ DCQ 0x90befffa23631e28, 0xa4506cebde82bde9
+ DCQ 0xbef9a3f7b2c67915, 0xc67178f2e372532b
+ DCQ 0xca273eceea26619c, 0xd186b8c721c0c207
+ DCQ 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178
+ DCQ 0x06f067aa72176fba, 0x0a637dc5a2c898a6
+ DCQ 0x113f9804bef90dae, 0x1b710b35131c471b
+ DCQ 0x28db77f523047d84, 0x32caab7b40c72493
+ DCQ 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c
+ DCQ 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a
+ DCQ 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
+ AREA |.text|, CODE, READONLY
+ ALIGN 4
+ EXPORT Transform_Sha512_Len_crypto
+Transform_Sha512_Len_crypto PROC
+ stp x29, x30, [sp, #-80]!
+ add x29, sp, #0
+ stp d8, d9, [x29, #16]
+ stp d10, d11, [x29, #32]
+ stp d12, d13, [x29, #48]
+ stp d14, d15, [x29, #64]
+ adrp x4, L_SHA512_trans_crypto_len_k
+ add x4, x4, L_SHA512_trans_crypto_len_k
+; .arch_extension sha3
+ ; Load K into vector registers
+ ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x4], #0x40
+ ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [x4], #0x40
+ ; Load digest into working vars
+ ld1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x0]
+ ; Start of loop processing a block
+L_sha512_len_crypto_begin
+ mov x3, x4
+ ; Load W
+ ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x1], #0x40
+ ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x1], #0x40
+ rev64 v0.16b, v0.16b
+ rev64 v1.16b, v1.16b
+ rev64 v2.16b, v2.16b
+ rev64 v3.16b, v3.16b
+ rev64 v4.16b, v4.16b
+ rev64 v5.16b, v5.16b
+ rev64 v6.16b, v6.16b
+ rev64 v7.16b, v7.16b
+ ; Copy digest to add in at end
+ mov v28.16b, v24.16b
+ mov v29.16b, v25.16b
+ mov v30.16b, v26.16b
+ mov v31.16b, v27.16b
+ ; Start of 16 rounds
+ ; Round 0
+ add v20.2d, v0.2d, v8.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Round 1
+ add v20.2d, v1.2d, v9.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Round 2
+ add v20.2d, v2.2d, v10.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Round 3
+ add v20.2d, v3.2d, v11.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Round 4
+ add v20.2d, v4.2d, v12.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ ; Round 5
+ add v20.2d, v5.2d, v13.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Round 6
+ add v20.2d, v6.2d, v14.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Round 7
+ add v20.2d, v7.2d, v15.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 8
+ sha512su0 v0.2d, v1.2d
+ ext v21.16b, v4.16b, v5.16b, #8
+ sha512su1 v0.2d, v7.2d, v21.2d
+ add v20.2d, v0.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Round 9
+ sha512su0 v1.2d, v2.2d
+ ext v21.16b, v5.16b, v6.16b, #8
+ sha512su1 v1.2d, v0.2d, v21.2d
+ add v20.2d, v1.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ ; Round 10
+ sha512su0 v2.2d, v3.2d
+ ext v21.16b, v6.16b, v7.16b, #8
+ sha512su1 v2.2d, v1.2d, v21.2d
+ add v20.2d, v2.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Round 11
+ sha512su0 v3.2d, v4.2d
+ ext v21.16b, v7.16b, v0.16b, #8
+ sha512su1 v3.2d, v2.2d, v21.2d
+ add v20.2d, v3.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 12
+ sha512su0 v4.2d, v5.2d
+ ext v21.16b, v0.16b, v1.16b, #8
+ sha512su1 v4.2d, v3.2d, v21.2d
+ add v20.2d, v4.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Round 13
+ sha512su0 v5.2d, v6.2d
+ ext v21.16b, v1.16b, v2.16b, #8
+ sha512su1 v5.2d, v4.2d, v21.2d
+ add v20.2d, v5.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Round 14
+ sha512su0 v6.2d, v7.2d
+ ext v21.16b, v2.16b, v3.16b, #8
+ sha512su1 v6.2d, v5.2d, v21.2d
+ add v20.2d, v6.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ ; Round 15
+ sha512su0 v7.2d, v0.2d
+ ext v21.16b, v3.16b, v4.16b, #8
+ sha512su1 v7.2d, v6.2d, v21.2d
+ add v20.2d, v7.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 16
+ sha512su0 v0.2d, v1.2d
+ ext v21.16b, v4.16b, v5.16b, #8
+ sha512su1 v0.2d, v7.2d, v21.2d
+ add v20.2d, v0.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Round 17
+ sha512su0 v1.2d, v2.2d
+ ext v21.16b, v5.16b, v6.16b, #8
+ sha512su1 v1.2d, v0.2d, v21.2d
+ add v20.2d, v1.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Round 18
+ sha512su0 v2.2d, v3.2d
+ ext v21.16b, v6.16b, v7.16b, #8
+ sha512su1 v2.2d, v1.2d, v21.2d
+ add v20.2d, v2.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Round 19
+ sha512su0 v3.2d, v4.2d
+ ext v21.16b, v7.16b, v0.16b, #8
+ sha512su1 v3.2d, v2.2d, v21.2d
+ add v20.2d, v3.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 20
+ sha512su0 v4.2d, v5.2d
+ ext v21.16b, v0.16b, v1.16b, #8
+ sha512su1 v4.2d, v3.2d, v21.2d
+ add v20.2d, v4.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Round 21
+ sha512su0 v5.2d, v6.2d
+ ext v21.16b, v1.16b, v2.16b, #8
+ sha512su1 v5.2d, v4.2d, v21.2d
+ add v20.2d, v5.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Round 22
+ sha512su0 v6.2d, v7.2d
+ ext v21.16b, v2.16b, v3.16b, #8
+ sha512su1 v6.2d, v5.2d, v21.2d
+ add v20.2d, v6.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Round 23
+ sha512su0 v7.2d, v0.2d
+ ext v21.16b, v3.16b, v4.16b, #8
+ sha512su1 v7.2d, v6.2d, v21.2d
+ add v20.2d, v7.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 24
+ sha512su0 v0.2d, v1.2d
+ ext v21.16b, v4.16b, v5.16b, #8
+ sha512su1 v0.2d, v7.2d, v21.2d
+ add v20.2d, v0.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ ; Round 25
+ sha512su0 v1.2d, v2.2d
+ ext v21.16b, v5.16b, v6.16b, #8
+ sha512su1 v1.2d, v0.2d, v21.2d
+ add v20.2d, v1.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Round 26
+ sha512su0 v2.2d, v3.2d
+ ext v21.16b, v6.16b, v7.16b, #8
+ sha512su1 v2.2d, v1.2d, v21.2d
+ add v20.2d, v2.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Round 27
+ sha512su0 v3.2d, v4.2d
+ ext v21.16b, v7.16b, v0.16b, #8
+ sha512su1 v3.2d, v2.2d, v21.2d
+ add v20.2d, v3.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 28
+ sha512su0 v4.2d, v5.2d
+ ext v21.16b, v0.16b, v1.16b, #8
+ sha512su1 v4.2d, v3.2d, v21.2d
+ add v20.2d, v4.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Round 29
+ sha512su0 v5.2d, v6.2d
+ ext v21.16b, v1.16b, v2.16b, #8
+ sha512su1 v5.2d, v4.2d, v21.2d
+ add v20.2d, v5.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ ; Round 30
+ sha512su0 v6.2d, v7.2d
+ ext v21.16b, v2.16b, v3.16b, #8
+ sha512su1 v6.2d, v5.2d, v21.2d
+ add v20.2d, v6.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Round 31
+ sha512su0 v7.2d, v0.2d
+ ext v21.16b, v3.16b, v4.16b, #8
+ sha512su1 v7.2d, v6.2d, v21.2d
+ add v20.2d, v7.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 32
+ sha512su0 v0.2d, v1.2d
+ ext v21.16b, v4.16b, v5.16b, #8
+ sha512su1 v0.2d, v7.2d, v21.2d
+ add v20.2d, v0.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Round 33
+ sha512su0 v1.2d, v2.2d
+ ext v21.16b, v5.16b, v6.16b, #8
+ sha512su1 v1.2d, v0.2d, v21.2d
+ add v20.2d, v1.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Round 34
+ sha512su0 v2.2d, v3.2d
+ ext v21.16b, v6.16b, v7.16b, #8
+ sha512su1 v2.2d, v1.2d, v21.2d
+ add v20.2d, v2.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ ; Round 35
+ sha512su0 v3.2d, v4.2d
+ ext v21.16b, v7.16b, v0.16b, #8
+ sha512su1 v3.2d, v2.2d, v21.2d
+ add v20.2d, v3.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v26.16b, v27.16b, #8
+ ext v22.16b, v25.16b, v26.16b, #8
+ add v27.2d, v27.2d, v20.2d
+ sha512h q27, q21, v22.2d
+ add v23.2d, v25.2d, v27.2d
+ sha512h2 q27, q25, v24.2d
+ ; Load next 8 64-bit words of K
+ ld1 {v16.2d, v17.2d, v18.2d, v19.2d}, [x3], #0x40
+ ; Round 36
+ sha512su0 v4.2d, v5.2d
+ ext v21.16b, v0.16b, v1.16b, #8
+ sha512su1 v4.2d, v3.2d, v21.2d
+ add v20.2d, v4.2d, v16.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v23.16b, v26.16b, #8
+ ext v22.16b, v24.16b, v23.16b, #8
+ add v26.2d, v26.2d, v20.2d
+ sha512h q26, q21, v22.2d
+ add v25.2d, v24.2d, v26.2d
+ sha512h2 q26, q24, v27.2d
+ ; Round 37
+ sha512su0 v5.2d, v6.2d
+ ext v21.16b, v1.16b, v2.16b, #8
+ sha512su1 v5.2d, v4.2d, v21.2d
+ add v20.2d, v5.2d, v17.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v25.16b, v23.16b, #8
+ ext v22.16b, v27.16b, v25.16b, #8
+ add v23.2d, v23.2d, v20.2d
+ sha512h q23, q21, v22.2d
+ add v24.2d, v27.2d, v23.2d
+ sha512h2 q23, q27, v26.2d
+ ; Round 38
+ sha512su0 v6.2d, v7.2d
+ ext v21.16b, v2.16b, v3.16b, #8
+ sha512su1 v6.2d, v5.2d, v21.2d
+ add v20.2d, v6.2d, v18.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v24.16b, v25.16b, #8
+ ext v22.16b, v26.16b, v24.16b, #8
+ add v25.2d, v25.2d, v20.2d
+ sha512h q25, q21, v22.2d
+ add v27.2d, v26.2d, v25.2d
+ sha512h2 q25, q26, v23.2d
+ ; Round 39
+ sha512su0 v7.2d, v0.2d
+ ext v21.16b, v3.16b, v4.16b, #8
+ sha512su1 v7.2d, v6.2d, v21.2d
+ add v20.2d, v7.2d, v19.2d
+ ext v20.16b, v20.16b, v20.16b, #8
+ ext v21.16b, v27.16b, v24.16b, #8
+ ext v22.16b, v23.16b, v27.16b, #8
+ add v24.2d, v24.2d, v20.2d
+ sha512h q24, q21, v22.2d
+ add v26.2d, v23.2d, v24.2d
+ sha512h2 q24, q23, v25.2d
+ add v27.2d, v27.2d, v31.2d
+ add v26.2d, v26.2d, v30.2d
+ add v25.2d, v25.2d, v29.2d
+ add v24.2d, v24.2d, v28.2d
+ subs w2, w2, #0x80
+ bne L_sha512_len_crypto_begin
+ ; Store digest back
+ st1 {v24.2d, v25.2d, v26.2d, v27.2d}, [x0]
+ ldp d8, d9, [x29, #16]
+ ldp d10, d11, [x29, #32]
+ ldp d12, d13, [x29, #48]
+ ldp d14, d15, [x29, #64]
+ ldp x29, x30, [sp], #0x50
+ ret
+ ENDP
+ ENDIF
+ ENDIF
+ END
diff --git a/wolfssl-VS2022.vcxproj b/wolfssl-VS2022.vcxproj
index f15f6e9a59..71cc6bbda2 100644
--- a/wolfssl-VS2022.vcxproj
+++ b/wolfssl-VS2022.vcxproj
@@ -64,6 +64,20 @@
msbuild /p:WolfSSLIntelAsm=true -->
false
+
+
+ false
+
+ --predefine "HAVE_AES_CBC SETL {TRUE}" --predefine "HAVE_AESCCM SETL {TRUE}" --predefine "HAVE_AESGCM SETL {TRUE}" --predefine "HAVE_AES_ECB SETL {TRUE}" --predefine "HAVE_AES_DECRYPT SETL {TRUE}" --predefine "WOLFSSL_AES_COUNTER SETL {TRUE}" --predefine "WOLFSSL_AES_DIRECT SETL {TRUE}" --predefine "WOLFSSL_AES_XTS SETL {TRUE}" --predefine "WOLFSSL_AESGCM_STREAM SETL {TRUE}" --predefine "WOLFSSL_SHA224 SETL {TRUE}" --predefine "WOLFSSL_SHA3 SETL {TRUE}" --predefine "WOLFSSL_ARMASM_CRYPTO_SHA3 SETL {TRUE}" --predefine "WOLFSSL_SHA384 SETL {TRUE}" --predefine "WOLFSSL_SHA512 SETL {TRUE}" --predefine "WOLFSSL_ARMASM_CRYPTO_SHA512 SETL {TRUE}" --predefine "HAVE_CHACHA SETL {TRUE}" --predefine "HAVE_CURVE25519 SETL {TRUE}" --predefine "HAVE_ED25519 SETL {TRUE}" --predefine "WOLFSSL_HAVE_MLKEM SETL {TRUE}"
+
StaticLibrary
v143
@@ -638,6 +652,54 @@
ml64.exe /c /Zi /DWOLFSSL_X86_64_BUILD /DWOLFSSL_HAVE_MLKEM /DWOLFSSL_HAVE_MLDSA /DWOLFSSL_HAVE_SLHDSA /DHAVE_ED25519 /Fo"$(IntDir)%(Filename).obj" %(Identity)
$(IntDir)%(Filename).obj
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
@@ -655,6 +717,11 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/wolfssl.vcxproj b/wolfssl.vcxproj
index e00b6e6122..f565549501 100644
--- a/wolfssl.vcxproj
+++ b/wolfssl.vcxproj
@@ -63,6 +63,20 @@
msbuild /p:WolfSSLIntelAsm=true -->
false
+
+
+ false
+
+ --predefine "HAVE_AES_CBC SETL {TRUE}" --predefine "HAVE_AESCCM SETL {TRUE}" --predefine "HAVE_AESGCM SETL {TRUE}" --predefine "HAVE_AES_ECB SETL {TRUE}" --predefine "HAVE_AES_DECRYPT SETL {TRUE}" --predefine "WOLFSSL_AES_COUNTER SETL {TRUE}" --predefine "WOLFSSL_AES_DIRECT SETL {TRUE}" --predefine "WOLFSSL_AES_XTS SETL {TRUE}" --predefine "WOLFSSL_AESGCM_STREAM SETL {TRUE}" --predefine "WOLFSSL_SHA224 SETL {TRUE}" --predefine "WOLFSSL_SHA3 SETL {TRUE}" --predefine "WOLFSSL_ARMASM_CRYPTO_SHA3 SETL {TRUE}" --predefine "WOLFSSL_SHA384 SETL {TRUE}" --predefine "WOLFSSL_SHA512 SETL {TRUE}" --predefine "WOLFSSL_ARMASM_CRYPTO_SHA512 SETL {TRUE}" --predefine "HAVE_CHACHA SETL {TRUE}" --predefine "HAVE_CURVE25519 SETL {TRUE}" --predefine "HAVE_ED25519 SETL {TRUE}" --predefine "WOLFSSL_HAVE_MLKEM SETL {TRUE}"
+
StaticLibrary
v110
@@ -638,6 +652,54 @@
ml64.exe /c /Zi /DWOLFSSL_X86_64_BUILD /DWOLFSSL_HAVE_MLKEM /DWOLFSSL_HAVE_MLDSA /DWOLFSSL_HAVE_SLHDSA /DHAVE_ED25519 /Fo"$(IntDir)%(Filename).obj" %(Identity)
$(IntDir)%(Filename).obj
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
+
+ true
+ false
+ armasm64.exe -o "$(IntDir)%(Filename).obj" $(WolfSSLArmAsmDefs) %(Identity)
+ $(IntDir)%(Filename).obj
+
@@ -655,6 +717,11 @@
USE_INTEL_SPEEDUP;WOLFSSL_X86_64_BUILD;%(PreprocessorDefinitions)
+
+
+ WOLFSSL_ARMASM;WOLFSSL_ARMASM_CRYPTO_SHA3;WOLFSSL_ARMASM_CRYPTO_SHA512;%(PreprocessorDefinitions)
+
+
diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h
index aeb81cc35e..028e3f438b 100644
--- a/wolfssl/wolfcrypt/settings.h
+++ b/wolfssl/wolfcrypt/settings.h
@@ -380,6 +380,15 @@
#endif
#endif
+/* Microsoft's ARM64 compiler defines _M_ARM64 but not __aarch64__. The wolfSSL
+ * ARMv8 assembly (WOLFSSL_ARMASM) and all of its C callers are gated on
+ * __aarch64__, so map _M_ARM64 across when building that assembly with MSVC and
+ * armasm64. Scoped to WOLFSSL_ARMASM so a plain MSVC ARM64 (pure C) build is
+ * left untouched. */
+#if defined(_M_ARM64) && defined(WOLFSSL_ARMASM) && !defined(__aarch64__)
+ #define __aarch64__ 1
+#endif
+
/* Forward propagation of the legacy parent gate to the canonical name
* (HAVE_DILITHIUM -> WOLFSSL_HAVE_MLDSA). Always active: required so that
* a user_settings.h or build flag using only the legacy spelling still