summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ArmPkg/ArmPkg.dec3
-rw-r--r--ArmPkg/Include/Guid/TransferListHob.h23
-rw-r--r--ArmPkg/Include/IndustryStandard/ArmTransferList.h12
-rw-r--r--ArmPkg/Include/Library/ArmTransferListLib.h58
-rw-r--r--ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c156
-rw-r--r--ArmPlatformPkg/ArmPlatformPkg.dsc1
-rw-r--r--ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c8
-rw-r--r--ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf2
-rw-r--r--ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c2
-rw-r--r--ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S20
-rw-r--r--ArmPlatformPkg/PeilessSec/PeilessSec.c31
-rw-r--r--ArmPlatformPkg/PeilessSec/PeilessSec.h2
-rw-r--r--ArmPlatformPkg/PeilessSec/PeilessSec.inf2
-rw-r--r--ArmPlatformPkg/PlatformPei/PlatformPeim.c21
-rw-r--r--ArmPlatformPkg/PlatformPei/PlatformPeim.inf4
-rw-r--r--ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S16
-rw-r--r--ArmPlatformPkg/Sec/Sec.c48
-rw-r--r--ArmPlatformPkg/Sec/Sec.h1
-rw-r--r--ArmPlatformPkg/Sec/Sec.inf2
-rw-r--r--ArmVirtPkg/ArmVirtCloudHv.dsc1
-rw-r--r--ArmVirtPkg/ArmVirtQemu.dsc1
-rwxr-xr-xBaseTools/Conf/tools_def.template48
-rw-r--r--CryptoPkg/CryptoPkg.ci.yaml4
-rw-r--r--CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c19
-rw-r--r--CryptoPkg/Library/Include/CrtLibSupport.h10
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S6
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S26
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S53
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S1
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S100
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S128
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S1
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S1
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S10
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S6
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S15
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S12
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S15
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S21
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm2
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm21
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s8145
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s1167
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s1768
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s1922
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s32
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s30
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm8350
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm1276
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm1927
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm2081
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm32
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm30
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c151
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h607
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h31
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h47
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h5
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h21
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h21
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h32
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h30
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h3
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h10
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h63
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h31
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h3
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h480
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c37
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c100
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h40
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h103
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslLib.inf19
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf51
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf16
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslLibFull.inf19
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf51
-rw-r--r--CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c11
-rwxr-xr-xCryptoPkg/Library/OpensslLib/configure.py4
m---------CryptoPkg/Library/OpensslLib/openssl0
-rw-r--r--DynamicTablesPkg/DynamicTables.dsc.inc1
-rw-r--r--DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h117
-rw-r--r--DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c533
-rw-r--r--DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf32
-rw-r--r--DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c460
-rw-r--r--EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h4
-rw-r--r--IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm20
-rw-r--r--IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm20
-rw-r--r--IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c4
-rw-r--r--IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm41
-rw-r--r--MdeModulePkg/Core/Dxe/Image/Image.c11
-rw-r--r--MdeModulePkg/Core/Pei/Image/Image.c12
-rw-r--r--MdeModulePkg/Core/PiSmmCore/Dispatcher.c11
-rw-r--r--MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c10
-rw-r--r--MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c12
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c28
-rw-r--r--MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c4
-rw-r--r--MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c5
-rw-r--r--MdePkg/Include/IndustryStandard/Acpi50.h34
-rw-r--r--MdePkg/Include/IndustryStandard/Acpi66.h184
-rw-r--r--OvmfPkg/CloudHv/CloudHvX64.dsc2
-rw-r--r--OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf4
-rw-r--r--OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm26
-rw-r--r--OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h8
-rw-r--r--OvmfPkg/CpuHotplugSmm/Smbase.c24
-rw-r--r--OvmfPkg/Include/Library/PlatformInitLib.h1
-rw-r--r--OvmfPkg/PlatformPei/FeatureControl.c1
-rw-r--r--OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S3
-rw-r--r--OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc6
-rw-r--r--OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c33
-rw-r--r--SecurityPkg/FvReportPei/FvReportPei.c25
-rw-r--r--SecurityPkg/HddPassword/HddPasswordDxe.c26
-rw-r--r--SecurityPkg/Library/AuthVariableLib/AuthService.c6
-rw-r--r--SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c13
-rw-r--r--SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c111
-rw-r--r--SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c2
-rw-r--r--SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c14
-rw-r--r--SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c5
-rw-r--r--SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c5
-rw-r--r--SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c17
-rw-r--r--SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c22
-rw-r--r--SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c9
-rw-r--r--SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c2
-rw-r--r--SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c2
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c10
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h50
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf1
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c19
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf51
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c87
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c62
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf1
-rw-r--r--SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c48
-rw-r--r--SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c7
-rw-r--r--SecurityPkg/SecurityPkg.dsc5
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c2
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c25
-rw-r--r--SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c6
-rw-r--r--SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf53
-rw-r--r--SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c198
-rw-r--r--SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c39
-rw-r--r--SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c16
-rw-r--r--SecurityPkg/Tcg/TcgDxe/TcgDxe.c5
-rw-r--r--SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c6
-rw-r--r--SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c46
-rw-r--r--ShellPkg/Application/Shell/Shell.c8
-rw-r--r--ShellPkg/Application/Shell/ShellEnvVar.c30
-rw-r--r--ShellPkg/Application/Shell/ShellProtocol.c6
-rw-r--r--ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c54
-rw-r--r--ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c5
-rw-r--r--ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c2
-rw-r--r--ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf2
-rw-r--r--ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c4
-rw-r--r--ShellPkg/ShellPkg.ci.yaml1
-rw-r--r--StandaloneMmPkg/Core/Dispatcher.c10
-rw-r--r--UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf42
-rw-r--r--UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni13
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf13
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c175
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h57
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c71
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c42
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandler.h (renamed from UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h)8
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandlerAsm.S (renamed from UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/SupervisorTrapHandler.S)2
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c (renamed from UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.c)18
-rw-r--r--UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf9
-rw-r--r--UefiCpuPkg/Library/MpInitLib/AmdSev.c4
-rw-r--r--UefiCpuPkg/Library/MpInitLib/MpLib.c12
-rw-r--r--UefiCpuPkg/Library/MpInitLib/MpLib.h2
-rw-r--r--UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm7
-rw-r--r--UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c13
-rw-r--r--UefiCpuPkg/UefiCpuPkg.ci.yaml1
-rw-r--r--UefiCpuPkg/UefiCpuPkg.dsc1
190 files changed, 31996 insertions, 956 deletions
diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
index ab3c3b3..a2b7c17 100644
--- a/ArmPkg/ArmPkg.dec
+++ b/ArmPkg/ArmPkg.dec
@@ -87,6 +87,8 @@
# Include/Guid/ArmMpCoreInfo.h
gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
+ gArmTransferListHobGuid = { 0xebe7bae8, 0xfe18, 0x43c5, { 0xbf, 0x3f, 0xf2, 0xb1, 0xaf, 0xb2, 0xdf, 0xb8 } }
+
[Protocols.common]
## Arm System Control and Management Interface(SCMI) Base protocol
## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h
@@ -106,6 +108,7 @@
[Ppis]
## Include/Ppi/ArmMpCoreInfo.h
gArmMpCoreInfoPpiGuid = { 0x6847cc74, 0xe9ec, 0x4f8f, {0xa2, 0x9d, 0xab, 0x44, 0xe7, 0x54, 0xa8, 0xfc} }
+ gArmTransferListPpiGuid = { 0x6d2e9da1, 0x9414, 0x41c3, {0x86, 0xbe, 0xf9, 0x16, 0x9f, 0xb4, 0x76, 0x38} }
[PcdsFeatureFlag.common]
gArmTokenSpaceGuid.PcdCpuDxeProduceDebugSupport|FALSE|BOOLEAN|0x00000001
diff --git a/ArmPkg/Include/Guid/TransferListHob.h b/ArmPkg/Include/Guid/TransferListHob.h
new file mode 100644
index 0000000..b8f9cc0
--- /dev/null
+++ b/ArmPkg/Include/Guid/TransferListHob.h
@@ -0,0 +1,23 @@
+/** @file
+ GUID for the HOB that contains the copy of the Transfer List
+
+ Copyright (C) 2024, Arm Limited. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Reference(s):
+ - https://github.com/FirmwareHandoff/firmware_handoff
+
+**/
+
+#ifndef ARM_TRANSFER_LIST_HOB_H__
+#define ARM_TRANSFER_LIST_HOB_H__
+
+#define ARM_TRANSFER_LIST_HOB_GUID {\
+ 0xebe7bae8, 0xfe18, 0x43c5, \
+ { 0xbf, 0x3f, 0xf2, 0xb1, 0xaf, 0xb2, 0xdf, 0xb8 } \
+ }
+
+extern EFI_GUID gArmTransferListHobGuid;
+
+#endif
diff --git a/ArmPkg/Include/IndustryStandard/ArmTransferList.h b/ArmPkg/Include/IndustryStandard/ArmTransferList.h
index 455c7d8..3033846 100644
--- a/ArmPkg/Include/IndustryStandard/ArmTransferList.h
+++ b/ArmPkg/Include/IndustryStandard/ArmTransferList.h
@@ -2,7 +2,7 @@
Header file defining a Transfer List and Transfer Entry as specified by the
A-profile Firmware Handoff Protocol specification.
- Copyright (c) 2024, Arm Limited. All rights reserved.<BR>
+ Copyright (c) 2025, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
@@ -74,6 +74,16 @@
#define TRANSFER_LIST_FL_HAS_CHECKSUM BIT0
/*
+ * Operation codes indicating the validity of the Transfer List.
+ */
+typedef enum {
+ TRANSFER_LIST_OPS_INVALID, /* invalid for any operation */
+ TRANSFER_LIST_OPS_ALL, /* valid for all operations */
+ TRANSFER_LIST_OPS_RO, /* valid for read only */
+ TRANSFER_LIST_OPS_CUSTOM, /* abort or switch to special code to interpret */
+} TRANSFER_LIST_OPS;
+
+/*
* Transfer list starts with the following header.
* Transfer entries followed after the following header.
*/
diff --git a/ArmPkg/Include/Library/ArmTransferListLib.h b/ArmPkg/Include/Library/ArmTransferListLib.h
index 96a1227..fb0c699 100644
--- a/ArmPkg/Include/Library/ArmTransferListLib.h
+++ b/ArmPkg/Include/Library/ArmTransferListLib.h
@@ -2,7 +2,7 @@
Library that implements the helper functions to parse and pack a Transfer
List as specified by the A-profile Firmware Handoff Specification.
- Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+ Copyright (c) 2022 - 2025, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
@@ -21,7 +21,7 @@
/**
Return the first Transfer Entry Node in the Transfer List.
- @param [in] TransferListHeader TransferListHeader
+ @param [in] TransferListHeader Pointer to the Transfer List Header.
@return Pointer to the Transfer Entry Node if successful otherwise NULL
@@ -103,4 +103,58 @@ TransferListGetEntryData (
IN TRANSFER_ENTRY_HEADER *TransferEntry
);
+/**
+ Dump the transfer list to the debug output.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+
+**/
+VOID
+EFIAPI
+TransferListDump (
+ IN TRANSFER_LIST_HEADER *TransferListHeader
+ );
+
+/**
+ Verify the checksum of the transfer list.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+
+ @retval FALSE Invalid Checksum
+ @retval TRUE Valid Checksum
+**/
+BOOLEAN
+EFIAPI
+TransferListVerifyChecksum (
+ IN TRANSFER_LIST_HEADER *TransferListHeader
+ );
+
+/**
+ Check the header of the Transfer List.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+
+ @return TRANSFER_LIST_OPS code indicating the validity of the Transfer List
+**/
+TRANSFER_LIST_OPS
+EFIAPI
+TransferListCheckHeader (
+ IN TRANSFER_LIST_HEADER *TransferListHeader
+ );
+
+/**
+ Find a Transfer Entry Node in the Transfer List matched with the given tag-id.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+ @param [in] TagId Tag id
+
+ @return Pointer to the Transfer Entry Node if successful otherwise NULL
+**/
+TRANSFER_ENTRY_HEADER *
+EFIAPI
+TransferListFindEntry (
+ IN TRANSFER_LIST_HEADER *TransferListHeader,
+ IN UINT16 TagId
+ );
+
#endif // ARM_TRANSFER_LIST_LIB_
diff --git a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c
index 7cd203e..af8170e 100644
--- a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c
+++ b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c
@@ -2,7 +2,7 @@
Library that implements the helper functions to parse and pack a Transfer
List as specified by the A-profile Firmware Handoff Specification.
- Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+ Copyright (c) 2022 - 2025, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
@@ -15,6 +15,90 @@
#include <Library/DebugLib.h>
/**
+ This function verifies the checksum of the Transfer List.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+
+ @retval FALSE Invalid Checksum
+ @retval TRUE Valid Checksum
+
+**/
+BOOLEAN
+EFIAPI
+TransferListVerifyChecksum (
+ IN TRANSFER_LIST_HEADER *TransferListHeader
+ )
+{
+ if (TransferListHeader == NULL) {
+ return FALSE;
+ }
+
+ if ((TransferListHeader->Flags & TRANSFER_LIST_FL_HAS_CHECKSUM) == 0) {
+ return TRUE;
+ }
+
+ return (CalculateSum8 ((UINT8 *)TransferListHeader, TransferListHeader->UsedSize) == 0);
+}
+
+/**
+ This function checks the header of the Transfer List.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+
+ @return TRANSFER_LIST_OPS code indicating the validity of the Transfer List
+
+**/
+TRANSFER_LIST_OPS
+EFIAPI
+TransferListCheckHeader (
+ IN TRANSFER_LIST_HEADER *TransferListHeader
+ )
+{
+ if (TransferListHeader == NULL) {
+ return TRANSFER_LIST_OPS_INVALID;
+ }
+
+ if (TransferListHeader->Signature != TRANSFER_LIST_SIGNATURE_64) {
+ DEBUG ((DEBUG_ERROR, "Bad transfer list signature 0x%x\n", TransferListHeader->Signature));
+ return TRANSFER_LIST_OPS_INVALID;
+ }
+
+ if (TransferListHeader->TotalSize == 0) {
+ DEBUG ((DEBUG_ERROR, "Bad transfer list total size 0x%x\n", TransferListHeader->TotalSize));
+ return TRANSFER_LIST_OPS_INVALID;
+ }
+
+ if (TransferListHeader->UsedSize > TransferListHeader->TotalSize) {
+ DEBUG ((DEBUG_ERROR, "Bad transfer list used size 0x%x\n", TransferListHeader->UsedSize));
+ return TRANSFER_LIST_OPS_INVALID;
+ }
+
+ if (TransferListHeader->HeaderSize != sizeof (TRANSFER_LIST_HEADER)) {
+ DEBUG ((DEBUG_ERROR, "Bad transfer list header size 0x%x\n", TransferListHeader->HeaderSize));
+ return TRANSFER_LIST_OPS_INVALID;
+ }
+
+ if (TransferListVerifyChecksum (TransferListHeader) == FALSE) {
+ DEBUG ((DEBUG_ERROR, "Bad transfer list checksum 0x%x\n", TransferListHeader->Checksum));
+ return TRANSFER_LIST_OPS_INVALID;
+ }
+
+ if (TransferListHeader->Version == 0) {
+ DEBUG ((DEBUG_ERROR, "Transfer list version is invalid\n"));
+ return TRANSFER_LIST_OPS_INVALID;
+ } else if (TransferListHeader->Version == ARM_FW_HANDOFF_PROTOCOL_VERSION) {
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Transfer list version is valid for all operations\n"));
+ return TRANSFER_LIST_OPS_ALL;
+ } else if (TransferListHeader->Version > ARM_FW_HANDOFF_PROTOCOL_VERSION) {
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Transfer list version is valid for read-only\n"));
+ return TRANSFER_LIST_OPS_RO;
+ }
+
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Old or custom transfer list version is detected\n"));
+ return TRANSFER_LIST_OPS_CUSTOM;
+}
+
+/**
Return the first Transfer Entry Node in the Transfer List.
@param [in] TransferListHeader TransferListHeader
@@ -165,3 +249,73 @@ TransferListGetEntryData (
return (VOID *)((UINTN)TransferEntry + TransferEntry->HeaderSize);
}
+
+/**
+ Find a Transfer Entry Node in the Transfer List matched with the given tag-id.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+ @param [in] TagId Tag id
+
+ @return Pointer to the Transfer Entry Node if successful otherwise NULL
+**/
+TRANSFER_ENTRY_HEADER *
+EFIAPI
+TransferListFindEntry (
+ IN TRANSFER_LIST_HEADER *TransferListHeader,
+ IN UINT16 TagId
+ )
+{
+ TRANSFER_ENTRY_HEADER *Entry = NULL;
+
+ do {
+ Entry = TransferListGetNextEntry (TransferListHeader, Entry);
+ } while ((Entry != NULL) && (Entry->TagId != TagId));
+
+ return Entry;
+}
+
+/**
+ Dump the transfer list to the debug output.
+
+ @param [in] TransferListHeader Pointer to the Transfer List Header
+
+**/
+VOID
+EFIAPI
+TransferListDump (
+ IN TRANSFER_LIST_HEADER *TransferListHeader
+ )
+{
+ TRANSFER_ENTRY_HEADER *Entry;
+ UINTN Idx;
+
+ Entry = NULL;
+ Idx = 0;
+
+ if (TransferListHeader == NULL) {
+ return;
+ }
+
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Dump transfer list:\n"));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "signature 0x%x\n", TransferListHeader->Signature));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "checksum 0x%x\n", TransferListHeader->Checksum));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "version 0x%x\n", TransferListHeader->Version));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "hdr_size 0x%x\n", TransferListHeader->HeaderSize));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "alignment 0x%x\n", TransferListHeader->Alignment));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "used_size 0x%x\n", TransferListHeader->UsedSize));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "total_size 0x%x\n", TransferListHeader->TotalSize));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "flags 0x%x\n", TransferListHeader->Flags));
+
+ while (TRUE) {
+ Entry = TransferListGetNextEntry (TransferListHeader, Entry);
+ if (Entry == NULL) {
+ break;
+ }
+
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Entry %d:\n", Idx++));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "tag_id 0x%x\n", Entry->TagId));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "hdr_size 0x%x\n", Entry->HeaderSize));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "data_size 0x%x\n", Entry->DataSize));
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "data_addr 0x%lx\n", (UINTN)TransferListGetEntryData (Entry)));
+ }
+}
diff --git a/ArmPlatformPkg/ArmPlatformPkg.dsc b/ArmPlatformPkg/ArmPlatformPkg.dsc
index 062246d..278d3cf 100644
--- a/ArmPlatformPkg/ArmPlatformPkg.dsc
+++ b/ArmPlatformPkg/ArmPlatformPkg.dsc
@@ -70,6 +70,7 @@
UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
+ ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf
[LibraryClasses.common.PEIM]
HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
diff --git a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c
index bf437af..afa3fc4 100644
--- a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c
+++ b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c
@@ -37,11 +37,11 @@ SerialPortInitialize (
EFI_STATUS Status;
UINT8 Scratch;
- BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);
+ BaudRate = PcdGet64 (PcdUartDefaultBaudRate);
ReceiveFifoDepth = 0; // Use default FIFO depth
- Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);
- DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);
- StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits);
+ Parity = (EFI_PARITY_TYPE)PcdGet8 (PcdUartDefaultParity);
+ DataBits = PcdGet8 (PcdUartDefaultDataBits);
+ StopBits = (EFI_STOP_BITS_TYPE)PcdGet8 (PcdUartDefaultStopBits);
Status = PL011UartInitializePort (
(UINTN)PcdGet64 (PcdSerialRegisterBase),
diff --git a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
index b6b87f3..07424cc 100644
--- a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
+++ b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
@@ -33,7 +33,7 @@
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
-[FixedPcd]
+[Pcd]
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity
diff --git a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c
index 60f9bc5..e8e2e1d 100644
--- a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c
+++ b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c
@@ -193,7 +193,7 @@ PL011UartInitializePort (
return RETURN_INVALID_PARAMETER;
}
- Divisor = (UartClkInHz * 4) / *BaudRate;
+ Divisor = (UINT32)((UartClkInHz * 4) / *BaudRate);
Integer = Divisor >> FRACTION_PART_SIZE_IN_BITS;
Fractional = Divisor & FRACTION_PART_MASK;
}
diff --git a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S
index 5f285f3..94635ef 100644
--- a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S
+++ b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S
@@ -1,13 +1,29 @@
//
-// Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.<BR>
+// Copyright (c) 2011 - 2025, Arm Limited. All rights reserved.<BR>
//
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
+// @Par Reference(s):
+// - Firmware Handoff specification [https://firmwarehandoff.github.io/firmware_handoff/main]
//
#include <AsmMacroLib.h>
ASM_FUNC(_ModuleEntryPoint)
+
+ // Check if register assignment at handoff matches spec
+ MOV64 (x4, 0x14a0fb10b)
+ cmp x1, x4
+ // Skip TransferList init if x1 is not equal to the TransferList signature
+ b.ne _SkipTransferList
+
+ // Skip TransferList init if x2 is not equal to 0
+ cbnz x2, _SkipTransferList
+
+ // Set the TransferList Base Address from register x3
+ mov x6, x3
+
+_SkipTransferList:
// Do early platform specific actions
bl ASM_PFX(ArmPlatformPeiBootAction)
@@ -76,6 +92,8 @@ _GetStackBase:
MOV32 (x2, FixedPcdGet32(PcdCPUCorePrimaryStackSize))
sub x1, x1, x2
+ // Pass Transfer List Base Address
+ mov x2, x6
// Move sec startup address into a data register
// Ensure we're jumping to FV version of the code (not boot remapped alias)
ldr x4, =ASM_PFX(CEntryPoint)
diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.c b/ArmPlatformPkg/PeilessSec/PeilessSec.c
index 639c374..b9b7196 100644
--- a/ArmPlatformPkg/PeilessSec/PeilessSec.c
+++ b/ArmPlatformPkg/PeilessSec/PeilessSec.c
@@ -53,13 +53,15 @@ GetPlatformPpi (
@param[in] UefiMemoryBase Start of the PI/UEFI memory region
@param[in] StackBase Start of the stack
@param[in] StartTimeStamp Timer value at start of execution
+ @param[in] TransferListBaseAddr Base address of the Transfer List
**/
STATIC
VOID
SecMain (
IN UINTN UefiMemoryBase,
IN UINTN StackBase,
- IN UINT64 StartTimeStamp
+ IN UINT64 StartTimeStamp,
+ IN UINTN TransferListBaseAddr
)
{
EFI_HOB_HANDOFF_INFO_TABLE *HobList;
@@ -71,6 +73,8 @@ SecMain (
UINTN CharCount;
UINTN StacksSize;
FIRMWARE_SEC_PERFORMANCE Performance;
+ VOID *TransferListBase;
+ UINTN *TransferListHobData;
// If ensure the FD is either part of the System Memory or totally outside of the System Memory (XIP)
ASSERT (
@@ -134,6 +138,25 @@ SecMain (
}
}
+ // Dump the Transfer List
+ TransferListBase = (VOID *)TransferListBaseAddr;
+ if (TransferListBase != NULL) {
+ if (TransferListCheckHeader (TransferListBase) != TRANSFER_LIST_OPS_INVALID) {
+ DEBUG_CODE_BEGIN ();
+ TransferListDump (TransferListBase);
+ DEBUG_CODE_END ();
+
+ TransferListHobData = BuildGuidHob (&gArmTransferListHobGuid, sizeof (*TransferListHobData));
+ ASSERT (TransferListHobData != NULL);
+
+ *TransferListHobData = (UINTN)TransferListBase;
+ } else {
+ DEBUG ((DEBUG_ERROR, "%a: No valid operations possible on TransferList found @ 0x%p\n", __func__, TransferListBase));
+ }
+ } else {
+ DEBUG ((DEBUG_INFO, "%a: No TransferList found, continuing boot\n", __func__));
+ }
+
// Store timer value logged at the beginning of firmware image execution
Performance.ResetEnd = GetTimeInNanoSecond (StartTimeStamp);
@@ -167,11 +190,13 @@ SecMain (
@param[in] UefiMemoryBase Start of the PI/UEFI memory region
@param[in] StackBase Start of the stack
+ @param[in] TransferListBaseAddr Base address of the Transfer List
**/
VOID
CEntryPoint (
IN UINTN UefiMemoryBase,
- IN UINTN StackBase
+ IN UINTN StackBase,
+ IN UINTN TransferListBaseAddr
)
{
UINT64 StartTimeStamp;
@@ -198,7 +223,7 @@ CEntryPoint (
FixedPcdGet32 (PcdSystemMemoryUefiRegionSize)
);
- SecMain (UefiMemoryBase, StackBase, StartTimeStamp);
+ SecMain (UefiMemoryBase, StackBase, StartTimeStamp, TransferListBaseAddr);
// DXE Core should always load and never return
ASSERT (FALSE);
diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.h b/ArmPlatformPkg/PeilessSec/PeilessSec.h
index 70d78ca..73b6b25 100644
--- a/ArmPlatformPkg/PeilessSec/PeilessSec.h
+++ b/ArmPlatformPkg/PeilessSec/PeilessSec.h
@@ -24,6 +24,8 @@
#include <Library/PrintLib.h>
#include <Library/SerialPortLib.h>
#include <Library/TimerLib.h>
+#include <Library/ArmTransferListLib.h>
+#include <Guid/TransferListHob.h>
#include <Ppi/ArmMpCoreInfo.h>
#include <Ppi/GuidedSectionExtraction.h>
diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.inf b/ArmPlatformPkg/PeilessSec/PeilessSec.inf
index e210d01..db7449f 100644
--- a/ArmPlatformPkg/PeilessSec/PeilessSec.inf
+++ b/ArmPlatformPkg/PeilessSec/PeilessSec.inf
@@ -52,6 +52,7 @@
SerialPortLib
TimerLib
StackCheckLib
+ ArmTransferListLib
[Ppis]
gArmMpCoreInfoPpiGuid
@@ -59,6 +60,7 @@
[Guids]
gArmMpCoreInfoGuid
gEfiFirmwarePerformanceGuid
+ gArmTransferListHobGuid
[FeaturePcd]
gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob
diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.c b/ArmPlatformPkg/PlatformPei/PlatformPeim.c
index 62d1faf..921371a 100644
--- a/ArmPlatformPkg/PlatformPei/PlatformPeim.c
+++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.c
@@ -24,6 +24,7 @@
#include <Library/PeimEntryPoint.h>
#include <Library/PeiServicesLib.h>
#include <Library/PcdLib.h>
+#include <Guid/TransferListHob.h>
EFI_STATUS
EFIAPI
@@ -76,14 +77,30 @@ InitializePlatformPeim (
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
- EFI_STATUS Status;
- EFI_BOOT_MODE BootMode;
+ EFI_STATUS Status;
+ EFI_BOOT_MODE BootMode;
+ VOID *TransferListBase;
+ UINTN *TransferListHobData;
+ EFI_HOB_GUID_TYPE *GuidHob;
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Platform PEIM Loaded\n"));
Status = PeiServicesSetBootMode (ArmPlatformGetBootMode ());
ASSERT_EFI_ERROR (Status);
+ // If TransferList PPI is present and TransferListHobGuid is not present,
+ // then create a TransferListHob with the TransferListBase address.
+ Status = PeiServicesLocatePpi (&gArmTransferListPpiGuid, 0, NULL, &TransferListBase);
+ if (!EFI_ERROR (Status)) {
+ GuidHob = GetFirstGuidHob (&gArmTransferListHobGuid);
+ if ((GuidHob == NULL) && (TransferListBase != NULL)) {
+ TransferListHobData = BuildGuidHob (&gArmTransferListHobGuid, sizeof (*TransferListHobData));
+ ASSERT (TransferListHobData != NULL);
+
+ *TransferListHobData = (UINTN)TransferListBase;
+ }
+ }
+
PlatformPeim ();
Status = PeiServicesGetBootMode (&BootMode);
diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf
index f2b0e0f..d9e8f32 100644
--- a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf
+++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf
@@ -43,6 +43,7 @@
[Ppis]
gEfiPeiMasterBootModePpiGuid # PPI ALWAYS_PRODUCED
gEfiPeiBootInRecoveryModePpiGuid # PPI SOMETIMES_PRODUCED
+ gArmTransferListPpiGuid # PPI SOMETIMES_CONSUMED
[FixedPcd]
gArmTokenSpaceGuid.PcdFdBaseAddress
@@ -51,6 +52,9 @@
gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdFvSize
+[Guids]
+ gArmTransferListHobGuid
+
[Depex]
TRUE
diff --git a/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S b/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S
index 154be11..28cd015 100644
--- a/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S
+++ b/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S
@@ -8,6 +8,19 @@
#include <AsmMacroLib.h>
ASM_FUNC(_ModuleEntryPoint)
+ // Check if register assignment at handoff matches spec
+ MOV64 (x4, 0x14a0fb10b)
+ // Check if x1 holds TransferList signature
+ cmp x1, x4
+ b.ne _SkipTransferList
+
+ // Skip TransferList init if x2 is not equal to 0
+ cbnz x2, _SkipTransferList
+
+ // Set the TransferList Base Address from register x3
+ mov x10, x3
+
+_SkipTransferList:
// Do early platform specific actions
bl ASM_PFX(ArmPlatformPeiBootAction)
@@ -47,7 +60,8 @@ ASM_PFX(MainEntryPoint):
// The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector
MOV64 (x2, FixedPcdGet64(PcdFvBaseAddress))
ldr x0, [x2, #8]
-
+ // Pass the TransferList Base Address
+ mov x1, x10
// Move sec startup address into a data register
// Ensure we're jumping to FV version of the code (not boot remapped alias)
ldr x3, =ASM_PFX(CEntryPoint)
diff --git a/ArmPlatformPkg/Sec/Sec.c b/ArmPlatformPkg/Sec/Sec.c
index 4535ae7..ec8bec2 100644
--- a/ArmPlatformPkg/Sec/Sec.c
+++ b/ArmPlatformPkg/Sec/Sec.c
@@ -86,12 +86,14 @@ STATIC CONST EFI_PEI_PPI_DESCRIPTOR gCommonPpiTable[] = {
@param[out] PpiListSize Size of the PPI list in bytes
@param[out] PpiList Pointer to the constructed PPI list
+ @param[in] TransferListBase Pointer to the Transfer List base
**/
STATIC
VOID
CreatePpiList (
OUT UINTN *PpiListSize,
- OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
+ OUT EFI_PEI_PPI_DESCRIPTOR **PpiList,
+ IN VOID *TransferListBase
)
{
EFI_PEI_PPI_DESCRIPTOR *PlatformPpiList;
@@ -111,10 +113,20 @@ CreatePpiList (
// Set the Terminate flag on the last PPI entry
LastPpi = (EFI_PEI_PPI_DESCRIPTOR *)ListBase +
((sizeof (gCommonPpiTable) + PlatformPpiListSize) / sizeof (EFI_PEI_PPI_DESCRIPTOR)) - 1;
+ *PpiListSize = sizeof (gCommonPpiTable) + PlatformPpiListSize;
+
+ // Add the Transfer List PPI after the Common and Platform PPIs
+ if (TransferListBase != NULL) {
+ LastPpi++;
+ LastPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI;
+ LastPpi->Guid = &gArmTransferListPpiGuid;
+ LastPpi->Ppi = TransferListBase;
+ *PpiListSize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
+ }
+
LastPpi->Flags |= EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
- *PpiList = (EFI_PEI_PPI_DESCRIPTOR *)ListBase;
- *PpiListSize = sizeof (gCommonPpiTable) + PlatformPpiListSize;
+ *PpiList = (EFI_PEI_PPI_DESCRIPTOR *)ListBase;
}
/**
@@ -151,12 +163,15 @@ PrintFirmwareVersion (
@param[in] PeiCoreEntryPoint Address in ram of the entrypoint of the PEI
core
+ @param[in] TransferListBaseAddr Address of the Transfer List base address
+
**/
STATIC
VOID
EFIAPI
SecMain (
- IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint
+ IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint,
+ IN UINTN TransferListBaseAddr
)
{
EFI_SEC_PEI_HAND_OFF SecCoreData;
@@ -164,8 +179,24 @@ SecMain (
EFI_PEI_PPI_DESCRIPTOR *PpiList;
UINTN TemporaryRamBase;
UINTN TemporaryRamSize;
+ VOID *TransferListBase;
+
+ // Dump the Transfer List
+ TransferListBase = (VOID *)TransferListBaseAddr;
+ if (TransferListBase != NULL) {
+ if (TransferListCheckHeader (TransferListBase) != TRANSFER_LIST_OPS_INVALID) {
+ DEBUG_CODE_BEGIN ();
+ TransferListDump (TransferListBase);
+ DEBUG_CODE_END ();
+ } else {
+ TransferListBase = NULL;
+ DEBUG ((DEBUG_ERROR, "%a: No valid operations possible on TransferList found @ 0x%p\n", __func__, TransferListBase));
+ }
+ } else {
+ DEBUG ((DEBUG_INFO, "%a: No TransferList found, continuing boot\n", __func__));
+ }
- CreatePpiList (&PpiListSize, &PpiList);
+ CreatePpiList (&PpiListSize, &PpiList, TransferListBase);
// Adjust the Temporary Ram as the new Ppi List (Common + Platform Ppi Lists) is created at
// the base of the primary core stack
@@ -197,10 +228,13 @@ SecMain (
@param[in] PeiCoreEntryPoint Address in ram of the entrypoint of the PEI
core
+ @param[in] TransferListBaseAddr Address of the Transfer List base address
+
**/
VOID
CEntryPoint (
- IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint
+ IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint,
+ IN UINTN TransferListBaseAddr
)
{
if (!ArmMmuEnabled ()) {
@@ -237,7 +271,7 @@ CEntryPoint (
ArmPlatformInitialize (ArmReadMpidr ());
// Goto primary Main.
- SecMain (PeiCoreEntryPoint);
+ SecMain (PeiCoreEntryPoint, TransferListBaseAddr);
// PEI Core should always load and never return
ASSERT (FALSE);
diff --git a/ArmPlatformPkg/Sec/Sec.h b/ArmPlatformPkg/Sec/Sec.h
index 56d9f35..c1cd10d 100644
--- a/ArmPlatformPkg/Sec/Sec.h
+++ b/ArmPlatformPkg/Sec/Sec.h
@@ -23,6 +23,7 @@
#include <Library/SerialPortLib.h>
#include <Ppi/TemporaryRamSupport.h>
+#include <Library/ArmTransferListLib.h>
/**
Helper function to switch to a different stack. Implemented in assembler as
diff --git a/ArmPlatformPkg/Sec/Sec.inf b/ArmPlatformPkg/Sec/Sec.inf
index a75ce8d..6206707 100644
--- a/ArmPlatformPkg/Sec/Sec.inf
+++ b/ArmPlatformPkg/Sec/Sec.inf
@@ -48,9 +48,11 @@
PrintLib
SerialPortLib
StackCheckLib
+ ArmTransferListLib
[Ppis]
gEfiTemporaryRamSupportPpiGuid
+ gArmTransferListPpiGuid
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
diff --git a/ArmVirtPkg/ArmVirtCloudHv.dsc b/ArmVirtPkg/ArmVirtCloudHv.dsc
index 541e7c9..94a4ff1 100644
--- a/ArmVirtPkg/ArmVirtCloudHv.dsc
+++ b/ArmVirtPkg/ArmVirtCloudHv.dsc
@@ -61,6 +61,7 @@
TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
TpmPlatformHierarchyLib|SecurityPkg/Library/PeiDxeTpmPlatformHierarchyLibNull/PeiDxeTpmPlatformHierarchyLib.inf
+ ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf
!include MdePkg/MdeLibs.dsc.inc
diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
index fadd15f..1e239bb 100644
--- a/ArmVirtPkg/ArmVirtQemu.dsc
+++ b/ArmVirtPkg/ArmVirtQemu.dsc
@@ -63,6 +63,7 @@
[LibraryClasses.common]
ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf
+ ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf
# Virtio Support
VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf
diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index 2108948..0caa1c9 100755
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -929,18 +929,15 @@ DEFINE GCC_AARCH64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -fno-
DEFINE GCC_AARCH64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only
DEFINE GCC_RISCV64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only
DEFINE GCC_DLINK2_FLAGS_COMMON = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds
-DEFINE GCC_IA32_X64_DLINK_COMMON = -nostdlib --pie --fatal-warnings -z,noexecstack --gc-sections
-DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map -Wl,--fatal-warnings -Wl,-z,noexecstack
+DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map
DEFINE GCC_LOONGARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map
DEFINE GCC_ARM_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) -z common-page-size=0x20 -Wl,--pic-veneer
DEFINE GCC_AARCH64_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) -z common-page-size=0x20
DEFINE GCC_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_COMMON) -z common-page-size=0x20
DEFINE GCC_ARM_AARCH64_ASLDLINK_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0 DEF(GCC_DLINK2_FLAGS_COMMON) -z common-page-size=0x20
-DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)
DEFINE GCC_ARM_ASLDLINK_FLAGS = DEF(GCC_ARM_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS)
DEFINE GCC_AARCH64_ASLDLINK_FLAGS = DEF(GCC_AARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS)
DEFINE GCC_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)
-DEFINE GCC_IA32_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _$(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
DEFINE GCC_ASM_FLAGS = -c -x assembler -imacros AutoGen.h
DEFINE GCC_PP_FLAGS = -E -x assembler-with-cpp -include AutoGen.h
DEFINE GCC_VFRPP_FLAGS = -x c -E -DVFRCOMPILE --include $(MODULE_NAME)StrDefs.h
@@ -1006,13 +1003,13 @@ DEFINE GCC49_ARM_ASLDLINK_FLAGS = DEF(GCC48_ARM_ASLDLINK_FLAGS)
DEFINE GCC49_AARCH64_ASLDLINK_FLAGS = DEF(GCC48_AARCH64_ASLDLINK_FLAGS)
DEFINE GCC49_ASLCC_FLAGS = DEF(GCC48_ASLCC_FLAGS)
+DEFINE GCC5_DLINK_WARNING_FLAGS = -Wl,--fatal-warnings -Wl,-z,noexecstack -Wl,-z,notext
DEFINE GCC5_IA32_CC_FLAGS = DEF(GCC49_IA32_CC_FLAGS)
DEFINE GCC5_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS)
-DEFINE GCC5_IA32_X64_DLINK_COMMON = DEF(GCC49_IA32_X64_DLINK_COMMON)
-DEFINE GCC5_IA32_X64_ASLDLINK_FLAGS = DEF(GCC49_IA32_X64_ASLDLINK_FLAGS)
-DEFINE GCC5_IA32_X64_DLINK_FLAGS = DEF(GCC49_IA32_X64_DLINK_FLAGS)
+DEFINE GCC5_IA32_X64_ASLDLINK_FLAGS = DEF(GCC49_IA32_X64_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
+DEFINE GCC5_IA32_X64_DLINK_FLAGS = DEF(GCC49_IA32_X64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_IA32_DLINK2_FLAGS = DEF(GCC49_IA32_DLINK2_FLAGS) -Wno-error
-DEFINE GCC5_X64_DLINK_FLAGS = DEF(GCC49_X64_DLINK_FLAGS)
+DEFINE GCC5_X64_DLINK_FLAGS = DEF(GCC49_X64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_X64_DLINK2_FLAGS = DEF(GCC49_X64_DLINK2_FLAGS) -Wno-error
DEFINE GCC5_ASM_FLAGS = DEF(GCC49_ASM_FLAGS)
DEFINE GCC5_ARM_ASM_FLAGS = DEF(GCC49_ARM_ASM_FLAGS)
@@ -1021,16 +1018,16 @@ DEFINE GCC5_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS)
DEFINE GCC5_ARM_CC_XIPFLAGS = DEF(GCC49_ARM_CC_XIPFLAGS)
DEFINE GCC5_AARCH64_CC_FLAGS = DEF(GCC49_AARCH64_CC_FLAGS)
DEFINE GCC5_AARCH64_CC_XIPFLAGS = DEF(GCC49_AARCH64_CC_XIPFLAGS)
-DEFINE GCC5_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS)
+DEFINE GCC5_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_ARM_DLINK2_FLAGS = DEF(GCC49_ARM_DLINK2_FLAGS) -Wno-error
-DEFINE GCC5_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS)
+DEFINE GCC5_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_AARCH64_DLINK2_FLAGS = DEF(GCC49_AARCH64_DLINK2_FLAGS) -Wno-error
-DEFINE GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS)
-DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS)
+DEFINE GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
+DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_ASLCC_FLAGS = DEF(GCC49_ASLCC_FLAGS) -fno-lto
-DEFINE GCC5_RISCV_ALL_CC_FLAGS = -g -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -ffunction-sections -fdata-sections -include AutoGen.h -fno-common -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings -msmall-data-limit=0
-DEFINE GCC5_RISCV_ALL_DLINK_COMMON = -nostdlib -Wl,-n,-q,--gc-sections -z common-page-size=0x40
+DEFINE GCC5_RISCV_ALL_CC_FLAGS = -g -fshort-wchar -fno-omit-frame-pointer -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -ffunction-sections -fdata-sections -include AutoGen.h -fno-common -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings -msmall-data-limit=0
+DEFINE GCC5_RISCV_ALL_DLINK_COMMON = -nostdlib -Wl,-n,-q,--gc-sections -z common-page-size=0x40 DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_RISCV_ALL_DLINK_FLAGS = DEF(GCC5_RISCV_ALL_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map
DEFINE GCC5_RISCV_ALL_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x220,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds
DEFINE GCC5_RISCV_ALL_ASM_FLAGS = -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h
@@ -1046,9 +1043,9 @@ DEFINE GCC5_RISCV64_DLINK2_FLAGS = DEF(GCC5_RISCV_ALL_DLINK2_FLAGS)
DEFINE GCC5_RISCV64_ASM_FLAGS = DEF(GCC5_RISCV_ALL_ASM_FLAGS) -march=DEF(GCC5_RISCV64_ARCH) -mcmodel=medany -mabi=lp64
DEFINE GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC_LOONGARCH64_CC_FLAGS) -march=loongarch64 -mno-memcpy -Werror -Wno-maybe-uninitialized -Wno-stringop-overflow -Wno-pointer-to-int-cast -no-pie -fno-stack-protector -mno-explicit-relocs
-DEFINE GCC5_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS)
+DEFINE GCC5_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_LOONGARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228
-DEFINE GCC5_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_ASLDLINK_FLAGS) DEF(GCC5_LOONGARCH64_DLINK2_FLAGS)
+DEFINE GCC5_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_ASLDLINK_FLAGS) DEF(GCC5_LOONGARCH64_DLINK2_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS)
DEFINE GCC5_LOONGARCH64_ASM_FLAGS = -x assembler-with-cpp -mabi=lp64d -march=loongarch64 -fno-builtin -c -Wall -mno-explicit-relocs
DEFINE GCC5_LOONGARCH64_PP_FLAGS = -mabi=lp64d -march=loongarch64 DEF(GCC_PP_FLAGS)
@@ -2031,10 +2028,11 @@ DEFINE CLANGDWARF_X64_PREFIX = ENV(CLANG_BIN)
# LLVM/CLANG doesn't support -n link option. So, it can't share the same IA32_X64_DLINK_COMMON flag.
# LLVM/CLANG doesn't support common page size. So, it can't share the same GccBase.lds script.
-DEFINE CLANGDWARF_IA32_X64_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40
+DEFINE CLANGDWARF_DLINK_WARNING_FLAGS = -Wl,-z,notext
+DEFINE CLANGDWARF_IA32_X64_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40 DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
DEFINE CLANGDWARF_DLINK2_FLAGS_COMMON = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds
DEFINE CLANGDWARF_IA32_X64_ASLDLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0 DEF(CLANGDWARF_DLINK2_FLAGS_COMMON) -Wl,--entry,ReferenceAcpiTable -u ReferenceAcpiTable
-DEFINE CLANGDWARF_IA32_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map,--whole-archive -Wl,-z,notext
+DEFINE CLANGDWARF_IA32_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map,--whole-archive
DEFINE CLANGDWARF_IA32_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x220 DEF(CLANGDWARF_DLINK2_FLAGS_COMMON)
DEFINE CLANGDWARF_X64_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 DEF(CLANGDWARF_DLINK2_FLAGS_COMMON)
@@ -2121,7 +2119,7 @@ NOOPT_CLANGDWARF_X64_DLINK2_FLAGS = DEF(CLANGDWARF_X64_DLINK2_FLAGS) -O0 -fu
##################
DEFINE CLANGDWARF_ARM_TARGET = -target arm-linux-gnueabi
DEFINE CLANGDWARF_ARM_CC_FLAGS = DEF(GCC_ARM_CC_FLAGS) DEF(CLANGDWARF_ARM_TARGET) DEF(CLANGDWARF_WARNING_OVERRIDES) -mno-movt -fno-stack-protector
-DEFINE CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS)
+DEFINE CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
*_CLANGDWARF_ARM_PP_FLAGS = DEF(GCC_PP_FLAGS)
*_CLANGDWARF_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS)
@@ -2165,7 +2163,7 @@ RELEASE_CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_DLINK_FLAGS) -flto -Wl,
##################
DEFINE CLANGDWARF_AARCH64_TARGET = -target aarch64-linux-gnu
DEFINE CLANGDWARF_AARCH64_CC_FLAGS = DEF(GCC_AARCH64_CC_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) -mcmodel=small DEF(CLANGDWARF_WARNING_OVERRIDES)
-DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000
+DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
*_CLANGDWARF_AARCH64_PP_FLAGS = DEF(GCC_PP_FLAGS)
*_CLANGDWARF_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS)
@@ -2187,9 +2185,9 @@ DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_
*_CLANGDWARF_AARCH64_RC_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy
*_CLANGDWARF_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -fno-lto
-*_CLANGDWARF_AARCH64_ASLDLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS)
+*_CLANGDWARF_AARCH64_ASLDLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
*_CLANGDWARF_AARCH64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) $(PLATFORM_FLAGS) -Qunused-arguments
-*_CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000
+*_CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
*_CLANGDWARF_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20
*_CLANGDWARF_AARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228
*_CLANGDWARF_AARCH64_PLATFORM_FLAGS =
@@ -2214,7 +2212,7 @@ DEFINE CLANGDWARF_RISCV64_CC_COMMON = DEF(GCC5_RISCV_ALL_CC_FLAGS) DEF(GCC5_RISC
DEFINE CLANGDWARF_RISCV64_CC_FLAGS = DEF(CLANGDWARF_RISCV64_CC_COMMON) DEF(CLANGDWARF_RISCV64_TARGET) DEF(CLANGDWARF_WARNING_OVERRIDES)
# This is similar to GCC flags but without -n
-DEFINE CLANGDWARF_RISCV64_ALL_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40
+DEFINE CLANGDWARF_RISCV64_ALL_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40 DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
DEFINE CLANGDWARF_RISCV64_ALL_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_ALL_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map
DEFINE CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(CLANGDWARF_RISCV64_ALL_DLINK_FLAGS) -Wl,-melf64lriscv,--oformat=elf64-littleriscv,--no-relax
@@ -2239,9 +2237,9 @@ DEFINE CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF
*_CLANGDWARF_RISCV64_RC_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy
*_CLANGDWARF_RISCV64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -fno-lto
-*_CLANGDWARF_RISCV64_ASLDLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV32_RISCV64_ASLDLINK_FLAGS)
+*_CLANGDWARF_RISCV64_ASLDLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV32_RISCV64_ASLDLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
*_CLANGDWARF_RISCV64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANGDWARF_RISCV64_TARGET) $(PLATFORM_FLAGS) -Qunused-arguments -mabi=lp64 -mno-relax
-*_CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV64_DLINK_FLAGS)
+*_CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV64_DLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS)
*_CLANGDWARF_RISCV64_DLINK_XIPFLAGS = -z common-page-size=0x20
*_CLANGDWARF_RISCV64_DLINK2_FLAGS = DEF(CLANGDWARF_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x240
*_CLANGDWARF_RISCV64_PLATFORM_FLAGS =
diff --git a/CryptoPkg/CryptoPkg.ci.yaml b/CryptoPkg/CryptoPkg.ci.yaml
index 8bb5717..cf614f0 100644
--- a/CryptoPkg/CryptoPkg.ci.yaml
+++ b/CryptoPkg/CryptoPkg.ci.yaml
@@ -142,12 +142,16 @@
"Library/OpensslLib/OpensslGen/providers/common/der/der_digests_gen.c",
"Library/OpensslLib/OpensslGen/providers/common/der/der_ecx_gen.c",
"Library/OpensslLib/OpensslGen/providers/common/der/der_ec_gen.c",
+ "Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c",
"Library/OpensslLib/OpensslGen/providers/common/der/der_rsa_gen.c",
+ "Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c",
"Library/OpensslLib/OpensslGen/providers/common/der/der_wrap_gen.c",
"Library/OpensslLib/OpensslGen/providers/common/include/prov/der_digests.h",
"Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ec.h",
"Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ecx.h",
+ "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h",
"Library/OpensslLib/OpensslGen/providers/common/include/prov/der_rsa.h",
+ "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h",
"Library/OpensslLib/OpensslGen/providers/common/include/prov/der_wrap.h",
"Library/OpensslLib/OpensslStub/uefiprov.c"
]
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
index 8046ef9..8a8fdfe 100644
--- a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
+++ b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
@@ -425,6 +425,25 @@ strtoul (
return 0;
}
+char *
+strpbrk (
+ const char *s,
+ const char *accept
+ )
+{
+ int i;
+
+ for ( ; *s != '\0'; s++) {
+ for (i = 0; accept[i] != '\0'; i++) {
+ if (*s == accept[i]) {
+ return (char *)s;
+ }
+ }
+ }
+
+ return NULL;
+}
+
/* Convert character to lowercase */
int
tolower (
diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h b/CryptoPkg/Library/Include/CrtLibSupport.h
index b43bfd4..80e2fa9 100644
--- a/CryptoPkg/Library/Include/CrtLibSupport.h
+++ b/CryptoPkg/Library/Include/CrtLibSupport.h
@@ -79,6 +79,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define CHAR_BIT 8 /* Number of bits in a char */
#define SIZE_MAX 0xFFFFFFFF /* Maximum unsigned size_t */
+#define INT32_MIN INT_MIN
+#define INT32_MAX INT_MAX
+#define UINT32_MAX UINT_MAX
+
//
// Address families.
//
@@ -426,6 +430,12 @@ strcat (
const char *strSource
);
+char *
+strpbrk (
+ const char *s,
+ const char *accept
+ );
+
//
// Macros that directly map functions to BaseLib, BaseMemoryLib, and DebugLib functions
//
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S
index 96a6637..31c750f 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S
@@ -3,12 +3,13 @@
#if __ARM_MAX_ARCH__>=7
.arch armv8-a+crypto
.text
+.section .rodata
.align 5
.Lrcon:
.long 0x01,0x01,0x01,0x01
.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat
.long 0x1b,0x1b,0x1b,0x1b
-
+.previous
.globl aes_v8_set_encrypt_key
.type aes_v8_set_encrypt_key,%function
.align 5
@@ -31,7 +32,8 @@ aes_v8_set_encrypt_key:
tst w1,#0x3f
b.ne .Lenc_key_abort
- adr x3,.Lrcon
+ adrp x3,.Lrcon
+ add x3,x3,#:lo12:.Lrcon
cmp w1,#192
eor v0.16b,v0.16b,v0.16b
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S
index 8a86682..bb05512 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S
@@ -1,4 +1,4 @@
-// Copyright 2021-2024 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the OpenSSL license (the "License"). You may not use
// this file except in compliance with the License. You can obtain a copy
@@ -44,7 +44,8 @@
// other SIMD registers corrupted
_bsaes_decrypt8:
ldr q8, [x9], #16
- adr x11, .LM0ISR
+ adrp x11, .LM0ISR
+ add x11, x11, #:lo12:.LM0ISR
movi v9.16b, #0x55
ldr q10, [x11], #16
movi v16.16b, #0x33
@@ -460,9 +461,10 @@ _bsaes_decrypt8:
ret
.size _bsaes_decrypt8,.-_bsaes_decrypt8
-.type _bsaes_const,%object
+.section .rodata
+.type _bsaes_consts,%object
.align 6
-_bsaes_const:
+_bsaes_consts:
// InvShiftRows constants
// Used in _bsaes_decrypt8, which assumes contiguity
// .LM0ISR used with round 0 key
@@ -498,7 +500,9 @@ _bsaes_const:
.quad 0x090d01050c000408, 0x03070b0f060a0e02
.align 6
-.size _bsaes_const,.-_bsaes_const
+.size _bsaes_consts,.-_bsaes_consts
+
+.previous
.type _bsaes_encrypt8,%function
.align 4
@@ -514,7 +518,8 @@ _bsaes_const:
// other SIMD registers corrupted
_bsaes_encrypt8:
ldr q8, [x9], #16
- adr x11, .LM0SR
+ adrp x11, .LM0SR
+ add x11, x11, #:lo12:.LM0SR
ldr q9, [x11], #16
_bsaes_encrypt8_alt:
eor v0.16b, v0.16b, v8.16b
@@ -918,9 +923,11 @@ _bsaes_encrypt8_alt:
// other SIMD registers corrupted
_bsaes_key_convert:
#ifdef __AARCH64EL__
- adr x11, .LM0_littleendian
+ adrp x11, .LM0_littleendian
+ add x11, x11, #:lo12:.LM0_littleendian
#else
- adr x11, .LM0_bigendian
+ adrp x11, .LM0_bigendian
+ add x11, x11, #:lo12:.LM0_bigendian
#endif
ldr q0, [x9], #16 // load round 0 key
ldr q1, [x11] // .LM0
@@ -964,7 +971,8 @@ _bsaes_key_convert:
// don't save last round key
#ifdef __AARCH64EL__
rev32 v15.16b, v15.16b
- adr x11, .LM0_bigendian
+ adrp x11, .LM0_bigendian
+ add x11, x11, #:lo12:.LM0_bigendian
#endif
ret
.size _bsaes_key_convert,.-_bsaes_key_convert
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S
index 9aef5ac..e78961d 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S
@@ -1,6 +1,6 @@
#include "arm_arch.h"
-.text
+.section .rodata
.type _vpaes_consts,%object
.align 7 // totally strategic alignment
@@ -92,6 +92,9 @@ _vpaes_consts:
.align 2
.size _vpaes_consts,.-_vpaes_consts
.align 6
+
+.text
+
//
// _aes_preheat
//
@@ -101,7 +104,8 @@ _vpaes_consts:
.type _vpaes_encrypt_preheat,%function
.align 4
_vpaes_encrypt_preheat:
- adr x10, .Lk_inv
+ adrp x10, .Lk_inv
+ add x10, x10, #:lo12:.Lk_inv
movi v17.16b, #0x0f
ld1 {v18.2d,v19.2d}, [x10],#32 // .Lk_inv
ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x10],#64 // .Lk_ipt, .Lk_sbo
@@ -129,7 +133,8 @@ _vpaes_encrypt_preheat:
_vpaes_encrypt_core:
mov x9, x2
ldr w8, [x2,#240] // pull rounds
- adr x11, .Lk_mc_forward+16
+ adrp x11, .Lk_mc_forward+16
+ add x11, x11, #:lo12:.Lk_mc_forward+16
// vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo
ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key
and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1
@@ -216,7 +221,8 @@ vpaes_encrypt:
_vpaes_encrypt_2x:
mov x9, x2
ldr w8, [x2,#240] // pull rounds
- adr x11, .Lk_mc_forward+16
+ adrp x11, .Lk_mc_forward+16
+ add x11, x11, #:lo12:.Lk_mc_forward+16
// vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo
ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key
and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1
@@ -319,9 +325,11 @@ _vpaes_encrypt_2x:
.type _vpaes_decrypt_preheat,%function
.align 4
_vpaes_decrypt_preheat:
- adr x10, .Lk_inv
+ adrp x10, .Lk_inv
+ add x10, x10, #:lo12:.Lk_inv
movi v17.16b, #0x0f
- adr x11, .Lk_dipt
+ adrp x11, .Lk_dipt
+ add x11, x11, #:lo12:.Lk_dipt
ld1 {v18.2d,v19.2d}, [x10],#32 // .Lk_inv
ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x11],#64 // .Lk_dipt, .Lk_dsbo
ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x11],#64 // .Lk_dsb9, .Lk_dsbd
@@ -343,10 +351,12 @@ _vpaes_decrypt_core:
// vmovdqa .Lk_dipt(%rip), %xmm2 # iptlo
lsl x11, x8, #4 // mov %rax, %r11; shl $4, %r11
eor x11, x11, #0x30 // xor $0x30, %r11
- adr x10, .Lk_sr
+ adrp x10, .Lk_sr
+ add x10, x10, #:lo12:.Lk_sr
and x11, x11, #0x30 // and $0x30, %r11
add x11, x11, x10
- adr x10, .Lk_mc_forward+48
+ adrp x10, .Lk_mc_forward+48
+ add x10, x10, #:lo12:.Lk_mc_forward+48
ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm4 # round0 key
and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1
@@ -454,10 +464,12 @@ _vpaes_decrypt_2x:
// vmovdqa .Lk_dipt(%rip), %xmm2 # iptlo
lsl x11, x8, #4 // mov %rax, %r11; shl $4, %r11
eor x11, x11, #0x30 // xor $0x30, %r11
- adr x10, .Lk_sr
+ adrp x10, .Lk_sr
+ add x10, x10, #:lo12:.Lk_sr
and x11, x11, #0x30 // and $0x30, %r11
add x11, x11, x10
- adr x10, .Lk_mc_forward+48
+ adrp x10, .Lk_mc_forward+48
+ add x10, x10, #:lo12:.Lk_mc_forward+48
ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm4 # round0 key
and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1
@@ -586,14 +598,18 @@ _vpaes_decrypt_2x:
.type _vpaes_key_preheat,%function
.align 4
_vpaes_key_preheat:
- adr x10, .Lk_inv
+ adrp x10, .Lk_inv
+ add x10, x10, #:lo12:.Lk_inv
movi v16.16b, #0x5b // .Lk_s63
- adr x11, .Lk_sb1
+ adrp x11, .Lk_sb1
+ add x11, x11, #:lo12:.Lk_sb1
movi v17.16b, #0x0f // .Lk_s0F
ld1 {v18.2d,v19.2d,v20.2d,v21.2d}, [x10] // .Lk_inv, .Lk_ipt
- adr x10, .Lk_dksd
+ adrp x10, .Lk_dksd
+ add x10, x10, #:lo12:.Lk_dksd
ld1 {v22.2d,v23.2d}, [x11] // .Lk_sb1
- adr x11, .Lk_mc_forward
+ adrp x11, .Lk_mc_forward
+ add x11, x11, #:lo12:.Lk_mc_forward
ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10],#64 // .Lk_dksd, .Lk_dksb
ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x10],#64 // .Lk_dkse, .Lk_dks9
ld1 {v8.2d}, [x10] // .Lk_rcon
@@ -617,7 +633,8 @@ _vpaes_schedule_core:
bl _vpaes_schedule_transform
mov v7.16b, v0.16b // vmovdqa %xmm0, %xmm7
- adr x10, .Lk_sr // lea .Lk_sr(%rip),%r10
+ adrp x10, .Lk_sr
+ add x10, x10, #:lo12:.Lk_sr
add x8, x8, x10
cbnz w3, .Lschedule_am_decrypting
@@ -743,12 +760,14 @@ _vpaes_schedule_core:
.align 4
.Lschedule_mangle_last:
// schedule last round key from xmm0
- adr x11, .Lk_deskew // lea .Lk_deskew(%rip),%r11 # prepare to deskew
+ adrp x11, .Lk_deskew
+ add x11, x11, #:lo12:.Lk_deskew
cbnz w3, .Lschedule_mangle_last_dec
// encrypting
ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10),%xmm1
- adr x11, .Lk_opt // lea .Lk_opt(%rip), %r11 # prepare to output transform
+ adrp x11, .Lk_opt
+ add x11, x11, #:lo12:.Lk_opt
add x2, x2, #32 // add $32, %rdx
tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 # output permute
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S
index 111de65..98c5b76 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S
@@ -2130,6 +2130,7 @@ __bn_mul4x_mont:
AARCH64_VALIDATE_LINK_REGISTER
ret
.size __bn_mul4x_mont,.-__bn_mul4x_mont
+.section .rodata
.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
.align 2
.align 4
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S
index 6fe86a4..8c42109 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S
@@ -1,6 +1,6 @@
#include "arm_arch.h"
-.text
+.section .rodata
.globl ecp_nistz256_precomputed
.type ecp_nistz256_precomputed,%object
.align 12
@@ -2390,6 +2390,8 @@ ecp_nistz256_precomputed:
.byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
.align 2
+.text
+
// void ecp_nistz256_to_mont(BN_ULONG x0[4],const BN_ULONG x1[4]);
.globl ecp_nistz256_to_mont
.type ecp_nistz256_to_mont,%function
@@ -2400,12 +2402,16 @@ ecp_nistz256_to_mont:
add x29,sp,#0
stp x19,x20,[sp,#16]
- ldr x3,.LRR // bp[0]
+ adrp x3,.LRR
+ ldr x3,[x3,#:lo12:.LRR] // bp[0]
ldp x4,x5,[x1]
ldp x6,x7,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
- adr x2,.LRR // &bp[0]
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
+ adrp x2,.LRR
+ add x2,x2,#:lo12:.LRR
bl __ecp_nistz256_mul_mont
@@ -2428,9 +2434,12 @@ ecp_nistz256_from_mont:
mov x3,#1 // bp[0]
ldp x4,x5,[x1]
ldp x6,x7,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
- adr x2,.Lone // &bp[0]
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
+ adrp x2,.Lone
+ add x2,x2,#:lo12:.Lone
bl __ecp_nistz256_mul_mont
@@ -2454,8 +2463,10 @@ ecp_nistz256_mul_mont:
ldr x3,[x2] // bp[0]
ldp x4,x5,[x1]
ldp x6,x7,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
bl __ecp_nistz256_mul_mont
@@ -2477,8 +2488,10 @@ ecp_nistz256_sqr_mont:
ldp x4,x5,[x1]
ldp x6,x7,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
bl __ecp_nistz256_sqr_mont
@@ -2502,8 +2515,10 @@ ecp_nistz256_add:
ldp x8,x9,[x2]
ldp x16,x17,[x1,#16]
ldp x10,x11,[x2,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
bl __ecp_nistz256_add
@@ -2523,8 +2538,10 @@ ecp_nistz256_div_by_2:
ldp x14,x15,[x1]
ldp x16,x17,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
bl __ecp_nistz256_div_by_2
@@ -2544,8 +2561,10 @@ ecp_nistz256_mul_by_2:
ldp x14,x15,[x1]
ldp x16,x17,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
mov x8,x14
mov x9,x15
mov x10,x16
@@ -2569,8 +2588,10 @@ ecp_nistz256_mul_by_3:
ldp x14,x15,[x1]
ldp x16,x17,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
mov x8,x14
mov x9,x15
mov x10,x16
@@ -2606,8 +2627,10 @@ ecp_nistz256_sub:
ldp x14,x15,[x1]
ldp x16,x17,[x1,#16]
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
bl __ecp_nistz256_sub_from
@@ -2630,8 +2653,10 @@ ecp_nistz256_neg:
mov x15,xzr
mov x16,xzr
mov x17,xzr
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
bl __ecp_nistz256_sub_from
@@ -3026,9 +3051,11 @@ ecp_nistz256_point_double:
mov x21,x0
ldp x16,x17,[x1,#48]
mov x22,x1
- ldr x12,.Lpoly+8
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
mov x8,x14
- ldr x13,.Lpoly+24
+ ldr x13,[x13,#24]
mov x9,x15
ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont
mov x10,x16
@@ -3171,8 +3198,10 @@ ecp_nistz256_point_add:
mov x21,x0
mov x22,x1
mov x23,x2
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
orr x8,x4,x5
orr x10,x6,x7
orr x25,x8,x10
@@ -3422,8 +3451,10 @@ ecp_nistz256_point_add_affine:
mov x21,x0
mov x22,x1
mov x23,x2
- ldr x12,.Lpoly+8
- ldr x13,.Lpoly+24
+ adrp x13,.Lpoly
+ add x13,x13,#:lo12:.Lpoly
+ ldr x12,[x13,#8]
+ ldr x13,[x13,#24]
ldp x4,x5,[x1,#64] // in1_z
ldp x6,x7,[x1,#64+16]
@@ -3569,7 +3600,8 @@ ecp_nistz256_point_add_affine:
ldp x10,x11,[x23,#0+48]
stp x14,x15,[x21,#0]
stp x16,x17,[x21,#0+16]
- adr x23,.Lone_mont-64
+ adrp x23,.Lone_mont-64
+ add x23,x23,#:lo12:.Lone_mont-64
ldp x14,x15,[x22,#32] // in1
cmp x24,#0 // ~, remember?
ldp x16,x17,[x22,#32+16]
@@ -3627,7 +3659,8 @@ ecp_nistz256_ord_mul_mont:
stp x21,x22,[sp,#32]
stp x23,x24,[sp,#48]
- adr x23,.Lord
+ adrp x23,.Lord
+ add x23,x23,#:lo12:.Lord
ldr x3,[x2] // bp[0]
ldp x4,x5,[x1]
ldp x6,x7,[x1,#16]
@@ -3837,7 +3870,8 @@ ecp_nistz256_ord_sqr_mont:
stp x21,x22,[sp,#32]
stp x23,x24,[sp,#48]
- adr x23,.Lord
+ adrp x23,.Lord
+ add x23,x23,#:lo12:.Lord
ldp x4,x5,[x1]
ldp x6,x7,[x1,#16]
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S
index 7045e31..76e4de3 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S
@@ -207,165 +207,165 @@ ossl_md5_blocks_loop:
add w9, w9, w13 // Add constant 0x49b40821
add w9, w9, w6 // Add aux function result
ror w9, w9, #10 // Rotate left s=22 bits
- bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x8, x17 // Aux function round 2 (~z & y)
add w9, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0x49b40821, s=22, M[15])
- and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x2562 // .Load lower half of constant 0xf61e2562
movk x13, #0xf61e, lsl #16 // .Load upper half of constant 0xf61e2562
add w4, w4, w20 // Add dest value
add w4, w4, w13 // Add constant 0xf61e2562
- add w4, w4, w6 // Add aux function result
+ and x13, x9, x17 // Aux function round 2 (x & z)
+ add w4, w4, w6 // Add (~z & y)
+ add w4, w4, w13 // Add (x & z)
ror w4, w4, #27 // Rotate left s=5 bits
- bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x9, x8 // Aux function round 2 (~z & y)
add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xf61e2562, s=5, M[1])
- and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xb340 // .Load lower half of constant 0xc040b340
movk x13, #0xc040, lsl #16 // .Load upper half of constant 0xc040b340
add w17, w17, w7 // Add dest value
add w17, w17, w13 // Add constant 0xc040b340
- add w17, w17, w6 // Add aux function result
+ and x13, x4, x8 // Aux function round 2 (x & z)
+ add w17, w17, w6 // Add (~z & y)
+ add w17, w17, w13 // Add (x & z)
ror w17, w17, #23 // Rotate left s=9 bits
- bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x4, x9 // Aux function round 2 (~z & y)
add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc040b340, s=9, M[6])
- and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x5a51 // .Load lower half of constant 0x265e5a51
movk x13, #0x265e, lsl #16 // .Load upper half of constant 0x265e5a51
add w8, w8, w25 // Add dest value
add w8, w8, w13 // Add constant 0x265e5a51
- add w8, w8, w6 // Add aux function result
+ and x13, x17, x9 // Aux function round 2 (x & z)
+ add w8, w8, w6 // Add (~z & y)
+ add w8, w8, w13 // Add (x & z)
ror w8, w8, #18 // Rotate left s=14 bits
- bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x17, x4 // Aux function round 2 (~z & y)
add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x265e5a51, s=14, M[11])
- and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xc7aa // .Load lower half of constant 0xe9b6c7aa
movk x13, #0xe9b6, lsl #16 // .Load upper half of constant 0xe9b6c7aa
add w9, w9, w15 // Add dest value
add w9, w9, w13 // Add constant 0xe9b6c7aa
- add w9, w9, w6 // Add aux function result
+ and x13, x8, x4 // Aux function round 2 (x & z)
+ add w9, w9, w6 // Add (~z & y)
+ add w9, w9, w13 // Add (x & z)
ror w9, w9, #12 // Rotate left s=20 bits
- bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x8, x17 // Aux function round 2 (~z & y)
add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe9b6c7aa, s=20, M[0])
- and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x105d // .Load lower half of constant 0xd62f105d
movk x13, #0xd62f, lsl #16 // .Load upper half of constant 0xd62f105d
add w4, w4, w22 // Add dest value
add w4, w4, w13 // Add constant 0xd62f105d
- add w4, w4, w6 // Add aux function result
+ and x13, x9, x17 // Aux function round 2 (x & z)
+ add w4, w4, w6 // Add (~z & y)
+ add w4, w4, w13 // Add (x & z)
ror w4, w4, #27 // Rotate left s=5 bits
- bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x9, x8 // Aux function round 2 (~z & y)
add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xd62f105d, s=5, M[5])
- and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x1453 // .Load lower half of constant 0x2441453
movk x13, #0x244, lsl #16 // .Load upper half of constant 0x2441453
add w17, w17, w16 // Add dest value
add w17, w17, w13 // Add constant 0x2441453
- add w17, w17, w6 // Add aux function result
+ and x13, x4, x8 // Aux function round 2 (x & z)
+ add w17, w17, w6 // Add (~z & y)
+ add w17, w17, w13 // Add (x & z)
ror w17, w17, #23 // Rotate left s=9 bits
- bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x4, x9 // Aux function round 2 (~z & y)
add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0x2441453, s=9, M[10])
- and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xe681 // .Load lower half of constant 0xd8a1e681
movk x13, #0xd8a1, lsl #16 // .Load upper half of constant 0xd8a1e681
add w8, w8, w27 // Add dest value
add w8, w8, w13 // Add constant 0xd8a1e681
- add w8, w8, w6 // Add aux function result
+ and x13, x17, x9 // Aux function round 2 (x & z)
+ add w8, w8, w6 // Add (~z & y)
+ add w8, w8, w13 // Add (x & z)
ror w8, w8, #18 // Rotate left s=14 bits
- bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x17, x4 // Aux function round 2 (~z & y)
add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xd8a1e681, s=14, M[15])
- and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xfbc8 // .Load lower half of constant 0xe7d3fbc8
movk x13, #0xe7d3, lsl #16 // .Load upper half of constant 0xe7d3fbc8
add w9, w9, w14 // Add dest value
add w9, w9, w13 // Add constant 0xe7d3fbc8
- add w9, w9, w6 // Add aux function result
+ and x13, x8, x4 // Aux function round 2 (x & z)
+ add w9, w9, w6 // Add (~z & y)
+ add w9, w9, w13 // Add (x & z)
ror w9, w9, #12 // Rotate left s=20 bits
- bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x8, x17 // Aux function round 2 (~z & y)
add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe7d3fbc8, s=20, M[4])
- and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xcde6 // .Load lower half of constant 0x21e1cde6
movk x13, #0x21e1, lsl #16 // .Load upper half of constant 0x21e1cde6
add w4, w4, w24 // Add dest value
add w4, w4, w13 // Add constant 0x21e1cde6
- add w4, w4, w6 // Add aux function result
+ and x13, x9, x17 // Aux function round 2 (x & z)
+ add w4, w4, w6 // Add (~z & y)
+ add w4, w4, w13 // Add (x & z)
ror w4, w4, #27 // Rotate left s=5 bits
- bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x9, x8 // Aux function round 2 (~z & y)
add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0x21e1cde6, s=5, M[9])
- and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x7d6 // .Load lower half of constant 0xc33707d6
movk x13, #0xc337, lsl #16 // .Load upper half of constant 0xc33707d6
add w17, w17, w12 // Add dest value
add w17, w17, w13 // Add constant 0xc33707d6
- add w17, w17, w6 // Add aux function result
+ and x13, x4, x8 // Aux function round 2 (x & z)
+ add w17, w17, w6 // Add (~z & y)
+ add w17, w17, w13 // Add (x & z)
ror w17, w17, #23 // Rotate left s=9 bits
- bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x4, x9 // Aux function round 2 (~z & y)
add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc33707d6, s=9, M[14])
- and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xd87 // .Load lower half of constant 0xf4d50d87
movk x13, #0xf4d5, lsl #16 // .Load upper half of constant 0xf4d50d87
add w8, w8, w21 // Add dest value
add w8, w8, w13 // Add constant 0xf4d50d87
- add w8, w8, w6 // Add aux function result
+ and x13, x17, x9 // Aux function round 2 (x & z)
+ add w8, w8, w6 // Add (~z & y)
+ add w8, w8, w13 // Add (x & z)
ror w8, w8, #18 // Rotate left s=14 bits
- bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x17, x4 // Aux function round 2 (~z & y)
add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xf4d50d87, s=14, M[3])
- and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x14ed // .Load lower half of constant 0x455a14ed
movk x13, #0x455a, lsl #16 // .Load upper half of constant 0x455a14ed
add w9, w9, w5 // Add dest value
add w9, w9, w13 // Add constant 0x455a14ed
- add w9, w9, w6 // Add aux function result
+ and x13, x8, x4 // Aux function round 2 (x & z)
+ add w9, w9, w6 // Add (~z & y)
+ add w9, w9, w13 // Add (x & z)
ror w9, w9, #12 // Rotate left s=20 bits
- bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x8, x17 // Aux function round 2 (~z & y)
add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0x455a14ed, s=20, M[8])
- and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xe905 // .Load lower half of constant 0xa9e3e905
movk x13, #0xa9e3, lsl #16 // .Load upper half of constant 0xa9e3e905
add w4, w4, w26 // Add dest value
add w4, w4, w13 // Add constant 0xa9e3e905
- add w4, w4, w6 // Add aux function result
+ and x13, x9, x17 // Aux function round 2 (x & z)
+ add w4, w4, w6 // Add (~z & y)
+ add w4, w4, w13 // Add (x & z)
ror w4, w4, #27 // Rotate left s=5 bits
- bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x9, x8 // Aux function round 2 (~z & y)
add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xa9e3e905, s=5, M[13])
- and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0xa3f8 // .Load lower half of constant 0xfcefa3f8
movk x13, #0xfcef, lsl #16 // .Load upper half of constant 0xfcefa3f8
add w17, w17, w3 // Add dest value
add w17, w17, w13 // Add constant 0xfcefa3f8
- add w17, w17, w6 // Add aux function result
+ and x13, x4, x8 // Aux function round 2 (x & z)
+ add w17, w17, w6 // Add (~z & y)
+ add w17, w17, w13 // Add (x & z)
ror w17, w17, #23 // Rotate left s=9 bits
- bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x4, x9 // Aux function round 2 (~z & y)
add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xfcefa3f8, s=9, M[2])
- and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x2d9 // .Load lower half of constant 0x676f02d9
movk x13, #0x676f, lsl #16 // .Load upper half of constant 0x676f02d9
add w8, w8, w23 // Add dest value
add w8, w8, w13 // Add constant 0x676f02d9
- add w8, w8, w6 // Add aux function result
+ and x13, x17, x9 // Aux function round 2 (x & z)
+ add w8, w8, w6 // Add (~z & y)
+ add w8, w8, w13 // Add (x & z)
ror w8, w8, #18 // Rotate left s=14 bits
- bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
+ bic x6, x17, x4 // Aux function round 2 (~z & y)
add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x676f02d9, s=14, M[7])
- and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
- orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
movz x13, #0x4c8a // .Load lower half of constant 0x8d2a4c8a
movk x13, #0x8d2a, lsl #16 // .Load upper half of constant 0x8d2a4c8a
add w9, w9, w11 // Add dest value
add w9, w9, w13 // Add constant 0x8d2a4c8a
- add w9, w9, w6 // Add aux function result
+ and x13, x8, x4 // Aux function round 2 (x & z)
+ add w9, w9, w6 // Add (~z & y)
+ add w9, w9, w13 // Add (x & z)
eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z)
ror w9, w9, #12 // Rotate left s=20 bits
movz x10, #0x3942 // .Load lower half of constant 0xfffa3942
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S
index 75e2953..117c52e 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S
@@ -6389,6 +6389,7 @@ aes_gcm_dec_256_kernel:
mov w0, #0x0
ret
.size aes_gcm_dec_256_kernel,.-aes_gcm_dec_256_kernel
+.section .rodata
.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
.align 2
.align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S
index 9553790..0b50e2a 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S
@@ -637,6 +637,7 @@ gcm_ghash_v8_4x:
ret
.size gcm_ghash_v8_4x,.-gcm_ghash_v8_4x
+.section .rodata
.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
.align 2
.align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S
index a6f0f60..a4f0f0f 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S
@@ -1,6 +1,6 @@
#include "arm_arch.h"
-.text
+.section .rodata
.align 8 // strategic alignment and padding that allows to use
// address value as loop termination condition...
@@ -32,11 +32,14 @@ iotas:
.quad 0x0000000080000001
.quad 0x8000000080008008
.size iotas,.-iotas
+.text
+
.type KeccakF1600_int,%function
.align 5
KeccakF1600_int:
AARCH64_SIGN_LINK_REGISTER
- adr x28,iotas
+ adrp x28,iotas
+ add x28,x28,#:lo12:iotas
stp x28,x30,[sp,#16] // 32 bytes on top are mine
b .Loop
.align 4
@@ -578,7 +581,8 @@ SHA3_squeeze:
.align 5
KeccakF1600_ce:
mov x9,#24
- adr x10,iotas
+ adrp x10,iotas
+ add x10,x10,#:lo12:iotas
b .Loop_ce
.align 4
.Loop_ce:
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S
index 42fc0a7..507262b 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S
@@ -1080,7 +1080,8 @@ sha1_block_armv8:
stp x29,x30,[sp,#-16]!
add x29,sp,#0
- adr x4,.Lconst
+ adrp x4,.Lconst
+ add x4,x4,#:lo12:.Lconst
eor v1.16b,v1.16b,v1.16b
ld1 {v0.4s},[x0],#16
ld1 {v1.s}[0],[x0]
@@ -1203,6 +1204,9 @@ sha1_block_armv8:
ldr x29,[sp],#16
ret
.size sha1_block_armv8,.-sha1_block_armv8
+
+.section .rodata
+
.align 6
.Lconst:
.long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 //K_00_19
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S
index 9d397fa..b0644b8 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S
@@ -1,4 +1,4 @@
-// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License 2.0 (the "License"). You may not use
// this file except in compliance with the License. You can obtain a copy
@@ -92,7 +92,8 @@ sha256_block_data_order:
ldp w24,w25,[x0,#4*4]
add x2,x1,x2,lsl#6 // end of input
ldp w26,w27,[x0,#6*4]
- adr x30,.LK256
+ adrp x30,.LK256
+ add x30,x30,#:lo12:.LK256
stp x0,x2,[x29,#96]
.Loop:
@@ -1040,6 +1041,8 @@ sha256_block_data_order:
ret
.size sha256_block_data_order,.-sha256_block_data_order
+.section .rodata
+
.align 6
.type .LK256,%object
.LK256:
@@ -1064,6 +1067,8 @@ sha256_block_data_order:
.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
.align 2
.align 2
+
+.text
#ifndef __KERNEL__
.type sha256_block_armv8,%function
.align 6
@@ -1074,7 +1079,8 @@ sha256_block_armv8:
add x29,sp,#0
ld1 {v0.4s,v1.4s},[x0]
- adr x3,.LK256
+ adrp x3,.LK256
+ add x3,x3,#:lo12:.LK256
.Loop_hw:
ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
@@ -1218,7 +1224,8 @@ sha256_block_neon:
mov x29, sp
sub sp,sp,#16*4
- adr x16,.LK256
+ adrp x16,.LK256
+ add x16,x16,#:lo12:.LK256
add x2,x1,x2,lsl#6 // len to point at the end of inp
ld1 {v0.16b},[x1], #16
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S
index dbc688d..0a45eb0 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S
@@ -1,4 +1,4 @@
-// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License 2.0 (the "License"). You may not use
// this file except in compliance with the License. You can obtain a copy
@@ -90,7 +90,8 @@ sha512_block_data_order:
ldp x24,x25,[x0,#4*8]
add x2,x1,x2,lsl#7 // end of input
ldp x26,x27,[x0,#6*8]
- adr x30,.LK512
+ adrp x30,.LK512
+ add x30,x30,#:lo12:.LK512
stp x0,x2,[x29,#96]
.Loop:
@@ -1038,6 +1039,8 @@ sha512_block_data_order:
ret
.size sha512_block_data_order,.-sha512_block_data_order
+.section .rodata
+
.align 6
.type .LK512,%object
.LK512:
@@ -1086,6 +1089,8 @@ sha512_block_data_order:
.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
.align 2
.align 2
+
+.text
#ifndef __KERNEL__
.type sha512_block_armv8,%function
.align 6
@@ -1099,7 +1104,8 @@ sha512_block_armv8:
ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64
ld1 {v0.2d,v1.2d,v2.2d,v3.2d},[x0] // load context
- adr x3,.LK512
+ adrp x3,.LK512
+ add x3,x3,#:lo12:.LK512
rev64 v16.16b,v16.16b
rev64 v17.16b,v17.16b
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S
index f1678ff..39ffc20 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S
@@ -1,4 +1,4 @@
-// Copyright 2021-2023 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License 2.0 (the "License"). You may not use
// this file except in compliance with the License. You can obtain a copy
@@ -22,19 +22,19 @@ ossl_hwsm3_block_data_order:
rev64 v6.4s, v6.4s
ext v5.16b, v5.16b, v5.16b, #8
ext v6.16b, v6.16b, v6.16b, #8
-
- adr x8, .Tj
+ adrp x8, .Tj
+ add x8, x8, #:lo12:.Tj
ldp s16, s17, [x8]
.Loop:
// load input
- ld1 {v0.16b,v1.16b,v2.16b,v3.16b}, [x1], #64
+ ld1 {v0.4s,v1.4s,v2.4s,v3.4s}, [x1], #64
sub w2, w2, #1
mov v18.16b, v5.16b
mov v19.16b, v6.16b
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
rev32 v0.16b, v0.16b
rev32 v1.16b, v1.16b
rev32 v2.16b, v2.16b
@@ -497,7 +497,12 @@ ossl_hwsm3_block_data_order:
st1 {v5.4s,v6.4s}, [x0]
ret
.size ossl_hwsm3_block_data_order,.-ossl_hwsm3_block_data_order
+.section .rodata
+.type _sm3_consts,%object
.align 3
+_sm3_consts:
.Tj:
.word 0x79cc4519, 0x9d8a7a87
+.size _sm3_consts,.-_sm3_consts
+.previous
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S
index 9792a50..c55c427 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S
@@ -3300,7 +3300,7 @@ AES_set_decrypt_key:
.byte 65,69,83,32,102,111,114,32,120,56,54,44,32,67,82,89
.byte 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114
.byte 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S
index 28e4f1a..2f9563b 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S
@@ -3344,7 +3344,7 @@ aesni_set_decrypt_key:
.byte 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83
.byte 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
.byte 115,108,46,111,114,103,62,0
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S
index b26aa4b..73b8714 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S
@@ -1552,7 +1552,7 @@ bn_sub_part_words:
popl %ebp
ret
.size bn_sub_part_words,.-.L_bn_sub_part_words_begin
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S
index 9ec7e16..74f0986 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S
@@ -354,7 +354,7 @@ bn_GF2m_mul_2x2:
.byte 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97
.byte 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103
.byte 62,0
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S
index 73fad9f..eedb0f4 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S
@@ -474,7 +474,7 @@ bn_mul_mont:
.byte 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121
.byte 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46
.byte 111,114,103,62,0
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S
index ccd96e4..63f333e 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S
@@ -5270,7 +5270,7 @@ ecp_nistz256_point_add_affine:
popl %ebp
ret
.size ecp_nistz256_point_add_affine,.-.L_ecp_nistz256_point_add_affine_begin
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S
index 9cfe5a4..a3f81ed 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S
@@ -3986,7 +3986,7 @@ _sha1_block_data_order_avx:
.byte 102,111,114,109,32,102,111,114,32,120,56,54,44,32,67,82
.byte 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112
.byte 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S
index 9253ab1..8497be1 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S
@@ -6784,7 +6784,7 @@ sha256_block_data_order:
popl %ebp
ret
.size sha256_block_data_order,.-.L_sha256_block_data_order_begin
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S
index 5e84936..74624d5 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S
@@ -2830,7 +2830,7 @@ sha512_block_data_order:
.byte 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97
.byte 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103
.byte 62,0
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section ".note.gnu.property", "a"
.p2align 2
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S
index 3a3533b..76d15e5 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S
@@ -122,6 +122,24 @@ OPENSSL_ia32_cpuid:
xorl %ecx,%ecx
.byte 0x0f,0xa2
movl %ebx,8(%edi)
+ movl %ecx,12(%edi)
+ movl %edx,16(%edi)
+ cmpl $1,%eax
+ jb .L005no_extended_info
+ movl $7,%eax
+ movl $1,%ecx
+ .byte 0x0f,0xa2
+ movl %eax,20(%edi)
+ movl %edx,24(%edi)
+ movl %ebx,28(%edi)
+ movl %ecx,32(%edi)
+ andl $524288,%edx
+ cmpl $0,%edx
+ je .L005no_extended_info
+ movl $36,%eax
+ movl $0,%ecx
+ .byte 0x0f,0xa2
+ movl %ebx,36(%edi)
.L005no_extended_info:
btl $27,%ebp
jnc .L006clear_avx
@@ -137,6 +155,7 @@ OPENSSL_ia32_cpuid:
andl $4278190079,%esi
.L006clear_avx:
andl $4026525695,%ebp
+ andl $4286578687,20(%edi)
andl $4294967263,8(%edi)
.L007done:
movl %esi,%eax
@@ -577,7 +596,7 @@ OPENSSL_ia32_rdseed_bytes:
.size OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin
.hidden OPENSSL_cpuid_setup
.hidden OPENSSL_ia32cap_P
-.comm OPENSSL_ia32cap_P,16,4
+.comm OPENSSL_ia32cap_P,40,4
.section .init
call OPENSSL_cpuid_setup
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm
index 6c21227..71c812a 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm
@@ -3208,4 +3208,4 @@ db 65,69,83,32,102,111,114,32,120,56,54,44,32,67,82,89
db 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114
db 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm
index ca5544a..37198a2 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm
@@ -3199,4 +3199,4 @@ db 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83
db 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
db 115,108,46,111,114,103,62,0
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm
index e46d845..d79fd80 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm
@@ -1512,4 +1512,4 @@ L$029pw_end:
pop ebp
ret
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm
index 7750777..52be719 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm
@@ -342,4 +342,4 @@ db 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97
db 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103
db 62,0
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm
index 6547b0d..5450853 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm
@@ -476,4 +476,4 @@ db 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121
db 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46
db 111,114,103,62,0
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm
index 1e48797..cd53815 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm
@@ -5125,4 +5125,4 @@ L$013pic:
pop ebp
ret
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm
index 0d644ac..41cc58a 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm
@@ -3967,4 +3967,4 @@ db 102,111,114,109,32,102,111,114,32,120,56,54,44,32,67,82
db 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112
db 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm
index 7d8398c..ec4ac3e 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm
@@ -6786,4 +6786,4 @@ L$018avx_bmi_00_47:
pop ebp
ret
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm
index 9410d5c..d04b03e 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm
@@ -2832,4 +2832,4 @@ db 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97
db 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103
db 62,0
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm
index 5f3599c..a0ca9ae 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm
@@ -123,6 +123,24 @@ L$002generic:
xor ecx,ecx
cpuid
mov DWORD [8+edi],ebx
+ mov DWORD [12+edi],ecx
+ mov DWORD [16+edi],edx
+ cmp eax,1
+ jb NEAR L$005no_extended_info
+ mov eax,7
+ mov ecx,1
+ cpuid
+ mov DWORD [20+edi],eax
+ mov DWORD [24+edi],edx
+ mov DWORD [28+edi],ebx
+ mov DWORD [32+edi],ecx
+ and edx,524288
+ cmp edx,0
+ je NEAR L$005no_extended_info
+ mov eax,36
+ mov ecx,0
+ cpuid
+ mov DWORD [36+edi],ebx
L$005no_extended_info:
bt ebp,27
jnc NEAR L$006clear_avx
@@ -138,6 +156,7 @@ L$008clear_xmm:
and esi,4278190079
L$006clear_avx:
and ebp,4026525695
+ and DWORD [20+edi],4286578687
and DWORD [8+edi],4294967263
L$007done:
mov eax,esi
@@ -500,7 +519,7 @@ L$031done:
pop edi
ret
segment .bss
-common _OPENSSL_ia32cap_P 16
+common _OPENSSL_ia32cap_P 40
segment .CRT$XCU data align=4
extern _OPENSSL_cpuid_setup
dd _OPENSSL_cpuid_setup
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s
new file mode 100644
index 0000000..a07316d
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s
@@ -0,0 +1,8145 @@
+.text
+
+.globl aesni_xts_avx512_eligible
+.type aesni_xts_avx512_eligible,@function
+.align 32
+aesni_xts_avx512_eligible:
+ movl OPENSSL_ia32cap_P+8(%rip),%ecx
+ xorl %eax,%eax
+
+ andl $0xc0030000,%ecx
+ cmpl $0xc0030000,%ecx
+ jne .L_done
+ movl OPENSSL_ia32cap_P+12(%rip),%ecx
+
+ andl $0x640,%ecx
+ cmpl $0x640,%ecx
+ cmovel %ecx,%eax
+.L_done:
+ .byte 0xf3,0xc3
+.size aesni_xts_avx512_eligible, .-aesni_xts_avx512_eligible
+.globl aesni_xts_128_encrypt_avx512
+.hidden aesni_xts_128_encrypt_avx512
+.type aesni_xts_128_encrypt_avx512,@function
+.align 32
+aesni_xts_128_encrypt_avx512:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbp
+ movq %rsp,%rbp
+ subq $136,%rsp
+ andq $0xffffffffffffffc0,%rsp
+ movq %rbx,128(%rsp)
+ movq $0x87,%r10
+ vmovdqu (%r9),%xmm1
+ vpxor (%r8),%xmm1,%xmm1
+ vaesenc 16(%r8),%xmm1,%xmm1
+ vaesenc 32(%r8),%xmm1,%xmm1
+ vaesenc 48(%r8),%xmm1,%xmm1
+ vaesenc 64(%r8),%xmm1,%xmm1
+ vaesenc 80(%r8),%xmm1,%xmm1
+ vaesenc 96(%r8),%xmm1,%xmm1
+ vaesenc 112(%r8),%xmm1,%xmm1
+ vaesenc 128(%r8),%xmm1,%xmm1
+ vaesenc 144(%r8),%xmm1,%xmm1
+ vaesenclast 160(%r8),%xmm1,%xmm1
+ vmovdqa %xmm1,(%rsp)
+
+ cmpq $0x80,%rdx
+ jl .L_less_than_128_bytes_hEgxyDlCngwrfFe
+ vpbroadcastq %r10,%zmm25
+ cmpq $0x100,%rdx
+ jge .L_start_by16_hEgxyDlCngwrfFe
+ cmpq $0x80,%rdx
+ jge .L_start_by8_hEgxyDlCngwrfFe
+
+.L_do_n_blocks_hEgxyDlCngwrfFe:
+ cmpq $0x0,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ cmpq $0x70,%rdx
+ jge .L_remaining_num_blocks_is_7_hEgxyDlCngwrfFe
+ cmpq $0x60,%rdx
+ jge .L_remaining_num_blocks_is_6_hEgxyDlCngwrfFe
+ cmpq $0x50,%rdx
+ jge .L_remaining_num_blocks_is_5_hEgxyDlCngwrfFe
+ cmpq $0x40,%rdx
+ jge .L_remaining_num_blocks_is_4_hEgxyDlCngwrfFe
+ cmpq $0x30,%rdx
+ jge .L_remaining_num_blocks_is_3_hEgxyDlCngwrfFe
+ cmpq $0x20,%rdx
+ jge .L_remaining_num_blocks_is_2_hEgxyDlCngwrfFe
+ cmpq $0x10,%rdx
+ jge .L_remaining_num_blocks_is_1_hEgxyDlCngwrfFe
+ vmovdqa %xmm0,%xmm8
+ vmovdqa %xmm9,%xmm0
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+
+.L_remaining_num_blocks_is_7_hEgxyDlCngwrfFe:
+ movq $0x0000ffffffffffff,%r8
+ kmovq %r8,%k1
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2{%k1}
+ addq $0x70,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ addq $0x70,%rsi
+ vextracti32x4 $0x2,%zmm2,%xmm8
+ vextracti32x4 $0x3,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+
+.L_remaining_num_blocks_is_6_hEgxyDlCngwrfFe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%ymm2
+ addq $0x60,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ addq $0x60,%rsi
+ vextracti32x4 $0x1,%zmm2,%xmm8
+ vextracti32x4 $0x2,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+
+.L_remaining_num_blocks_is_5_hEgxyDlCngwrfFe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu 64(%rdi),%xmm2
+ addq $0x50,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu %xmm2,64(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm2,%xmm8
+ vextracti32x4 $0x1,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+
+.L_remaining_num_blocks_is_4_hEgxyDlCngwrfFe:
+ vmovdqu8 (%rdi),%zmm1
+ addq $0x40,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,(%rsi)
+ addq $0x40,%rsi
+ vextracti32x4 $0x3,%zmm1,%xmm8
+ vmovdqa64 %xmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_remaining_num_blocks_is_3_hEgxyDlCngwrfFe:
+ movq $-1,%r8
+ shrq $0x10,%r8
+ kmovq %r8,%k1
+ vmovdqu8 (%rdi),%zmm1{%k1}
+ addq $0x30,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,(%rsi){%k1}
+ addq $0x30,%rsi
+ vextracti32x4 $0x2,%zmm1,%xmm8
+ vextracti32x4 $0x3,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_remaining_num_blocks_is_2_hEgxyDlCngwrfFe:
+ vmovdqu8 (%rdi),%ymm1
+ addq $0x20,%rdi
+ vbroadcasti32x4 (%rcx),%ymm0
+ vpternlogq $0x96,%ymm0,%ymm9,%ymm1
+ vbroadcasti32x4 16(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 32(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 48(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 64(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 80(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 96(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 112(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 128(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 144(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 160(%rcx),%ymm0
+ vaesenclast %ymm0,%ymm1,%ymm1
+ vpxorq %ymm9,%ymm1,%ymm1
+ vmovdqu %ymm1,(%rsi)
+ addq $0x20,%rsi
+ vextracti32x4 $0x1,%zmm1,%xmm8
+ vextracti32x4 $0x2,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_remaining_num_blocks_is_1_hEgxyDlCngwrfFe:
+ vmovdqu (%rdi),%xmm1
+ addq $0x10,%rdi
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor (%rcx),%xmm1,%xmm1
+ vaesenc 16(%rcx),%xmm1,%xmm1
+ vaesenc 32(%rcx),%xmm1,%xmm1
+ vaesenc 48(%rcx),%xmm1,%xmm1
+ vaesenc 64(%rcx),%xmm1,%xmm1
+ vaesenc 80(%rcx),%xmm1,%xmm1
+ vaesenc 96(%rcx),%xmm1,%xmm1
+ vaesenc 112(%rcx),%xmm1,%xmm1
+ vaesenc 128(%rcx),%xmm1,%xmm1
+ vaesenc 144(%rcx),%xmm1,%xmm1
+ vaesenclast 160(%rcx),%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu %xmm1,(%rsi)
+ addq $0x10,%rsi
+ vmovdqa %xmm1,%xmm8
+ vextracti32x4 $0x1,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+
+
+.L_start_by16_hEgxyDlCngwrfFe:
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm11
+ vpxord %zmm14,%zmm11,%zmm11
+ vpsrldq $0xf,%zmm10,%zmm15
+ vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16
+ vpslldq $0x1,%zmm10,%zmm12
+ vpxord %zmm16,%zmm12,%zmm12
+
+.L_main_loop_run_16_hEgxyDlCngwrfFe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ vmovdqu8 128(%rdi),%zmm3
+ vmovdqu8 192(%rdi),%zmm4
+ addq $0x100,%rdi
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vpxorq %zmm0,%zmm3,%zmm3
+ vpxorq %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm11,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm11,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm12,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm12,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm15,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm15,%zmm17
+ vpxord %zmm14,%zmm17,%zmm17
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm16,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm16,%zmm18
+ vpxord %zmm14,%zmm18,%zmm18
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vaesenclast %zmm0,%zmm3,%zmm3
+ vaesenclast %zmm0,%zmm4,%zmm4
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqa32 %zmm17,%zmm11
+ vmovdqa32 %zmm18,%zmm12
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ vmovdqu8 %zmm3,128(%rsi)
+ vmovdqu8 %zmm4,192(%rsi)
+ addq $0x100,%rsi
+ subq $0x100,%rdx
+ cmpq $0x100,%rdx
+ jae .L_main_loop_run_16_hEgxyDlCngwrfFe
+ cmpq $0x80,%rdx
+ jae .L_main_loop_run_8_hEgxyDlCngwrfFe
+ vextracti32x4 $0x3,%zmm4,%xmm0
+ jmp .L_do_n_blocks_hEgxyDlCngwrfFe
+
+.L_start_by8_hEgxyDlCngwrfFe:
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+
+.L_main_loop_run_8_hEgxyDlCngwrfFe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ addq $0x80,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vpsrldq $0xf,%zmm10,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm10,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ addq $0x80,%rsi
+ subq $0x80,%rdx
+ cmpq $0x80,%rdx
+ jae .L_main_loop_run_8_hEgxyDlCngwrfFe
+ vextracti32x4 $0x3,%zmm2,%xmm0
+ jmp .L_do_n_blocks_hEgxyDlCngwrfFe
+
+.L_steal_cipher_hEgxyDlCngwrfFe:
+ vmovdqa %xmm8,%xmm2
+ leaq vpshufb_shf_table(%rip),%rax
+ vmovdqu (%rax,%rdx,1),%xmm10
+ vpshufb %xmm10,%xmm8,%xmm8
+ vmovdqu -16(%rdi,%rdx,1),%xmm3
+ vmovdqu %xmm8,-16(%rsi,%rdx,1)
+ leaq vpshufb_shf_table(%rip),%rax
+ addq $16,%rax
+ subq %rdx,%rax
+ vmovdqu (%rax),%xmm10
+ vpxor mask1(%rip),%xmm10,%xmm10
+ vpshufb %xmm10,%xmm3,%xmm3
+ vpblendvb %xmm10,%xmm2,%xmm3,%xmm3
+ vpxor %xmm0,%xmm3,%xmm8
+ vpxor (%rcx),%xmm8,%xmm8
+ vaesenc 16(%rcx),%xmm8,%xmm8
+ vaesenc 32(%rcx),%xmm8,%xmm8
+ vaesenc 48(%rcx),%xmm8,%xmm8
+ vaesenc 64(%rcx),%xmm8,%xmm8
+ vaesenc 80(%rcx),%xmm8,%xmm8
+ vaesenc 96(%rcx),%xmm8,%xmm8
+ vaesenc 112(%rcx),%xmm8,%xmm8
+ vaesenc 128(%rcx),%xmm8,%xmm8
+ vaesenc 144(%rcx),%xmm8,%xmm8
+ vaesenclast 160(%rcx),%xmm8,%xmm8
+ vpxor %xmm0,%xmm8,%xmm8
+ vmovdqu %xmm8,-16(%rsi)
+.L_ret_hEgxyDlCngwrfFe:
+ movq 128(%rsp),%rbx
+ xorq %r8,%r8
+ movq %r8,128(%rsp)
+
+ vpxorq %zmm0,%zmm0,%zmm0
+ movq %rbp,%rsp
+ popq %rbp
+ vzeroupper
+ .byte 0xf3,0xc3
+
+.L_less_than_128_bytes_hEgxyDlCngwrfFe:
+ vpbroadcastq %r10,%zmm25
+ cmpq $0x10,%rdx
+ jb .L_ret_hEgxyDlCngwrfFe
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movl $0xaa,%r8d
+ kmovq %r8,%k2
+ movq %rdx,%r8
+ andq $0x70,%r8
+ cmpq $0x60,%r8
+ je .L_num_blocks_is_6_hEgxyDlCngwrfFe
+ cmpq $0x50,%r8
+ je .L_num_blocks_is_5_hEgxyDlCngwrfFe
+ cmpq $0x40,%r8
+ je .L_num_blocks_is_4_hEgxyDlCngwrfFe
+ cmpq $0x30,%r8
+ je .L_num_blocks_is_3_hEgxyDlCngwrfFe
+ cmpq $0x20,%r8
+ je .L_num_blocks_is_2_hEgxyDlCngwrfFe
+ cmpq $0x10,%r8
+ je .L_num_blocks_is_1_hEgxyDlCngwrfFe
+
+.L_num_blocks_is_7_hEgxyDlCngwrfFe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ movq $0x0000ffffffffffff,%r8
+ kmovq %r8,%k1
+ vmovdqu8 0(%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2{%k1}
+
+ addq $0x70,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,0(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ addq $0x70,%rsi
+ vextracti32x4 $0x2,%zmm2,%xmm8
+ vextracti32x4 $0x3,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_num_blocks_is_6_hEgxyDlCngwrfFe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vmovdqu8 0(%rdi),%zmm1
+ vmovdqu8 64(%rdi),%ymm2
+ addq $96,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,0(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ addq $96,%rsi
+
+ vextracti32x4 $0x1,%ymm2,%xmm8
+ vextracti32x4 $0x2,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_num_blocks_is_5_hEgxyDlCngwrfFe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vmovdqu8 0(%rdi),%zmm1
+ vmovdqu8 64(%rdi),%xmm2
+ addq $80,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,0(%rsi)
+ vmovdqu8 %xmm2,64(%rsi)
+ addq $80,%rsi
+
+ vmovdqa %xmm2,%xmm8
+ vextracti32x4 $0x1,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_num_blocks_is_4_hEgxyDlCngwrfFe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vmovdqu8 0(%rdi),%zmm1
+ addq $64,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,0(%rsi)
+ addq $64,%rsi
+ vextracti32x4 $0x3,%zmm1,%xmm8
+ vmovdqa %xmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_num_blocks_is_3_hEgxyDlCngwrfFe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ movq $0x0000ffffffffffff,%r8
+ kmovq %r8,%k1
+ vmovdqu8 0(%rdi),%zmm1{%k1}
+ addq $48,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,0(%rsi){%k1}
+ addq $48,%rsi
+ vextracti32x4 $2,%zmm1,%xmm8
+ vextracti32x4 $3,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_num_blocks_is_2_hEgxyDlCngwrfFe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+ vmovdqu8 0(%rdi),%ymm1
+ addq $32,%rdi
+ vbroadcasti32x4 (%rcx),%ymm0
+ vpternlogq $0x96,%ymm0,%ymm9,%ymm1
+ vbroadcasti32x4 16(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 32(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 48(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 64(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 80(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 96(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 112(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 128(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 144(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 160(%rcx),%ymm0
+ vaesenclast %ymm0,%ymm1,%ymm1
+ vpxorq %ymm9,%ymm1,%ymm1
+ vmovdqu8 %ymm1,0(%rsi)
+ addq $32,%rsi
+
+ vextracti32x4 $1,%ymm1,%xmm8
+ vextracti32x4 $2,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.L_num_blocks_is_1_hEgxyDlCngwrfFe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+ vmovdqu8 0(%rdi),%xmm1
+ addq $16,%rdi
+ vbroadcasti32x4 (%rcx),%ymm0
+ vpternlogq $0x96,%ymm0,%ymm9,%ymm1
+ vbroadcasti32x4 16(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 32(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 48(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 64(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 80(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 96(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 112(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 128(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 144(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 160(%rcx),%ymm0
+ vaesenclast %ymm0,%ymm1,%ymm1
+ vpxorq %ymm9,%ymm1,%ymm1
+ vmovdqu8 %xmm1,0(%rsi)
+ addq $16,%rsi
+
+ vmovdqa %xmm1,%xmm8
+ vextracti32x4 $1,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_hEgxyDlCngwrfFe
+ jmp .L_steal_cipher_hEgxyDlCngwrfFe
+.cfi_endproc
+.globl aesni_xts_128_decrypt_avx512
+.hidden aesni_xts_128_decrypt_avx512
+.type aesni_xts_128_decrypt_avx512,@function
+.align 32
+aesni_xts_128_decrypt_avx512:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbp
+ movq %rsp,%rbp
+ subq $136,%rsp
+ andq $0xffffffffffffffc0,%rsp
+ movq %rbx,128(%rsp)
+ movq $0x87,%r10
+ vmovdqu (%r9),%xmm1
+ vpxor (%r8),%xmm1,%xmm1
+ vaesenc 16(%r8),%xmm1,%xmm1
+ vaesenc 32(%r8),%xmm1,%xmm1
+ vaesenc 48(%r8),%xmm1,%xmm1
+ vaesenc 64(%r8),%xmm1,%xmm1
+ vaesenc 80(%r8),%xmm1,%xmm1
+ vaesenc 96(%r8),%xmm1,%xmm1
+ vaesenc 112(%r8),%xmm1,%xmm1
+ vaesenc 128(%r8),%xmm1,%xmm1
+ vaesenc 144(%r8),%xmm1,%xmm1
+ vaesenclast 160(%r8),%xmm1,%xmm1
+ vmovdqa %xmm1,(%rsp)
+
+ cmpq $0x80,%rdx
+ jb .L_less_than_128_bytes_amivrujEyduiFoi
+ vpbroadcastq %r10,%zmm25
+ cmpq $0x100,%rdx
+ jge .L_start_by16_amivrujEyduiFoi
+ jmp .L_start_by8_amivrujEyduiFoi
+
+.L_do_n_blocks_amivrujEyduiFoi:
+ cmpq $0x0,%rdx
+ je .L_ret_amivrujEyduiFoi
+ cmpq $0x70,%rdx
+ jge .L_remaining_num_blocks_is_7_amivrujEyduiFoi
+ cmpq $0x60,%rdx
+ jge .L_remaining_num_blocks_is_6_amivrujEyduiFoi
+ cmpq $0x50,%rdx
+ jge .L_remaining_num_blocks_is_5_amivrujEyduiFoi
+ cmpq $0x40,%rdx
+ jge .L_remaining_num_blocks_is_4_amivrujEyduiFoi
+ cmpq $0x30,%rdx
+ jge .L_remaining_num_blocks_is_3_amivrujEyduiFoi
+ cmpq $0x20,%rdx
+ jge .L_remaining_num_blocks_is_2_amivrujEyduiFoi
+ cmpq $0x10,%rdx
+ jge .L_remaining_num_blocks_is_1_amivrujEyduiFoi
+
+
+ vmovdqu %xmm5,%xmm1
+
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu %xmm1,-16(%rsi)
+ vmovdqa %xmm1,%xmm8
+
+
+ movq $0x1,%r8
+ kmovq %r8,%k1
+ vpsllq $0x3f,%xmm9,%xmm13
+ vpsraq $0x3f,%xmm13,%xmm14
+ vpandq %xmm25,%xmm14,%xmm5
+ vpxorq %xmm5,%xmm9,%xmm9{%k1}
+ vpsrldq $0x8,%xmm9,%xmm10
+.byte 98, 211, 181, 8, 115, 194, 1
+ vpslldq $0x8,%xmm13,%xmm13
+ vpxorq %xmm13,%xmm0,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_remaining_num_blocks_is_7_amivrujEyduiFoi:
+ movq $0xffffffffffffffff,%r8
+ shrq $0x10,%r8
+ kmovq %r8,%k1
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2{%k1}
+ addq $0x70,%rdi
+ andq $0xf,%rdx
+ je .L_done_7_remain_amivrujEyduiFoi
+ vextracti32x4 $0x2,%zmm10,%xmm12
+ vextracti32x4 $0x3,%zmm10,%xmm13
+ vinserti32x4 $0x2,%xmm13,%zmm10,%zmm10
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ addq $0x70,%rsi
+ vextracti32x4 $0x2,%zmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_7_remain_amivrujEyduiFoi:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ jmp .L_ret_amivrujEyduiFoi
+
+.L_remaining_num_blocks_is_6_amivrujEyduiFoi:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%ymm2
+ addq $0x60,%rdi
+ andq $0xf,%rdx
+ je .L_done_6_remain_amivrujEyduiFoi
+ vextracti32x4 $0x1,%zmm10,%xmm12
+ vextracti32x4 $0x2,%zmm10,%xmm13
+ vinserti32x4 $0x1,%xmm13,%zmm10,%zmm10
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ addq $0x60,%rsi
+ vextracti32x4 $0x1,%zmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_6_remain_amivrujEyduiFoi:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ jmp .L_ret_amivrujEyduiFoi
+
+.L_remaining_num_blocks_is_5_amivrujEyduiFoi:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu 64(%rdi),%xmm2
+ addq $0x50,%rdi
+ andq $0xf,%rdx
+ je .L_done_5_remain_amivrujEyduiFoi
+ vmovdqa %xmm10,%xmm12
+ vextracti32x4 $0x1,%zmm10,%xmm10
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu %xmm2,64(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_5_remain_amivrujEyduiFoi:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %xmm2,64(%rsi)
+ jmp .L_ret_amivrujEyduiFoi
+
+.L_remaining_num_blocks_is_4_amivrujEyduiFoi:
+ vmovdqu8 (%rdi),%zmm1
+ addq $0x40,%rdi
+ andq $0xf,%rdx
+ je .L_done_4_remain_amivrujEyduiFoi
+ vextracti32x4 $0x3,%zmm9,%xmm12
+ vinserti32x4 $0x3,%xmm10,%zmm9,%zmm9
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ addq $0x40,%rsi
+ vextracti32x4 $0x3,%zmm1,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_4_remain_amivrujEyduiFoi:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ jmp .L_ret_amivrujEyduiFoi
+
+.L_remaining_num_blocks_is_3_amivrujEyduiFoi:
+ vmovdqu (%rdi),%xmm1
+ vmovdqu 16(%rdi),%xmm2
+ vmovdqu 32(%rdi),%xmm3
+ addq $0x30,%rdi
+ andq $0xf,%rdx
+ je .L_done_3_remain_amivrujEyduiFoi
+ vextracti32x4 $0x2,%zmm9,%xmm13
+ vextracti32x4 $0x1,%zmm9,%xmm10
+ vextracti32x4 $0x3,%zmm9,%xmm11
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ addq $0x30,%rsi
+ vmovdqa %xmm3,%xmm8
+ vmovdqa %xmm13,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_3_remain_amivrujEyduiFoi:
+ vextracti32x4 $0x1,%zmm9,%xmm10
+ vextracti32x4 $0x2,%zmm9,%xmm11
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ jmp .L_ret_amivrujEyduiFoi
+
+.L_remaining_num_blocks_is_2_amivrujEyduiFoi:
+ vmovdqu (%rdi),%xmm1
+ vmovdqu 16(%rdi),%xmm2
+ addq $0x20,%rdi
+ andq $0xf,%rdx
+ je .L_done_2_remain_amivrujEyduiFoi
+ vextracti32x4 $0x2,%zmm9,%xmm10
+ vextracti32x4 $0x1,%zmm9,%xmm12
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ addq $0x20,%rsi
+ vmovdqa %xmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_2_remain_amivrujEyduiFoi:
+ vextracti32x4 $0x1,%zmm9,%xmm10
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ jmp .L_ret_amivrujEyduiFoi
+
+.L_remaining_num_blocks_is_1_amivrujEyduiFoi:
+ vmovdqu (%rdi),%xmm1
+ addq $0x10,%rdi
+ andq $0xf,%rdx
+ je .L_done_1_remain_amivrujEyduiFoi
+ vextracti32x4 $0x1,%zmm9,%xmm11
+ vpxor %xmm11,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm11,%xmm1,%xmm1
+ vmovdqu %xmm1,(%rsi)
+ addq $0x10,%rsi
+ vmovdqa %xmm1,%xmm8
+ vmovdqa %xmm9,%xmm0
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_1_remain_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu %xmm1,(%rsi)
+ jmp .L_ret_amivrujEyduiFoi
+
+.L_start_by16_amivrujEyduiFoi:
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+
+
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+
+
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm11
+ vpxord %zmm14,%zmm11,%zmm11
+
+ vpsrldq $0xf,%zmm10,%zmm15
+ vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16
+ vpslldq $0x1,%zmm10,%zmm12
+ vpxord %zmm16,%zmm12,%zmm12
+
+.L_main_loop_run_16_amivrujEyduiFoi:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ vmovdqu8 128(%rdi),%zmm3
+ vmovdqu8 192(%rdi),%zmm4
+ vmovdqu8 240(%rdi),%xmm5
+ addq $0x100,%rdi
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vpxorq %zmm0,%zmm3,%zmm3
+ vpxorq %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm11,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm11,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm12,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm12,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm15,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm15,%zmm17
+ vpxord %zmm14,%zmm17,%zmm17
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm16,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm16,%zmm18
+ vpxord %zmm14,%zmm18,%zmm18
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+ vaesdeclast %zmm0,%zmm3,%zmm3
+ vaesdeclast %zmm0,%zmm4,%zmm4
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqa32 %zmm17,%zmm11
+ vmovdqa32 %zmm18,%zmm12
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ vmovdqu8 %zmm3,128(%rsi)
+ vmovdqu8 %zmm4,192(%rsi)
+ addq $0x100,%rsi
+ subq $0x100,%rdx
+ cmpq $0x100,%rdx
+ jge .L_main_loop_run_16_amivrujEyduiFoi
+
+ cmpq $0x80,%rdx
+ jge .L_main_loop_run_8_amivrujEyduiFoi
+ jmp .L_do_n_blocks_amivrujEyduiFoi
+
+.L_start_by8_amivrujEyduiFoi:
+
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+
+
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+
+.L_main_loop_run_8_amivrujEyduiFoi:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ vmovdqu8 112(%rdi),%xmm5
+ addq $0x80,%rdi
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vpsrldq $0xf,%zmm10,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm10,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ addq $0x80,%rsi
+ subq $0x80,%rdx
+ cmpq $0x80,%rdx
+ jge .L_main_loop_run_8_amivrujEyduiFoi
+ jmp .L_do_n_blocks_amivrujEyduiFoi
+
+.L_steal_cipher_amivrujEyduiFoi:
+
+ vmovdqa %xmm8,%xmm2
+
+
+ leaq vpshufb_shf_table(%rip),%rax
+ vmovdqu (%rax,%rdx,1),%xmm10
+ vpshufb %xmm10,%xmm8,%xmm8
+
+
+ vmovdqu -16(%rdi,%rdx,1),%xmm3
+ vmovdqu %xmm8,-16(%rsi,%rdx,1)
+
+
+ leaq vpshufb_shf_table(%rip),%rax
+ addq $16,%rax
+ subq %rdx,%rax
+ vmovdqu (%rax),%xmm10
+ vpxor mask1(%rip),%xmm10,%xmm10
+ vpshufb %xmm10,%xmm3,%xmm3
+
+ vpblendvb %xmm10,%xmm2,%xmm3,%xmm3
+
+
+ vpxor %xmm0,%xmm3,%xmm8
+
+
+ vpxor (%rcx),%xmm8,%xmm8
+ vaesdec 16(%rcx),%xmm8,%xmm8
+ vaesdec 32(%rcx),%xmm8,%xmm8
+ vaesdec 48(%rcx),%xmm8,%xmm8
+ vaesdec 64(%rcx),%xmm8,%xmm8
+ vaesdec 80(%rcx),%xmm8,%xmm8
+ vaesdec 96(%rcx),%xmm8,%xmm8
+ vaesdec 112(%rcx),%xmm8,%xmm8
+ vaesdec 128(%rcx),%xmm8,%xmm8
+ vaesdec 144(%rcx),%xmm8,%xmm8
+ vaesdeclast 160(%rcx),%xmm8,%xmm8
+
+ vpxor %xmm0,%xmm8,%xmm8
+
+.L_done_amivrujEyduiFoi:
+
+ vmovdqu %xmm8,-16(%rsi)
+.L_ret_amivrujEyduiFoi:
+ movq 128(%rsp),%rbx
+ xorq %r8,%r8
+ movq %r8,128(%rsp)
+
+ vpxorq %zmm0,%zmm0,%zmm0
+ movq %rbp,%rsp
+ popq %rbp
+ vzeroupper
+ .byte 0xf3,0xc3
+
+.L_less_than_128_bytes_amivrujEyduiFoi:
+ cmpq $0x10,%rdx
+ jb .L_ret_amivrujEyduiFoi
+
+ movq %rdx,%r8
+ andq $0x70,%r8
+ cmpq $0x60,%r8
+ je .L_num_blocks_is_6_amivrujEyduiFoi
+ cmpq $0x50,%r8
+ je .L_num_blocks_is_5_amivrujEyduiFoi
+ cmpq $0x40,%r8
+ je .L_num_blocks_is_4_amivrujEyduiFoi
+ cmpq $0x30,%r8
+ je .L_num_blocks_is_3_amivrujEyduiFoi
+ cmpq $0x20,%r8
+ je .L_num_blocks_is_2_amivrujEyduiFoi
+ cmpq $0x10,%r8
+ je .L_num_blocks_is_1_amivrujEyduiFoi
+
+.L_num_blocks_is_7_amivrujEyduiFoi:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,64(%rsp)
+ movq %rbx,64 + 8(%rsp)
+ vmovdqa 64(%rsp),%xmm13
+ vmovdqu 64(%rdi),%xmm5
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,80(%rsp)
+ movq %rbx,80 + 8(%rsp)
+ vmovdqa 80(%rsp),%xmm14
+ vmovdqu 80(%rdi),%xmm6
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,96(%rsp)
+ movq %rbx,96 + 8(%rsp)
+ vmovdqa 96(%rsp),%xmm15
+ vmovdqu 96(%rdi),%xmm7
+ addq $0x70,%rdi
+ andq $0xf,%rdx
+ je .L_done_7_amivrujEyduiFoi
+
+.L_steal_cipher_7_amivrujEyduiFoi:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm15,%xmm16
+ vmovdqa 16(%rsp),%xmm15
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vpxor %xmm0,%xmm7,%xmm7
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vaesdeclast %xmm0,%xmm7,%xmm7
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ vmovdqu %xmm6,80(%rsi)
+ addq $0x70,%rsi
+ vmovdqa64 %xmm16,%xmm0
+ vmovdqa %xmm7,%xmm8
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_7_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vpxor %xmm0,%xmm7,%xmm7
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vaesdeclast %xmm0,%xmm7,%xmm7
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ vmovdqu %xmm6,80(%rsi)
+ addq $0x70,%rsi
+ vmovdqa %xmm7,%xmm8
+ jmp .L_done_amivrujEyduiFoi
+
+.L_num_blocks_is_6_amivrujEyduiFoi:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,64(%rsp)
+ movq %rbx,64 + 8(%rsp)
+ vmovdqa 64(%rsp),%xmm13
+ vmovdqu 64(%rdi),%xmm5
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,80(%rsp)
+ movq %rbx,80 + 8(%rsp)
+ vmovdqa 80(%rsp),%xmm14
+ vmovdqu 80(%rdi),%xmm6
+ addq $0x60,%rdi
+ andq $0xf,%rdx
+ je .L_done_6_amivrujEyduiFoi
+
+.L_steal_cipher_6_amivrujEyduiFoi:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm14,%xmm15
+ vmovdqa 16(%rsp),%xmm14
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ addq $0x60,%rsi
+ vmovdqa %xmm15,%xmm0
+ vmovdqa %xmm6,%xmm8
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_6_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ addq $0x60,%rsi
+ vmovdqa %xmm6,%xmm8
+ jmp .L_done_amivrujEyduiFoi
+
+.L_num_blocks_is_5_amivrujEyduiFoi:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,64(%rsp)
+ movq %rbx,64 + 8(%rsp)
+ vmovdqa 64(%rsp),%xmm13
+ vmovdqu 64(%rdi),%xmm5
+ addq $0x50,%rdi
+ andq $0xf,%rdx
+ je .L_done_5_amivrujEyduiFoi
+
+.L_steal_cipher_5_amivrujEyduiFoi:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm13,%xmm14
+ vmovdqa 16(%rsp),%xmm13
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm14,%xmm0
+ vmovdqa %xmm5,%xmm8
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_5_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm5,%xmm8
+ jmp .L_done_amivrujEyduiFoi
+
+.L_num_blocks_is_4_amivrujEyduiFoi:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ addq $0x40,%rdi
+ andq $0xf,%rdx
+ je .L_done_4_amivrujEyduiFoi
+
+.L_steal_cipher_4_amivrujEyduiFoi:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm12,%xmm13
+ vmovdqa 16(%rsp),%xmm12
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ addq $0x40,%rsi
+ vmovdqa %xmm13,%xmm0
+ vmovdqa %xmm4,%xmm8
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_4_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ addq $0x40,%rsi
+ vmovdqa %xmm4,%xmm8
+ jmp .L_done_amivrujEyduiFoi
+
+.L_num_blocks_is_3_amivrujEyduiFoi:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ addq $0x30,%rdi
+ andq $0xf,%rdx
+ je .L_done_3_amivrujEyduiFoi
+
+.L_steal_cipher_3_amivrujEyduiFoi:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm11,%xmm12
+ vmovdqa 16(%rsp),%xmm11
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ addq $0x30,%rsi
+ vmovdqa %xmm12,%xmm0
+ vmovdqa %xmm3,%xmm8
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_3_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ addq $0x30,%rsi
+ vmovdqa %xmm3,%xmm8
+ jmp .L_done_amivrujEyduiFoi
+
+.L_num_blocks_is_2_amivrujEyduiFoi:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ addq $0x20,%rdi
+ andq $0xf,%rdx
+ je .L_done_2_amivrujEyduiFoi
+
+.L_steal_cipher_2_amivrujEyduiFoi:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm10,%xmm11
+ vmovdqa 16(%rsp),%xmm10
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ addq $0x20,%rsi
+ vmovdqa %xmm11,%xmm0
+ vmovdqa %xmm2,%xmm8
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_2_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ addq $0x20,%rsi
+ vmovdqa %xmm2,%xmm8
+ jmp .L_done_amivrujEyduiFoi
+
+.L_num_blocks_is_1_amivrujEyduiFoi:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ addq $0x10,%rdi
+ andq $0xf,%rdx
+ je .L_done_1_amivrujEyduiFoi
+
+.L_steal_cipher_1_amivrujEyduiFoi:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm9,%xmm10
+ vmovdqa 16(%rsp),%xmm9
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ addq $0x10,%rsi
+ vmovdqa %xmm10,%xmm0
+ vmovdqa %xmm1,%xmm8
+ jmp .L_steal_cipher_amivrujEyduiFoi
+
+.L_done_1_amivrujEyduiFoi:
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ addq $0x10,%rsi
+ vmovdqa %xmm1,%xmm8
+ jmp .L_done_amivrujEyduiFoi
+.cfi_endproc
+.globl aesni_xts_256_encrypt_avx512
+.hidden aesni_xts_256_encrypt_avx512
+.type aesni_xts_256_encrypt_avx512,@function
+.align 32
+aesni_xts_256_encrypt_avx512:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbp
+ movq %rsp,%rbp
+ subq $136,%rsp
+ andq $0xffffffffffffffc0,%rsp
+ movq %rbx,128(%rsp)
+ movq $0x87,%r10
+ vmovdqu (%r9),%xmm1
+ vpxor (%r8),%xmm1,%xmm1
+ vaesenc 16(%r8),%xmm1,%xmm1
+ vaesenc 32(%r8),%xmm1,%xmm1
+ vaesenc 48(%r8),%xmm1,%xmm1
+ vaesenc 64(%r8),%xmm1,%xmm1
+ vaesenc 80(%r8),%xmm1,%xmm1
+ vaesenc 96(%r8),%xmm1,%xmm1
+ vaesenc 112(%r8),%xmm1,%xmm1
+ vaesenc 128(%r8),%xmm1,%xmm1
+ vaesenc 144(%r8),%xmm1,%xmm1
+ vaesenc 160(%r8),%xmm1,%xmm1
+ vaesenc 176(%r8),%xmm1,%xmm1
+ vaesenc 192(%r8),%xmm1,%xmm1
+ vaesenc 208(%r8),%xmm1,%xmm1
+ vaesenclast 224(%r8),%xmm1,%xmm1
+ vmovdqa %xmm1,(%rsp)
+
+ cmpq $0x80,%rdx
+ jl .L_less_than_128_bytes_wcpqaDvsGlbjGoe
+ vpbroadcastq %r10,%zmm25
+ cmpq $0x100,%rdx
+ jge .L_start_by16_wcpqaDvsGlbjGoe
+ cmpq $0x80,%rdx
+ jge .L_start_by8_wcpqaDvsGlbjGoe
+
+.L_do_n_blocks_wcpqaDvsGlbjGoe:
+ cmpq $0x0,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ cmpq $0x70,%rdx
+ jge .L_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe
+ cmpq $0x60,%rdx
+ jge .L_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe
+ cmpq $0x50,%rdx
+ jge .L_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe
+ cmpq $0x40,%rdx
+ jge .L_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe
+ cmpq $0x30,%rdx
+ jge .L_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe
+ cmpq $0x20,%rdx
+ jge .L_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe
+ cmpq $0x10,%rdx
+ jge .L_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe
+ vmovdqa %xmm0,%xmm8
+ vmovdqa %xmm9,%xmm0
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+
+.L_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe:
+ movq $0x0000ffffffffffff,%r8
+ kmovq %r8,%k1
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2{%k1}
+ addq $0x70,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ addq $0x70,%rsi
+ vextracti32x4 $0x2,%zmm2,%xmm8
+ vextracti32x4 $0x3,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+
+.L_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%ymm2
+ addq $0x60,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ addq $0x60,%rsi
+ vextracti32x4 $0x1,%zmm2,%xmm8
+ vextracti32x4 $0x2,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+
+.L_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu 64(%rdi),%xmm2
+ addq $0x50,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu %xmm2,64(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm2,%xmm8
+ vextracti32x4 $0x1,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+
+.L_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe:
+ vmovdqu8 (%rdi),%zmm1
+ addq $0x40,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,(%rsi)
+ addq $0x40,%rsi
+ vextracti32x4 $0x3,%zmm1,%xmm8
+ vmovdqa64 %xmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe:
+ movq $-1,%r8
+ shrq $0x10,%r8
+ kmovq %r8,%k1
+ vmovdqu8 (%rdi),%zmm1{%k1}
+ addq $0x30,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,(%rsi){%k1}
+ addq $0x30,%rsi
+ vextracti32x4 $0x2,%zmm1,%xmm8
+ vextracti32x4 $0x3,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe:
+ vmovdqu8 (%rdi),%ymm1
+ addq $0x20,%rdi
+ vbroadcasti32x4 (%rcx),%ymm0
+ vpternlogq $0x96,%ymm0,%ymm9,%ymm1
+ vbroadcasti32x4 16(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 32(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 48(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 64(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 80(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 96(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 112(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 128(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 144(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 160(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 176(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 192(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 208(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 224(%rcx),%ymm0
+ vaesenclast %ymm0,%ymm1,%ymm1
+ vpxorq %ymm9,%ymm1,%ymm1
+ vmovdqu %ymm1,(%rsi)
+ addq $0x20,%rsi
+ vextracti32x4 $0x1,%zmm1,%xmm8
+ vextracti32x4 $0x2,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe:
+ vmovdqu (%rdi),%xmm1
+ addq $0x10,%rdi
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor (%rcx),%xmm1,%xmm1
+ vaesenc 16(%rcx),%xmm1,%xmm1
+ vaesenc 32(%rcx),%xmm1,%xmm1
+ vaesenc 48(%rcx),%xmm1,%xmm1
+ vaesenc 64(%rcx),%xmm1,%xmm1
+ vaesenc 80(%rcx),%xmm1,%xmm1
+ vaesenc 96(%rcx),%xmm1,%xmm1
+ vaesenc 112(%rcx),%xmm1,%xmm1
+ vaesenc 128(%rcx),%xmm1,%xmm1
+ vaesenc 144(%rcx),%xmm1,%xmm1
+ vaesenc 160(%rcx),%xmm1,%xmm1
+ vaesenc 176(%rcx),%xmm1,%xmm1
+ vaesenc 192(%rcx),%xmm1,%xmm1
+ vaesenc 208(%rcx),%xmm1,%xmm1
+ vaesenclast 224(%rcx),%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu %xmm1,(%rsi)
+ addq $0x10,%rsi
+ vmovdqa %xmm1,%xmm8
+ vextracti32x4 $0x1,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+
+
+.L_start_by16_wcpqaDvsGlbjGoe:
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm11
+ vpxord %zmm14,%zmm11,%zmm11
+ vpsrldq $0xf,%zmm10,%zmm15
+ vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16
+ vpslldq $0x1,%zmm10,%zmm12
+ vpxord %zmm16,%zmm12,%zmm12
+
+.L_main_loop_run_16_wcpqaDvsGlbjGoe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ vmovdqu8 128(%rdi),%zmm3
+ vmovdqu8 192(%rdi),%zmm4
+ addq $0x100,%rdi
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vpxorq %zmm0,%zmm3,%zmm3
+ vpxorq %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm11,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm11,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm12,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm12,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm15,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm15,%zmm17
+ vpxord %zmm14,%zmm17,%zmm17
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm16,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm16,%zmm18
+ vpxord %zmm14,%zmm18,%zmm18
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vaesenc %zmm0,%zmm3,%zmm3
+ vaesenc %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vaesenclast %zmm0,%zmm3,%zmm3
+ vaesenclast %zmm0,%zmm4,%zmm4
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqa32 %zmm17,%zmm11
+ vmovdqa32 %zmm18,%zmm12
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ vmovdqu8 %zmm3,128(%rsi)
+ vmovdqu8 %zmm4,192(%rsi)
+ addq $0x100,%rsi
+ subq $0x100,%rdx
+ cmpq $0x100,%rdx
+ jae .L_main_loop_run_16_wcpqaDvsGlbjGoe
+ cmpq $0x80,%rdx
+ jae .L_main_loop_run_8_wcpqaDvsGlbjGoe
+ vextracti32x4 $0x3,%zmm4,%xmm0
+ jmp .L_do_n_blocks_wcpqaDvsGlbjGoe
+
+.L_start_by8_wcpqaDvsGlbjGoe:
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+
+.L_main_loop_run_8_wcpqaDvsGlbjGoe:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ addq $0x80,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+ vpsrldq $0xf,%zmm10,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm10,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ addq $0x80,%rsi
+ subq $0x80,%rdx
+ cmpq $0x80,%rdx
+ jae .L_main_loop_run_8_wcpqaDvsGlbjGoe
+ vextracti32x4 $0x3,%zmm2,%xmm0
+ jmp .L_do_n_blocks_wcpqaDvsGlbjGoe
+
+.L_steal_cipher_wcpqaDvsGlbjGoe:
+ vmovdqa %xmm8,%xmm2
+ leaq vpshufb_shf_table(%rip),%rax
+ vmovdqu (%rax,%rdx,1),%xmm10
+ vpshufb %xmm10,%xmm8,%xmm8
+ vmovdqu -16(%rdi,%rdx,1),%xmm3
+ vmovdqu %xmm8,-16(%rsi,%rdx,1)
+ leaq vpshufb_shf_table(%rip),%rax
+ addq $16,%rax
+ subq %rdx,%rax
+ vmovdqu (%rax),%xmm10
+ vpxor mask1(%rip),%xmm10,%xmm10
+ vpshufb %xmm10,%xmm3,%xmm3
+ vpblendvb %xmm10,%xmm2,%xmm3,%xmm3
+ vpxor %xmm0,%xmm3,%xmm8
+ vpxor (%rcx),%xmm8,%xmm8
+ vaesenc 16(%rcx),%xmm8,%xmm8
+ vaesenc 32(%rcx),%xmm8,%xmm8
+ vaesenc 48(%rcx),%xmm8,%xmm8
+ vaesenc 64(%rcx),%xmm8,%xmm8
+ vaesenc 80(%rcx),%xmm8,%xmm8
+ vaesenc 96(%rcx),%xmm8,%xmm8
+ vaesenc 112(%rcx),%xmm8,%xmm8
+ vaesenc 128(%rcx),%xmm8,%xmm8
+ vaesenc 144(%rcx),%xmm8,%xmm8
+ vaesenc 160(%rcx),%xmm8,%xmm8
+ vaesenc 176(%rcx),%xmm8,%xmm8
+ vaesenc 192(%rcx),%xmm8,%xmm8
+ vaesenc 208(%rcx),%xmm8,%xmm8
+ vaesenclast 224(%rcx),%xmm8,%xmm8
+ vpxor %xmm0,%xmm8,%xmm8
+ vmovdqu %xmm8,-16(%rsi)
+.L_ret_wcpqaDvsGlbjGoe:
+ movq 128(%rsp),%rbx
+ xorq %r8,%r8
+ movq %r8,128(%rsp)
+
+ vpxorq %zmm0,%zmm0,%zmm0
+ movq %rbp,%rsp
+ popq %rbp
+ vzeroupper
+ .byte 0xf3,0xc3
+
+.L_less_than_128_bytes_wcpqaDvsGlbjGoe:
+ vpbroadcastq %r10,%zmm25
+ cmpq $0x10,%rdx
+ jb .L_ret_wcpqaDvsGlbjGoe
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movl $0xaa,%r8d
+ kmovq %r8,%k2
+ movq %rdx,%r8
+ andq $0x70,%r8
+ cmpq $0x60,%r8
+ je .L_num_blocks_is_6_wcpqaDvsGlbjGoe
+ cmpq $0x50,%r8
+ je .L_num_blocks_is_5_wcpqaDvsGlbjGoe
+ cmpq $0x40,%r8
+ je .L_num_blocks_is_4_wcpqaDvsGlbjGoe
+ cmpq $0x30,%r8
+ je .L_num_blocks_is_3_wcpqaDvsGlbjGoe
+ cmpq $0x20,%r8
+ je .L_num_blocks_is_2_wcpqaDvsGlbjGoe
+ cmpq $0x10,%r8
+ je .L_num_blocks_is_1_wcpqaDvsGlbjGoe
+
+.L_num_blocks_is_7_wcpqaDvsGlbjGoe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ movq $0x0000ffffffffffff,%r8
+ kmovq %r8,%k1
+ vmovdqu8 0(%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2{%k1}
+
+ addq $0x70,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,0(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ addq $0x70,%rsi
+ vextracti32x4 $0x2,%zmm2,%xmm8
+ vextracti32x4 $0x3,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_num_blocks_is_6_wcpqaDvsGlbjGoe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vmovdqu8 0(%rdi),%zmm1
+ vmovdqu8 64(%rdi),%ymm2
+ addq $96,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,0(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ addq $96,%rsi
+
+ vextracti32x4 $0x1,%ymm2,%xmm8
+ vextracti32x4 $0x2,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_num_blocks_is_5_wcpqaDvsGlbjGoe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vmovdqu8 0(%rdi),%zmm1
+ vmovdqu8 64(%rdi),%xmm2
+ addq $80,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vpternlogq $0x96,%zmm0,%zmm10,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vaesenc %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vaesenclast %zmm0,%zmm2,%zmm2
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vmovdqu8 %zmm1,0(%rsi)
+ vmovdqu8 %xmm2,64(%rsi)
+ addq $80,%rsi
+
+ vmovdqa %xmm2,%xmm8
+ vextracti32x4 $0x1,%zmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_num_blocks_is_4_wcpqaDvsGlbjGoe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+ vmovdqu8 0(%rdi),%zmm1
+ addq $64,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,0(%rsi)
+ addq $64,%rsi
+ vextracti32x4 $0x3,%zmm1,%xmm8
+ vmovdqa %xmm10,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_num_blocks_is_3_wcpqaDvsGlbjGoe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+ movq $0x0000ffffffffffff,%r8
+ kmovq %r8,%k1
+ vmovdqu8 0(%rdi),%zmm1{%k1}
+ addq $48,%rdi
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpternlogq $0x96,%zmm0,%zmm9,%zmm1
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesenc %zmm0,%zmm1,%zmm1
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesenclast %zmm0,%zmm1,%zmm1
+ vpxorq %zmm9,%zmm1,%zmm1
+ vmovdqu8 %zmm1,0(%rsi){%k1}
+ addq $48,%rsi
+ vextracti32x4 $2,%zmm1,%xmm8
+ vextracti32x4 $3,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_num_blocks_is_2_wcpqaDvsGlbjGoe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+ vmovdqu8 0(%rdi),%ymm1
+ addq $32,%rdi
+ vbroadcasti32x4 (%rcx),%ymm0
+ vpternlogq $0x96,%ymm0,%ymm9,%ymm1
+ vbroadcasti32x4 16(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 32(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 48(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 64(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 80(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 96(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 112(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 128(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 144(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 160(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 176(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 192(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 208(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 224(%rcx),%ymm0
+ vaesenclast %ymm0,%ymm1,%ymm1
+ vpxorq %ymm9,%ymm1,%ymm1
+ vmovdqu8 %ymm1,0(%rsi)
+ addq $32,%rsi
+
+ vextracti32x4 $1,%ymm1,%xmm8
+ vextracti32x4 $2,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.L_num_blocks_is_1_wcpqaDvsGlbjGoe:
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+ vmovdqu8 0(%rdi),%xmm1
+ addq $16,%rdi
+ vbroadcasti32x4 (%rcx),%ymm0
+ vpternlogq $0x96,%ymm0,%ymm9,%ymm1
+ vbroadcasti32x4 16(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 32(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 48(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 64(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 80(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 96(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 112(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 128(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 144(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 160(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 176(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 192(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 208(%rcx),%ymm0
+ vaesenc %ymm0,%ymm1,%ymm1
+ vbroadcasti32x4 224(%rcx),%ymm0
+ vaesenclast %ymm0,%ymm1,%ymm1
+ vpxorq %ymm9,%ymm1,%ymm1
+ vmovdqu8 %xmm1,0(%rsi)
+ addq $16,%rsi
+
+ vmovdqa %xmm1,%xmm8
+ vextracti32x4 $1,%zmm9,%xmm0
+ andq $0xf,%rdx
+ je .L_ret_wcpqaDvsGlbjGoe
+ jmp .L_steal_cipher_wcpqaDvsGlbjGoe
+.cfi_endproc
+.globl aesni_xts_256_decrypt_avx512
+.hidden aesni_xts_256_decrypt_avx512
+.type aesni_xts_256_decrypt_avx512,@function
+.align 32
+aesni_xts_256_decrypt_avx512:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbp
+ movq %rsp,%rbp
+ subq $136,%rsp
+ andq $0xffffffffffffffc0,%rsp
+ movq %rbx,128(%rsp)
+ movq $0x87,%r10
+ vmovdqu (%r9),%xmm1
+ vpxor (%r8),%xmm1,%xmm1
+ vaesenc 16(%r8),%xmm1,%xmm1
+ vaesenc 32(%r8),%xmm1,%xmm1
+ vaesenc 48(%r8),%xmm1,%xmm1
+ vaesenc 64(%r8),%xmm1,%xmm1
+ vaesenc 80(%r8),%xmm1,%xmm1
+ vaesenc 96(%r8),%xmm1,%xmm1
+ vaesenc 112(%r8),%xmm1,%xmm1
+ vaesenc 128(%r8),%xmm1,%xmm1
+ vaesenc 144(%r8),%xmm1,%xmm1
+ vaesenc 160(%r8),%xmm1,%xmm1
+ vaesenc 176(%r8),%xmm1,%xmm1
+ vaesenc 192(%r8),%xmm1,%xmm1
+ vaesenc 208(%r8),%xmm1,%xmm1
+ vaesenclast 224(%r8),%xmm1,%xmm1
+ vmovdqa %xmm1,(%rsp)
+
+ cmpq $0x80,%rdx
+ jb .L_less_than_128_bytes_EmbgEptodyewbFa
+ vpbroadcastq %r10,%zmm25
+ cmpq $0x100,%rdx
+ jge .L_start_by16_EmbgEptodyewbFa
+ jmp .L_start_by8_EmbgEptodyewbFa
+
+.L_do_n_blocks_EmbgEptodyewbFa:
+ cmpq $0x0,%rdx
+ je .L_ret_EmbgEptodyewbFa
+ cmpq $0x70,%rdx
+ jge .L_remaining_num_blocks_is_7_EmbgEptodyewbFa
+ cmpq $0x60,%rdx
+ jge .L_remaining_num_blocks_is_6_EmbgEptodyewbFa
+ cmpq $0x50,%rdx
+ jge .L_remaining_num_blocks_is_5_EmbgEptodyewbFa
+ cmpq $0x40,%rdx
+ jge .L_remaining_num_blocks_is_4_EmbgEptodyewbFa
+ cmpq $0x30,%rdx
+ jge .L_remaining_num_blocks_is_3_EmbgEptodyewbFa
+ cmpq $0x20,%rdx
+ jge .L_remaining_num_blocks_is_2_EmbgEptodyewbFa
+ cmpq $0x10,%rdx
+ jge .L_remaining_num_blocks_is_1_EmbgEptodyewbFa
+
+
+ vmovdqu %xmm5,%xmm1
+
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu %xmm1,-16(%rsi)
+ vmovdqa %xmm1,%xmm8
+
+
+ movq $0x1,%r8
+ kmovq %r8,%k1
+ vpsllq $0x3f,%xmm9,%xmm13
+ vpsraq $0x3f,%xmm13,%xmm14
+ vpandq %xmm25,%xmm14,%xmm5
+ vpxorq %xmm5,%xmm9,%xmm9{%k1}
+ vpsrldq $0x8,%xmm9,%xmm10
+.byte 98, 211, 181, 8, 115, 194, 1
+ vpslldq $0x8,%xmm13,%xmm13
+ vpxorq %xmm13,%xmm0,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_remaining_num_blocks_is_7_EmbgEptodyewbFa:
+ movq $0xffffffffffffffff,%r8
+ shrq $0x10,%r8
+ kmovq %r8,%k1
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2{%k1}
+ addq $0x70,%rdi
+ andq $0xf,%rdx
+ je .L_done_7_remain_EmbgEptodyewbFa
+ vextracti32x4 $0x2,%zmm10,%xmm12
+ vextracti32x4 $0x3,%zmm10,%xmm13
+ vinserti32x4 $0x2,%xmm13,%zmm10,%zmm10
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ addq $0x70,%rsi
+ vextracti32x4 $0x2,%zmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_7_remain_EmbgEptodyewbFa:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi){%k1}
+ jmp .L_ret_EmbgEptodyewbFa
+
+.L_remaining_num_blocks_is_6_EmbgEptodyewbFa:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%ymm2
+ addq $0x60,%rdi
+ andq $0xf,%rdx
+ je .L_done_6_remain_EmbgEptodyewbFa
+ vextracti32x4 $0x1,%zmm10,%xmm12
+ vextracti32x4 $0x2,%zmm10,%xmm13
+ vinserti32x4 $0x1,%xmm13,%zmm10,%zmm10
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ addq $0x60,%rsi
+ vextracti32x4 $0x1,%zmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_6_remain_EmbgEptodyewbFa:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %ymm2,64(%rsi)
+ jmp .L_ret_EmbgEptodyewbFa
+
+.L_remaining_num_blocks_is_5_EmbgEptodyewbFa:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu 64(%rdi),%xmm2
+ addq $0x50,%rdi
+ andq $0xf,%rdx
+ je .L_done_5_remain_EmbgEptodyewbFa
+ vmovdqa %xmm10,%xmm12
+ vextracti32x4 $0x1,%zmm10,%xmm10
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu %xmm2,64(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_5_remain_EmbgEptodyewbFa:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %xmm2,64(%rsi)
+ jmp .L_ret_EmbgEptodyewbFa
+
+.L_remaining_num_blocks_is_4_EmbgEptodyewbFa:
+ vmovdqu8 (%rdi),%zmm1
+ addq $0x40,%rdi
+ andq $0xf,%rdx
+ je .L_done_4_remain_EmbgEptodyewbFa
+ vextracti32x4 $0x3,%zmm9,%xmm12
+ vinserti32x4 $0x3,%xmm10,%zmm9,%zmm9
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ addq $0x40,%rsi
+ vextracti32x4 $0x3,%zmm1,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_4_remain_EmbgEptodyewbFa:
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ jmp .L_ret_EmbgEptodyewbFa
+
+.L_remaining_num_blocks_is_3_EmbgEptodyewbFa:
+ vmovdqu (%rdi),%xmm1
+ vmovdqu 16(%rdi),%xmm2
+ vmovdqu 32(%rdi),%xmm3
+ addq $0x30,%rdi
+ andq $0xf,%rdx
+ je .L_done_3_remain_EmbgEptodyewbFa
+ vextracti32x4 $0x2,%zmm9,%xmm13
+ vextracti32x4 $0x1,%zmm9,%xmm10
+ vextracti32x4 $0x3,%zmm9,%xmm11
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ addq $0x30,%rsi
+ vmovdqa %xmm3,%xmm8
+ vmovdqa %xmm13,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_3_remain_EmbgEptodyewbFa:
+ vextracti32x4 $0x1,%zmm9,%xmm10
+ vextracti32x4 $0x2,%zmm9,%xmm11
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ jmp .L_ret_EmbgEptodyewbFa
+
+.L_remaining_num_blocks_is_2_EmbgEptodyewbFa:
+ vmovdqu (%rdi),%xmm1
+ vmovdqu 16(%rdi),%xmm2
+ addq $0x20,%rdi
+ andq $0xf,%rdx
+ je .L_done_2_remain_EmbgEptodyewbFa
+ vextracti32x4 $0x2,%zmm9,%xmm10
+ vextracti32x4 $0x1,%zmm9,%xmm12
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ addq $0x20,%rsi
+ vmovdqa %xmm2,%xmm8
+ vmovdqa %xmm12,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_2_remain_EmbgEptodyewbFa:
+ vextracti32x4 $0x1,%zmm9,%xmm10
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ jmp .L_ret_EmbgEptodyewbFa
+
+.L_remaining_num_blocks_is_1_EmbgEptodyewbFa:
+ vmovdqu (%rdi),%xmm1
+ addq $0x10,%rdi
+ andq $0xf,%rdx
+ je .L_done_1_remain_EmbgEptodyewbFa
+ vextracti32x4 $0x1,%zmm9,%xmm11
+ vpxor %xmm11,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm11,%xmm1,%xmm1
+ vmovdqu %xmm1,(%rsi)
+ addq $0x10,%rsi
+ vmovdqa %xmm1,%xmm8
+ vmovdqa %xmm9,%xmm0
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_1_remain_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu %xmm1,(%rsi)
+ jmp .L_ret_EmbgEptodyewbFa
+
+.L_start_by16_EmbgEptodyewbFa:
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+
+
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+
+
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm11
+ vpxord %zmm14,%zmm11,%zmm11
+
+ vpsrldq $0xf,%zmm10,%zmm15
+ vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16
+ vpslldq $0x1,%zmm10,%zmm12
+ vpxord %zmm16,%zmm12,%zmm12
+
+.L_main_loop_run_16_EmbgEptodyewbFa:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ vmovdqu8 128(%rdi),%zmm3
+ vmovdqu8 192(%rdi),%zmm4
+ vmovdqu8 240(%rdi),%xmm5
+ addq $0x100,%rdi
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vpxorq %zmm0,%zmm3,%zmm3
+ vpxorq %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm11,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm11,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm12,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm12,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm15,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm15,%zmm17
+ vpxord %zmm14,%zmm17,%zmm17
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vpsrldq $0xf,%zmm16,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm16,%zmm18
+ vpxord %zmm14,%zmm18,%zmm18
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vaesdec %zmm0,%zmm3,%zmm3
+ vaesdec %zmm0,%zmm4,%zmm4
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+ vaesdeclast %zmm0,%zmm3,%zmm3
+ vaesdeclast %zmm0,%zmm4,%zmm4
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+ vpxorq %zmm11,%zmm3,%zmm3
+ vpxorq %zmm12,%zmm4,%zmm4
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqa32 %zmm17,%zmm11
+ vmovdqa32 %zmm18,%zmm12
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ vmovdqu8 %zmm3,128(%rsi)
+ vmovdqu8 %zmm4,192(%rsi)
+ addq $0x100,%rsi
+ subq $0x100,%rdx
+ cmpq $0x100,%rdx
+ jge .L_main_loop_run_16_EmbgEptodyewbFa
+
+ cmpq $0x80,%rdx
+ jge .L_main_loop_run_8_EmbgEptodyewbFa
+ jmp .L_do_n_blocks_EmbgEptodyewbFa
+
+.L_start_by8_EmbgEptodyewbFa:
+
+ vbroadcasti32x4 (%rsp),%zmm0
+ vbroadcasti32x4 shufb_15_7(%rip),%zmm8
+ movq $0xaa,%r8
+ kmovq %r8,%k2
+
+
+ vpshufb %zmm8,%zmm0,%zmm1
+ vpsllvq const_dq3210(%rip),%zmm0,%zmm4
+ vpsrlvq const_dq5678(%rip),%zmm1,%zmm2
+ vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3
+ vpxorq %zmm2,%zmm4,%zmm4{%k2}
+ vpxord %zmm4,%zmm3,%zmm9
+
+
+ vpsllvq const_dq7654(%rip),%zmm0,%zmm5
+ vpsrlvq const_dq1234(%rip),%zmm1,%zmm6
+ vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7
+ vpxorq %zmm6,%zmm5,%zmm5{%k2}
+ vpxord %zmm5,%zmm7,%zmm10
+
+.L_main_loop_run_8_EmbgEptodyewbFa:
+ vmovdqu8 (%rdi),%zmm1
+ vmovdqu8 64(%rdi),%zmm2
+ vmovdqu8 112(%rdi),%xmm5
+ addq $0x80,%rdi
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 (%rcx),%zmm0
+ vpxorq %zmm0,%zmm1,%zmm1
+ vpxorq %zmm0,%zmm2,%zmm2
+ vpsrldq $0xf,%zmm9,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm9,%zmm15
+ vpxord %zmm14,%zmm15,%zmm15
+ vbroadcasti32x4 16(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 32(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 48(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+ vpsrldq $0xf,%zmm10,%zmm13
+ vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14
+ vpslldq $0x1,%zmm10,%zmm16
+ vpxord %zmm14,%zmm16,%zmm16
+
+ vbroadcasti32x4 64(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 80(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 96(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 112(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 128(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 144(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 160(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 176(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 192(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 208(%rcx),%zmm0
+ vaesdec %zmm0,%zmm1,%zmm1
+ vaesdec %zmm0,%zmm2,%zmm2
+
+
+ vbroadcasti32x4 224(%rcx),%zmm0
+ vaesdeclast %zmm0,%zmm1,%zmm1
+ vaesdeclast %zmm0,%zmm2,%zmm2
+
+ vpxorq %zmm9,%zmm1,%zmm1
+ vpxorq %zmm10,%zmm2,%zmm2
+
+
+ vmovdqa32 %zmm15,%zmm9
+ vmovdqa32 %zmm16,%zmm10
+ vmovdqu8 %zmm1,(%rsi)
+ vmovdqu8 %zmm2,64(%rsi)
+ addq $0x80,%rsi
+ subq $0x80,%rdx
+ cmpq $0x80,%rdx
+ jge .L_main_loop_run_8_EmbgEptodyewbFa
+ jmp .L_do_n_blocks_EmbgEptodyewbFa
+
+.L_steal_cipher_EmbgEptodyewbFa:
+
+ vmovdqa %xmm8,%xmm2
+
+
+ leaq vpshufb_shf_table(%rip),%rax
+ vmovdqu (%rax,%rdx,1),%xmm10
+ vpshufb %xmm10,%xmm8,%xmm8
+
+
+ vmovdqu -16(%rdi,%rdx,1),%xmm3
+ vmovdqu %xmm8,-16(%rsi,%rdx,1)
+
+
+ leaq vpshufb_shf_table(%rip),%rax
+ addq $16,%rax
+ subq %rdx,%rax
+ vmovdqu (%rax),%xmm10
+ vpxor mask1(%rip),%xmm10,%xmm10
+ vpshufb %xmm10,%xmm3,%xmm3
+
+ vpblendvb %xmm10,%xmm2,%xmm3,%xmm3
+
+
+ vpxor %xmm0,%xmm3,%xmm8
+
+
+ vpxor (%rcx),%xmm8,%xmm8
+ vaesdec 16(%rcx),%xmm8,%xmm8
+ vaesdec 32(%rcx),%xmm8,%xmm8
+ vaesdec 48(%rcx),%xmm8,%xmm8
+ vaesdec 64(%rcx),%xmm8,%xmm8
+ vaesdec 80(%rcx),%xmm8,%xmm8
+ vaesdec 96(%rcx),%xmm8,%xmm8
+ vaesdec 112(%rcx),%xmm8,%xmm8
+ vaesdec 128(%rcx),%xmm8,%xmm8
+ vaesdec 144(%rcx),%xmm8,%xmm8
+ vaesdec 160(%rcx),%xmm8,%xmm8
+ vaesdec 176(%rcx),%xmm8,%xmm8
+ vaesdec 192(%rcx),%xmm8,%xmm8
+ vaesdec 208(%rcx),%xmm8,%xmm8
+ vaesdeclast 224(%rcx),%xmm8,%xmm8
+
+ vpxor %xmm0,%xmm8,%xmm8
+
+.L_done_EmbgEptodyewbFa:
+
+ vmovdqu %xmm8,-16(%rsi)
+.L_ret_EmbgEptodyewbFa:
+ movq 128(%rsp),%rbx
+ xorq %r8,%r8
+ movq %r8,128(%rsp)
+
+ vpxorq %zmm0,%zmm0,%zmm0
+ movq %rbp,%rsp
+ popq %rbp
+ vzeroupper
+ .byte 0xf3,0xc3
+
+.L_less_than_128_bytes_EmbgEptodyewbFa:
+ cmpq $0x10,%rdx
+ jb .L_ret_EmbgEptodyewbFa
+
+ movq %rdx,%r8
+ andq $0x70,%r8
+ cmpq $0x60,%r8
+ je .L_num_blocks_is_6_EmbgEptodyewbFa
+ cmpq $0x50,%r8
+ je .L_num_blocks_is_5_EmbgEptodyewbFa
+ cmpq $0x40,%r8
+ je .L_num_blocks_is_4_EmbgEptodyewbFa
+ cmpq $0x30,%r8
+ je .L_num_blocks_is_3_EmbgEptodyewbFa
+ cmpq $0x20,%r8
+ je .L_num_blocks_is_2_EmbgEptodyewbFa
+ cmpq $0x10,%r8
+ je .L_num_blocks_is_1_EmbgEptodyewbFa
+
+.L_num_blocks_is_7_EmbgEptodyewbFa:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,64(%rsp)
+ movq %rbx,64 + 8(%rsp)
+ vmovdqa 64(%rsp),%xmm13
+ vmovdqu 64(%rdi),%xmm5
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,80(%rsp)
+ movq %rbx,80 + 8(%rsp)
+ vmovdqa 80(%rsp),%xmm14
+ vmovdqu 80(%rdi),%xmm6
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,96(%rsp)
+ movq %rbx,96 + 8(%rsp)
+ vmovdqa 96(%rsp),%xmm15
+ vmovdqu 96(%rdi),%xmm7
+ addq $0x70,%rdi
+ andq $0xf,%rdx
+ je .L_done_7_EmbgEptodyewbFa
+
+.L_steal_cipher_7_EmbgEptodyewbFa:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm15,%xmm16
+ vmovdqa 16(%rsp),%xmm15
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vpxor %xmm0,%xmm7,%xmm7
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vaesdeclast %xmm0,%xmm7,%xmm7
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ vmovdqu %xmm6,80(%rsi)
+ addq $0x70,%rsi
+ vmovdqa64 %xmm16,%xmm0
+ vmovdqa %xmm7,%xmm8
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_7_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vpxor %xmm0,%xmm7,%xmm7
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vaesdec %xmm0,%xmm7,%xmm7
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vaesdeclast %xmm0,%xmm7,%xmm7
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vpxor %xmm15,%xmm7,%xmm7
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ vmovdqu %xmm6,80(%rsi)
+ addq $0x70,%rsi
+ vmovdqa %xmm7,%xmm8
+ jmp .L_done_EmbgEptodyewbFa
+
+.L_num_blocks_is_6_EmbgEptodyewbFa:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,64(%rsp)
+ movq %rbx,64 + 8(%rsp)
+ vmovdqa 64(%rsp),%xmm13
+ vmovdqu 64(%rdi),%xmm5
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,80(%rsp)
+ movq %rbx,80 + 8(%rsp)
+ vmovdqa 80(%rsp),%xmm14
+ vmovdqu 80(%rdi),%xmm6
+ addq $0x60,%rdi
+ andq $0xf,%rdx
+ je .L_done_6_EmbgEptodyewbFa
+
+.L_steal_cipher_6_EmbgEptodyewbFa:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm14,%xmm15
+ vmovdqa 16(%rsp),%xmm14
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ addq $0x60,%rsi
+ vmovdqa %xmm15,%xmm0
+ vmovdqa %xmm6,%xmm8
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_6_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vpxor %xmm0,%xmm6,%xmm6
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vaesdec %xmm0,%xmm6,%xmm6
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vaesdeclast %xmm0,%xmm6,%xmm6
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vpxor %xmm14,%xmm6,%xmm6
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ vmovdqu %xmm5,64(%rsi)
+ addq $0x60,%rsi
+ vmovdqa %xmm6,%xmm8
+ jmp .L_done_EmbgEptodyewbFa
+
+.L_num_blocks_is_5_EmbgEptodyewbFa:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,64(%rsp)
+ movq %rbx,64 + 8(%rsp)
+ vmovdqa 64(%rsp),%xmm13
+ vmovdqu 64(%rdi),%xmm5
+ addq $0x50,%rdi
+ andq $0xf,%rdx
+ je .L_done_5_EmbgEptodyewbFa
+
+.L_steal_cipher_5_EmbgEptodyewbFa:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm13,%xmm14
+ vmovdqa 16(%rsp),%xmm13
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm14,%xmm0
+ vmovdqa %xmm5,%xmm8
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_5_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vpxor %xmm0,%xmm5,%xmm5
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vaesdec %xmm0,%xmm5,%xmm5
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vaesdeclast %xmm0,%xmm5,%xmm5
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vpxor %xmm13,%xmm5,%xmm5
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ vmovdqu %xmm4,48(%rsi)
+ addq $0x50,%rsi
+ vmovdqa %xmm5,%xmm8
+ jmp .L_done_EmbgEptodyewbFa
+
+.L_num_blocks_is_4_EmbgEptodyewbFa:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,48(%rsp)
+ movq %rbx,48 + 8(%rsp)
+ vmovdqa 48(%rsp),%xmm12
+ vmovdqu 48(%rdi),%xmm4
+ addq $0x40,%rdi
+ andq $0xf,%rdx
+ je .L_done_4_EmbgEptodyewbFa
+
+.L_steal_cipher_4_EmbgEptodyewbFa:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm12,%xmm13
+ vmovdqa 16(%rsp),%xmm12
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ addq $0x40,%rsi
+ vmovdqa %xmm13,%xmm0
+ vmovdqa %xmm4,%xmm8
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_4_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vpxor %xmm0,%xmm4,%xmm4
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vaesdec %xmm0,%xmm4,%xmm4
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vaesdeclast %xmm0,%xmm4,%xmm4
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vpxor %xmm12,%xmm4,%xmm4
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ vmovdqu %xmm3,32(%rsi)
+ addq $0x40,%rsi
+ vmovdqa %xmm4,%xmm8
+ jmp .L_done_EmbgEptodyewbFa
+
+.L_num_blocks_is_3_EmbgEptodyewbFa:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,32(%rsp)
+ movq %rbx,32 + 8(%rsp)
+ vmovdqa 32(%rsp),%xmm11
+ vmovdqu 32(%rdi),%xmm3
+ addq $0x30,%rdi
+ andq $0xf,%rdx
+ je .L_done_3_EmbgEptodyewbFa
+
+.L_steal_cipher_3_EmbgEptodyewbFa:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm11,%xmm12
+ vmovdqa 16(%rsp),%xmm11
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ addq $0x30,%rsi
+ vmovdqa %xmm12,%xmm0
+ vmovdqa %xmm3,%xmm8
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_3_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vpxor %xmm0,%xmm3,%xmm3
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vaesdec %xmm0,%xmm3,%xmm3
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vaesdeclast %xmm0,%xmm3,%xmm3
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vpxor %xmm11,%xmm3,%xmm3
+ vmovdqu %xmm1,(%rsi)
+ vmovdqu %xmm2,16(%rsi)
+ addq $0x30,%rsi
+ vmovdqa %xmm3,%xmm8
+ jmp .L_done_EmbgEptodyewbFa
+
+.L_num_blocks_is_2_EmbgEptodyewbFa:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,16 + 8(%rsp)
+ vmovdqa 16(%rsp),%xmm10
+ vmovdqu 16(%rdi),%xmm2
+ addq $0x20,%rdi
+ andq $0xf,%rdx
+ je .L_done_2_EmbgEptodyewbFa
+
+.L_steal_cipher_2_EmbgEptodyewbFa:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm10,%xmm11
+ vmovdqa 16(%rsp),%xmm10
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ addq $0x20,%rsi
+ vmovdqa %xmm11,%xmm0
+ vmovdqa %xmm2,%xmm8
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_2_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vpxor %xmm0,%xmm2,%xmm2
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vaesdec %xmm0,%xmm2,%xmm2
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vaesdeclast %xmm0,%xmm2,%xmm2
+ vpxor %xmm9,%xmm1,%xmm1
+ vpxor %xmm10,%xmm2,%xmm2
+ vmovdqu %xmm1,(%rsi)
+ addq $0x20,%rsi
+ vmovdqa %xmm2,%xmm8
+ jmp .L_done_EmbgEptodyewbFa
+
+.L_num_blocks_is_1_EmbgEptodyewbFa:
+ vmovdqa 0(%rsp),%xmm9
+ movq 0(%rsp),%rax
+ movq 8(%rsp),%rbx
+ vmovdqu 0(%rdi),%xmm1
+ addq $0x10,%rdi
+ andq $0xf,%rdx
+ je .L_done_1_EmbgEptodyewbFa
+
+.L_steal_cipher_1_EmbgEptodyewbFa:
+ xorq %r11,%r11
+ shlq $1,%rax
+ adcq %rbx,%rbx
+ cmovcq %r10,%r11
+ xorq %r11,%rax
+ movq %rax,16(%rsp)
+ movq %rbx,24(%rsp)
+ vmovdqa64 %xmm9,%xmm10
+ vmovdqa 16(%rsp),%xmm9
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ addq $0x10,%rsi
+ vmovdqa %xmm10,%xmm0
+ vmovdqa %xmm1,%xmm8
+ jmp .L_steal_cipher_EmbgEptodyewbFa
+
+.L_done_1_EmbgEptodyewbFa:
+ vpxor %xmm9,%xmm1,%xmm1
+ vmovdqu (%rcx),%xmm0
+ vpxor %xmm0,%xmm1,%xmm1
+ vmovdqu 16(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 32(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 48(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 64(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 80(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 96(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 112(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 128(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 144(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 160(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 176(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 192(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 208(%rcx),%xmm0
+ vaesdec %xmm0,%xmm1,%xmm1
+ vmovdqu 224(%rcx),%xmm0
+ vaesdeclast %xmm0,%xmm1,%xmm1
+ vpxor %xmm9,%xmm1,%xmm1
+ addq $0x10,%rsi
+ vmovdqa %xmm1,%xmm8
+ jmp .L_done_EmbgEptodyewbFa
+.cfi_endproc
+.section .rodata
+.align 16
+
+vpshufb_shf_table:
+.quad 0x8786858483828100, 0x8f8e8d8c8b8a8988
+.quad 0x0706050403020100, 0x000e0d0c0b0a0908
+
+mask1:
+.quad 0x8080808080808080, 0x8080808080808080
+
+const_dq3210:
+.quad 0, 0, 1, 1, 2, 2, 3, 3
+const_dq5678:
+.quad 8, 8, 7, 7, 6, 6, 5, 5
+const_dq7654:
+.quad 4, 4, 5, 5, 6, 6, 7, 7
+const_dq1234:
+.quad 4, 4, 3, 3, 2, 2, 1, 1
+
+shufb_15_7:
+.byte 15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 7, 0xff, 0xff
+.byte 0xff, 0xff, 0xff, 0xff, 0xff
+
+.text
+ .section ".note.gnu.property", "a"
+ .p2align 3
+ .long 1f - 0f
+ .long 4f - 1f
+ .long 5
+0:
+ # "GNU" encoded with .byte, since .asciz isn't supported
+ # on Solaris.
+ .byte 0x47
+ .byte 0x4e
+ .byte 0x55
+ .byte 0
+1:
+ .p2align 3
+ .long 0xc0000002
+ .long 3f - 2f
+2:
+ .long 3
+3:
+ .p2align 3
+4:
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s
new file mode 100644
index 0000000..1a91fca
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s
@@ -0,0 +1,1167 @@
+.text
+
+.globl ossl_rsaz_avxifma_eligible
+.type ossl_rsaz_avxifma_eligible,@function
+.align 32
+ossl_rsaz_avxifma_eligible:
+ movl OPENSSL_ia32cap_P+20(%rip),%ecx
+ xorl %eax,%eax
+ andl $8388608,%ecx
+ cmpl $8388608,%ecx
+ cmovel %ecx,%eax
+ .byte 0xf3,0xc3
+.size ossl_rsaz_avxifma_eligible, .-ossl_rsaz_avxifma_eligible
+.text
+
+.globl ossl_rsaz_amm52x20_x1_avxifma256
+.type ossl_rsaz_amm52x20_x1_avxifma256,@function
+.align 32
+ossl_rsaz_amm52x20_x1_avxifma256:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbx
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbx,-16
+ pushq %rbp
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbp,-24
+ pushq %r12
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r12,-32
+ pushq %r13
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r13,-40
+ pushq %r14
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r14,-48
+ pushq %r15
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r15,-56
+.Lossl_rsaz_amm52x20_x1_avxifma256_body:
+
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+
+ xorl %r9d,%r9d
+
+ movq %rdx,%r11
+ movq $0xfffffffffffff,%rax
+
+
+ movl $5,%ebx
+
+.align 32
+.Lloop5:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -168(%rsp),%rsp
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm5,32(%rsp)
+ vmovdqu %ymm6,64(%rsp)
+ vmovdqu %ymm7,96(%rsp)
+ vmovdqu %ymm8,128(%rsp)
+ movq $0,160(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm5
+ vmovdqu 72(%rsp),%ymm6
+ vmovdqu 104(%rsp),%ymm7
+ vmovdqu 136(%rsp),%ymm8
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8
+ leaq 168(%rsp),%rsp
+ movq 8(%r11),%r13
+
+ vpbroadcastq 8(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -168(%rsp),%rsp
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm5,32(%rsp)
+ vmovdqu %ymm6,64(%rsp)
+ vmovdqu %ymm7,96(%rsp)
+ vmovdqu %ymm8,128(%rsp)
+ movq $0,160(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm5
+ vmovdqu 72(%rsp),%ymm6
+ vmovdqu 104(%rsp),%ymm7
+ vmovdqu 136(%rsp),%ymm8
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8
+ leaq 168(%rsp),%rsp
+ movq 16(%r11),%r13
+
+ vpbroadcastq 16(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -168(%rsp),%rsp
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm5,32(%rsp)
+ vmovdqu %ymm6,64(%rsp)
+ vmovdqu %ymm7,96(%rsp)
+ vmovdqu %ymm8,128(%rsp)
+ movq $0,160(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm5
+ vmovdqu 72(%rsp),%ymm6
+ vmovdqu 104(%rsp),%ymm7
+ vmovdqu 136(%rsp),%ymm8
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8
+ leaq 168(%rsp),%rsp
+ movq 24(%r11),%r13
+
+ vpbroadcastq 24(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -168(%rsp),%rsp
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm5,32(%rsp)
+ vmovdqu %ymm6,64(%rsp)
+ vmovdqu %ymm7,96(%rsp)
+ vmovdqu %ymm8,128(%rsp)
+ movq $0,160(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm5
+ vmovdqu 72(%rsp),%ymm6
+ vmovdqu 104(%rsp),%ymm7
+ vmovdqu 136(%rsp),%ymm8
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8
+ leaq 168(%rsp),%rsp
+ leaq 32(%r11),%r11
+ decl %ebx
+ jne .Lloop5
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+
+
+ vpsrlq $52,%ymm3,%ymm0
+ vpsrlq $52,%ymm5,%ymm1
+ vpsrlq $52,%ymm6,%ymm2
+ vpsrlq $52,%ymm7,%ymm13
+ vpsrlq $52,%ymm8,%ymm14
+
+
+ vpermq $144,%ymm14,%ymm14
+ vpermq $3,%ymm13,%ymm15
+ vblendpd $1,%ymm15,%ymm14,%ymm14
+
+ vpermq $144,%ymm13,%ymm13
+ vpermq $3,%ymm2,%ymm15
+ vblendpd $1,%ymm15,%ymm13,%ymm13
+
+ vpermq $144,%ymm2,%ymm2
+ vpermq $3,%ymm1,%ymm15
+ vblendpd $1,%ymm15,%ymm2,%ymm2
+
+ vpermq $144,%ymm1,%ymm1
+ vpermq $3,%ymm0,%ymm15
+ vblendpd $1,%ymm15,%ymm1,%ymm1
+
+ vpermq $144,%ymm0,%ymm0
+ vpand .Lhigh64x3(%rip),%ymm0,%ymm0
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+
+
+ vpaddq %ymm0,%ymm3,%ymm3
+ vpaddq %ymm1,%ymm5,%ymm5
+ vpaddq %ymm2,%ymm6,%ymm6
+ vpaddq %ymm13,%ymm7,%ymm7
+ vpaddq %ymm14,%ymm8,%ymm8
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm1
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm2
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm14
+ vmovmskpd %ymm0,%r14d
+ vmovmskpd %ymm1,%r13d
+ vmovmskpd %ymm2,%r12d
+ vmovmskpd %ymm13,%r11d
+ vmovmskpd %ymm14,%r10d
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm1
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm2
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm14
+ vmovmskpd %ymm0,%r9d
+ vmovmskpd %ymm1,%r8d
+ vmovmskpd %ymm2,%ebx
+ vmovmskpd %ymm13,%ecx
+ vmovmskpd %ymm14,%edx
+
+
+
+ shlb $4,%r13b
+ orb %r13b,%r14b
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ addb %r14b,%r14b
+ adcb %r12b,%r12b
+ adcb %r10b,%r10b
+
+ shlb $4,%r8b
+ orb %r8b,%r9b
+ shlb $4,%cl
+ orb %cl,%bl
+
+ addb %r9b,%r14b
+ adcb %bl,%r12b
+ adcb %dl,%r10b
+
+ xorb %r9b,%r14b
+ xorb %bl,%r12b
+ xorb %dl,%r10b
+
+ leaq .Lkmasklut(%rip),%rdx
+
+ movb %r14b,%r13b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm0
+ shlq $5,%r14
+ vmovapd (%rdx,%r14,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm3,%ymm3
+
+ shrb $4,%r13b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm0
+ shlq $5,%r13
+ vmovapd (%rdx,%r13,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm5,%ymm5
+
+ movb %r12b,%r11b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm0
+ shlq $5,%r12
+ vmovapd (%rdx,%r12,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm6,%ymm6
+
+ shrb $4,%r11b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm0
+ shlq $5,%r11
+ vmovapd (%rdx,%r11,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm7,%ymm7
+
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm8,%ymm8
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+
+ vmovdqu %ymm3,0(%rdi)
+ vmovdqu %ymm5,32(%rdi)
+ vmovdqu %ymm6,64(%rdi)
+ vmovdqu %ymm7,96(%rdi)
+ vmovdqu %ymm8,128(%rdi)
+
+ vzeroupper
+ movq 0(%rsp),%r15
+.cfi_restore %r15
+ movq 8(%rsp),%r14
+.cfi_restore %r14
+ movq 16(%rsp),%r13
+.cfi_restore %r13
+ movq 24(%rsp),%r12
+.cfi_restore %r12
+ movq 32(%rsp),%rbp
+.cfi_restore %rbp
+ movq 40(%rsp),%rbx
+.cfi_restore %rbx
+ leaq 48(%rsp),%rsp
+.cfi_adjust_cfa_offset -48
+.Lossl_rsaz_amm52x20_x1_avxifma256_epilogue:
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_rsaz_amm52x20_x1_avxifma256, .-ossl_rsaz_amm52x20_x1_avxifma256
+.section .rodata
+.align 32
+.Lmask52x4:
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.Lhigh64x3:
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.Lkmasklut:
+
+.quad 0x0
+.quad 0x0
+.quad 0x0
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+.quad 0x0
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0x0
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.text
+
+.globl ossl_rsaz_amm52x20_x2_avxifma256
+.type ossl_rsaz_amm52x20_x2_avxifma256,@function
+.align 32
+ossl_rsaz_amm52x20_x2_avxifma256:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbx
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbx,-16
+ pushq %rbp
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbp,-24
+ pushq %r12
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r12,-32
+ pushq %r13
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r13,-40
+ pushq %r14
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r14,-48
+ pushq %r15
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r15,-56
+.Lossl_rsaz_amm52x20_x2_avxifma256_body:
+
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm10
+ vmovapd %ymm0,%ymm11
+ vmovapd %ymm0,%ymm12
+
+ xorl %r9d,%r9d
+ xorl %r15d,%r15d
+
+ movq %rdx,%r11
+ movq $0xfffffffffffff,%rax
+
+ movl $20,%ebx
+
+.align 32
+.Lloop20:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq (%r8),%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -168(%rsp),%rsp
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm5,32(%rsp)
+ vmovdqu %ymm6,64(%rsp)
+ vmovdqu %ymm7,96(%rsp)
+ vmovdqu %ymm8,128(%rsp)
+ movq $0,160(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm5
+ vmovdqu 72(%rsp),%ymm6
+ vmovdqu 104(%rsp),%ymm7
+ vmovdqu 136(%rsp),%ymm8
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8
+ leaq 168(%rsp),%rsp
+ movq 160(%r11),%r13
+
+ vpbroadcastq 160(%r11),%ymm1
+ movq 160(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r15
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq 8(%r8),%r13
+ imulq %r15,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 160(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r15
+ adcq %r12,%r10
+
+ shrq $52,%r15
+ salq $12,%r10
+ orq %r10,%r15
+
+ leaq -168(%rsp),%rsp
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12
+
+
+ vmovdqu %ymm4,0(%rsp)
+ vmovdqu %ymm9,32(%rsp)
+ vmovdqu %ymm10,64(%rsp)
+ vmovdqu %ymm11,96(%rsp)
+ vmovdqu %ymm12,128(%rsp)
+ movq $0,160(%rsp)
+
+ vmovdqu 8(%rsp),%ymm4
+ vmovdqu 40(%rsp),%ymm9
+ vmovdqu 72(%rsp),%ymm10
+ vmovdqu 104(%rsp),%ymm11
+ vmovdqu 136(%rsp),%ymm12
+
+ addq 8(%rsp),%r15
+
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12
+ leaq 168(%rsp),%rsp
+ leaq 8(%r11),%r11
+ decl %ebx
+ jne .Lloop20
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+
+
+ vpsrlq $52,%ymm3,%ymm0
+ vpsrlq $52,%ymm5,%ymm1
+ vpsrlq $52,%ymm6,%ymm2
+ vpsrlq $52,%ymm7,%ymm13
+ vpsrlq $52,%ymm8,%ymm14
+
+
+ vpermq $144,%ymm14,%ymm14
+ vpermq $3,%ymm13,%ymm15
+ vblendpd $1,%ymm15,%ymm14,%ymm14
+
+ vpermq $144,%ymm13,%ymm13
+ vpermq $3,%ymm2,%ymm15
+ vblendpd $1,%ymm15,%ymm13,%ymm13
+
+ vpermq $144,%ymm2,%ymm2
+ vpermq $3,%ymm1,%ymm15
+ vblendpd $1,%ymm15,%ymm2,%ymm2
+
+ vpermq $144,%ymm1,%ymm1
+ vpermq $3,%ymm0,%ymm15
+ vblendpd $1,%ymm15,%ymm1,%ymm1
+
+ vpermq $144,%ymm0,%ymm0
+ vpand .Lhigh64x3(%rip),%ymm0,%ymm0
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+
+
+ vpaddq %ymm0,%ymm3,%ymm3
+ vpaddq %ymm1,%ymm5,%ymm5
+ vpaddq %ymm2,%ymm6,%ymm6
+ vpaddq %ymm13,%ymm7,%ymm7
+ vpaddq %ymm14,%ymm8,%ymm8
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm1
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm2
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm14
+ vmovmskpd %ymm0,%r14d
+ vmovmskpd %ymm1,%r13d
+ vmovmskpd %ymm2,%r12d
+ vmovmskpd %ymm13,%r11d
+ vmovmskpd %ymm14,%r10d
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm1
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm2
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm14
+ vmovmskpd %ymm0,%r9d
+ vmovmskpd %ymm1,%r8d
+ vmovmskpd %ymm2,%ebx
+ vmovmskpd %ymm13,%ecx
+ vmovmskpd %ymm14,%edx
+
+
+
+ shlb $4,%r13b
+ orb %r13b,%r14b
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ addb %r14b,%r14b
+ adcb %r12b,%r12b
+ adcb %r10b,%r10b
+
+ shlb $4,%r8b
+ orb %r8b,%r9b
+ shlb $4,%cl
+ orb %cl,%bl
+
+ addb %r9b,%r14b
+ adcb %bl,%r12b
+ adcb %dl,%r10b
+
+ xorb %r9b,%r14b
+ xorb %bl,%r12b
+ xorb %dl,%r10b
+
+ leaq .Lkmasklut(%rip),%rdx
+
+ movb %r14b,%r13b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm0
+ shlq $5,%r14
+ vmovapd (%rdx,%r14,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm3,%ymm3
+
+ shrb $4,%r13b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm0
+ shlq $5,%r13
+ vmovapd (%rdx,%r13,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm5,%ymm5
+
+ movb %r12b,%r11b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm0
+ shlq $5,%r12
+ vmovapd (%rdx,%r12,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm6,%ymm6
+
+ shrb $4,%r11b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm0
+ shlq $5,%r11
+ vmovapd (%rdx,%r11,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm7,%ymm7
+
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm8,%ymm8
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+
+ vmovq %r15,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm4,%ymm4
+
+
+
+ vpsrlq $52,%ymm4,%ymm0
+ vpsrlq $52,%ymm9,%ymm1
+ vpsrlq $52,%ymm10,%ymm2
+ vpsrlq $52,%ymm11,%ymm13
+ vpsrlq $52,%ymm12,%ymm14
+
+
+ vpermq $144,%ymm14,%ymm14
+ vpermq $3,%ymm13,%ymm15
+ vblendpd $1,%ymm15,%ymm14,%ymm14
+
+ vpermq $144,%ymm13,%ymm13
+ vpermq $3,%ymm2,%ymm15
+ vblendpd $1,%ymm15,%ymm13,%ymm13
+
+ vpermq $144,%ymm2,%ymm2
+ vpermq $3,%ymm1,%ymm15
+ vblendpd $1,%ymm15,%ymm2,%ymm2
+
+ vpermq $144,%ymm1,%ymm1
+ vpermq $3,%ymm0,%ymm15
+ vblendpd $1,%ymm15,%ymm1,%ymm1
+
+ vpermq $144,%ymm0,%ymm0
+ vpand .Lhigh64x3(%rip),%ymm0,%ymm0
+
+
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+
+ vpaddq %ymm0,%ymm4,%ymm4
+ vpaddq %ymm1,%ymm9,%ymm9
+ vpaddq %ymm2,%ymm10,%ymm10
+ vpaddq %ymm13,%ymm11,%ymm11
+ vpaddq %ymm14,%ymm12,%ymm12
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm0
+ vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm1
+ vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm2
+ vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13
+ vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm14
+ vmovmskpd %ymm0,%r14d
+ vmovmskpd %ymm1,%r13d
+ vmovmskpd %ymm2,%r12d
+ vmovmskpd %ymm13,%r11d
+ vmovmskpd %ymm14,%r10d
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm0
+ vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm1
+ vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm2
+ vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13
+ vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm14
+ vmovmskpd %ymm0,%r9d
+ vmovmskpd %ymm1,%r8d
+ vmovmskpd %ymm2,%ebx
+ vmovmskpd %ymm13,%ecx
+ vmovmskpd %ymm14,%edx
+
+
+
+ shlb $4,%r13b
+ orb %r13b,%r14b
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ addb %r14b,%r14b
+ adcb %r12b,%r12b
+ adcb %r10b,%r10b
+
+ shlb $4,%r8b
+ orb %r8b,%r9b
+ shlb $4,%cl
+ orb %cl,%bl
+
+ addb %r9b,%r14b
+ adcb %bl,%r12b
+ adcb %dl,%r10b
+
+ xorb %r9b,%r14b
+ xorb %bl,%r12b
+ xorb %dl,%r10b
+
+ leaq .Lkmasklut(%rip),%rdx
+
+ movb %r14b,%r13b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm4,%ymm0
+ shlq $5,%r14
+ vmovapd (%rdx,%r14,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm4,%ymm4
+
+ shrb $4,%r13b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm9,%ymm0
+ shlq $5,%r13
+ vmovapd (%rdx,%r13,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm9,%ymm9
+
+ movb %r12b,%r11b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm10,%ymm0
+ shlq $5,%r12
+ vmovapd (%rdx,%r12,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm10,%ymm10
+
+ shrb $4,%r11b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm11,%ymm0
+ shlq $5,%r11
+ vmovapd (%rdx,%r11,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm11,%ymm11
+
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm12,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm12,%ymm12
+
+
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+ vmovdqu %ymm3,0(%rdi)
+ vmovdqu %ymm5,32(%rdi)
+ vmovdqu %ymm6,64(%rdi)
+ vmovdqu %ymm7,96(%rdi)
+ vmovdqu %ymm8,128(%rdi)
+
+ vmovdqu %ymm4,160(%rdi)
+ vmovdqu %ymm9,192(%rdi)
+ vmovdqu %ymm10,224(%rdi)
+ vmovdqu %ymm11,256(%rdi)
+ vmovdqu %ymm12,288(%rdi)
+
+ vzeroupper
+ movq 0(%rsp),%r15
+.cfi_restore %r15
+ movq 8(%rsp),%r14
+.cfi_restore %r14
+ movq 16(%rsp),%r13
+.cfi_restore %r13
+ movq 24(%rsp),%r12
+.cfi_restore %r12
+ movq 32(%rsp),%rbp
+.cfi_restore %rbp
+ movq 40(%rsp),%rbx
+.cfi_restore %rbx
+ leaq 48(%rsp),%rsp
+.cfi_adjust_cfa_offset -48
+.Lossl_rsaz_amm52x20_x2_avxifma256_epilogue:
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_rsaz_amm52x20_x2_avxifma256, .-ossl_rsaz_amm52x20_x2_avxifma256
+.text
+
+.align 32
+.globl ossl_extract_multiplier_2x20_win5_avx
+.type ossl_extract_multiplier_2x20_win5_avx,@function
+ossl_extract_multiplier_2x20_win5_avx:
+.cfi_startproc
+.byte 243,15,30,250
+ vmovapd .Lones(%rip),%ymm14
+ vmovq %rdx,%xmm10
+ vpbroadcastq %xmm10,%ymm12
+ vmovq %rcx,%xmm10
+ vpbroadcastq %xmm10,%ymm13
+ leaq 10240(%rsi),%rax
+
+
+ vpxor %xmm0,%xmm0,%xmm0
+ vmovapd %ymm0,%ymm11
+ vmovapd %ymm0,%ymm1
+ vmovapd %ymm0,%ymm2
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+
+.align 32
+.Lloop:
+ vpcmpeqq %ymm11,%ymm12,%ymm15
+ vmovdqu 0(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm0,%ymm0
+ vmovdqu 32(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm1,%ymm1
+ vmovdqu 64(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm2,%ymm2
+ vmovdqu 96(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm3,%ymm3
+ vmovdqu 128(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm4,%ymm4
+ vpcmpeqq %ymm11,%ymm13,%ymm15
+ vmovdqu 160(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm5,%ymm5
+ vmovdqu 192(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm6,%ymm6
+ vmovdqu 224(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm7,%ymm7
+ vmovdqu 256(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm8,%ymm8
+ vmovdqu 288(%rsi),%ymm10
+ vblendvpd %ymm15,%ymm10,%ymm9,%ymm9
+ vpaddq %ymm14,%ymm11,%ymm11
+ addq $320,%rsi
+ cmpq %rsi,%rax
+ jne .Lloop
+ vmovdqu %ymm0,0(%rdi)
+ vmovdqu %ymm1,32(%rdi)
+ vmovdqu %ymm2,64(%rdi)
+ vmovdqu %ymm3,96(%rdi)
+ vmovdqu %ymm4,128(%rdi)
+ vmovdqu %ymm5,160(%rdi)
+ vmovdqu %ymm6,192(%rdi)
+ vmovdqu %ymm7,224(%rdi)
+ vmovdqu %ymm8,256(%rdi)
+ vmovdqu %ymm9,288(%rdi)
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_extract_multiplier_2x20_win5_avx, .-ossl_extract_multiplier_2x20_win5_avx
+.section .rodata
+.align 32
+.Lones:
+.quad 1,1,1,1
+.Lzeros:
+.quad 0,0,0,0
+ .section ".note.gnu.property", "a"
+ .p2align 3
+ .long 1f - 0f
+ .long 4f - 1f
+ .long 5
+0:
+ # "GNU" encoded with .byte, since .asciz isn't supported
+ # on Solaris.
+ .byte 0x47
+ .byte 0x4e
+ .byte 0x55
+ .byte 0
+1:
+ .p2align 3
+ .long 0xc0000002
+ .long 3f - 2f
+2:
+ .long 3
+3:
+ .p2align 3
+4:
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s
new file mode 100644
index 0000000..c40b209
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s
@@ -0,0 +1,1768 @@
+.text
+
+.globl ossl_rsaz_amm52x30_x1_avxifma256
+.type ossl_rsaz_amm52x30_x1_avxifma256,@function
+.align 32
+ossl_rsaz_amm52x30_x1_avxifma256:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbx
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbx,-16
+ pushq %rbp
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbp,-24
+ pushq %r12
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r12,-32
+ pushq %r13
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r13,-40
+ pushq %r14
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r14,-48
+ pushq %r15
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r15,-56
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm10
+
+ xorl %r9d,%r9d
+
+ movq %rdx,%r11
+ movq $0xfffffffffffff,%rax
+
+
+ movl $7,%ebx
+
+.align 32
+.Lloop7:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+ movq 8(%r11),%r13
+
+ vpbroadcastq 8(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+ movq 16(%r11),%r13
+
+ vpbroadcastq 16(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+ movq 24(%r11),%r13
+
+ vpbroadcastq 24(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+ leaq 32(%r11),%r11
+ decl %ebx
+ jne .Lloop7
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+ movq 8(%r11),%r13
+
+ vpbroadcastq 8(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+
+
+ vpsrlq $52,%ymm3,%ymm0
+ vpsrlq $52,%ymm4,%ymm1
+ vpsrlq $52,%ymm5,%ymm2
+ vpsrlq $52,%ymm6,%ymm11
+ vpsrlq $52,%ymm7,%ymm12
+ vpsrlq $52,%ymm8,%ymm13
+ vpsrlq $52,%ymm9,%ymm14
+ vpsrlq $52,%ymm10,%ymm15
+
+ leaq -32(%rsp),%rsp
+ vmovupd %ymm3,(%rsp)
+
+
+ vpermq $144,%ymm15,%ymm15
+ vpermq $3,%ymm14,%ymm3
+ vblendpd $1,%ymm3,%ymm15,%ymm15
+
+ vpermq $144,%ymm14,%ymm14
+ vpermq $3,%ymm13,%ymm3
+ vblendpd $1,%ymm3,%ymm14,%ymm14
+
+ vpermq $144,%ymm13,%ymm13
+ vpermq $3,%ymm12,%ymm3
+ vblendpd $1,%ymm3,%ymm13,%ymm13
+
+ vpermq $144,%ymm12,%ymm12
+ vpermq $3,%ymm11,%ymm3
+ vblendpd $1,%ymm3,%ymm12,%ymm12
+
+ vpermq $144,%ymm11,%ymm11
+ vpermq $3,%ymm2,%ymm3
+ vblendpd $1,%ymm3,%ymm11,%ymm11
+
+ vpermq $144,%ymm2,%ymm2
+ vpermq $3,%ymm1,%ymm3
+ vblendpd $1,%ymm3,%ymm2,%ymm2
+
+ vpermq $144,%ymm1,%ymm1
+ vpermq $3,%ymm0,%ymm3
+ vblendpd $1,%ymm3,%ymm1,%ymm1
+
+ vpermq $144,%ymm0,%ymm0
+ vpand .Lhigh64x3(%rip),%ymm0,%ymm0
+
+ vmovupd (%rsp),%ymm3
+ leaq 32(%rsp),%rsp
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+
+
+ vpaddq %ymm0,%ymm3,%ymm3
+ vpaddq %ymm1,%ymm4,%ymm4
+ vpaddq %ymm2,%ymm5,%ymm5
+ vpaddq %ymm11,%ymm6,%ymm6
+ vpaddq %ymm12,%ymm7,%ymm7
+ vpaddq %ymm13,%ymm8,%ymm8
+ vpaddq %ymm14,%ymm9,%ymm9
+ vpaddq %ymm15,%ymm10,%ymm10
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm1
+ vmovmskpd %ymm0,%r14d
+ vmovmskpd %ymm1,%r13d
+ shlb $4,%r13b
+ orb %r13b,%r14b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm2
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm11
+ vmovmskpd %ymm2,%r13d
+ vmovmskpd %ymm11,%r12d
+ shlb $4,%r12b
+ orb %r12b,%r13b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm12
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm12,%r12d
+ vmovmskpd %ymm13,%r11d
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm14
+ vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm15
+ vmovmskpd %ymm14,%r11d
+ vmovmskpd %ymm15,%r10d
+ shlb $4,%r10b
+ orb %r10b,%r11b
+
+ addb %r14b,%r14b
+ adcb %r13b,%r13b
+ adcb %r12b,%r12b
+ adcb %r11b,%r11b
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm1
+ vmovmskpd %ymm0,%r9d
+ vmovmskpd %ymm1,%r8d
+ shlb $4,%r8b
+ orb %r8b,%r9b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm2
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm11
+ vmovmskpd %ymm2,%r8d
+ vmovmskpd %ymm11,%edx
+ shlb $4,%dl
+ orb %dl,%r8b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm12
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm12,%edx
+ vmovmskpd %ymm13,%ecx
+ shlb $4,%cl
+ orb %cl,%dl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm14
+ vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm15
+ vmovmskpd %ymm14,%ecx
+ vmovmskpd %ymm15,%ebx
+ shlb $4,%bl
+ orb %bl,%cl
+
+ addb %r9b,%r14b
+ adcb %r8b,%r13b
+ adcb %dl,%r12b
+ adcb %cl,%r11b
+
+ xorb %r9b,%r14b
+ xorb %r8b,%r13b
+ xorb %dl,%r12b
+ xorb %cl,%r11b
+
+ leaq .Lkmasklut(%rip),%rdx
+
+ movb %r14b,%r10b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm0
+ shlq $5,%r14
+ vmovapd (%rdx,%r14,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm3,%ymm3
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm4,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm4,%ymm4
+
+ movb %r13b,%r10b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm0
+ shlq $5,%r13
+ vmovapd (%rdx,%r13,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm5,%ymm5
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm6,%ymm6
+
+ movb %r12b,%r10b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm0
+ shlq $5,%r12
+ vmovapd (%rdx,%r12,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm7,%ymm7
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm8,%ymm8
+
+ movb %r11b,%r10b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm9,%ymm0
+ shlq $5,%r11
+ vmovapd (%rdx,%r11,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm9,%ymm9
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm10,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm10,%ymm10
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+
+ vmovdqu %ymm3,0(%rdi)
+ vmovdqu %ymm4,32(%rdi)
+ vmovdqu %ymm5,64(%rdi)
+ vmovdqu %ymm6,96(%rdi)
+ vmovdqu %ymm7,128(%rdi)
+ vmovdqu %ymm8,160(%rdi)
+ vmovdqu %ymm9,192(%rdi)
+ vmovdqu %ymm10,224(%rdi)
+
+ vzeroupper
+ leaq (%rsp),%rax
+.cfi_def_cfa_register %rax
+ movq 0(%rax),%r15
+.cfi_restore %r15
+ movq 8(%rax),%r14
+.cfi_restore %r14
+ movq 16(%rax),%r13
+.cfi_restore %r13
+ movq 24(%rax),%r12
+.cfi_restore %r12
+ movq 32(%rax),%rbp
+.cfi_restore %rbp
+ movq 40(%rax),%rbx
+.cfi_restore %rbx
+ leaq 48(%rax),%rsp
+.cfi_def_cfa %rsp,8
+.Lossl_rsaz_amm52x30_x1_avxifma256_epilogue:
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_rsaz_amm52x30_x1_avxifma256, .-ossl_rsaz_amm52x30_x1_avxifma256
+.section .rodata
+.align 32
+.Lmask52x4:
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.Lhigh64x3:
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.Lkmasklut:
+
+.quad 0x0
+.quad 0x0
+.quad 0x0
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+.quad 0x0
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0x0
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.text
+
+.globl ossl_rsaz_amm52x30_x2_avxifma256
+.type ossl_rsaz_amm52x30_x2_avxifma256,@function
+.align 32
+ossl_rsaz_amm52x30_x2_avxifma256:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbx
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbx,-16
+ pushq %rbp
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbp,-24
+ pushq %r12
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r12,-32
+ pushq %r13
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r13,-40
+ pushq %r14
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r14,-48
+ pushq %r15
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r15,-56
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm10
+
+ xorl %r9d,%r9d
+
+ movq %rdx,%r11
+ movq $0xfffffffffffff,%rax
+
+ movl $30,%ebx
+
+.align 32
+.Lloop30:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq (%r8),%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+ leaq 8(%r11),%r11
+ decl %ebx
+ jne .Lloop30
+
+ pushq %r11
+ pushq %rsi
+ pushq %rcx
+ pushq %r8
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+
+
+ vpsrlq $52,%ymm3,%ymm0
+ vpsrlq $52,%ymm4,%ymm1
+ vpsrlq $52,%ymm5,%ymm2
+ vpsrlq $52,%ymm6,%ymm11
+ vpsrlq $52,%ymm7,%ymm12
+ vpsrlq $52,%ymm8,%ymm13
+ vpsrlq $52,%ymm9,%ymm14
+ vpsrlq $52,%ymm10,%ymm15
+
+ leaq -32(%rsp),%rsp
+ vmovupd %ymm3,(%rsp)
+
+
+ vpermq $144,%ymm15,%ymm15
+ vpermq $3,%ymm14,%ymm3
+ vblendpd $1,%ymm3,%ymm15,%ymm15
+
+ vpermq $144,%ymm14,%ymm14
+ vpermq $3,%ymm13,%ymm3
+ vblendpd $1,%ymm3,%ymm14,%ymm14
+
+ vpermq $144,%ymm13,%ymm13
+ vpermq $3,%ymm12,%ymm3
+ vblendpd $1,%ymm3,%ymm13,%ymm13
+
+ vpermq $144,%ymm12,%ymm12
+ vpermq $3,%ymm11,%ymm3
+ vblendpd $1,%ymm3,%ymm12,%ymm12
+
+ vpermq $144,%ymm11,%ymm11
+ vpermq $3,%ymm2,%ymm3
+ vblendpd $1,%ymm3,%ymm11,%ymm11
+
+ vpermq $144,%ymm2,%ymm2
+ vpermq $3,%ymm1,%ymm3
+ vblendpd $1,%ymm3,%ymm2,%ymm2
+
+ vpermq $144,%ymm1,%ymm1
+ vpermq $3,%ymm0,%ymm3
+ vblendpd $1,%ymm3,%ymm1,%ymm1
+
+ vpermq $144,%ymm0,%ymm0
+ vpand .Lhigh64x3(%rip),%ymm0,%ymm0
+
+ vmovupd (%rsp),%ymm3
+ leaq 32(%rsp),%rsp
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+
+
+ vpaddq %ymm0,%ymm3,%ymm3
+ vpaddq %ymm1,%ymm4,%ymm4
+ vpaddq %ymm2,%ymm5,%ymm5
+ vpaddq %ymm11,%ymm6,%ymm6
+ vpaddq %ymm12,%ymm7,%ymm7
+ vpaddq %ymm13,%ymm8,%ymm8
+ vpaddq %ymm14,%ymm9,%ymm9
+ vpaddq %ymm15,%ymm10,%ymm10
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm1
+ vmovmskpd %ymm0,%r14d
+ vmovmskpd %ymm1,%r13d
+ shlb $4,%r13b
+ orb %r13b,%r14b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm2
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm11
+ vmovmskpd %ymm2,%r13d
+ vmovmskpd %ymm11,%r12d
+ shlb $4,%r12b
+ orb %r12b,%r13b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm12
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm12,%r12d
+ vmovmskpd %ymm13,%r11d
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm14
+ vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm15
+ vmovmskpd %ymm14,%r11d
+ vmovmskpd %ymm15,%r10d
+ shlb $4,%r10b
+ orb %r10b,%r11b
+
+ addb %r14b,%r14b
+ adcb %r13b,%r13b
+ adcb %r12b,%r12b
+ adcb %r11b,%r11b
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm1
+ vmovmskpd %ymm0,%r9d
+ vmovmskpd %ymm1,%r8d
+ shlb $4,%r8b
+ orb %r8b,%r9b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm2
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm11
+ vmovmskpd %ymm2,%r8d
+ vmovmskpd %ymm11,%edx
+ shlb $4,%dl
+ orb %dl,%r8b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm12
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm12,%edx
+ vmovmskpd %ymm13,%ecx
+ shlb $4,%cl
+ orb %cl,%dl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm14
+ vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm15
+ vmovmskpd %ymm14,%ecx
+ vmovmskpd %ymm15,%ebx
+ shlb $4,%bl
+ orb %bl,%cl
+
+ addb %r9b,%r14b
+ adcb %r8b,%r13b
+ adcb %dl,%r12b
+ adcb %cl,%r11b
+
+ xorb %r9b,%r14b
+ xorb %r8b,%r13b
+ xorb %dl,%r12b
+ xorb %cl,%r11b
+
+ leaq .Lkmasklut(%rip),%rdx
+
+ movb %r14b,%r10b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm0
+ shlq $5,%r14
+ vmovapd (%rdx,%r14,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm3,%ymm3
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm4,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm4,%ymm4
+
+ movb %r13b,%r10b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm0
+ shlq $5,%r13
+ vmovapd (%rdx,%r13,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm5,%ymm5
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm6,%ymm6
+
+ movb %r12b,%r10b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm0
+ shlq $5,%r12
+ vmovapd (%rdx,%r12,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm7,%ymm7
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm8,%ymm8
+
+ movb %r11b,%r10b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm9,%ymm0
+ shlq $5,%r11
+ vmovapd (%rdx,%r11,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm9,%ymm9
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm10,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm10,%ymm10
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ popq %r8
+ popq %rcx
+ popq %rsi
+ popq %r11
+
+ vmovdqu %ymm3,0(%rdi)
+ vmovdqu %ymm4,32(%rdi)
+ vmovdqu %ymm5,64(%rdi)
+ vmovdqu %ymm6,96(%rdi)
+ vmovdqu %ymm7,128(%rdi)
+ vmovdqu %ymm8,160(%rdi)
+ vmovdqu %ymm9,192(%rdi)
+ vmovdqu %ymm10,224(%rdi)
+
+ xorl %r15d,%r15d
+
+ leaq 16(%r11),%r11
+ movq $0xfffffffffffff,%rax
+
+ movl $30,%ebx
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm10
+.align 32
+.Lloop40:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 256(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq 8(%r8),%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 256(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -264(%rsp),%rsp
+
+{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 320(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 352(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 384(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 416(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 448(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 480(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 320(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 352(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 384(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 416(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 448(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 480(%rcx),%ymm2,%ymm10
+
+
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ movq $0,256(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 320(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 352(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 384(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 416(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 448(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 480(%rsi),%ymm1,%ymm10
+
+{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 320(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 352(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 384(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 416(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 448(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 480(%rcx),%ymm2,%ymm10
+
+ leaq 264(%rsp),%rsp
+ leaq 8(%r11),%r11
+ decl %ebx
+ jne .Lloop40
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+
+
+ vpsrlq $52,%ymm3,%ymm0
+ vpsrlq $52,%ymm4,%ymm1
+ vpsrlq $52,%ymm5,%ymm2
+ vpsrlq $52,%ymm6,%ymm11
+ vpsrlq $52,%ymm7,%ymm12
+ vpsrlq $52,%ymm8,%ymm13
+ vpsrlq $52,%ymm9,%ymm14
+ vpsrlq $52,%ymm10,%ymm15
+
+ leaq -32(%rsp),%rsp
+ vmovupd %ymm3,(%rsp)
+
+
+ vpermq $144,%ymm15,%ymm15
+ vpermq $3,%ymm14,%ymm3
+ vblendpd $1,%ymm3,%ymm15,%ymm15
+
+ vpermq $144,%ymm14,%ymm14
+ vpermq $3,%ymm13,%ymm3
+ vblendpd $1,%ymm3,%ymm14,%ymm14
+
+ vpermq $144,%ymm13,%ymm13
+ vpermq $3,%ymm12,%ymm3
+ vblendpd $1,%ymm3,%ymm13,%ymm13
+
+ vpermq $144,%ymm12,%ymm12
+ vpermq $3,%ymm11,%ymm3
+ vblendpd $1,%ymm3,%ymm12,%ymm12
+
+ vpermq $144,%ymm11,%ymm11
+ vpermq $3,%ymm2,%ymm3
+ vblendpd $1,%ymm3,%ymm11,%ymm11
+
+ vpermq $144,%ymm2,%ymm2
+ vpermq $3,%ymm1,%ymm3
+ vblendpd $1,%ymm3,%ymm2,%ymm2
+
+ vpermq $144,%ymm1,%ymm1
+ vpermq $3,%ymm0,%ymm3
+ vblendpd $1,%ymm3,%ymm1,%ymm1
+
+ vpermq $144,%ymm0,%ymm0
+ vpand .Lhigh64x3(%rip),%ymm0,%ymm0
+
+ vmovupd (%rsp),%ymm3
+ leaq 32(%rsp),%rsp
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+
+
+ vpaddq %ymm0,%ymm3,%ymm3
+ vpaddq %ymm1,%ymm4,%ymm4
+ vpaddq %ymm2,%ymm5,%ymm5
+ vpaddq %ymm11,%ymm6,%ymm6
+ vpaddq %ymm12,%ymm7,%ymm7
+ vpaddq %ymm13,%ymm8,%ymm8
+ vpaddq %ymm14,%ymm9,%ymm9
+ vpaddq %ymm15,%ymm10,%ymm10
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm1
+ vmovmskpd %ymm0,%r14d
+ vmovmskpd %ymm1,%r13d
+ shlb $4,%r13b
+ orb %r13b,%r14b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm2
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm11
+ vmovmskpd %ymm2,%r13d
+ vmovmskpd %ymm11,%r12d
+ shlb $4,%r12b
+ orb %r12b,%r13b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm12
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm12,%r12d
+ vmovmskpd %ymm13,%r11d
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm14
+ vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm15
+ vmovmskpd %ymm14,%r11d
+ vmovmskpd %ymm15,%r10d
+ shlb $4,%r10b
+ orb %r10b,%r11b
+
+ addb %r14b,%r14b
+ adcb %r13b,%r13b
+ adcb %r12b,%r12b
+ adcb %r11b,%r11b
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0
+ vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm1
+ vmovmskpd %ymm0,%r9d
+ vmovmskpd %ymm1,%r8d
+ shlb $4,%r8b
+ orb %r8b,%r9b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm2
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm11
+ vmovmskpd %ymm2,%r8d
+ vmovmskpd %ymm11,%edx
+ shlb $4,%dl
+ orb %dl,%r8b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm12
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm12,%edx
+ vmovmskpd %ymm13,%ecx
+ shlb $4,%cl
+ orb %cl,%dl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm14
+ vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm15
+ vmovmskpd %ymm14,%ecx
+ vmovmskpd %ymm15,%ebx
+ shlb $4,%bl
+ orb %bl,%cl
+
+ addb %r9b,%r14b
+ adcb %r8b,%r13b
+ adcb %dl,%r12b
+ adcb %cl,%r11b
+
+ xorb %r9b,%r14b
+ xorb %r8b,%r13b
+ xorb %dl,%r12b
+ xorb %cl,%r11b
+
+ leaq .Lkmasklut(%rip),%rdx
+
+ movb %r14b,%r10b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm0
+ shlq $5,%r14
+ vmovapd (%rdx,%r14,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm3,%ymm3
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm4,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm4,%ymm4
+
+ movb %r13b,%r10b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm0
+ shlq $5,%r13
+ vmovapd (%rdx,%r13,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm5,%ymm5
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm6,%ymm6
+
+ movb %r12b,%r10b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm0
+ shlq $5,%r12
+ vmovapd (%rdx,%r12,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm7,%ymm7
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm8,%ymm8
+
+ movb %r11b,%r10b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm9,%ymm0
+ shlq $5,%r11
+ vmovapd (%rdx,%r11,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm9,%ymm9
+
+ shrb $4,%r10b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm10,%ymm0
+ shlq $5,%r10
+ vmovapd (%rdx,%r10,1),%ymm2
+ vblendvpd %ymm2,%ymm0,%ymm10,%ymm10
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+
+ vmovdqu %ymm3,256(%rdi)
+ vmovdqu %ymm4,288(%rdi)
+ vmovdqu %ymm5,320(%rdi)
+ vmovdqu %ymm6,352(%rdi)
+ vmovdqu %ymm7,384(%rdi)
+ vmovdqu %ymm8,416(%rdi)
+ vmovdqu %ymm9,448(%rdi)
+ vmovdqu %ymm10,480(%rdi)
+
+ vzeroupper
+ leaq (%rsp),%rax
+.cfi_def_cfa_register %rax
+ movq 0(%rax),%r15
+.cfi_restore %r15
+ movq 8(%rax),%r14
+.cfi_restore %r14
+ movq 16(%rax),%r13
+.cfi_restore %r13
+ movq 24(%rax),%r12
+.cfi_restore %r12
+ movq 32(%rax),%rbp
+.cfi_restore %rbp
+ movq 40(%rax),%rbx
+.cfi_restore %rbx
+ leaq 48(%rax),%rsp
+.cfi_def_cfa %rsp,8
+.Lossl_rsaz_amm52x30_x2_avxifma256_epilogue:
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_rsaz_amm52x30_x2_avxifma256, .-ossl_rsaz_amm52x30_x2_avxifma256
+.text
+
+.align 32
+.globl ossl_extract_multiplier_2x30_win5_avx
+.type ossl_extract_multiplier_2x30_win5_avx,@function
+ossl_extract_multiplier_2x30_win5_avx:
+.cfi_startproc
+.byte 243,15,30,250
+ vmovapd .Lones(%rip),%ymm12
+ vmovq %rdx,%xmm8
+ vpbroadcastq %xmm8,%ymm10
+ vmovq %rcx,%xmm8
+ vpbroadcastq %xmm8,%ymm11
+ leaq 16384(%rsi),%rax
+
+
+ vpxor %xmm0,%xmm0,%xmm0
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm1
+ vmovapd %ymm0,%ymm2
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+
+.align 32
+.Lloop:
+ vpcmpeqq %ymm9,%ymm10,%ymm13
+ vmovdqu 0(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm0,%ymm0
+ vmovdqu 32(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm1,%ymm1
+ vmovdqu 64(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm2,%ymm2
+ vmovdqu 96(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm3,%ymm3
+ vmovdqu 128(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm4,%ymm4
+ vmovdqu 160(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm5,%ymm5
+ vmovdqu 192(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm6,%ymm6
+ vmovdqu 224(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm7,%ymm7
+ vpaddq %ymm12,%ymm9,%ymm9
+ addq $512,%rsi
+ cmpq %rsi,%rax
+ jne .Lloop
+ vmovdqu %ymm0,0(%rdi)
+ vmovdqu %ymm1,32(%rdi)
+ vmovdqu %ymm2,64(%rdi)
+ vmovdqu %ymm3,96(%rdi)
+ vmovdqu %ymm4,128(%rdi)
+ vmovdqu %ymm5,160(%rdi)
+ vmovdqu %ymm6,192(%rdi)
+ vmovdqu %ymm7,224(%rdi)
+ leaq -16384(%rax),%rsi
+
+
+ vpxor %xmm0,%xmm0,%xmm0
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm0
+ vmovapd %ymm0,%ymm1
+ vmovapd %ymm0,%ymm2
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+
+.align 32
+.Lloop_8_15:
+ vpcmpeqq %ymm9,%ymm11,%ymm13
+ vmovdqu 256(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm0,%ymm0
+ vmovdqu 288(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm1,%ymm1
+ vmovdqu 320(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm2,%ymm2
+ vmovdqu 352(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm3,%ymm3
+ vmovdqu 384(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm4,%ymm4
+ vmovdqu 416(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm5,%ymm5
+ vmovdqu 448(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm6,%ymm6
+ vmovdqu 480(%rsi),%ymm8
+
+ vblendvpd %ymm13,%ymm8,%ymm7,%ymm7
+ vpaddq %ymm12,%ymm9,%ymm9
+ addq $512,%rsi
+ cmpq %rsi,%rax
+ jne .Lloop_8_15
+ vmovdqu %ymm0,256(%rdi)
+ vmovdqu %ymm1,288(%rdi)
+ vmovdqu %ymm2,320(%rdi)
+ vmovdqu %ymm3,352(%rdi)
+ vmovdqu %ymm4,384(%rdi)
+ vmovdqu %ymm5,416(%rdi)
+ vmovdqu %ymm6,448(%rdi)
+ vmovdqu %ymm7,480(%rdi)
+
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_extract_multiplier_2x30_win5_avx, .-ossl_extract_multiplier_2x30_win5_avx
+.section .rodata
+.align 32
+.Lones:
+.quad 1,1,1,1
+.Lzeros:
+.quad 0,0,0,0
+ .section ".note.gnu.property", "a"
+ .p2align 3
+ .long 1f - 0f
+ .long 4f - 1f
+ .long 5
+0:
+ # "GNU" encoded with .byte, since .asciz isn't supported
+ # on Solaris.
+ .byte 0x47
+ .byte 0x4e
+ .byte 0x55
+ .byte 0
+1:
+ .p2align 3
+ .long 0xc0000002
+ .long 3f - 2f
+2:
+ .long 3
+3:
+ .p2align 3
+4:
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s
new file mode 100644
index 0000000..5b5a897
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s
@@ -0,0 +1,1922 @@
+.text
+
+.globl ossl_rsaz_amm52x40_x1_avxifma256
+.type ossl_rsaz_amm52x40_x1_avxifma256,@function
+.align 32
+ossl_rsaz_amm52x40_x1_avxifma256:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbx
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbx,-16
+ pushq %rbp
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbp,-24
+ pushq %r12
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r12,-32
+ pushq %r13
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r13,-40
+ pushq %r14
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r14,-48
+ pushq %r15
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r15,-56
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm10
+ vmovapd %ymm0,%ymm11
+ vmovapd %ymm0,%ymm12
+
+ xorl %r9d,%r9d
+
+ movq %rdx,%r11
+ movq $0xfffffffffffff,%rax
+
+
+ movl $10,%ebx
+
+.align 32
+.Lloop10:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -328(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ vmovdqu %ymm11,256(%rsp)
+ vmovdqu %ymm12,288(%rsp)
+ movq $0,320(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+ vmovdqu 264(%rsp),%ymm11
+ vmovdqu 296(%rsp),%ymm12
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12
+ leaq 328(%rsp),%rsp
+ movq 8(%r11),%r13
+
+ vpbroadcastq 8(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -328(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ vmovdqu %ymm11,256(%rsp)
+ vmovdqu %ymm12,288(%rsp)
+ movq $0,320(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+ vmovdqu 264(%rsp),%ymm11
+ vmovdqu 296(%rsp),%ymm12
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12
+ leaq 328(%rsp),%rsp
+ movq 16(%r11),%r13
+
+ vpbroadcastq 16(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -328(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ vmovdqu %ymm11,256(%rsp)
+ vmovdqu %ymm12,288(%rsp)
+ movq $0,320(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+ vmovdqu 264(%rsp),%ymm11
+ vmovdqu 296(%rsp),%ymm12
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12
+ leaq 328(%rsp),%rsp
+ movq 24(%r11),%r13
+
+ vpbroadcastq 24(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq %r8,%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -328(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ vmovdqu %ymm11,256(%rsp)
+ vmovdqu %ymm12,288(%rsp)
+ movq $0,320(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+ vmovdqu 264(%rsp),%ymm11
+ vmovdqu 296(%rsp),%ymm12
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12
+ leaq 328(%rsp),%rsp
+ leaq 32(%r11),%r11
+ decl %ebx
+ jne .Lloop10
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+ leaq -640(%rsp),%rsp
+ vmovupd %ymm3,0(%rsp)
+ vmovupd %ymm4,32(%rsp)
+ vmovupd %ymm5,64(%rsp)
+ vmovupd %ymm6,96(%rsp)
+ vmovupd %ymm7,128(%rsp)
+ vmovupd %ymm8,160(%rsp)
+ vmovupd %ymm9,192(%rsp)
+ vmovupd %ymm10,224(%rsp)
+ vmovupd %ymm11,256(%rsp)
+ vmovupd %ymm12,288(%rsp)
+
+
+
+ vpsrlq $52,%ymm3,%ymm3
+ vpsrlq $52,%ymm4,%ymm4
+ vpsrlq $52,%ymm5,%ymm5
+ vpsrlq $52,%ymm6,%ymm6
+ vpsrlq $52,%ymm7,%ymm7
+ vpsrlq $52,%ymm8,%ymm8
+ vpsrlq $52,%ymm9,%ymm9
+ vpsrlq $52,%ymm10,%ymm10
+ vpsrlq $52,%ymm11,%ymm11
+ vpsrlq $52,%ymm12,%ymm12
+
+
+ vpermq $144,%ymm12,%ymm12
+ vpermq $3,%ymm11,%ymm13
+ vblendpd $1,%ymm13,%ymm12,%ymm12
+
+ vpermq $144,%ymm11,%ymm11
+ vpermq $3,%ymm10,%ymm13
+ vblendpd $1,%ymm13,%ymm11,%ymm11
+
+ vpermq $144,%ymm10,%ymm10
+ vpermq $3,%ymm9,%ymm13
+ vblendpd $1,%ymm13,%ymm10,%ymm10
+
+ vpermq $144,%ymm9,%ymm9
+ vpermq $3,%ymm8,%ymm13
+ vblendpd $1,%ymm13,%ymm9,%ymm9
+
+ vpermq $144,%ymm8,%ymm8
+ vpermq $3,%ymm7,%ymm13
+ vblendpd $1,%ymm13,%ymm8,%ymm8
+
+ vpermq $144,%ymm7,%ymm7
+ vpermq $3,%ymm6,%ymm13
+ vblendpd $1,%ymm13,%ymm7,%ymm7
+
+ vpermq $144,%ymm6,%ymm6
+ vpermq $3,%ymm5,%ymm13
+ vblendpd $1,%ymm13,%ymm6,%ymm6
+
+ vpermq $144,%ymm5,%ymm5
+ vpermq $3,%ymm4,%ymm13
+ vblendpd $1,%ymm13,%ymm5,%ymm5
+
+ vpermq $144,%ymm4,%ymm4
+ vpermq $3,%ymm3,%ymm13
+ vblendpd $1,%ymm13,%ymm4,%ymm4
+
+ vpermq $144,%ymm3,%ymm3
+ vpand .Lhigh64x3(%rip),%ymm3,%ymm3
+
+ vmovupd %ymm3,320(%rsp)
+ vmovupd %ymm4,352(%rsp)
+ vmovupd %ymm5,384(%rsp)
+ vmovupd %ymm6,416(%rsp)
+ vmovupd %ymm7,448(%rsp)
+ vmovupd %ymm8,480(%rsp)
+ vmovupd %ymm9,512(%rsp)
+ vmovupd %ymm10,544(%rsp)
+ vmovupd %ymm11,576(%rsp)
+ vmovupd %ymm12,608(%rsp)
+
+ vmovupd 0(%rsp),%ymm3
+ vmovupd 32(%rsp),%ymm4
+ vmovupd 64(%rsp),%ymm5
+ vmovupd 96(%rsp),%ymm6
+ vmovupd 128(%rsp),%ymm7
+ vmovupd 160(%rsp),%ymm8
+ vmovupd 192(%rsp),%ymm9
+ vmovupd 224(%rsp),%ymm10
+ vmovupd 256(%rsp),%ymm11
+ vmovupd 288(%rsp),%ymm12
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+
+ vpaddq 320(%rsp),%ymm3,%ymm3
+ vpaddq 352(%rsp),%ymm4,%ymm4
+ vpaddq 384(%rsp),%ymm5,%ymm5
+ vpaddq 416(%rsp),%ymm6,%ymm6
+ vpaddq 448(%rsp),%ymm7,%ymm7
+ vpaddq 480(%rsp),%ymm8,%ymm8
+ vpaddq 512(%rsp),%ymm9,%ymm9
+ vpaddq 544(%rsp),%ymm10,%ymm10
+ vpaddq 576(%rsp),%ymm11,%ymm11
+ vpaddq 608(%rsp),%ymm12,%ymm12
+
+ leaq 640(%rsp),%rsp
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm13
+ vmovmskpd %ymm13,%r14d
+ vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm13
+ vmovmskpd %ymm13,%r13d
+ shlb $4,%r13b
+ orb %r13b,%r14b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm13
+ vmovmskpd %ymm13,%r13d
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm13
+ vmovmskpd %ymm13,%r12d
+ shlb $4,%r12b
+ orb %r12b,%r13b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13
+ vmovmskpd %ymm13,%r12d
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm13,%r11d
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm13
+ vmovmskpd %ymm13,%r11d
+ vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm13
+ vmovmskpd %ymm13,%r10d
+ shlb $4,%r10b
+ orb %r10b,%r11b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13
+ vmovmskpd %ymm13,%r10d
+ vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm13
+ vmovmskpd %ymm13,%r9d
+ shlb $4,%r9b
+ orb %r9b,%r10b
+
+ addb %r14b,%r14b
+ adcb %r13b,%r13b
+ adcb %r12b,%r12b
+ adcb %r11b,%r11b
+ adcb %r10b,%r10b
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm13
+ vmovmskpd %ymm13,%r9d
+ vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm13
+ vmovmskpd %ymm13,%r8d
+ shlb $4,%r8b
+ orb %r8b,%r9b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm13
+ vmovmskpd %ymm13,%r8d
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm13
+ vmovmskpd %ymm13,%edx
+ shlb $4,%dl
+ orb %dl,%r8b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13
+ vmovmskpd %ymm13,%edx
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm13,%ecx
+ shlb $4,%cl
+ orb %cl,%dl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm13
+ vmovmskpd %ymm13,%ecx
+ vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm13
+ vmovmskpd %ymm13,%ebx
+ shlb $4,%bl
+ orb %bl,%cl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13
+ vmovmskpd %ymm13,%ebx
+ vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm13
+ vmovmskpd %ymm13,%eax
+ shlb $4,%al
+ orb %al,%bl
+
+ addb %r9b,%r14b
+ adcb %r8b,%r13b
+ adcb %dl,%r12b
+ adcb %cl,%r11b
+ adcb %bl,%r10b
+
+ xorb %r9b,%r14b
+ xorb %r8b,%r13b
+ xorb %dl,%r12b
+ xorb %cl,%r11b
+ xorb %bl,%r10b
+
+ pushq %r9
+ pushq %r8
+
+ leaq .Lkmasklut(%rip),%r8
+
+ movb %r14b,%r9b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm13
+ shlq $5,%r14
+ vmovapd (%r8,%r14,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm3,%ymm3
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm4,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm4,%ymm4
+
+ movb %r13b,%r9b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm13
+ shlq $5,%r13
+ vmovapd (%r8,%r13,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm5,%ymm5
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm6,%ymm6
+
+ movb %r12b,%r9b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm13
+ shlq $5,%r12
+ vmovapd (%r8,%r12,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm7,%ymm7
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm8,%ymm8
+
+ movb %r11b,%r9b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm9,%ymm13
+ shlq $5,%r11
+ vmovapd (%r8,%r11,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm9,%ymm9
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm10,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm10,%ymm10
+
+ movb %r10b,%r9b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm11,%ymm13
+ shlq $5,%r10
+ vmovapd (%r8,%r10,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm11,%ymm11
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm12,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm12,%ymm12
+
+ popq %r8
+ popq %r9
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+ vmovdqu %ymm3,0(%rdi)
+ vmovdqu %ymm4,32(%rdi)
+ vmovdqu %ymm5,64(%rdi)
+ vmovdqu %ymm6,96(%rdi)
+ vmovdqu %ymm7,128(%rdi)
+ vmovdqu %ymm8,160(%rdi)
+ vmovdqu %ymm9,192(%rdi)
+ vmovdqu %ymm10,224(%rdi)
+ vmovdqu %ymm11,256(%rdi)
+ vmovdqu %ymm12,288(%rdi)
+
+ vzeroupper
+ leaq (%rsp),%rax
+.cfi_def_cfa_register %rax
+ movq 0(%rax),%r15
+.cfi_restore %r15
+ movq 8(%rax),%r14
+.cfi_restore %r14
+ movq 16(%rax),%r13
+.cfi_restore %r13
+ movq 24(%rax),%r12
+.cfi_restore %r12
+ movq 32(%rax),%rbp
+.cfi_restore %rbp
+ movq 40(%rax),%rbx
+.cfi_restore %rbx
+ leaq 48(%rax),%rsp
+.cfi_def_cfa %rsp,8
+.Lossl_rsaz_amm52x40_x1_avxifma256_epilogue:
+
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_rsaz_amm52x40_x1_avxifma256, .-ossl_rsaz_amm52x40_x1_avxifma256
+.section .rodata
+.align 32
+.Lmask52x4:
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.quad 0xfffffffffffff
+.Lhigh64x3:
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.Lkmasklut:
+
+.quad 0x0
+.quad 0x0
+.quad 0x0
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+.quad 0x0
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+
+.quad 0x0
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0x0
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.quad 0xffffffffffffffff
+.text
+
+.globl ossl_rsaz_amm52x40_x2_avxifma256
+.type ossl_rsaz_amm52x40_x2_avxifma256,@function
+.align 32
+ossl_rsaz_amm52x40_x2_avxifma256:
+.cfi_startproc
+.byte 243,15,30,250
+ pushq %rbx
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbx,-16
+ pushq %rbp
+.cfi_adjust_cfa_offset 8
+.cfi_offset %rbp,-24
+ pushq %r12
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r12,-32
+ pushq %r13
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r13,-40
+ pushq %r14
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r14,-48
+ pushq %r15
+.cfi_adjust_cfa_offset 8
+.cfi_offset %r15,-56
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm10
+ vmovapd %ymm0,%ymm11
+ vmovapd %ymm0,%ymm12
+
+ xorl %r9d,%r9d
+
+ movq %rdx,%r11
+ movq $0xfffffffffffff,%rax
+
+ movl $40,%ebx
+
+.align 32
+.Lloop40:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 0(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq (%r8),%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 0(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -328(%rsp),%rsp
+
+{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ vmovdqu %ymm11,256(%rsp)
+ vmovdqu %ymm12,288(%rsp)
+ movq $0,320(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+ vmovdqu 264(%rsp),%ymm11
+ vmovdqu 296(%rsp),%ymm12
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10
+{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11
+{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10
+{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11
+{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12
+ leaq 328(%rsp),%rsp
+ leaq 8(%r11),%r11
+ decl %ebx
+ jne .Lloop40
+
+ pushq %r11
+ pushq %rsi
+ pushq %rcx
+ pushq %r8
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+ leaq -640(%rsp),%rsp
+ vmovupd %ymm3,0(%rsp)
+ vmovupd %ymm4,32(%rsp)
+ vmovupd %ymm5,64(%rsp)
+ vmovupd %ymm6,96(%rsp)
+ vmovupd %ymm7,128(%rsp)
+ vmovupd %ymm8,160(%rsp)
+ vmovupd %ymm9,192(%rsp)
+ vmovupd %ymm10,224(%rsp)
+ vmovupd %ymm11,256(%rsp)
+ vmovupd %ymm12,288(%rsp)
+
+
+
+ vpsrlq $52,%ymm3,%ymm3
+ vpsrlq $52,%ymm4,%ymm4
+ vpsrlq $52,%ymm5,%ymm5
+ vpsrlq $52,%ymm6,%ymm6
+ vpsrlq $52,%ymm7,%ymm7
+ vpsrlq $52,%ymm8,%ymm8
+ vpsrlq $52,%ymm9,%ymm9
+ vpsrlq $52,%ymm10,%ymm10
+ vpsrlq $52,%ymm11,%ymm11
+ vpsrlq $52,%ymm12,%ymm12
+
+
+ vpermq $144,%ymm12,%ymm12
+ vpermq $3,%ymm11,%ymm13
+ vblendpd $1,%ymm13,%ymm12,%ymm12
+
+ vpermq $144,%ymm11,%ymm11
+ vpermq $3,%ymm10,%ymm13
+ vblendpd $1,%ymm13,%ymm11,%ymm11
+
+ vpermq $144,%ymm10,%ymm10
+ vpermq $3,%ymm9,%ymm13
+ vblendpd $1,%ymm13,%ymm10,%ymm10
+
+ vpermq $144,%ymm9,%ymm9
+ vpermq $3,%ymm8,%ymm13
+ vblendpd $1,%ymm13,%ymm9,%ymm9
+
+ vpermq $144,%ymm8,%ymm8
+ vpermq $3,%ymm7,%ymm13
+ vblendpd $1,%ymm13,%ymm8,%ymm8
+
+ vpermq $144,%ymm7,%ymm7
+ vpermq $3,%ymm6,%ymm13
+ vblendpd $1,%ymm13,%ymm7,%ymm7
+
+ vpermq $144,%ymm6,%ymm6
+ vpermq $3,%ymm5,%ymm13
+ vblendpd $1,%ymm13,%ymm6,%ymm6
+
+ vpermq $144,%ymm5,%ymm5
+ vpermq $3,%ymm4,%ymm13
+ vblendpd $1,%ymm13,%ymm5,%ymm5
+
+ vpermq $144,%ymm4,%ymm4
+ vpermq $3,%ymm3,%ymm13
+ vblendpd $1,%ymm13,%ymm4,%ymm4
+
+ vpermq $144,%ymm3,%ymm3
+ vpand .Lhigh64x3(%rip),%ymm3,%ymm3
+
+ vmovupd %ymm3,320(%rsp)
+ vmovupd %ymm4,352(%rsp)
+ vmovupd %ymm5,384(%rsp)
+ vmovupd %ymm6,416(%rsp)
+ vmovupd %ymm7,448(%rsp)
+ vmovupd %ymm8,480(%rsp)
+ vmovupd %ymm9,512(%rsp)
+ vmovupd %ymm10,544(%rsp)
+ vmovupd %ymm11,576(%rsp)
+ vmovupd %ymm12,608(%rsp)
+
+ vmovupd 0(%rsp),%ymm3
+ vmovupd 32(%rsp),%ymm4
+ vmovupd 64(%rsp),%ymm5
+ vmovupd 96(%rsp),%ymm6
+ vmovupd 128(%rsp),%ymm7
+ vmovupd 160(%rsp),%ymm8
+ vmovupd 192(%rsp),%ymm9
+ vmovupd 224(%rsp),%ymm10
+ vmovupd 256(%rsp),%ymm11
+ vmovupd 288(%rsp),%ymm12
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+
+ vpaddq 320(%rsp),%ymm3,%ymm3
+ vpaddq 352(%rsp),%ymm4,%ymm4
+ vpaddq 384(%rsp),%ymm5,%ymm5
+ vpaddq 416(%rsp),%ymm6,%ymm6
+ vpaddq 448(%rsp),%ymm7,%ymm7
+ vpaddq 480(%rsp),%ymm8,%ymm8
+ vpaddq 512(%rsp),%ymm9,%ymm9
+ vpaddq 544(%rsp),%ymm10,%ymm10
+ vpaddq 576(%rsp),%ymm11,%ymm11
+ vpaddq 608(%rsp),%ymm12,%ymm12
+
+ leaq 640(%rsp),%rsp
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm13
+ vmovmskpd %ymm13,%r14d
+ vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm13
+ vmovmskpd %ymm13,%r13d
+ shlb $4,%r13b
+ orb %r13b,%r14b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm13
+ vmovmskpd %ymm13,%r13d
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm13
+ vmovmskpd %ymm13,%r12d
+ shlb $4,%r12b
+ orb %r12b,%r13b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13
+ vmovmskpd %ymm13,%r12d
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm13,%r11d
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm13
+ vmovmskpd %ymm13,%r11d
+ vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm13
+ vmovmskpd %ymm13,%r10d
+ shlb $4,%r10b
+ orb %r10b,%r11b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13
+ vmovmskpd %ymm13,%r10d
+ vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm13
+ vmovmskpd %ymm13,%r9d
+ shlb $4,%r9b
+ orb %r9b,%r10b
+
+ addb %r14b,%r14b
+ adcb %r13b,%r13b
+ adcb %r12b,%r12b
+ adcb %r11b,%r11b
+ adcb %r10b,%r10b
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm13
+ vmovmskpd %ymm13,%r9d
+ vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm13
+ vmovmskpd %ymm13,%r8d
+ shlb $4,%r8b
+ orb %r8b,%r9b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm13
+ vmovmskpd %ymm13,%r8d
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm13
+ vmovmskpd %ymm13,%edx
+ shlb $4,%dl
+ orb %dl,%r8b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13
+ vmovmskpd %ymm13,%edx
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm13,%ecx
+ shlb $4,%cl
+ orb %cl,%dl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm13
+ vmovmskpd %ymm13,%ecx
+ vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm13
+ vmovmskpd %ymm13,%ebx
+ shlb $4,%bl
+ orb %bl,%cl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13
+ vmovmskpd %ymm13,%ebx
+ vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm13
+ vmovmskpd %ymm13,%eax
+ shlb $4,%al
+ orb %al,%bl
+
+ addb %r9b,%r14b
+ adcb %r8b,%r13b
+ adcb %dl,%r12b
+ adcb %cl,%r11b
+ adcb %bl,%r10b
+
+ xorb %r9b,%r14b
+ xorb %r8b,%r13b
+ xorb %dl,%r12b
+ xorb %cl,%r11b
+ xorb %bl,%r10b
+
+ pushq %r9
+ pushq %r8
+
+ leaq .Lkmasklut(%rip),%r8
+
+ movb %r14b,%r9b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm13
+ shlq $5,%r14
+ vmovapd (%r8,%r14,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm3,%ymm3
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm4,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm4,%ymm4
+
+ movb %r13b,%r9b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm13
+ shlq $5,%r13
+ vmovapd (%r8,%r13,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm5,%ymm5
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm6,%ymm6
+
+ movb %r12b,%r9b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm13
+ shlq $5,%r12
+ vmovapd (%r8,%r12,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm7,%ymm7
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm8,%ymm8
+
+ movb %r11b,%r9b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm9,%ymm13
+ shlq $5,%r11
+ vmovapd (%r8,%r11,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm9,%ymm9
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm10,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm10,%ymm10
+
+ movb %r10b,%r9b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm11,%ymm13
+ shlq $5,%r10
+ vmovapd (%r8,%r10,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm11,%ymm11
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm12,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm12,%ymm12
+
+ popq %r8
+ popq %r9
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+ popq %r8
+ popq %rcx
+ popq %rsi
+ popq %r11
+
+ vmovdqu %ymm3,0(%rdi)
+ vmovdqu %ymm4,32(%rdi)
+ vmovdqu %ymm5,64(%rdi)
+ vmovdqu %ymm6,96(%rdi)
+ vmovdqu %ymm7,128(%rdi)
+ vmovdqu %ymm8,160(%rdi)
+ vmovdqu %ymm9,192(%rdi)
+ vmovdqu %ymm10,224(%rdi)
+ vmovdqu %ymm11,256(%rdi)
+ vmovdqu %ymm12,288(%rdi)
+
+ xorl %r15d,%r15d
+
+ movq $0xfffffffffffff,%rax
+
+ movl $40,%ebx
+
+ vpxor %ymm0,%ymm0,%ymm0
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+ vmovapd %ymm0,%ymm10
+ vmovapd %ymm0,%ymm11
+ vmovapd %ymm0,%ymm12
+.align 32
+.Lloop40_1:
+ movq 0(%r11),%r13
+
+ vpbroadcastq 0(%r11),%ymm1
+ movq 320(%rsi),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ movq %r12,%r10
+ adcq $0,%r10
+
+ movq 8(%r8),%r13
+ imulq %r9,%r13
+ andq %rax,%r13
+
+ vmovq %r13,%xmm2
+ vpbroadcastq %xmm2,%ymm2
+ movq 320(%rcx),%rdx
+ mulxq %r13,%r13,%r12
+ addq %r13,%r9
+ adcq %r12,%r10
+
+ shrq $52,%r9
+ salq $12,%r10
+ orq %r10,%r9
+
+ leaq -328(%rsp),%rsp
+
+{vex} vpmadd52luq 320(%rsi),%ymm1,%ymm3
+{vex} vpmadd52luq 352(%rsi),%ymm1,%ymm4
+{vex} vpmadd52luq 384(%rsi),%ymm1,%ymm5
+{vex} vpmadd52luq 416(%rsi),%ymm1,%ymm6
+{vex} vpmadd52luq 448(%rsi),%ymm1,%ymm7
+{vex} vpmadd52luq 480(%rsi),%ymm1,%ymm8
+{vex} vpmadd52luq 512(%rsi),%ymm1,%ymm9
+{vex} vpmadd52luq 544(%rsi),%ymm1,%ymm10
+{vex} vpmadd52luq 576(%rsi),%ymm1,%ymm11
+{vex} vpmadd52luq 608(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52luq 320(%rcx),%ymm2,%ymm3
+{vex} vpmadd52luq 352(%rcx),%ymm2,%ymm4
+{vex} vpmadd52luq 384(%rcx),%ymm2,%ymm5
+{vex} vpmadd52luq 416(%rcx),%ymm2,%ymm6
+{vex} vpmadd52luq 448(%rcx),%ymm2,%ymm7
+{vex} vpmadd52luq 480(%rcx),%ymm2,%ymm8
+{vex} vpmadd52luq 512(%rcx),%ymm2,%ymm9
+{vex} vpmadd52luq 544(%rcx),%ymm2,%ymm10
+{vex} vpmadd52luq 576(%rcx),%ymm2,%ymm11
+{vex} vpmadd52luq 608(%rcx),%ymm2,%ymm12
+ vmovdqu %ymm3,0(%rsp)
+ vmovdqu %ymm4,32(%rsp)
+ vmovdqu %ymm5,64(%rsp)
+ vmovdqu %ymm6,96(%rsp)
+ vmovdqu %ymm7,128(%rsp)
+ vmovdqu %ymm8,160(%rsp)
+ vmovdqu %ymm9,192(%rsp)
+ vmovdqu %ymm10,224(%rsp)
+ vmovdqu %ymm11,256(%rsp)
+ vmovdqu %ymm12,288(%rsp)
+ movq $0,320(%rsp)
+
+ vmovdqu 8(%rsp),%ymm3
+ vmovdqu 40(%rsp),%ymm4
+ vmovdqu 72(%rsp),%ymm5
+ vmovdqu 104(%rsp),%ymm6
+ vmovdqu 136(%rsp),%ymm7
+ vmovdqu 168(%rsp),%ymm8
+ vmovdqu 200(%rsp),%ymm9
+ vmovdqu 232(%rsp),%ymm10
+ vmovdqu 264(%rsp),%ymm11
+ vmovdqu 296(%rsp),%ymm12
+
+ addq 8(%rsp),%r9
+
+{vex} vpmadd52huq 320(%rsi),%ymm1,%ymm3
+{vex} vpmadd52huq 352(%rsi),%ymm1,%ymm4
+{vex} vpmadd52huq 384(%rsi),%ymm1,%ymm5
+{vex} vpmadd52huq 416(%rsi),%ymm1,%ymm6
+{vex} vpmadd52huq 448(%rsi),%ymm1,%ymm7
+{vex} vpmadd52huq 480(%rsi),%ymm1,%ymm8
+{vex} vpmadd52huq 512(%rsi),%ymm1,%ymm9
+{vex} vpmadd52huq 544(%rsi),%ymm1,%ymm10
+{vex} vpmadd52huq 576(%rsi),%ymm1,%ymm11
+{vex} vpmadd52huq 608(%rsi),%ymm1,%ymm12
+
+{vex} vpmadd52huq 320(%rcx),%ymm2,%ymm3
+{vex} vpmadd52huq 352(%rcx),%ymm2,%ymm4
+{vex} vpmadd52huq 384(%rcx),%ymm2,%ymm5
+{vex} vpmadd52huq 416(%rcx),%ymm2,%ymm6
+{vex} vpmadd52huq 448(%rcx),%ymm2,%ymm7
+{vex} vpmadd52huq 480(%rcx),%ymm2,%ymm8
+{vex} vpmadd52huq 512(%rcx),%ymm2,%ymm9
+{vex} vpmadd52huq 544(%rcx),%ymm2,%ymm10
+{vex} vpmadd52huq 576(%rcx),%ymm2,%ymm11
+{vex} vpmadd52huq 608(%rcx),%ymm2,%ymm12
+ leaq 328(%rsp),%rsp
+ leaq 8(%r11),%r11
+ decl %ebx
+ jne .Lloop40_1
+
+ vmovq %r9,%xmm0
+ vpbroadcastq %xmm0,%ymm0
+ vpblendd $3,%ymm0,%ymm3,%ymm3
+
+ leaq -640(%rsp),%rsp
+ vmovupd %ymm3,0(%rsp)
+ vmovupd %ymm4,32(%rsp)
+ vmovupd %ymm5,64(%rsp)
+ vmovupd %ymm6,96(%rsp)
+ vmovupd %ymm7,128(%rsp)
+ vmovupd %ymm8,160(%rsp)
+ vmovupd %ymm9,192(%rsp)
+ vmovupd %ymm10,224(%rsp)
+ vmovupd %ymm11,256(%rsp)
+ vmovupd %ymm12,288(%rsp)
+
+
+
+ vpsrlq $52,%ymm3,%ymm3
+ vpsrlq $52,%ymm4,%ymm4
+ vpsrlq $52,%ymm5,%ymm5
+ vpsrlq $52,%ymm6,%ymm6
+ vpsrlq $52,%ymm7,%ymm7
+ vpsrlq $52,%ymm8,%ymm8
+ vpsrlq $52,%ymm9,%ymm9
+ vpsrlq $52,%ymm10,%ymm10
+ vpsrlq $52,%ymm11,%ymm11
+ vpsrlq $52,%ymm12,%ymm12
+
+
+ vpermq $144,%ymm12,%ymm12
+ vpermq $3,%ymm11,%ymm13
+ vblendpd $1,%ymm13,%ymm12,%ymm12
+
+ vpermq $144,%ymm11,%ymm11
+ vpermq $3,%ymm10,%ymm13
+ vblendpd $1,%ymm13,%ymm11,%ymm11
+
+ vpermq $144,%ymm10,%ymm10
+ vpermq $3,%ymm9,%ymm13
+ vblendpd $1,%ymm13,%ymm10,%ymm10
+
+ vpermq $144,%ymm9,%ymm9
+ vpermq $3,%ymm8,%ymm13
+ vblendpd $1,%ymm13,%ymm9,%ymm9
+
+ vpermq $144,%ymm8,%ymm8
+ vpermq $3,%ymm7,%ymm13
+ vblendpd $1,%ymm13,%ymm8,%ymm8
+
+ vpermq $144,%ymm7,%ymm7
+ vpermq $3,%ymm6,%ymm13
+ vblendpd $1,%ymm13,%ymm7,%ymm7
+
+ vpermq $144,%ymm6,%ymm6
+ vpermq $3,%ymm5,%ymm13
+ vblendpd $1,%ymm13,%ymm6,%ymm6
+
+ vpermq $144,%ymm5,%ymm5
+ vpermq $3,%ymm4,%ymm13
+ vblendpd $1,%ymm13,%ymm5,%ymm5
+
+ vpermq $144,%ymm4,%ymm4
+ vpermq $3,%ymm3,%ymm13
+ vblendpd $1,%ymm13,%ymm4,%ymm4
+
+ vpermq $144,%ymm3,%ymm3
+ vpand .Lhigh64x3(%rip),%ymm3,%ymm3
+
+ vmovupd %ymm3,320(%rsp)
+ vmovupd %ymm4,352(%rsp)
+ vmovupd %ymm5,384(%rsp)
+ vmovupd %ymm6,416(%rsp)
+ vmovupd %ymm7,448(%rsp)
+ vmovupd %ymm8,480(%rsp)
+ vmovupd %ymm9,512(%rsp)
+ vmovupd %ymm10,544(%rsp)
+ vmovupd %ymm11,576(%rsp)
+ vmovupd %ymm12,608(%rsp)
+
+ vmovupd 0(%rsp),%ymm3
+ vmovupd 32(%rsp),%ymm4
+ vmovupd 64(%rsp),%ymm5
+ vmovupd 96(%rsp),%ymm6
+ vmovupd 128(%rsp),%ymm7
+ vmovupd 160(%rsp),%ymm8
+ vmovupd 192(%rsp),%ymm9
+ vmovupd 224(%rsp),%ymm10
+ vmovupd 256(%rsp),%ymm11
+ vmovupd 288(%rsp),%ymm12
+
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+
+ vpaddq 320(%rsp),%ymm3,%ymm3
+ vpaddq 352(%rsp),%ymm4,%ymm4
+ vpaddq 384(%rsp),%ymm5,%ymm5
+ vpaddq 416(%rsp),%ymm6,%ymm6
+ vpaddq 448(%rsp),%ymm7,%ymm7
+ vpaddq 480(%rsp),%ymm8,%ymm8
+ vpaddq 512(%rsp),%ymm9,%ymm9
+ vpaddq 544(%rsp),%ymm10,%ymm10
+ vpaddq 576(%rsp),%ymm11,%ymm11
+ vpaddq 608(%rsp),%ymm12,%ymm12
+
+ leaq 640(%rsp),%rsp
+
+
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm13
+ vmovmskpd %ymm13,%r14d
+ vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm13
+ vmovmskpd %ymm13,%r13d
+ shlb $4,%r13b
+ orb %r13b,%r14b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm13
+ vmovmskpd %ymm13,%r13d
+ vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm13
+ vmovmskpd %ymm13,%r12d
+ shlb $4,%r12b
+ orb %r12b,%r13b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13
+ vmovmskpd %ymm13,%r12d
+ vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm13,%r11d
+ shlb $4,%r11b
+ orb %r11b,%r12b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm13
+ vmovmskpd %ymm13,%r11d
+ vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm13
+ vmovmskpd %ymm13,%r10d
+ shlb $4,%r10b
+ orb %r10b,%r11b
+
+ vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13
+ vmovmskpd %ymm13,%r10d
+ vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm13
+ vmovmskpd %ymm13,%r9d
+ shlb $4,%r9b
+ orb %r9b,%r10b
+
+ addb %r14b,%r14b
+ adcb %r13b,%r13b
+ adcb %r12b,%r12b
+ adcb %r11b,%r11b
+ adcb %r10b,%r10b
+
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm13
+ vmovmskpd %ymm13,%r9d
+ vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm13
+ vmovmskpd %ymm13,%r8d
+ shlb $4,%r8b
+ orb %r8b,%r9b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm13
+ vmovmskpd %ymm13,%r8d
+ vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm13
+ vmovmskpd %ymm13,%edx
+ shlb $4,%dl
+ orb %dl,%r8b
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13
+ vmovmskpd %ymm13,%edx
+ vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13
+ vmovmskpd %ymm13,%ecx
+ shlb $4,%cl
+ orb %cl,%dl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm13
+ vmovmskpd %ymm13,%ecx
+ vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm13
+ vmovmskpd %ymm13,%ebx
+ shlb $4,%bl
+ orb %bl,%cl
+
+ vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13
+ vmovmskpd %ymm13,%ebx
+ vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm13
+ vmovmskpd %ymm13,%eax
+ shlb $4,%al
+ orb %al,%bl
+
+ addb %r9b,%r14b
+ adcb %r8b,%r13b
+ adcb %dl,%r12b
+ adcb %cl,%r11b
+ adcb %bl,%r10b
+
+ xorb %r9b,%r14b
+ xorb %r8b,%r13b
+ xorb %dl,%r12b
+ xorb %cl,%r11b
+ xorb %bl,%r10b
+
+ pushq %r9
+ pushq %r8
+
+ leaq .Lkmasklut(%rip),%r8
+
+ movb %r14b,%r9b
+ andq $0xf,%r14
+ vpsubq .Lmask52x4(%rip),%ymm3,%ymm13
+ shlq $5,%r14
+ vmovapd (%r8,%r14,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm3,%ymm3
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm4,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm4,%ymm4
+
+ movb %r13b,%r9b
+ andq $0xf,%r13
+ vpsubq .Lmask52x4(%rip),%ymm5,%ymm13
+ shlq $5,%r13
+ vmovapd (%r8,%r13,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm5,%ymm5
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm6,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm6,%ymm6
+
+ movb %r12b,%r9b
+ andq $0xf,%r12
+ vpsubq .Lmask52x4(%rip),%ymm7,%ymm13
+ shlq $5,%r12
+ vmovapd (%r8,%r12,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm7,%ymm7
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm8,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm8,%ymm8
+
+ movb %r11b,%r9b
+ andq $0xf,%r11
+ vpsubq .Lmask52x4(%rip),%ymm9,%ymm13
+ shlq $5,%r11
+ vmovapd (%r8,%r11,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm9,%ymm9
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm10,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm10,%ymm10
+
+ movb %r10b,%r9b
+ andq $0xf,%r10
+ vpsubq .Lmask52x4(%rip),%ymm11,%ymm13
+ shlq $5,%r10
+ vmovapd (%r8,%r10,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm11,%ymm11
+
+ shrb $4,%r9b
+ andq $0xf,%r9
+ vpsubq .Lmask52x4(%rip),%ymm12,%ymm13
+ shlq $5,%r9
+ vmovapd (%r8,%r9,1),%ymm14
+ vblendvpd %ymm14,%ymm13,%ymm12,%ymm12
+
+ popq %r8
+ popq %r9
+
+ vpand .Lmask52x4(%rip),%ymm3,%ymm3
+ vpand .Lmask52x4(%rip),%ymm4,%ymm4
+ vpand .Lmask52x4(%rip),%ymm5,%ymm5
+ vpand .Lmask52x4(%rip),%ymm6,%ymm6
+ vpand .Lmask52x4(%rip),%ymm7,%ymm7
+ vpand .Lmask52x4(%rip),%ymm8,%ymm8
+ vpand .Lmask52x4(%rip),%ymm9,%ymm9
+
+ vpand .Lmask52x4(%rip),%ymm10,%ymm10
+ vpand .Lmask52x4(%rip),%ymm11,%ymm11
+ vpand .Lmask52x4(%rip),%ymm12,%ymm12
+
+ vmovdqu %ymm3,320(%rdi)
+ vmovdqu %ymm4,352(%rdi)
+ vmovdqu %ymm5,384(%rdi)
+ vmovdqu %ymm6,416(%rdi)
+ vmovdqu %ymm7,448(%rdi)
+ vmovdqu %ymm8,480(%rdi)
+ vmovdqu %ymm9,512(%rdi)
+ vmovdqu %ymm10,544(%rdi)
+ vmovdqu %ymm11,576(%rdi)
+ vmovdqu %ymm12,608(%rdi)
+
+ vzeroupper
+ leaq (%rsp),%rax
+.cfi_def_cfa_register %rax
+ movq 0(%rax),%r15
+.cfi_restore %r15
+ movq 8(%rax),%r14
+.cfi_restore %r14
+ movq 16(%rax),%r13
+.cfi_restore %r13
+ movq 24(%rax),%r12
+.cfi_restore %r12
+ movq 32(%rax),%rbp
+.cfi_restore %rbp
+ movq 40(%rax),%rbx
+.cfi_restore %rbx
+ leaq 48(%rax),%rsp
+.cfi_def_cfa %rsp,8
+.Lossl_rsaz_amm52x40_x2_avxifma256_epilogue:
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_rsaz_amm52x40_x2_avxifma256, .-ossl_rsaz_amm52x40_x2_avxifma256
+.text
+
+.align 32
+.globl ossl_extract_multiplier_2x40_win5_avx
+.type ossl_extract_multiplier_2x40_win5_avx,@function
+ossl_extract_multiplier_2x40_win5_avx:
+.cfi_startproc
+.byte 243,15,30,250
+ vmovapd .Lones(%rip),%ymm14
+ vmovq %rdx,%xmm10
+ vpbroadcastq %xmm10,%ymm12
+ vmovq %rcx,%xmm10
+ vpbroadcastq %xmm10,%ymm13
+ leaq 20480(%rsi),%rax
+
+
+ movq %rsi,%r10
+
+
+ vpxor %xmm0,%xmm0,%xmm0
+ vmovapd %ymm0,%ymm1
+ vmovapd %ymm0,%ymm2
+ vmovapd %ymm0,%ymm3
+ vmovapd %ymm0,%ymm4
+ vmovapd %ymm0,%ymm5
+ vmovapd %ymm0,%ymm6
+ vmovapd %ymm0,%ymm7
+ vmovapd %ymm0,%ymm8
+ vmovapd %ymm0,%ymm9
+ vpxor %ymm11,%ymm11,%ymm11
+.align 32
+.Lloop_0:
+ vpcmpeqq %ymm11,%ymm12,%ymm15
+ vmovdqu 0(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm0,%ymm0
+ vmovdqu 32(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm1,%ymm1
+ vmovdqu 64(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm2,%ymm2
+ vmovdqu 96(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm3,%ymm3
+ vmovdqu 128(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm4,%ymm4
+ vmovdqu 160(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm5,%ymm5
+ vmovdqu 192(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm6,%ymm6
+ vmovdqu 224(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm7,%ymm7
+ vmovdqu 256(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm8,%ymm8
+ vmovdqu 288(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm9,%ymm9
+ vpaddq %ymm14,%ymm11,%ymm11
+ addq $640,%rsi
+ cmpq %rsi,%rax
+ jne .Lloop_0
+ vmovdqu %ymm0,0(%rdi)
+ vmovdqu %ymm1,32(%rdi)
+ vmovdqu %ymm2,64(%rdi)
+ vmovdqu %ymm3,96(%rdi)
+ vmovdqu %ymm4,128(%rdi)
+ vmovdqu %ymm5,160(%rdi)
+ vmovdqu %ymm6,192(%rdi)
+ vmovdqu %ymm7,224(%rdi)
+ vmovdqu %ymm8,256(%rdi)
+ vmovdqu %ymm9,288(%rdi)
+ movq %r10,%rsi
+ vpxor %ymm11,%ymm11,%ymm11
+.align 32
+.Lloop_320:
+ vpcmpeqq %ymm11,%ymm13,%ymm15
+ vmovdqu 320(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm0,%ymm0
+ vmovdqu 352(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm1,%ymm1
+ vmovdqu 384(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm2,%ymm2
+ vmovdqu 416(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm3,%ymm3
+ vmovdqu 448(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm4,%ymm4
+ vmovdqu 480(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm5,%ymm5
+ vmovdqu 512(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm6,%ymm6
+ vmovdqu 544(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm7,%ymm7
+ vmovdqu 576(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm8,%ymm8
+ vmovdqu 608(%rsi),%ymm10
+
+ vblendvpd %ymm15,%ymm10,%ymm9,%ymm9
+ vpaddq %ymm14,%ymm11,%ymm11
+ addq $640,%rsi
+ cmpq %rsi,%rax
+ jne .Lloop_320
+ vmovdqu %ymm0,320(%rdi)
+ vmovdqu %ymm1,352(%rdi)
+ vmovdqu %ymm2,384(%rdi)
+ vmovdqu %ymm3,416(%rdi)
+ vmovdqu %ymm4,448(%rdi)
+ vmovdqu %ymm5,480(%rdi)
+ vmovdqu %ymm6,512(%rdi)
+ vmovdqu %ymm7,544(%rdi)
+ vmovdqu %ymm8,576(%rdi)
+ vmovdqu %ymm9,608(%rdi)
+
+ .byte 0xf3,0xc3
+.cfi_endproc
+.size ossl_extract_multiplier_2x40_win5_avx, .-ossl_extract_multiplier_2x40_win5_avx
+.section .rodata
+.align 32
+.Lones:
+.quad 1,1,1,1
+.Lzeros:
+.quad 0,0,0,0
+ .section ".note.gnu.property", "a"
+ .p2align 3
+ .long 1f - 0f
+ .long 4f - 1f
+ .long 5
+0:
+ # "GNU" encoded with .byte, since .asciz isn't supported
+ # on Solaris.
+ .byte 0x47
+ .byte 0x4e
+ .byte 0x55
+ .byte 0
+1:
+ .p2align 3
+ .long 0xc0000002
+ .long 3f - 2f
+2:
+ .long 3
+3:
+ .p2align 3
+4:
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s
index 40bfc69..27a5a80 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s
@@ -201,7 +201,7 @@ ossl_md5_block_asm_data_order:
leal -165796510(%rax,%r10,1),%eax
andl %ecx,%r11d
movl 24(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%eax
movl %ecx,%r11d
addl %r12d,%eax
movl %ecx,%r12d
@@ -212,7 +212,7 @@ ossl_md5_block_asm_data_order:
leal -1069501632(%rdx,%r10,1),%edx
andl %ebx,%r11d
movl 44(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%edx
movl %ebx,%r11d
addl %r12d,%edx
movl %ebx,%r12d
@@ -223,7 +223,7 @@ ossl_md5_block_asm_data_order:
leal 643717713(%rcx,%r10,1),%ecx
andl %eax,%r11d
movl 0(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ecx
movl %eax,%r11d
addl %r12d,%ecx
movl %eax,%r12d
@@ -234,7 +234,7 @@ ossl_md5_block_asm_data_order:
leal -373897302(%rbx,%r10,1),%ebx
andl %edx,%r11d
movl 20(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ebx
movl %edx,%r11d
addl %r12d,%ebx
movl %edx,%r12d
@@ -245,7 +245,7 @@ ossl_md5_block_asm_data_order:
leal -701558691(%rax,%r10,1),%eax
andl %ecx,%r11d
movl 40(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%eax
movl %ecx,%r11d
addl %r12d,%eax
movl %ecx,%r12d
@@ -256,7 +256,7 @@ ossl_md5_block_asm_data_order:
leal 38016083(%rdx,%r10,1),%edx
andl %ebx,%r11d
movl 60(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%edx
movl %ebx,%r11d
addl %r12d,%edx
movl %ebx,%r12d
@@ -267,7 +267,7 @@ ossl_md5_block_asm_data_order:
leal -660478335(%rcx,%r10,1),%ecx
andl %eax,%r11d
movl 16(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ecx
movl %eax,%r11d
addl %r12d,%ecx
movl %eax,%r12d
@@ -278,7 +278,7 @@ ossl_md5_block_asm_data_order:
leal -405537848(%rbx,%r10,1),%ebx
andl %edx,%r11d
movl 36(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ebx
movl %edx,%r11d
addl %r12d,%ebx
movl %edx,%r12d
@@ -289,7 +289,7 @@ ossl_md5_block_asm_data_order:
leal 568446438(%rax,%r10,1),%eax
andl %ecx,%r11d
movl 56(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%eax
movl %ecx,%r11d
addl %r12d,%eax
movl %ecx,%r12d
@@ -300,7 +300,7 @@ ossl_md5_block_asm_data_order:
leal -1019803690(%rdx,%r10,1),%edx
andl %ebx,%r11d
movl 12(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%edx
movl %ebx,%r11d
addl %r12d,%edx
movl %ebx,%r12d
@@ -311,7 +311,7 @@ ossl_md5_block_asm_data_order:
leal -187363961(%rcx,%r10,1),%ecx
andl %eax,%r11d
movl 32(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ecx
movl %eax,%r11d
addl %r12d,%ecx
movl %eax,%r12d
@@ -322,7 +322,7 @@ ossl_md5_block_asm_data_order:
leal 1163531501(%rbx,%r10,1),%ebx
andl %edx,%r11d
movl 52(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ebx
movl %edx,%r11d
addl %r12d,%ebx
movl %edx,%r12d
@@ -333,7 +333,7 @@ ossl_md5_block_asm_data_order:
leal -1444681467(%rax,%r10,1),%eax
andl %ecx,%r11d
movl 8(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%eax
movl %ecx,%r11d
addl %r12d,%eax
movl %ecx,%r12d
@@ -344,7 +344,7 @@ ossl_md5_block_asm_data_order:
leal -51403784(%rdx,%r10,1),%edx
andl %ebx,%r11d
movl 28(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%edx
movl %ebx,%r11d
addl %r12d,%edx
movl %ebx,%r12d
@@ -355,7 +355,7 @@ ossl_md5_block_asm_data_order:
leal 1735328473(%rcx,%r10,1),%ecx
andl %eax,%r11d
movl 48(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ecx
movl %eax,%r11d
addl %r12d,%ecx
movl %eax,%r12d
@@ -366,7 +366,7 @@ ossl_md5_block_asm_data_order:
leal -1926607734(%rbx,%r10,1),%ebx
andl %edx,%r11d
movl 20(%rsi),%r10d
- orl %r11d,%r12d
+ addl %r11d,%ebx
movl %edx,%r11d
addl %r12d,%ebx
movl %edx,%r12d
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s
index 5fda386..4fb26cc 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s
@@ -1,11 +1,11 @@
+
.hidden OPENSSL_cpuid_setup
.section .init
call OPENSSL_cpuid_setup
.hidden OPENSSL_ia32cap_P
-.comm OPENSSL_ia32cap_P,16,4
-
+.comm OPENSSL_ia32cap_P,40,4
.text
.globl OPENSSL_atomic_add
@@ -163,6 +163,7 @@ OPENSSL_ia32_cpuid:
movl $7,%eax
xorl %ecx,%ecx
cpuid
+ movd %eax,%xmm1
btl $26,%r9d
jc .Lnotknights
andl $0xfff7ffff,%ebx
@@ -173,9 +174,31 @@ OPENSSL_ia32_cpuid:
jne .Lnotskylakex
andl $0xfffeffff,%ebx
+
.Lnotskylakex:
movl %ebx,8(%rdi)
movl %ecx,12(%rdi)
+ movl %edx,16(%rdi)
+
+ movd %xmm1,%eax
+ cmpl $0x1,%eax
+ jb .Lno_extended_info
+ movl $0x7,%eax
+ movl $0x1,%ecx
+ cpuid
+ movl %eax,20(%rdi)
+ movl %edx,24(%rdi)
+ movl %ebx,28(%rdi)
+ movl %ecx,32(%rdi)
+
+ andl $0x80000,%edx
+ cmpl $0x0,%edx
+ je .Lno_extended_info
+ movl $0x24,%eax
+ movl $0x0,%ecx
+ cpuid
+ movl %ebx,36(%rdi)
+
.Lno_extended_info:
btl $27,%r9d
@@ -194,6 +217,9 @@ OPENSSL_ia32_cpuid:
cmpl $6,%eax
je .Ldone
.Lclear_avx:
+ andl $0xff7fffff,20(%rdi)
+
+
movl $0xefffe7ff,%eax
andl %eax,%r9d
movl $0x3fdeffdf,%eax
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm
new file mode 100644
index 0000000..cf6644f
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm
@@ -0,0 +1,8350 @@
+default rel
+%define XMMWORD
+%define YMMWORD
+%define ZMMWORD
+section .text code align=64
+
+EXTERN OPENSSL_ia32cap_P
+global aesni_xts_avx512_eligible
+
+ALIGN 32
+aesni_xts_avx512_eligible:
+ mov ecx,DWORD[((OPENSSL_ia32cap_P+8))]
+ xor eax,eax
+
+ and ecx,0xc0030000
+ cmp ecx,0xc0030000
+ jne NEAR $L$_done
+ mov ecx,DWORD[((OPENSSL_ia32cap_P+12))]
+
+ and ecx,0x640
+ cmp ecx,0x640
+ cmove eax,ecx
+$L$_done:
+ DB 0F3h,0C3h ;repret
+
+global aesni_xts_128_encrypt_avx512
+
+
+ALIGN 32
+aesni_xts_128_encrypt_avx512:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_aesni_xts_128_encrypt_avx512:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+ mov r9,QWORD[48+rsp]
+
+
+
+DB 243,15,30,250
+ push rbp
+ mov rbp,rsp
+ sub rsp,312
+ and rsp,0xffffffffffffffc0
+ mov QWORD[288+rsp],rbx
+ mov QWORD[((288 + 8))+rsp],rdi
+ mov QWORD[((288 + 16))+rsp],rsi
+ vmovdqa XMMWORD[(128 + 0)+rsp],xmm6
+ vmovdqa XMMWORD[(128 + 16)+rsp],xmm7
+ vmovdqa XMMWORD[(128 + 32)+rsp],xmm8
+ vmovdqa XMMWORD[(128 + 48)+rsp],xmm9
+ vmovdqa XMMWORD[(128 + 64)+rsp],xmm10
+ vmovdqa XMMWORD[(128 + 80)+rsp],xmm11
+ vmovdqa XMMWORD[(128 + 96)+rsp],xmm12
+ vmovdqa XMMWORD[(128 + 112)+rsp],xmm13
+ vmovdqa XMMWORD[(128 + 128)+rsp],xmm14
+ vmovdqa XMMWORD[(128 + 144)+rsp],xmm15
+ mov r10,0x87
+ vmovdqu xmm1,XMMWORD[r9]
+ vpxor xmm1,xmm1,XMMWORD[r8]
+ vaesenc xmm1,xmm1,XMMWORD[16+r8]
+ vaesenc xmm1,xmm1,XMMWORD[32+r8]
+ vaesenc xmm1,xmm1,XMMWORD[48+r8]
+ vaesenc xmm1,xmm1,XMMWORD[64+r8]
+ vaesenc xmm1,xmm1,XMMWORD[80+r8]
+ vaesenc xmm1,xmm1,XMMWORD[96+r8]
+ vaesenc xmm1,xmm1,XMMWORD[112+r8]
+ vaesenc xmm1,xmm1,XMMWORD[128+r8]
+ vaesenc xmm1,xmm1,XMMWORD[144+r8]
+ vaesenclast xmm1,xmm1,XMMWORD[160+r8]
+ vmovdqa XMMWORD[rsp],xmm1
+ mov QWORD[((8 + 40))+rbp],rdi
+ mov QWORD[((8 + 48))+rbp],rsi
+
+ cmp rdx,0x80
+ jl NEAR $L$_less_than_128_bytes_hEgxyDlCngwrfFe
+ vpbroadcastq zmm25,r10
+ cmp rdx,0x100
+ jge NEAR $L$_start_by16_hEgxyDlCngwrfFe
+ cmp rdx,0x80
+ jge NEAR $L$_start_by8_hEgxyDlCngwrfFe
+
+$L$_do_n_blocks_hEgxyDlCngwrfFe:
+ cmp rdx,0x0
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ cmp rdx,0x70
+ jge NEAR $L$_remaining_num_blocks_is_7_hEgxyDlCngwrfFe
+ cmp rdx,0x60
+ jge NEAR $L$_remaining_num_blocks_is_6_hEgxyDlCngwrfFe
+ cmp rdx,0x50
+ jge NEAR $L$_remaining_num_blocks_is_5_hEgxyDlCngwrfFe
+ cmp rdx,0x40
+ jge NEAR $L$_remaining_num_blocks_is_4_hEgxyDlCngwrfFe
+ cmp rdx,0x30
+ jge NEAR $L$_remaining_num_blocks_is_3_hEgxyDlCngwrfFe
+ cmp rdx,0x20
+ jge NEAR $L$_remaining_num_blocks_is_2_hEgxyDlCngwrfFe
+ cmp rdx,0x10
+ jge NEAR $L$_remaining_num_blocks_is_1_hEgxyDlCngwrfFe
+ vmovdqa xmm8,xmm0
+ vmovdqa xmm0,xmm9
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+
+$L$_remaining_num_blocks_is_7_hEgxyDlCngwrfFe:
+ mov r8,0x0000ffffffffffff
+ kmovq k1,r8
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2{k1},[64+rdi]
+ add rdi,0x70
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ add rsi,0x70
+ vextracti32x4 xmm8,zmm2,0x2
+ vextracti32x4 xmm0,zmm10,0x3
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+
+$L$_remaining_num_blocks_is_6_hEgxyDlCngwrfFe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 ymm2,YMMWORD[64+rdi]
+ add rdi,0x60
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ add rsi,0x60
+ vextracti32x4 xmm8,zmm2,0x1
+ vextracti32x4 xmm0,zmm10,0x2
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+
+$L$_remaining_num_blocks_is_5_hEgxyDlCngwrfFe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[64+rdi]
+ add rdi,0x50
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu XMMWORD[64+rsi],xmm2
+ add rsi,0x50
+ vmovdqa xmm8,xmm2
+ vextracti32x4 xmm0,zmm10,0x1
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+
+$L$_remaining_num_blocks_is_4_hEgxyDlCngwrfFe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ add rdi,0x40
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ add rsi,0x40
+ vextracti32x4 xmm8,zmm1,0x3
+ vmovdqa64 xmm0,xmm10
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_remaining_num_blocks_is_3_hEgxyDlCngwrfFe:
+ mov r8,-1
+ shr r8,0x10
+ kmovq k1,r8
+ vmovdqu8 zmm1{k1},[rdi]
+ add rdi,0x30
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi]{k1},zmm1
+ add rsi,0x30
+ vextracti32x4 xmm8,zmm1,0x2
+ vextracti32x4 xmm0,zmm9,0x3
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_remaining_num_blocks_is_2_hEgxyDlCngwrfFe:
+ vmovdqu8 ymm1,YMMWORD[rdi]
+ add rdi,0x20
+ vbroadcasti32x4 ymm0,YMMWORD[rcx]
+ vpternlogq ymm1,ymm9,ymm0,0x96
+ vbroadcasti32x4 ymm0,YMMWORD[16+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[32+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[48+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[64+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[80+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[96+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[112+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[128+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[144+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[160+rcx]
+ vaesenclast ymm1,ymm1,ymm0
+ vpxorq ymm1,ymm1,ymm9
+ vmovdqu YMMWORD[rsi],ymm1
+ add rsi,0x20
+ vextracti32x4 xmm8,zmm1,0x1
+ vextracti32x4 xmm0,zmm9,0x2
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_remaining_num_blocks_is_1_hEgxyDlCngwrfFe:
+ vmovdqu xmm1,XMMWORD[rdi]
+ add rdi,0x10
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm1,xmm1,XMMWORD[rcx]
+ vaesenc xmm1,xmm1,XMMWORD[16+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[32+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[48+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[64+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[80+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[96+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[112+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[128+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[144+rcx]
+ vaesenclast xmm1,xmm1,XMMWORD[160+rcx]
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x10
+ vmovdqa xmm8,xmm1
+ vextracti32x4 xmm0,zmm9,0x1
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+
+
+$L$_start_by16_hEgxyDlCngwrfFe:
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm11,zmm9,0x1
+ vpxord zmm11,zmm11,zmm14
+ vpsrldq zmm15,zmm10,0xf
+ vpclmulqdq zmm16,zmm15,zmm25,0x0
+ vpslldq zmm12,zmm10,0x1
+ vpxord zmm12,zmm12,zmm16
+
+$L$_main_loop_run_16_hEgxyDlCngwrfFe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ vmovdqu8 zmm3,ZMMWORD[128+rdi]
+ vmovdqu8 zmm4,ZMMWORD[192+rdi]
+ add rdi,0x100
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vpxorq zmm3,zmm3,zmm0
+ vpxorq zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm11,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm11,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm12,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm12,0x1
+ vpxord zmm16,zmm16,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm15,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm17,zmm15,0x1
+ vpxord zmm17,zmm17,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm16,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm18,zmm16,0x1
+ vpxord zmm18,zmm18,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vaesenclast zmm3,zmm3,zmm0
+ vaesenclast zmm4,zmm4,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqa32 zmm11,zmm17
+ vmovdqa32 zmm12,zmm18
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ vmovdqu8 ZMMWORD[128+rsi],zmm3
+ vmovdqu8 ZMMWORD[192+rsi],zmm4
+ add rsi,0x100
+ sub rdx,0x100
+ cmp rdx,0x100
+ jae NEAR $L$_main_loop_run_16_hEgxyDlCngwrfFe
+ cmp rdx,0x80
+ jae NEAR $L$_main_loop_run_8_hEgxyDlCngwrfFe
+ vextracti32x4 xmm0,zmm4,0x3
+ jmp NEAR $L$_do_n_blocks_hEgxyDlCngwrfFe
+
+$L$_start_by8_hEgxyDlCngwrfFe:
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+
+$L$_main_loop_run_8_hEgxyDlCngwrfFe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ add rdi,0x80
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm9,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vpsrldq zmm13,zmm10,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm10,0x1
+ vpxord zmm16,zmm16,zmm14
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ add rsi,0x80
+ sub rdx,0x80
+ cmp rdx,0x80
+ jae NEAR $L$_main_loop_run_8_hEgxyDlCngwrfFe
+ vextracti32x4 xmm0,zmm2,0x3
+ jmp NEAR $L$_do_n_blocks_hEgxyDlCngwrfFe
+
+$L$_steal_cipher_hEgxyDlCngwrfFe:
+ vmovdqa xmm2,xmm8
+ lea rax,[vpshufb_shf_table]
+ vmovdqu xmm10,XMMWORD[rdx*1+rax]
+ vpshufb xmm8,xmm8,xmm10
+ vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi]
+ vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8
+ lea rax,[vpshufb_shf_table]
+ add rax,16
+ sub rax,rdx
+ vmovdqu xmm10,XMMWORD[rax]
+ vpxor xmm10,xmm10,XMMWORD[mask1]
+ vpshufb xmm3,xmm3,xmm10
+ vpblendvb xmm3,xmm3,xmm2,xmm10
+ vpxor xmm8,xmm3,xmm0
+ vpxor xmm8,xmm8,XMMWORD[rcx]
+ vaesenc xmm8,xmm8,XMMWORD[16+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[32+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[48+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[64+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[80+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[96+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[112+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[128+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[144+rcx]
+ vaesenclast xmm8,xmm8,XMMWORD[160+rcx]
+ vpxor xmm8,xmm8,xmm0
+ vmovdqu XMMWORD[(-16)+rsi],xmm8
+$L$_ret_hEgxyDlCngwrfFe:
+ mov rbx,QWORD[288+rsp]
+ xor r8,r8
+ mov QWORD[288+rsp],r8
+
+ vpxorq zmm0,zmm0,zmm0
+ mov rdi,QWORD[((288 + 8))+rsp]
+ mov QWORD[((288 + 8))+rsp],r8
+ mov rsi,QWORD[((288 + 16))+rsp]
+ mov QWORD[((288 + 16))+rsp],r8
+
+ vmovdqa xmm6,XMMWORD[((128 + 0))+rsp]
+ vmovdqa xmm7,XMMWORD[((128 + 16))+rsp]
+ vmovdqa xmm8,XMMWORD[((128 + 32))+rsp]
+ vmovdqa xmm9,XMMWORD[((128 + 48))+rsp]
+
+
+ vmovdqa64 ZMMWORD[128+rsp],zmm0
+
+ vmovdqa xmm10,XMMWORD[((128 + 64))+rsp]
+ vmovdqa xmm11,XMMWORD[((128 + 80))+rsp]
+ vmovdqa xmm12,XMMWORD[((128 + 96))+rsp]
+ vmovdqa xmm13,XMMWORD[((128 + 112))+rsp]
+
+
+ vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0
+
+ vmovdqa xmm14,XMMWORD[((128 + 128))+rsp]
+ vmovdqa xmm15,XMMWORD[((128 + 144))+rsp]
+
+
+
+ vmovdqa YMMWORD[(128 + 128)+rsp],ymm0
+ mov rsp,rbp
+ pop rbp
+ vzeroupper
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$_less_than_128_bytes_hEgxyDlCngwrfFe:
+ vpbroadcastq zmm25,r10
+ cmp rdx,0x10
+ jb NEAR $L$_ret_hEgxyDlCngwrfFe
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8d,0xaa
+ kmovq k2,r8
+ mov r8,rdx
+ and r8,0x70
+ cmp r8,0x60
+ je NEAR $L$_num_blocks_is_6_hEgxyDlCngwrfFe
+ cmp r8,0x50
+ je NEAR $L$_num_blocks_is_5_hEgxyDlCngwrfFe
+ cmp r8,0x40
+ je NEAR $L$_num_blocks_is_4_hEgxyDlCngwrfFe
+ cmp r8,0x30
+ je NEAR $L$_num_blocks_is_3_hEgxyDlCngwrfFe
+ cmp r8,0x20
+ je NEAR $L$_num_blocks_is_2_hEgxyDlCngwrfFe
+ cmp r8,0x10
+ je NEAR $L$_num_blocks_is_1_hEgxyDlCngwrfFe
+
+$L$_num_blocks_is_7_hEgxyDlCngwrfFe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ mov r8,0x0000ffffffffffff
+ kmovq k1,r8
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2{k1},[64+rdi]
+
+ add rdi,0x70
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ add rsi,0x70
+ vextracti32x4 xmm8,zmm2,0x2
+ vextracti32x4 xmm0,zmm10,0x3
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_num_blocks_is_6_hEgxyDlCngwrfFe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 ymm2,YMMWORD[64+rdi]
+ add rdi,96
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ add rsi,96
+
+ vextracti32x4 xmm8,ymm2,0x1
+ vextracti32x4 xmm0,zmm10,0x2
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_num_blocks_is_5_hEgxyDlCngwrfFe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 xmm2,XMMWORD[64+rdi]
+ add rdi,80
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 XMMWORD[64+rsi],xmm2
+ add rsi,80
+
+ vmovdqa xmm8,xmm2
+ vextracti32x4 xmm0,zmm10,0x1
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_num_blocks_is_4_hEgxyDlCngwrfFe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ add rdi,64
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ add rsi,64
+ vextracti32x4 xmm8,zmm1,0x3
+ vmovdqa xmm0,xmm10
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_num_blocks_is_3_hEgxyDlCngwrfFe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ mov r8,0x0000ffffffffffff
+ kmovq k1,r8
+ vmovdqu8 zmm1{k1},[rdi]
+ add rdi,48
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi]{k1},zmm1
+ add rsi,48
+ vextracti32x4 xmm8,zmm1,2
+ vextracti32x4 xmm0,zmm9,3
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_num_blocks_is_2_hEgxyDlCngwrfFe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+ vmovdqu8 ymm1,YMMWORD[rdi]
+ add rdi,32
+ vbroadcasti32x4 ymm0,YMMWORD[rcx]
+ vpternlogq ymm1,ymm9,ymm0,0x96
+ vbroadcasti32x4 ymm0,YMMWORD[16+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[32+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[48+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[64+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[80+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[96+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[112+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[128+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[144+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[160+rcx]
+ vaesenclast ymm1,ymm1,ymm0
+ vpxorq ymm1,ymm1,ymm9
+ vmovdqu8 YMMWORD[rsi],ymm1
+ add rsi,32
+
+ vextracti32x4 xmm8,ymm1,1
+ vextracti32x4 xmm0,zmm9,2
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+$L$_num_blocks_is_1_hEgxyDlCngwrfFe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+ vmovdqu8 xmm1,XMMWORD[rdi]
+ add rdi,16
+ vbroadcasti32x4 ymm0,YMMWORD[rcx]
+ vpternlogq ymm1,ymm9,ymm0,0x96
+ vbroadcasti32x4 ymm0,YMMWORD[16+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[32+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[48+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[64+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[80+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[96+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[112+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[128+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[144+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[160+rcx]
+ vaesenclast ymm1,ymm1,ymm0
+ vpxorq ymm1,ymm1,ymm9
+ vmovdqu8 XMMWORD[rsi],xmm1
+ add rsi,16
+
+ vmovdqa xmm8,xmm1
+ vextracti32x4 xmm0,zmm9,1
+ and rdx,0xf
+ je NEAR $L$_ret_hEgxyDlCngwrfFe
+ jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe
+
+global aesni_xts_128_decrypt_avx512
+
+
+ALIGN 32
+aesni_xts_128_decrypt_avx512:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_aesni_xts_128_decrypt_avx512:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+ mov r9,QWORD[48+rsp]
+
+
+
+DB 243,15,30,250
+ push rbp
+ mov rbp,rsp
+ sub rsp,312
+ and rsp,0xffffffffffffffc0
+ mov QWORD[288+rsp],rbx
+ mov QWORD[((288 + 8))+rsp],rdi
+ mov QWORD[((288 + 16))+rsp],rsi
+ vmovdqa XMMWORD[(128 + 0)+rsp],xmm6
+ vmovdqa XMMWORD[(128 + 16)+rsp],xmm7
+ vmovdqa XMMWORD[(128 + 32)+rsp],xmm8
+ vmovdqa XMMWORD[(128 + 48)+rsp],xmm9
+ vmovdqa XMMWORD[(128 + 64)+rsp],xmm10
+ vmovdqa XMMWORD[(128 + 80)+rsp],xmm11
+ vmovdqa XMMWORD[(128 + 96)+rsp],xmm12
+ vmovdqa XMMWORD[(128 + 112)+rsp],xmm13
+ vmovdqa XMMWORD[(128 + 128)+rsp],xmm14
+ vmovdqa XMMWORD[(128 + 144)+rsp],xmm15
+ mov r10,0x87
+ vmovdqu xmm1,XMMWORD[r9]
+ vpxor xmm1,xmm1,XMMWORD[r8]
+ vaesenc xmm1,xmm1,XMMWORD[16+r8]
+ vaesenc xmm1,xmm1,XMMWORD[32+r8]
+ vaesenc xmm1,xmm1,XMMWORD[48+r8]
+ vaesenc xmm1,xmm1,XMMWORD[64+r8]
+ vaesenc xmm1,xmm1,XMMWORD[80+r8]
+ vaesenc xmm1,xmm1,XMMWORD[96+r8]
+ vaesenc xmm1,xmm1,XMMWORD[112+r8]
+ vaesenc xmm1,xmm1,XMMWORD[128+r8]
+ vaesenc xmm1,xmm1,XMMWORD[144+r8]
+ vaesenclast xmm1,xmm1,XMMWORD[160+r8]
+ vmovdqa XMMWORD[rsp],xmm1
+ mov QWORD[((8 + 40))+rbp],rdi
+ mov QWORD[((8 + 48))+rbp],rsi
+
+ cmp rdx,0x80
+ jb NEAR $L$_less_than_128_bytes_amivrujEyduiFoi
+ vpbroadcastq zmm25,r10
+ cmp rdx,0x100
+ jge NEAR $L$_start_by16_amivrujEyduiFoi
+ jmp NEAR $L$_start_by8_amivrujEyduiFoi
+
+$L$_do_n_blocks_amivrujEyduiFoi:
+ cmp rdx,0x0
+ je NEAR $L$_ret_amivrujEyduiFoi
+ cmp rdx,0x70
+ jge NEAR $L$_remaining_num_blocks_is_7_amivrujEyduiFoi
+ cmp rdx,0x60
+ jge NEAR $L$_remaining_num_blocks_is_6_amivrujEyduiFoi
+ cmp rdx,0x50
+ jge NEAR $L$_remaining_num_blocks_is_5_amivrujEyduiFoi
+ cmp rdx,0x40
+ jge NEAR $L$_remaining_num_blocks_is_4_amivrujEyduiFoi
+ cmp rdx,0x30
+ jge NEAR $L$_remaining_num_blocks_is_3_amivrujEyduiFoi
+ cmp rdx,0x20
+ jge NEAR $L$_remaining_num_blocks_is_2_amivrujEyduiFoi
+ cmp rdx,0x10
+ jge NEAR $L$_remaining_num_blocks_is_1_amivrujEyduiFoi
+
+
+ vmovdqu xmm1,xmm5
+
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu XMMWORD[(-16)+rsi],xmm1
+ vmovdqa xmm8,xmm1
+
+
+ mov r8,0x1
+ kmovq k1,r8
+ vpsllq xmm13,xmm9,0x3f
+ vpsraq xmm14,xmm13,0x3f
+ vpandq xmm5,xmm14,xmm25
+ vpxorq xmm9{k1},xmm9,xmm5
+ vpsrldq xmm10,xmm9,0x8
+DB 98,211,181,8,115,194,1
+ vpslldq xmm13,xmm13,0x8
+ vpxorq xmm0,xmm0,xmm13
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_remaining_num_blocks_is_7_amivrujEyduiFoi:
+ mov r8,0xffffffffffffffff
+ shr r8,0x10
+ kmovq k1,r8
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2{k1},[64+rdi]
+ add rdi,0x70
+ and rdx,0xf
+ je NEAR $L$_done_7_remain_amivrujEyduiFoi
+ vextracti32x4 xmm12,zmm10,0x2
+ vextracti32x4 xmm13,zmm10,0x3
+ vinserti32x4 zmm10,zmm10,xmm13,0x2
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ add rsi,0x70
+ vextracti32x4 xmm8,zmm2,0x2
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_7_remain_amivrujEyduiFoi:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ jmp NEAR $L$_ret_amivrujEyduiFoi
+
+$L$_remaining_num_blocks_is_6_amivrujEyduiFoi:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 ymm2,YMMWORD[64+rdi]
+ add rdi,0x60
+ and rdx,0xf
+ je NEAR $L$_done_6_remain_amivrujEyduiFoi
+ vextracti32x4 xmm12,zmm10,0x1
+ vextracti32x4 xmm13,zmm10,0x2
+ vinserti32x4 zmm10,zmm10,xmm13,0x1
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ add rsi,0x60
+ vextracti32x4 xmm8,zmm2,0x1
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_6_remain_amivrujEyduiFoi:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ jmp NEAR $L$_ret_amivrujEyduiFoi
+
+$L$_remaining_num_blocks_is_5_amivrujEyduiFoi:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[64+rdi]
+ add rdi,0x50
+ and rdx,0xf
+ je NEAR $L$_done_5_remain_amivrujEyduiFoi
+ vmovdqa xmm12,xmm10
+ vextracti32x4 xmm10,zmm10,0x1
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu XMMWORD[64+rsi],xmm2
+ add rsi,0x50
+ vmovdqa xmm8,xmm2
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_5_remain_amivrujEyduiFoi:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 XMMWORD[64+rsi],xmm2
+ jmp NEAR $L$_ret_amivrujEyduiFoi
+
+$L$_remaining_num_blocks_is_4_amivrujEyduiFoi:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ add rdi,0x40
+ and rdx,0xf
+ je NEAR $L$_done_4_remain_amivrujEyduiFoi
+ vextracti32x4 xmm12,zmm9,0x3
+ vinserti32x4 zmm9,zmm9,xmm10,0x3
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ add rsi,0x40
+ vextracti32x4 xmm8,zmm1,0x3
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_4_remain_amivrujEyduiFoi:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ jmp NEAR $L$_ret_amivrujEyduiFoi
+
+$L$_remaining_num_blocks_is_3_amivrujEyduiFoi:
+ vmovdqu xmm1,XMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ add rdi,0x30
+ and rdx,0xf
+ je NEAR $L$_done_3_remain_amivrujEyduiFoi
+ vextracti32x4 xmm13,zmm9,0x2
+ vextracti32x4 xmm10,zmm9,0x1
+ vextracti32x4 xmm11,zmm9,0x3
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ add rsi,0x30
+ vmovdqa xmm8,xmm3
+ vmovdqa xmm0,xmm13
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_3_remain_amivrujEyduiFoi:
+ vextracti32x4 xmm10,zmm9,0x1
+ vextracti32x4 xmm11,zmm9,0x2
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ jmp NEAR $L$_ret_amivrujEyduiFoi
+
+$L$_remaining_num_blocks_is_2_amivrujEyduiFoi:
+ vmovdqu xmm1,XMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ add rdi,0x20
+ and rdx,0xf
+ je NEAR $L$_done_2_remain_amivrujEyduiFoi
+ vextracti32x4 xmm10,zmm9,0x2
+ vextracti32x4 xmm12,zmm9,0x1
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ add rsi,0x20
+ vmovdqa xmm8,xmm2
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_2_remain_amivrujEyduiFoi:
+ vextracti32x4 xmm10,zmm9,0x1
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ jmp NEAR $L$_ret_amivrujEyduiFoi
+
+$L$_remaining_num_blocks_is_1_amivrujEyduiFoi:
+ vmovdqu xmm1,XMMWORD[rdi]
+ add rdi,0x10
+ and rdx,0xf
+ je NEAR $L$_done_1_remain_amivrujEyduiFoi
+ vextracti32x4 xmm11,zmm9,0x1
+ vpxor xmm1,xmm1,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x10
+ vmovdqa xmm8,xmm1
+ vmovdqa xmm0,xmm9
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_1_remain_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu XMMWORD[rsi],xmm1
+ jmp NEAR $L$_ret_amivrujEyduiFoi
+
+$L$_start_by16_amivrujEyduiFoi:
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+
+
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+
+
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm11,zmm9,0x1
+ vpxord zmm11,zmm11,zmm14
+
+ vpsrldq zmm15,zmm10,0xf
+ vpclmulqdq zmm16,zmm15,zmm25,0x0
+ vpslldq zmm12,zmm10,0x1
+ vpxord zmm12,zmm12,zmm16
+
+$L$_main_loop_run_16_amivrujEyduiFoi:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ vmovdqu8 zmm3,ZMMWORD[128+rdi]
+ vmovdqu8 zmm4,ZMMWORD[192+rdi]
+ vmovdqu8 xmm5,XMMWORD[240+rdi]
+ add rdi,0x100
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vpxorq zmm3,zmm3,zmm0
+ vpxorq zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm11,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm11,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm12,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm12,0x1
+ vpxord zmm16,zmm16,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm15,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm17,zmm15,0x1
+ vpxord zmm17,zmm17,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm16,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm18,zmm16,0x1
+ vpxord zmm18,zmm18,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+ vaesdeclast zmm3,zmm3,zmm0
+ vaesdeclast zmm4,zmm4,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqa32 zmm11,zmm17
+ vmovdqa32 zmm12,zmm18
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ vmovdqu8 ZMMWORD[128+rsi],zmm3
+ vmovdqu8 ZMMWORD[192+rsi],zmm4
+ add rsi,0x100
+ sub rdx,0x100
+ cmp rdx,0x100
+ jge NEAR $L$_main_loop_run_16_amivrujEyduiFoi
+
+ cmp rdx,0x80
+ jge NEAR $L$_main_loop_run_8_amivrujEyduiFoi
+ jmp NEAR $L$_do_n_blocks_amivrujEyduiFoi
+
+$L$_start_by8_amivrujEyduiFoi:
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+
+
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+
+$L$_main_loop_run_8_amivrujEyduiFoi:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ vmovdqu8 xmm5,XMMWORD[112+rdi]
+ add rdi,0x80
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm9,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vpsrldq zmm13,zmm10,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm10,0x1
+ vpxord zmm16,zmm16,zmm14
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ add rsi,0x80
+ sub rdx,0x80
+ cmp rdx,0x80
+ jge NEAR $L$_main_loop_run_8_amivrujEyduiFoi
+ jmp NEAR $L$_do_n_blocks_amivrujEyduiFoi
+
+$L$_steal_cipher_amivrujEyduiFoi:
+
+ vmovdqa xmm2,xmm8
+
+
+ lea rax,[vpshufb_shf_table]
+ vmovdqu xmm10,XMMWORD[rdx*1+rax]
+ vpshufb xmm8,xmm8,xmm10
+
+
+ vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi]
+ vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8
+
+
+ lea rax,[vpshufb_shf_table]
+ add rax,16
+ sub rax,rdx
+ vmovdqu xmm10,XMMWORD[rax]
+ vpxor xmm10,xmm10,XMMWORD[mask1]
+ vpshufb xmm3,xmm3,xmm10
+
+ vpblendvb xmm3,xmm3,xmm2,xmm10
+
+
+ vpxor xmm8,xmm3,xmm0
+
+
+ vpxor xmm8,xmm8,XMMWORD[rcx]
+ vaesdec xmm8,xmm8,XMMWORD[16+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[32+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[48+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[64+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[80+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[96+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[112+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[128+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[144+rcx]
+ vaesdeclast xmm8,xmm8,XMMWORD[160+rcx]
+
+ vpxor xmm8,xmm8,xmm0
+
+$L$_done_amivrujEyduiFoi:
+
+ vmovdqu XMMWORD[(-16)+rsi],xmm8
+$L$_ret_amivrujEyduiFoi:
+ mov rbx,QWORD[288+rsp]
+ xor r8,r8
+ mov QWORD[288+rsp],r8
+
+ vpxorq zmm0,zmm0,zmm0
+ mov rdi,QWORD[((288 + 8))+rsp]
+ mov QWORD[((288 + 8))+rsp],r8
+ mov rsi,QWORD[((288 + 16))+rsp]
+ mov QWORD[((288 + 16))+rsp],r8
+
+ vmovdqa xmm6,XMMWORD[((128 + 0))+rsp]
+ vmovdqa xmm7,XMMWORD[((128 + 16))+rsp]
+ vmovdqa xmm8,XMMWORD[((128 + 32))+rsp]
+ vmovdqa xmm9,XMMWORD[((128 + 48))+rsp]
+
+
+ vmovdqa64 ZMMWORD[128+rsp],zmm0
+
+ vmovdqa xmm10,XMMWORD[((128 + 64))+rsp]
+ vmovdqa xmm11,XMMWORD[((128 + 80))+rsp]
+ vmovdqa xmm12,XMMWORD[((128 + 96))+rsp]
+ vmovdqa xmm13,XMMWORD[((128 + 112))+rsp]
+
+
+ vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0
+
+ vmovdqa xmm14,XMMWORD[((128 + 128))+rsp]
+ vmovdqa xmm15,XMMWORD[((128 + 144))+rsp]
+
+
+
+ vmovdqa YMMWORD[(128 + 128)+rsp],ymm0
+ mov rsp,rbp
+ pop rbp
+ vzeroupper
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$_less_than_128_bytes_amivrujEyduiFoi:
+ cmp rdx,0x10
+ jb NEAR $L$_ret_amivrujEyduiFoi
+
+ mov r8,rdx
+ and r8,0x70
+ cmp r8,0x60
+ je NEAR $L$_num_blocks_is_6_amivrujEyduiFoi
+ cmp r8,0x50
+ je NEAR $L$_num_blocks_is_5_amivrujEyduiFoi
+ cmp r8,0x40
+ je NEAR $L$_num_blocks_is_4_amivrujEyduiFoi
+ cmp r8,0x30
+ je NEAR $L$_num_blocks_is_3_amivrujEyduiFoi
+ cmp r8,0x20
+ je NEAR $L$_num_blocks_is_2_amivrujEyduiFoi
+ cmp r8,0x10
+ je NEAR $L$_num_blocks_is_1_amivrujEyduiFoi
+
+$L$_num_blocks_is_7_amivrujEyduiFoi:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[64+rsp],rax
+ mov QWORD[((64 + 8))+rsp],rbx
+ vmovdqa xmm13,XMMWORD[64+rsp]
+ vmovdqu xmm5,XMMWORD[64+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[80+rsp],rax
+ mov QWORD[((80 + 8))+rsp],rbx
+ vmovdqa xmm14,XMMWORD[80+rsp]
+ vmovdqu xmm6,XMMWORD[80+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[96+rsp],rax
+ mov QWORD[((96 + 8))+rsp],rbx
+ vmovdqa xmm15,XMMWORD[96+rsp]
+ vmovdqu xmm7,XMMWORD[96+rdi]
+ add rdi,0x70
+ and rdx,0xf
+ je NEAR $L$_done_7_amivrujEyduiFoi
+
+$L$_steal_cipher_7_amivrujEyduiFoi:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm16,xmm15
+ vmovdqa xmm15,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vpxor xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vaesdeclast xmm7,xmm7,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ vmovdqu XMMWORD[80+rsi],xmm6
+ add rsi,0x70
+ vmovdqa64 xmm0,xmm16
+ vmovdqa xmm8,xmm7
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_7_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vpxor xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vaesdeclast xmm7,xmm7,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ vmovdqu XMMWORD[80+rsi],xmm6
+ add rsi,0x70
+ vmovdqa xmm8,xmm7
+ jmp NEAR $L$_done_amivrujEyduiFoi
+
+$L$_num_blocks_is_6_amivrujEyduiFoi:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[64+rsp],rax
+ mov QWORD[((64 + 8))+rsp],rbx
+ vmovdqa xmm13,XMMWORD[64+rsp]
+ vmovdqu xmm5,XMMWORD[64+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[80+rsp],rax
+ mov QWORD[((80 + 8))+rsp],rbx
+ vmovdqa xmm14,XMMWORD[80+rsp]
+ vmovdqu xmm6,XMMWORD[80+rdi]
+ add rdi,0x60
+ and rdx,0xf
+ je NEAR $L$_done_6_amivrujEyduiFoi
+
+$L$_steal_cipher_6_amivrujEyduiFoi:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm15,xmm14
+ vmovdqa xmm14,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ add rsi,0x60
+ vmovdqa xmm0,xmm15
+ vmovdqa xmm8,xmm6
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_6_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ add rsi,0x60
+ vmovdqa xmm8,xmm6
+ jmp NEAR $L$_done_amivrujEyduiFoi
+
+$L$_num_blocks_is_5_amivrujEyduiFoi:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[64+rsp],rax
+ mov QWORD[((64 + 8))+rsp],rbx
+ vmovdqa xmm13,XMMWORD[64+rsp]
+ vmovdqu xmm5,XMMWORD[64+rdi]
+ add rdi,0x50
+ and rdx,0xf
+ je NEAR $L$_done_5_amivrujEyduiFoi
+
+$L$_steal_cipher_5_amivrujEyduiFoi:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm14,xmm13
+ vmovdqa xmm13,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ add rsi,0x50
+ vmovdqa xmm0,xmm14
+ vmovdqa xmm8,xmm5
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_5_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ add rsi,0x50
+ vmovdqa xmm8,xmm5
+ jmp NEAR $L$_done_amivrujEyduiFoi
+
+$L$_num_blocks_is_4_amivrujEyduiFoi:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ add rdi,0x40
+ and rdx,0xf
+ je NEAR $L$_done_4_amivrujEyduiFoi
+
+$L$_steal_cipher_4_amivrujEyduiFoi:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm13,xmm12
+ vmovdqa xmm12,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ add rsi,0x40
+ vmovdqa xmm0,xmm13
+ vmovdqa xmm8,xmm4
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_4_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ add rsi,0x40
+ vmovdqa xmm8,xmm4
+ jmp NEAR $L$_done_amivrujEyduiFoi
+
+$L$_num_blocks_is_3_amivrujEyduiFoi:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ add rdi,0x30
+ and rdx,0xf
+ je NEAR $L$_done_3_amivrujEyduiFoi
+
+$L$_steal_cipher_3_amivrujEyduiFoi:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm12,xmm11
+ vmovdqa xmm11,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ add rsi,0x30
+ vmovdqa xmm0,xmm12
+ vmovdqa xmm8,xmm3
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_3_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ add rsi,0x30
+ vmovdqa xmm8,xmm3
+ jmp NEAR $L$_done_amivrujEyduiFoi
+
+$L$_num_blocks_is_2_amivrujEyduiFoi:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ add rdi,0x20
+ and rdx,0xf
+ je NEAR $L$_done_2_amivrujEyduiFoi
+
+$L$_steal_cipher_2_amivrujEyduiFoi:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm11,xmm10
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x20
+ vmovdqa xmm0,xmm11
+ vmovdqa xmm8,xmm2
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_2_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x20
+ vmovdqa xmm8,xmm2
+ jmp NEAR $L$_done_amivrujEyduiFoi
+
+$L$_num_blocks_is_1_amivrujEyduiFoi:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ add rdi,0x10
+ and rdx,0xf
+ je NEAR $L$_done_1_amivrujEyduiFoi
+
+$L$_steal_cipher_1_amivrujEyduiFoi:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm10,xmm9
+ vmovdqa xmm9,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ add rsi,0x10
+ vmovdqa xmm0,xmm10
+ vmovdqa xmm8,xmm1
+ jmp NEAR $L$_steal_cipher_amivrujEyduiFoi
+
+$L$_done_1_amivrujEyduiFoi:
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ add rsi,0x10
+ vmovdqa xmm8,xmm1
+ jmp NEAR $L$_done_amivrujEyduiFoi
+
+global aesni_xts_256_encrypt_avx512
+
+
+ALIGN 32
+aesni_xts_256_encrypt_avx512:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_aesni_xts_256_encrypt_avx512:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+ mov r9,QWORD[48+rsp]
+
+
+
+DB 243,15,30,250
+ push rbp
+ mov rbp,rsp
+ sub rsp,312
+ and rsp,0xffffffffffffffc0
+ mov QWORD[288+rsp],rbx
+ mov QWORD[((288 + 8))+rsp],rdi
+ mov QWORD[((288 + 16))+rsp],rsi
+ vmovdqa XMMWORD[(128 + 0)+rsp],xmm6
+ vmovdqa XMMWORD[(128 + 16)+rsp],xmm7
+ vmovdqa XMMWORD[(128 + 32)+rsp],xmm8
+ vmovdqa XMMWORD[(128 + 48)+rsp],xmm9
+ vmovdqa XMMWORD[(128 + 64)+rsp],xmm10
+ vmovdqa XMMWORD[(128 + 80)+rsp],xmm11
+ vmovdqa XMMWORD[(128 + 96)+rsp],xmm12
+ vmovdqa XMMWORD[(128 + 112)+rsp],xmm13
+ vmovdqa XMMWORD[(128 + 128)+rsp],xmm14
+ vmovdqa XMMWORD[(128 + 144)+rsp],xmm15
+ mov r10,0x87
+ vmovdqu xmm1,XMMWORD[r9]
+ vpxor xmm1,xmm1,XMMWORD[r8]
+ vaesenc xmm1,xmm1,XMMWORD[16+r8]
+ vaesenc xmm1,xmm1,XMMWORD[32+r8]
+ vaesenc xmm1,xmm1,XMMWORD[48+r8]
+ vaesenc xmm1,xmm1,XMMWORD[64+r8]
+ vaesenc xmm1,xmm1,XMMWORD[80+r8]
+ vaesenc xmm1,xmm1,XMMWORD[96+r8]
+ vaesenc xmm1,xmm1,XMMWORD[112+r8]
+ vaesenc xmm1,xmm1,XMMWORD[128+r8]
+ vaesenc xmm1,xmm1,XMMWORD[144+r8]
+ vaesenc xmm1,xmm1,XMMWORD[160+r8]
+ vaesenc xmm1,xmm1,XMMWORD[176+r8]
+ vaesenc xmm1,xmm1,XMMWORD[192+r8]
+ vaesenc xmm1,xmm1,XMMWORD[208+r8]
+ vaesenclast xmm1,xmm1,XMMWORD[224+r8]
+ vmovdqa XMMWORD[rsp],xmm1
+ mov QWORD[((8 + 40))+rbp],rdi
+ mov QWORD[((8 + 48))+rbp],rsi
+
+ cmp rdx,0x80
+ jl NEAR $L$_less_than_128_bytes_wcpqaDvsGlbjGoe
+ vpbroadcastq zmm25,r10
+ cmp rdx,0x100
+ jge NEAR $L$_start_by16_wcpqaDvsGlbjGoe
+ cmp rdx,0x80
+ jge NEAR $L$_start_by8_wcpqaDvsGlbjGoe
+
+$L$_do_n_blocks_wcpqaDvsGlbjGoe:
+ cmp rdx,0x0
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ cmp rdx,0x70
+ jge NEAR $L$_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe
+ cmp rdx,0x60
+ jge NEAR $L$_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe
+ cmp rdx,0x50
+ jge NEAR $L$_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe
+ cmp rdx,0x40
+ jge NEAR $L$_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe
+ cmp rdx,0x30
+ jge NEAR $L$_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe
+ cmp rdx,0x20
+ jge NEAR $L$_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe
+ cmp rdx,0x10
+ jge NEAR $L$_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe
+ vmovdqa xmm8,xmm0
+ vmovdqa xmm0,xmm9
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+
+$L$_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe:
+ mov r8,0x0000ffffffffffff
+ kmovq k1,r8
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2{k1},[64+rdi]
+ add rdi,0x70
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ add rsi,0x70
+ vextracti32x4 xmm8,zmm2,0x2
+ vextracti32x4 xmm0,zmm10,0x3
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+
+$L$_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 ymm2,YMMWORD[64+rdi]
+ add rdi,0x60
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ add rsi,0x60
+ vextracti32x4 xmm8,zmm2,0x1
+ vextracti32x4 xmm0,zmm10,0x2
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+
+$L$_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[64+rdi]
+ add rdi,0x50
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu XMMWORD[64+rsi],xmm2
+ add rsi,0x50
+ vmovdqa xmm8,xmm2
+ vextracti32x4 xmm0,zmm10,0x1
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+
+$L$_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ add rdi,0x40
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ add rsi,0x40
+ vextracti32x4 xmm8,zmm1,0x3
+ vmovdqa64 xmm0,xmm10
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe:
+ mov r8,-1
+ shr r8,0x10
+ kmovq k1,r8
+ vmovdqu8 zmm1{k1},[rdi]
+ add rdi,0x30
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi]{k1},zmm1
+ add rsi,0x30
+ vextracti32x4 xmm8,zmm1,0x2
+ vextracti32x4 xmm0,zmm9,0x3
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe:
+ vmovdqu8 ymm1,YMMWORD[rdi]
+ add rdi,0x20
+ vbroadcasti32x4 ymm0,YMMWORD[rcx]
+ vpternlogq ymm1,ymm9,ymm0,0x96
+ vbroadcasti32x4 ymm0,YMMWORD[16+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[32+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[48+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[64+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[80+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[96+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[112+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[128+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[144+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[160+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[176+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[192+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[208+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[224+rcx]
+ vaesenclast ymm1,ymm1,ymm0
+ vpxorq ymm1,ymm1,ymm9
+ vmovdqu YMMWORD[rsi],ymm1
+ add rsi,0x20
+ vextracti32x4 xmm8,zmm1,0x1
+ vextracti32x4 xmm0,zmm9,0x2
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe:
+ vmovdqu xmm1,XMMWORD[rdi]
+ add rdi,0x10
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm1,xmm1,XMMWORD[rcx]
+ vaesenc xmm1,xmm1,XMMWORD[16+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[32+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[48+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[64+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[80+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[96+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[112+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[128+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[144+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[160+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[176+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[192+rcx]
+ vaesenc xmm1,xmm1,XMMWORD[208+rcx]
+ vaesenclast xmm1,xmm1,XMMWORD[224+rcx]
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x10
+ vmovdqa xmm8,xmm1
+ vextracti32x4 xmm0,zmm9,0x1
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+
+
+$L$_start_by16_wcpqaDvsGlbjGoe:
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm11,zmm9,0x1
+ vpxord zmm11,zmm11,zmm14
+ vpsrldq zmm15,zmm10,0xf
+ vpclmulqdq zmm16,zmm15,zmm25,0x0
+ vpslldq zmm12,zmm10,0x1
+ vpxord zmm12,zmm12,zmm16
+
+$L$_main_loop_run_16_wcpqaDvsGlbjGoe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ vmovdqu8 zmm3,ZMMWORD[128+rdi]
+ vmovdqu8 zmm4,ZMMWORD[192+rdi]
+ add rdi,0x100
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vpxorq zmm3,zmm3,zmm0
+ vpxorq zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm11,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm11,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm12,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm12,0x1
+ vpxord zmm16,zmm16,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm15,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm17,zmm15,0x1
+ vpxord zmm17,zmm17,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm16,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm18,zmm16,0x1
+ vpxord zmm18,zmm18,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vaesenc zmm3,zmm3,zmm0
+ vaesenc zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vaesenclast zmm3,zmm3,zmm0
+ vaesenclast zmm4,zmm4,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqa32 zmm11,zmm17
+ vmovdqa32 zmm12,zmm18
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ vmovdqu8 ZMMWORD[128+rsi],zmm3
+ vmovdqu8 ZMMWORD[192+rsi],zmm4
+ add rsi,0x100
+ sub rdx,0x100
+ cmp rdx,0x100
+ jae NEAR $L$_main_loop_run_16_wcpqaDvsGlbjGoe
+ cmp rdx,0x80
+ jae NEAR $L$_main_loop_run_8_wcpqaDvsGlbjGoe
+ vextracti32x4 xmm0,zmm4,0x3
+ jmp NEAR $L$_do_n_blocks_wcpqaDvsGlbjGoe
+
+$L$_start_by8_wcpqaDvsGlbjGoe:
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+
+$L$_main_loop_run_8_wcpqaDvsGlbjGoe:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ add rdi,0x80
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm9,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+ vpsrldq zmm13,zmm10,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm10,0x1
+ vpxord zmm16,zmm16,zmm14
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ add rsi,0x80
+ sub rdx,0x80
+ cmp rdx,0x80
+ jae NEAR $L$_main_loop_run_8_wcpqaDvsGlbjGoe
+ vextracti32x4 xmm0,zmm2,0x3
+ jmp NEAR $L$_do_n_blocks_wcpqaDvsGlbjGoe
+
+$L$_steal_cipher_wcpqaDvsGlbjGoe:
+ vmovdqa xmm2,xmm8
+ lea rax,[vpshufb_shf_table]
+ vmovdqu xmm10,XMMWORD[rdx*1+rax]
+ vpshufb xmm8,xmm8,xmm10
+ vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi]
+ vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8
+ lea rax,[vpshufb_shf_table]
+ add rax,16
+ sub rax,rdx
+ vmovdqu xmm10,XMMWORD[rax]
+ vpxor xmm10,xmm10,XMMWORD[mask1]
+ vpshufb xmm3,xmm3,xmm10
+ vpblendvb xmm3,xmm3,xmm2,xmm10
+ vpxor xmm8,xmm3,xmm0
+ vpxor xmm8,xmm8,XMMWORD[rcx]
+ vaesenc xmm8,xmm8,XMMWORD[16+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[32+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[48+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[64+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[80+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[96+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[112+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[128+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[144+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[160+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[176+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[192+rcx]
+ vaesenc xmm8,xmm8,XMMWORD[208+rcx]
+ vaesenclast xmm8,xmm8,XMMWORD[224+rcx]
+ vpxor xmm8,xmm8,xmm0
+ vmovdqu XMMWORD[(-16)+rsi],xmm8
+$L$_ret_wcpqaDvsGlbjGoe:
+ mov rbx,QWORD[288+rsp]
+ xor r8,r8
+ mov QWORD[288+rsp],r8
+
+ vpxorq zmm0,zmm0,zmm0
+ mov rdi,QWORD[((288 + 8))+rsp]
+ mov QWORD[((288 + 8))+rsp],r8
+ mov rsi,QWORD[((288 + 16))+rsp]
+ mov QWORD[((288 + 16))+rsp],r8
+
+ vmovdqa xmm6,XMMWORD[((128 + 0))+rsp]
+ vmovdqa xmm7,XMMWORD[((128 + 16))+rsp]
+ vmovdqa xmm8,XMMWORD[((128 + 32))+rsp]
+ vmovdqa xmm9,XMMWORD[((128 + 48))+rsp]
+
+
+ vmovdqa64 ZMMWORD[128+rsp],zmm0
+
+ vmovdqa xmm10,XMMWORD[((128 + 64))+rsp]
+ vmovdqa xmm11,XMMWORD[((128 + 80))+rsp]
+ vmovdqa xmm12,XMMWORD[((128 + 96))+rsp]
+ vmovdqa xmm13,XMMWORD[((128 + 112))+rsp]
+
+
+ vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0
+
+ vmovdqa xmm14,XMMWORD[((128 + 128))+rsp]
+ vmovdqa xmm15,XMMWORD[((128 + 144))+rsp]
+
+
+
+ vmovdqa YMMWORD[(128 + 128)+rsp],ymm0
+ mov rsp,rbp
+ pop rbp
+ vzeroupper
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$_less_than_128_bytes_wcpqaDvsGlbjGoe:
+ vpbroadcastq zmm25,r10
+ cmp rdx,0x10
+ jb NEAR $L$_ret_wcpqaDvsGlbjGoe
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8d,0xaa
+ kmovq k2,r8
+ mov r8,rdx
+ and r8,0x70
+ cmp r8,0x60
+ je NEAR $L$_num_blocks_is_6_wcpqaDvsGlbjGoe
+ cmp r8,0x50
+ je NEAR $L$_num_blocks_is_5_wcpqaDvsGlbjGoe
+ cmp r8,0x40
+ je NEAR $L$_num_blocks_is_4_wcpqaDvsGlbjGoe
+ cmp r8,0x30
+ je NEAR $L$_num_blocks_is_3_wcpqaDvsGlbjGoe
+ cmp r8,0x20
+ je NEAR $L$_num_blocks_is_2_wcpqaDvsGlbjGoe
+ cmp r8,0x10
+ je NEAR $L$_num_blocks_is_1_wcpqaDvsGlbjGoe
+
+$L$_num_blocks_is_7_wcpqaDvsGlbjGoe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ mov r8,0x0000ffffffffffff
+ kmovq k1,r8
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2{k1},[64+rdi]
+
+ add rdi,0x70
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ add rsi,0x70
+ vextracti32x4 xmm8,zmm2,0x2
+ vextracti32x4 xmm0,zmm10,0x3
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_num_blocks_is_6_wcpqaDvsGlbjGoe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 ymm2,YMMWORD[64+rdi]
+ add rdi,96
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ add rsi,96
+
+ vextracti32x4 xmm8,ymm2,0x1
+ vextracti32x4 xmm0,zmm10,0x2
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_num_blocks_is_5_wcpqaDvsGlbjGoe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 xmm2,XMMWORD[64+rdi]
+ add rdi,80
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vpternlogq zmm2,zmm10,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vaesenc zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vaesenclast zmm2,zmm2,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 XMMWORD[64+rsi],xmm2
+ add rsi,80
+
+ vmovdqa xmm8,xmm2
+ vextracti32x4 xmm0,zmm10,0x1
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_num_blocks_is_4_wcpqaDvsGlbjGoe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x00
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ add rdi,64
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ add rsi,64
+ vextracti32x4 xmm8,zmm1,0x3
+ vmovdqa xmm0,xmm10
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_num_blocks_is_3_wcpqaDvsGlbjGoe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+ mov r8,0x0000ffffffffffff
+ kmovq k1,r8
+ vmovdqu8 zmm1{k1},[rdi]
+ add rdi,48
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpternlogq zmm1,zmm9,zmm0,0x96
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesenc zmm1,zmm1,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesenclast zmm1,zmm1,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vmovdqu8 ZMMWORD[rsi]{k1},zmm1
+ add rsi,48
+ vextracti32x4 xmm8,zmm1,2
+ vextracti32x4 xmm0,zmm9,3
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_num_blocks_is_2_wcpqaDvsGlbjGoe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+ vmovdqu8 ymm1,YMMWORD[rdi]
+ add rdi,32
+ vbroadcasti32x4 ymm0,YMMWORD[rcx]
+ vpternlogq ymm1,ymm9,ymm0,0x96
+ vbroadcasti32x4 ymm0,YMMWORD[16+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[32+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[48+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[64+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[80+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[96+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[112+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[128+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[144+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[160+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[176+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[192+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[208+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[224+rcx]
+ vaesenclast ymm1,ymm1,ymm0
+ vpxorq ymm1,ymm1,ymm9
+ vmovdqu8 YMMWORD[rsi],ymm1
+ add rsi,32
+
+ vextracti32x4 xmm8,ymm1,1
+ vextracti32x4 xmm0,zmm9,2
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+$L$_num_blocks_is_1_wcpqaDvsGlbjGoe:
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x00
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+ vmovdqu8 xmm1,XMMWORD[rdi]
+ add rdi,16
+ vbroadcasti32x4 ymm0,YMMWORD[rcx]
+ vpternlogq ymm1,ymm9,ymm0,0x96
+ vbroadcasti32x4 ymm0,YMMWORD[16+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[32+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[48+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[64+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[80+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[96+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[112+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[128+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[144+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[160+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[176+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[192+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[208+rcx]
+ vaesenc ymm1,ymm1,ymm0
+ vbroadcasti32x4 ymm0,YMMWORD[224+rcx]
+ vaesenclast ymm1,ymm1,ymm0
+ vpxorq ymm1,ymm1,ymm9
+ vmovdqu8 XMMWORD[rsi],xmm1
+ add rsi,16
+
+ vmovdqa xmm8,xmm1
+ vextracti32x4 xmm0,zmm9,1
+ and rdx,0xf
+ je NEAR $L$_ret_wcpqaDvsGlbjGoe
+ jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe
+
+global aesni_xts_256_decrypt_avx512
+
+
+ALIGN 32
+aesni_xts_256_decrypt_avx512:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_aesni_xts_256_decrypt_avx512:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+ mov r9,QWORD[48+rsp]
+
+
+
+DB 243,15,30,250
+ push rbp
+ mov rbp,rsp
+ sub rsp,312
+ and rsp,0xffffffffffffffc0
+ mov QWORD[288+rsp],rbx
+ mov QWORD[((288 + 8))+rsp],rdi
+ mov QWORD[((288 + 16))+rsp],rsi
+ vmovdqa XMMWORD[(128 + 0)+rsp],xmm6
+ vmovdqa XMMWORD[(128 + 16)+rsp],xmm7
+ vmovdqa XMMWORD[(128 + 32)+rsp],xmm8
+ vmovdqa XMMWORD[(128 + 48)+rsp],xmm9
+ vmovdqa XMMWORD[(128 + 64)+rsp],xmm10
+ vmovdqa XMMWORD[(128 + 80)+rsp],xmm11
+ vmovdqa XMMWORD[(128 + 96)+rsp],xmm12
+ vmovdqa XMMWORD[(128 + 112)+rsp],xmm13
+ vmovdqa XMMWORD[(128 + 128)+rsp],xmm14
+ vmovdqa XMMWORD[(128 + 144)+rsp],xmm15
+ mov r10,0x87
+ vmovdqu xmm1,XMMWORD[r9]
+ vpxor xmm1,xmm1,XMMWORD[r8]
+ vaesenc xmm1,xmm1,XMMWORD[16+r8]
+ vaesenc xmm1,xmm1,XMMWORD[32+r8]
+ vaesenc xmm1,xmm1,XMMWORD[48+r8]
+ vaesenc xmm1,xmm1,XMMWORD[64+r8]
+ vaesenc xmm1,xmm1,XMMWORD[80+r8]
+ vaesenc xmm1,xmm1,XMMWORD[96+r8]
+ vaesenc xmm1,xmm1,XMMWORD[112+r8]
+ vaesenc xmm1,xmm1,XMMWORD[128+r8]
+ vaesenc xmm1,xmm1,XMMWORD[144+r8]
+ vaesenc xmm1,xmm1,XMMWORD[160+r8]
+ vaesenc xmm1,xmm1,XMMWORD[176+r8]
+ vaesenc xmm1,xmm1,XMMWORD[192+r8]
+ vaesenc xmm1,xmm1,XMMWORD[208+r8]
+ vaesenclast xmm1,xmm1,XMMWORD[224+r8]
+ vmovdqa XMMWORD[rsp],xmm1
+ mov QWORD[((8 + 40))+rbp],rdi
+ mov QWORD[((8 + 48))+rbp],rsi
+
+ cmp rdx,0x80
+ jb NEAR $L$_less_than_128_bytes_EmbgEptodyewbFa
+ vpbroadcastq zmm25,r10
+ cmp rdx,0x100
+ jge NEAR $L$_start_by16_EmbgEptodyewbFa
+ jmp NEAR $L$_start_by8_EmbgEptodyewbFa
+
+$L$_do_n_blocks_EmbgEptodyewbFa:
+ cmp rdx,0x0
+ je NEAR $L$_ret_EmbgEptodyewbFa
+ cmp rdx,0x70
+ jge NEAR $L$_remaining_num_blocks_is_7_EmbgEptodyewbFa
+ cmp rdx,0x60
+ jge NEAR $L$_remaining_num_blocks_is_6_EmbgEptodyewbFa
+ cmp rdx,0x50
+ jge NEAR $L$_remaining_num_blocks_is_5_EmbgEptodyewbFa
+ cmp rdx,0x40
+ jge NEAR $L$_remaining_num_blocks_is_4_EmbgEptodyewbFa
+ cmp rdx,0x30
+ jge NEAR $L$_remaining_num_blocks_is_3_EmbgEptodyewbFa
+ cmp rdx,0x20
+ jge NEAR $L$_remaining_num_blocks_is_2_EmbgEptodyewbFa
+ cmp rdx,0x10
+ jge NEAR $L$_remaining_num_blocks_is_1_EmbgEptodyewbFa
+
+
+ vmovdqu xmm1,xmm5
+
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu XMMWORD[(-16)+rsi],xmm1
+ vmovdqa xmm8,xmm1
+
+
+ mov r8,0x1
+ kmovq k1,r8
+ vpsllq xmm13,xmm9,0x3f
+ vpsraq xmm14,xmm13,0x3f
+ vpandq xmm5,xmm14,xmm25
+ vpxorq xmm9{k1},xmm9,xmm5
+ vpsrldq xmm10,xmm9,0x8
+DB 98,211,181,8,115,194,1
+ vpslldq xmm13,xmm13,0x8
+ vpxorq xmm0,xmm0,xmm13
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_remaining_num_blocks_is_7_EmbgEptodyewbFa:
+ mov r8,0xffffffffffffffff
+ shr r8,0x10
+ kmovq k1,r8
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2{k1},[64+rdi]
+ add rdi,0x70
+ and rdx,0xf
+ je NEAR $L$_done_7_remain_EmbgEptodyewbFa
+ vextracti32x4 xmm12,zmm10,0x2
+ vextracti32x4 xmm13,zmm10,0x3
+ vinserti32x4 zmm10,zmm10,xmm13,0x2
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ add rsi,0x70
+ vextracti32x4 xmm8,zmm2,0x2
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_7_remain_EmbgEptodyewbFa:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2
+ jmp NEAR $L$_ret_EmbgEptodyewbFa
+
+$L$_remaining_num_blocks_is_6_EmbgEptodyewbFa:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 ymm2,YMMWORD[64+rdi]
+ add rdi,0x60
+ and rdx,0xf
+ je NEAR $L$_done_6_remain_EmbgEptodyewbFa
+ vextracti32x4 xmm12,zmm10,0x1
+ vextracti32x4 xmm13,zmm10,0x2
+ vinserti32x4 zmm10,zmm10,xmm13,0x1
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ add rsi,0x60
+ vextracti32x4 xmm8,zmm2,0x1
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_6_remain_EmbgEptodyewbFa:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 YMMWORD[64+rsi],ymm2
+ jmp NEAR $L$_ret_EmbgEptodyewbFa
+
+$L$_remaining_num_blocks_is_5_EmbgEptodyewbFa:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[64+rdi]
+ add rdi,0x50
+ and rdx,0xf
+ je NEAR $L$_done_5_remain_EmbgEptodyewbFa
+ vmovdqa xmm12,xmm10
+ vextracti32x4 xmm10,zmm10,0x1
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu XMMWORD[64+rsi],xmm2
+ add rsi,0x50
+ vmovdqa xmm8,xmm2
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_5_remain_EmbgEptodyewbFa:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 XMMWORD[64+rsi],xmm2
+ jmp NEAR $L$_ret_EmbgEptodyewbFa
+
+$L$_remaining_num_blocks_is_4_EmbgEptodyewbFa:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ add rdi,0x40
+ and rdx,0xf
+ je NEAR $L$_done_4_remain_EmbgEptodyewbFa
+ vextracti32x4 xmm12,zmm9,0x3
+ vinserti32x4 zmm9,zmm9,xmm10,0x3
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ add rsi,0x40
+ vextracti32x4 xmm8,zmm1,0x3
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_4_remain_EmbgEptodyewbFa:
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ jmp NEAR $L$_ret_EmbgEptodyewbFa
+
+$L$_remaining_num_blocks_is_3_EmbgEptodyewbFa:
+ vmovdqu xmm1,XMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ add rdi,0x30
+ and rdx,0xf
+ je NEAR $L$_done_3_remain_EmbgEptodyewbFa
+ vextracti32x4 xmm13,zmm9,0x2
+ vextracti32x4 xmm10,zmm9,0x1
+ vextracti32x4 xmm11,zmm9,0x3
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ add rsi,0x30
+ vmovdqa xmm8,xmm3
+ vmovdqa xmm0,xmm13
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_3_remain_EmbgEptodyewbFa:
+ vextracti32x4 xmm10,zmm9,0x1
+ vextracti32x4 xmm11,zmm9,0x2
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ jmp NEAR $L$_ret_EmbgEptodyewbFa
+
+$L$_remaining_num_blocks_is_2_EmbgEptodyewbFa:
+ vmovdqu xmm1,XMMWORD[rdi]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ add rdi,0x20
+ and rdx,0xf
+ je NEAR $L$_done_2_remain_EmbgEptodyewbFa
+ vextracti32x4 xmm10,zmm9,0x2
+ vextracti32x4 xmm12,zmm9,0x1
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ add rsi,0x20
+ vmovdqa xmm8,xmm2
+ vmovdqa xmm0,xmm12
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_2_remain_EmbgEptodyewbFa:
+ vextracti32x4 xmm10,zmm9,0x1
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ jmp NEAR $L$_ret_EmbgEptodyewbFa
+
+$L$_remaining_num_blocks_is_1_EmbgEptodyewbFa:
+ vmovdqu xmm1,XMMWORD[rdi]
+ add rdi,0x10
+ and rdx,0xf
+ je NEAR $L$_done_1_remain_EmbgEptodyewbFa
+ vextracti32x4 xmm11,zmm9,0x1
+ vpxor xmm1,xmm1,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x10
+ vmovdqa xmm8,xmm1
+ vmovdqa xmm0,xmm9
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_1_remain_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu XMMWORD[rsi],xmm1
+ jmp NEAR $L$_ret_EmbgEptodyewbFa
+
+$L$_start_by16_EmbgEptodyewbFa:
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+
+
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+
+
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm11,zmm9,0x1
+ vpxord zmm11,zmm11,zmm14
+
+ vpsrldq zmm15,zmm10,0xf
+ vpclmulqdq zmm16,zmm15,zmm25,0x0
+ vpslldq zmm12,zmm10,0x1
+ vpxord zmm12,zmm12,zmm16
+
+$L$_main_loop_run_16_EmbgEptodyewbFa:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ vmovdqu8 zmm3,ZMMWORD[128+rdi]
+ vmovdqu8 zmm4,ZMMWORD[192+rdi]
+ vmovdqu8 xmm5,XMMWORD[240+rdi]
+ add rdi,0x100
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vpxorq zmm3,zmm3,zmm0
+ vpxorq zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm11,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm11,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm12,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm12,0x1
+ vpxord zmm16,zmm16,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm15,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm17,zmm15,0x1
+ vpxord zmm17,zmm17,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vpsrldq zmm13,zmm16,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm18,zmm16,0x1
+ vpxord zmm18,zmm18,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vaesdec zmm3,zmm3,zmm0
+ vaesdec zmm4,zmm4,zmm0
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+ vaesdeclast zmm3,zmm3,zmm0
+ vaesdeclast zmm4,zmm4,zmm0
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+ vpxorq zmm3,zmm3,zmm11
+ vpxorq zmm4,zmm4,zmm12
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqa32 zmm11,zmm17
+ vmovdqa32 zmm12,zmm18
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ vmovdqu8 ZMMWORD[128+rsi],zmm3
+ vmovdqu8 ZMMWORD[192+rsi],zmm4
+ add rsi,0x100
+ sub rdx,0x100
+ cmp rdx,0x100
+ jge NEAR $L$_main_loop_run_16_EmbgEptodyewbFa
+
+ cmp rdx,0x80
+ jge NEAR $L$_main_loop_run_8_EmbgEptodyewbFa
+ jmp NEAR $L$_do_n_blocks_EmbgEptodyewbFa
+
+$L$_start_by8_EmbgEptodyewbFa:
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rsp]
+ vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7]
+ mov r8,0xaa
+ kmovq k2,r8
+
+
+ vpshufb zmm1,zmm0,zmm8
+ vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210]
+ vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678]
+ vpclmulqdq zmm3,zmm2,zmm25,0x0
+ vpxorq zmm4{k2},zmm4,zmm2
+ vpxord zmm9,zmm3,zmm4
+
+
+ vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654]
+ vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234]
+ vpclmulqdq zmm7,zmm6,zmm25,0x0
+ vpxorq zmm5{k2},zmm5,zmm6
+ vpxord zmm10,zmm7,zmm5
+
+$L$_main_loop_run_8_EmbgEptodyewbFa:
+ vmovdqu8 zmm1,ZMMWORD[rdi]
+ vmovdqu8 zmm2,ZMMWORD[64+rdi]
+ vmovdqu8 xmm5,XMMWORD[112+rdi]
+ add rdi,0x80
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[rcx]
+ vpxorq zmm1,zmm1,zmm0
+ vpxorq zmm2,zmm2,zmm0
+ vpsrldq zmm13,zmm9,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm15,zmm9,0x1
+ vpxord zmm15,zmm15,zmm14
+ vbroadcasti32x4 zmm0,ZMMWORD[16+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[32+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[48+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+ vpsrldq zmm13,zmm10,0xf
+ vpclmulqdq zmm14,zmm13,zmm25,0x0
+ vpslldq zmm16,zmm10,0x1
+ vpxord zmm16,zmm16,zmm14
+
+ vbroadcasti32x4 zmm0,ZMMWORD[64+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[80+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[96+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[112+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[128+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[144+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[160+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[176+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[192+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[208+rcx]
+ vaesdec zmm1,zmm1,zmm0
+ vaesdec zmm2,zmm2,zmm0
+
+
+ vbroadcasti32x4 zmm0,ZMMWORD[224+rcx]
+ vaesdeclast zmm1,zmm1,zmm0
+ vaesdeclast zmm2,zmm2,zmm0
+
+ vpxorq zmm1,zmm1,zmm9
+ vpxorq zmm2,zmm2,zmm10
+
+
+ vmovdqa32 zmm9,zmm15
+ vmovdqa32 zmm10,zmm16
+ vmovdqu8 ZMMWORD[rsi],zmm1
+ vmovdqu8 ZMMWORD[64+rsi],zmm2
+ add rsi,0x80
+ sub rdx,0x80
+ cmp rdx,0x80
+ jge NEAR $L$_main_loop_run_8_EmbgEptodyewbFa
+ jmp NEAR $L$_do_n_blocks_EmbgEptodyewbFa
+
+$L$_steal_cipher_EmbgEptodyewbFa:
+
+ vmovdqa xmm2,xmm8
+
+
+ lea rax,[vpshufb_shf_table]
+ vmovdqu xmm10,XMMWORD[rdx*1+rax]
+ vpshufb xmm8,xmm8,xmm10
+
+
+ vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi]
+ vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8
+
+
+ lea rax,[vpshufb_shf_table]
+ add rax,16
+ sub rax,rdx
+ vmovdqu xmm10,XMMWORD[rax]
+ vpxor xmm10,xmm10,XMMWORD[mask1]
+ vpshufb xmm3,xmm3,xmm10
+
+ vpblendvb xmm3,xmm3,xmm2,xmm10
+
+
+ vpxor xmm8,xmm3,xmm0
+
+
+ vpxor xmm8,xmm8,XMMWORD[rcx]
+ vaesdec xmm8,xmm8,XMMWORD[16+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[32+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[48+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[64+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[80+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[96+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[112+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[128+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[144+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[160+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[176+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[192+rcx]
+ vaesdec xmm8,xmm8,XMMWORD[208+rcx]
+ vaesdeclast xmm8,xmm8,XMMWORD[224+rcx]
+
+ vpxor xmm8,xmm8,xmm0
+
+$L$_done_EmbgEptodyewbFa:
+
+ vmovdqu XMMWORD[(-16)+rsi],xmm8
+$L$_ret_EmbgEptodyewbFa:
+ mov rbx,QWORD[288+rsp]
+ xor r8,r8
+ mov QWORD[288+rsp],r8
+
+ vpxorq zmm0,zmm0,zmm0
+ mov rdi,QWORD[((288 + 8))+rsp]
+ mov QWORD[((288 + 8))+rsp],r8
+ mov rsi,QWORD[((288 + 16))+rsp]
+ mov QWORD[((288 + 16))+rsp],r8
+
+ vmovdqa xmm6,XMMWORD[((128 + 0))+rsp]
+ vmovdqa xmm7,XMMWORD[((128 + 16))+rsp]
+ vmovdqa xmm8,XMMWORD[((128 + 32))+rsp]
+ vmovdqa xmm9,XMMWORD[((128 + 48))+rsp]
+
+
+ vmovdqa64 ZMMWORD[128+rsp],zmm0
+
+ vmovdqa xmm10,XMMWORD[((128 + 64))+rsp]
+ vmovdqa xmm11,XMMWORD[((128 + 80))+rsp]
+ vmovdqa xmm12,XMMWORD[((128 + 96))+rsp]
+ vmovdqa xmm13,XMMWORD[((128 + 112))+rsp]
+
+
+ vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0
+
+ vmovdqa xmm14,XMMWORD[((128 + 128))+rsp]
+ vmovdqa xmm15,XMMWORD[((128 + 144))+rsp]
+
+
+
+ vmovdqa YMMWORD[(128 + 128)+rsp],ymm0
+ mov rsp,rbp
+ pop rbp
+ vzeroupper
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$_less_than_128_bytes_EmbgEptodyewbFa:
+ cmp rdx,0x10
+ jb NEAR $L$_ret_EmbgEptodyewbFa
+
+ mov r8,rdx
+ and r8,0x70
+ cmp r8,0x60
+ je NEAR $L$_num_blocks_is_6_EmbgEptodyewbFa
+ cmp r8,0x50
+ je NEAR $L$_num_blocks_is_5_EmbgEptodyewbFa
+ cmp r8,0x40
+ je NEAR $L$_num_blocks_is_4_EmbgEptodyewbFa
+ cmp r8,0x30
+ je NEAR $L$_num_blocks_is_3_EmbgEptodyewbFa
+ cmp r8,0x20
+ je NEAR $L$_num_blocks_is_2_EmbgEptodyewbFa
+ cmp r8,0x10
+ je NEAR $L$_num_blocks_is_1_EmbgEptodyewbFa
+
+$L$_num_blocks_is_7_EmbgEptodyewbFa:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[64+rsp],rax
+ mov QWORD[((64 + 8))+rsp],rbx
+ vmovdqa xmm13,XMMWORD[64+rsp]
+ vmovdqu xmm5,XMMWORD[64+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[80+rsp],rax
+ mov QWORD[((80 + 8))+rsp],rbx
+ vmovdqa xmm14,XMMWORD[80+rsp]
+ vmovdqu xmm6,XMMWORD[80+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[96+rsp],rax
+ mov QWORD[((96 + 8))+rsp],rbx
+ vmovdqa xmm15,XMMWORD[96+rsp]
+ vmovdqu xmm7,XMMWORD[96+rdi]
+ add rdi,0x70
+ and rdx,0xf
+ je NEAR $L$_done_7_EmbgEptodyewbFa
+
+$L$_steal_cipher_7_EmbgEptodyewbFa:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm16,xmm15
+ vmovdqa xmm15,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vpxor xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vaesdeclast xmm7,xmm7,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ vmovdqu XMMWORD[80+rsi],xmm6
+ add rsi,0x70
+ vmovdqa64 xmm0,xmm16
+ vmovdqa xmm8,xmm7
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_7_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vpxor xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vaesdec xmm7,xmm7,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vaesdeclast xmm7,xmm7,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vpxor xmm7,xmm7,xmm15
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ vmovdqu XMMWORD[80+rsi],xmm6
+ add rsi,0x70
+ vmovdqa xmm8,xmm7
+ jmp NEAR $L$_done_EmbgEptodyewbFa
+
+$L$_num_blocks_is_6_EmbgEptodyewbFa:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[64+rsp],rax
+ mov QWORD[((64 + 8))+rsp],rbx
+ vmovdqa xmm13,XMMWORD[64+rsp]
+ vmovdqu xmm5,XMMWORD[64+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[80+rsp],rax
+ mov QWORD[((80 + 8))+rsp],rbx
+ vmovdqa xmm14,XMMWORD[80+rsp]
+ vmovdqu xmm6,XMMWORD[80+rdi]
+ add rdi,0x60
+ and rdx,0xf
+ je NEAR $L$_done_6_EmbgEptodyewbFa
+
+$L$_steal_cipher_6_EmbgEptodyewbFa:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm15,xmm14
+ vmovdqa xmm14,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ add rsi,0x60
+ vmovdqa xmm0,xmm15
+ vmovdqa xmm8,xmm6
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_6_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vpxor xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vaesdec xmm6,xmm6,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vaesdeclast xmm6,xmm6,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vpxor xmm6,xmm6,xmm14
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ vmovdqu XMMWORD[64+rsi],xmm5
+ add rsi,0x60
+ vmovdqa xmm8,xmm6
+ jmp NEAR $L$_done_EmbgEptodyewbFa
+
+$L$_num_blocks_is_5_EmbgEptodyewbFa:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[64+rsp],rax
+ mov QWORD[((64 + 8))+rsp],rbx
+ vmovdqa xmm13,XMMWORD[64+rsp]
+ vmovdqu xmm5,XMMWORD[64+rdi]
+ add rdi,0x50
+ and rdx,0xf
+ je NEAR $L$_done_5_EmbgEptodyewbFa
+
+$L$_steal_cipher_5_EmbgEptodyewbFa:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm14,xmm13
+ vmovdqa xmm13,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ add rsi,0x50
+ vmovdqa xmm0,xmm14
+ vmovdqa xmm8,xmm5
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_5_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vpxor xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vaesdec xmm5,xmm5,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vaesdeclast xmm5,xmm5,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vpxor xmm5,xmm5,xmm13
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ vmovdqu XMMWORD[48+rsi],xmm4
+ add rsi,0x50
+ vmovdqa xmm8,xmm5
+ jmp NEAR $L$_done_EmbgEptodyewbFa
+
+$L$_num_blocks_is_4_EmbgEptodyewbFa:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[48+rsp],rax
+ mov QWORD[((48 + 8))+rsp],rbx
+ vmovdqa xmm12,XMMWORD[48+rsp]
+ vmovdqu xmm4,XMMWORD[48+rdi]
+ add rdi,0x40
+ and rdx,0xf
+ je NEAR $L$_done_4_EmbgEptodyewbFa
+
+$L$_steal_cipher_4_EmbgEptodyewbFa:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm13,xmm12
+ vmovdqa xmm12,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ add rsi,0x40
+ vmovdqa xmm0,xmm13
+ vmovdqa xmm8,xmm4
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_4_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vpxor xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vaesdec xmm4,xmm4,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vaesdeclast xmm4,xmm4,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vpxor xmm4,xmm4,xmm12
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ vmovdqu XMMWORD[32+rsi],xmm3
+ add rsi,0x40
+ vmovdqa xmm8,xmm4
+ jmp NEAR $L$_done_EmbgEptodyewbFa
+
+$L$_num_blocks_is_3_EmbgEptodyewbFa:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[32+rsp],rax
+ mov QWORD[((32 + 8))+rsp],rbx
+ vmovdqa xmm11,XMMWORD[32+rsp]
+ vmovdqu xmm3,XMMWORD[32+rdi]
+ add rdi,0x30
+ and rdx,0xf
+ je NEAR $L$_done_3_EmbgEptodyewbFa
+
+$L$_steal_cipher_3_EmbgEptodyewbFa:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm12,xmm11
+ vmovdqa xmm11,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ add rsi,0x30
+ vmovdqa xmm0,xmm12
+ vmovdqa xmm8,xmm3
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_3_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vpxor xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vaesdec xmm3,xmm3,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vaesdeclast xmm3,xmm3,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vpxor xmm3,xmm3,xmm11
+ vmovdqu XMMWORD[rsi],xmm1
+ vmovdqu XMMWORD[16+rsi],xmm2
+ add rsi,0x30
+ vmovdqa xmm8,xmm3
+ jmp NEAR $L$_done_EmbgEptodyewbFa
+
+$L$_num_blocks_is_2_EmbgEptodyewbFa:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[((16 + 8))+rsp],rbx
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vmovdqu xmm2,XMMWORD[16+rdi]
+ add rdi,0x20
+ and rdx,0xf
+ je NEAR $L$_done_2_EmbgEptodyewbFa
+
+$L$_steal_cipher_2_EmbgEptodyewbFa:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm11,xmm10
+ vmovdqa xmm10,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x20
+ vmovdqa xmm0,xmm11
+ vmovdqa xmm8,xmm2
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_2_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vpxor xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vaesdec xmm2,xmm2,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vaesdeclast xmm2,xmm2,xmm0
+ vpxor xmm1,xmm1,xmm9
+ vpxor xmm2,xmm2,xmm10
+ vmovdqu XMMWORD[rsi],xmm1
+ add rsi,0x20
+ vmovdqa xmm8,xmm2
+ jmp NEAR $L$_done_EmbgEptodyewbFa
+
+$L$_num_blocks_is_1_EmbgEptodyewbFa:
+ vmovdqa xmm9,XMMWORD[rsp]
+ mov rax,QWORD[rsp]
+ mov rbx,QWORD[8+rsp]
+ vmovdqu xmm1,XMMWORD[rdi]
+ add rdi,0x10
+ and rdx,0xf
+ je NEAR $L$_done_1_EmbgEptodyewbFa
+
+$L$_steal_cipher_1_EmbgEptodyewbFa:
+ xor r11,r11
+ shl rax,1
+ adc rbx,rbx
+ cmovc r11,r10
+ xor rax,r11
+ mov QWORD[16+rsp],rax
+ mov QWORD[24+rsp],rbx
+ vmovdqa64 xmm10,xmm9
+ vmovdqa xmm9,XMMWORD[16+rsp]
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ add rsi,0x10
+ vmovdqa xmm0,xmm10
+ vmovdqa xmm8,xmm1
+ jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa
+
+$L$_done_1_EmbgEptodyewbFa:
+ vpxor xmm1,xmm1,xmm9
+ vmovdqu xmm0,XMMWORD[rcx]
+ vpxor xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[16+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[32+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[48+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[64+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[80+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[96+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[112+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[128+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[144+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[160+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[176+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[192+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[208+rcx]
+ vaesdec xmm1,xmm1,xmm0
+ vmovdqu xmm0,XMMWORD[224+rcx]
+ vaesdeclast xmm1,xmm1,xmm0
+ vpxor xmm1,xmm1,xmm9
+ add rsi,0x10
+ vmovdqa xmm8,xmm1
+ jmp NEAR $L$_done_EmbgEptodyewbFa
+
+section .rdata rdata align=8
+ALIGN 16
+
+vpshufb_shf_table:
+ DQ 0x8786858483828100,0x8f8e8d8c8b8a8988
+ DQ 0x0706050403020100,0x000e0d0c0b0a0908
+
+mask1:
+ DQ 0x8080808080808080,0x8080808080808080
+
+const_dq3210:
+ DQ 0,0,1,1,2,2,3,3
+const_dq5678:
+ DQ 8,8,7,7,6,6,5,5
+const_dq7654:
+ DQ 4,4,5,5,6,6,7,7
+const_dq1234:
+ DQ 4,4,3,3,2,2,1,1
+
+shufb_15_7:
+DB 15,0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,0xff,0xff
+DB 0xff,0xff,0xff,0xff,0xff
+
+section .text code align=64
+
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm
new file mode 100644
index 0000000..47930a9
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm
@@ -0,0 +1,1276 @@
+default rel
+%define XMMWORD
+%define YMMWORD
+%define ZMMWORD
+section .text code align=64
+
+EXTERN OPENSSL_ia32cap_P
+global ossl_rsaz_avxifma_eligible
+
+ALIGN 32
+ossl_rsaz_avxifma_eligible:
+ mov ecx,DWORD[((OPENSSL_ia32cap_P+20))]
+ xor eax,eax
+ and ecx,8388608
+ cmp ecx,8388608
+ cmove eax,ecx
+ DB 0F3h,0C3h ;repret
+
+section .text code align=64
+
+
+global ossl_rsaz_amm52x20_x1_avxifma256
+
+ALIGN 32
+ossl_rsaz_amm52x20_x1_avxifma256:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_ossl_rsaz_amm52x20_x1_avxifma256:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+
+
+
+DB 243,15,30,250
+ push rbx
+
+ push rbp
+
+ push r12
+
+ push r13
+
+ push r14
+
+ push r15
+
+$L$ossl_rsaz_amm52x20_x1_avxifma256_body:
+
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+
+ xor r9d,r9d
+
+ mov r11,rdx
+ mov rax,0xfffffffffffff
+
+
+ mov ebx,5
+
+ALIGN 32
+$L$loop5:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-168))+rsp]
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm5
+ vmovdqu YMMWORD[64+rsp],ymm6
+ vmovdqu YMMWORD[96+rsp],ymm7
+ vmovdqu YMMWORD[128+rsp],ymm8
+ mov QWORD[160+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm5,YMMWORD[40+rsp]
+ vmovdqu ymm6,YMMWORD[72+rsp]
+ vmovdqu ymm7,YMMWORD[104+rsp]
+ vmovdqu ymm8,YMMWORD[136+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx]
+ lea rsp,[168+rsp]
+ mov r13,QWORD[8+r11]
+
+ vpbroadcastq ymm1,QWORD[8+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-168))+rsp]
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm5
+ vmovdqu YMMWORD[64+rsp],ymm6
+ vmovdqu YMMWORD[96+rsp],ymm7
+ vmovdqu YMMWORD[128+rsp],ymm8
+ mov QWORD[160+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm5,YMMWORD[40+rsp]
+ vmovdqu ymm6,YMMWORD[72+rsp]
+ vmovdqu ymm7,YMMWORD[104+rsp]
+ vmovdqu ymm8,YMMWORD[136+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx]
+ lea rsp,[168+rsp]
+ mov r13,QWORD[16+r11]
+
+ vpbroadcastq ymm1,QWORD[16+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-168))+rsp]
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm5
+ vmovdqu YMMWORD[64+rsp],ymm6
+ vmovdqu YMMWORD[96+rsp],ymm7
+ vmovdqu YMMWORD[128+rsp],ymm8
+ mov QWORD[160+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm5,YMMWORD[40+rsp]
+ vmovdqu ymm6,YMMWORD[72+rsp]
+ vmovdqu ymm7,YMMWORD[104+rsp]
+ vmovdqu ymm8,YMMWORD[136+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx]
+ lea rsp,[168+rsp]
+ mov r13,QWORD[24+r11]
+
+ vpbroadcastq ymm1,QWORD[24+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-168))+rsp]
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm5
+ vmovdqu YMMWORD[64+rsp],ymm6
+ vmovdqu YMMWORD[96+rsp],ymm7
+ vmovdqu YMMWORD[128+rsp],ymm8
+ mov QWORD[160+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm5,YMMWORD[40+rsp]
+ vmovdqu ymm6,YMMWORD[72+rsp]
+ vmovdqu ymm7,YMMWORD[104+rsp]
+ vmovdqu ymm8,YMMWORD[136+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx]
+ lea rsp,[168+rsp]
+ lea r11,[32+r11]
+ dec ebx
+ jne NEAR $L$loop5
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+
+
+ vpsrlq ymm0,ymm3,52
+ vpsrlq ymm1,ymm5,52
+ vpsrlq ymm2,ymm6,52
+ vpsrlq ymm13,ymm7,52
+ vpsrlq ymm14,ymm8,52
+
+
+ vpermq ymm14,ymm14,144
+ vpermq ymm15,ymm13,3
+ vblendpd ymm14,ymm14,ymm15,1
+
+ vpermq ymm13,ymm13,144
+ vpermq ymm15,ymm2,3
+ vblendpd ymm13,ymm13,ymm15,1
+
+ vpermq ymm2,ymm2,144
+ vpermq ymm15,ymm1,3
+ vblendpd ymm2,ymm2,ymm15,1
+
+ vpermq ymm1,ymm1,144
+ vpermq ymm15,ymm0,3
+ vblendpd ymm1,ymm1,ymm15,1
+
+ vpermq ymm0,ymm0,144
+ vpand ymm0,ymm0,YMMWORD[$L$high64x3]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,ymm0
+ vpaddq ymm5,ymm5,ymm1
+ vpaddq ymm6,ymm6,ymm2
+ vpaddq ymm7,ymm7,ymm13
+ vpaddq ymm8,ymm8,ymm14
+
+
+
+ vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm1,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm2,ymm6,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm14,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm0
+ vmovmskpd r13d,ymm1
+ vmovmskpd r12d,ymm2
+ vmovmskpd r11d,ymm13
+ vmovmskpd r10d,ymm14
+
+
+ vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm1,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm2,ymm6,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm14,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm0
+ vmovmskpd r8d,ymm1
+ vmovmskpd ebx,ymm2
+ vmovmskpd ecx,ymm13
+ vmovmskpd edx,ymm14
+
+
+
+ shl r13b,4
+ or r14b,r13b
+ shl r11b,4
+ or r12b,r11b
+
+ add r14b,r14b
+ adc r12b,r12b
+ adc r10b,r10b
+
+ shl r8b,4
+ or r9b,r8b
+ shl cl,4
+ or bl,cl
+
+ add r14b,r9b
+ adc r12b,bl
+ adc r10b,dl
+
+ xor r14b,r9b
+ xor r12b,bl
+ xor r10b,dl
+
+ lea rdx,[$L$kmasklut]
+
+ mov r13b,r14b
+ and r14,0xf
+ vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm2,YMMWORD[r14*1+rdx]
+ vblendvpd ymm3,ymm3,ymm0,ymm2
+
+ shr r13b,4
+ and r13,0xf
+ vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm2,YMMWORD[r13*1+rdx]
+ vblendvpd ymm5,ymm5,ymm0,ymm2
+
+ mov r11b,r12b
+ and r12,0xf
+ vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm2,YMMWORD[r12*1+rdx]
+ vblendvpd ymm6,ymm6,ymm0,ymm2
+
+ shr r11b,4
+ and r11,0xf
+ vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm2,YMMWORD[r11*1+rdx]
+ vblendvpd ymm7,ymm7,ymm0,ymm2
+
+ and r10,0xf
+ vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm8,ymm8,ymm0,ymm2
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+
+ vmovdqu YMMWORD[rdi],ymm3
+ vmovdqu YMMWORD[32+rdi],ymm5
+ vmovdqu YMMWORD[64+rdi],ymm6
+ vmovdqu YMMWORD[96+rdi],ymm7
+ vmovdqu YMMWORD[128+rdi],ymm8
+
+ vzeroupper
+ mov r15,QWORD[rsp]
+
+ mov r14,QWORD[8+rsp]
+
+ mov r13,QWORD[16+rsp]
+
+ mov r12,QWORD[24+rsp]
+
+ mov rbp,QWORD[32+rsp]
+
+ mov rbx,QWORD[40+rsp]
+
+ lea rsp,[48+rsp]
+
+$L$ossl_rsaz_amm52x20_x1_avxifma256_epilogue:
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$SEH_end_ossl_rsaz_amm52x20_x1_avxifma256:
+section .rdata rdata align=32
+ALIGN 32
+$L$mask52x4:
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+$L$high64x3:
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+$L$kmasklut:
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+section .text code align=64
+
+
+global ossl_rsaz_amm52x20_x2_avxifma256
+
+ALIGN 32
+ossl_rsaz_amm52x20_x2_avxifma256:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_ossl_rsaz_amm52x20_x2_avxifma256:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+
+
+
+DB 243,15,30,250
+ push rbx
+
+ push rbp
+
+ push r12
+
+ push r13
+
+ push r14
+
+ push r15
+
+$L$ossl_rsaz_amm52x20_x2_avxifma256_body:
+
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm10,ymm0
+ vmovapd ymm11,ymm0
+ vmovapd ymm12,ymm0
+
+ xor r9d,r9d
+ xor r15d,r15d
+
+ mov r11,rdx
+ mov rax,0xfffffffffffff
+
+ mov ebx,20
+
+ALIGN 32
+$L$loop20:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,QWORD[r8]
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-168))+rsp]
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm5
+ vmovdqu YMMWORD[64+rsp],ymm6
+ vmovdqu YMMWORD[96+rsp],ymm7
+ vmovdqu YMMWORD[128+rsp],ymm8
+ mov QWORD[160+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm5,YMMWORD[40+rsp]
+ vmovdqu ymm6,YMMWORD[72+rsp]
+ vmovdqu ymm7,YMMWORD[104+rsp]
+ vmovdqu ymm8,YMMWORD[136+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx]
+ lea rsp,[168+rsp]
+ mov r13,QWORD[160+r11]
+
+ vpbroadcastq ymm1,QWORD[160+r11]
+ mov rdx,QWORD[160+rsi]
+ mulx r12,r13,r13
+ add r15,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,QWORD[8+r8]
+ imul r13,r15
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[160+rcx]
+ mulx r12,r13,r13
+ add r15,r13
+ adc r10,r12
+
+ shr r15,52
+ sal r10,12
+ or r15,r10
+
+ lea rsp,[((-168))+rsp]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm4
+ vmovdqu YMMWORD[32+rsp],ymm9
+ vmovdqu YMMWORD[64+rsp],ymm10
+ vmovdqu YMMWORD[96+rsp],ymm11
+ vmovdqu YMMWORD[128+rsp],ymm12
+ mov QWORD[160+rsp],0
+
+ vmovdqu ymm4,YMMWORD[8+rsp]
+ vmovdqu ymm9,YMMWORD[40+rsp]
+ vmovdqu ymm10,YMMWORD[72+rsp]
+ vmovdqu ymm11,YMMWORD[104+rsp]
+ vmovdqu ymm12,YMMWORD[136+rsp]
+
+ add r15,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx]
+ lea rsp,[168+rsp]
+ lea r11,[8+r11]
+ dec ebx
+ jne NEAR $L$loop20
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+
+
+ vpsrlq ymm0,ymm3,52
+ vpsrlq ymm1,ymm5,52
+ vpsrlq ymm2,ymm6,52
+ vpsrlq ymm13,ymm7,52
+ vpsrlq ymm14,ymm8,52
+
+
+ vpermq ymm14,ymm14,144
+ vpermq ymm15,ymm13,3
+ vblendpd ymm14,ymm14,ymm15,1
+
+ vpermq ymm13,ymm13,144
+ vpermq ymm15,ymm2,3
+ vblendpd ymm13,ymm13,ymm15,1
+
+ vpermq ymm2,ymm2,144
+ vpermq ymm15,ymm1,3
+ vblendpd ymm2,ymm2,ymm15,1
+
+ vpermq ymm1,ymm1,144
+ vpermq ymm15,ymm0,3
+ vblendpd ymm1,ymm1,ymm15,1
+
+ vpermq ymm0,ymm0,144
+ vpand ymm0,ymm0,YMMWORD[$L$high64x3]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,ymm0
+ vpaddq ymm5,ymm5,ymm1
+ vpaddq ymm6,ymm6,ymm2
+ vpaddq ymm7,ymm7,ymm13
+ vpaddq ymm8,ymm8,ymm14
+
+
+
+ vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm1,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm2,ymm6,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm14,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm0
+ vmovmskpd r13d,ymm1
+ vmovmskpd r12d,ymm2
+ vmovmskpd r11d,ymm13
+ vmovmskpd r10d,ymm14
+
+
+ vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm1,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm2,ymm6,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm14,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm0
+ vmovmskpd r8d,ymm1
+ vmovmskpd ebx,ymm2
+ vmovmskpd ecx,ymm13
+ vmovmskpd edx,ymm14
+
+
+
+ shl r13b,4
+ or r14b,r13b
+ shl r11b,4
+ or r12b,r11b
+
+ add r14b,r14b
+ adc r12b,r12b
+ adc r10b,r10b
+
+ shl r8b,4
+ or r9b,r8b
+ shl cl,4
+ or bl,cl
+
+ add r14b,r9b
+ adc r12b,bl
+ adc r10b,dl
+
+ xor r14b,r9b
+ xor r12b,bl
+ xor r10b,dl
+
+ lea rdx,[$L$kmasklut]
+
+ mov r13b,r14b
+ and r14,0xf
+ vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm2,YMMWORD[r14*1+rdx]
+ vblendvpd ymm3,ymm3,ymm0,ymm2
+
+ shr r13b,4
+ and r13,0xf
+ vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm2,YMMWORD[r13*1+rdx]
+ vblendvpd ymm5,ymm5,ymm0,ymm2
+
+ mov r11b,r12b
+ and r12,0xf
+ vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm2,YMMWORD[r12*1+rdx]
+ vblendvpd ymm6,ymm6,ymm0,ymm2
+
+ shr r11b,4
+ and r11,0xf
+ vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm2,YMMWORD[r11*1+rdx]
+ vblendvpd ymm7,ymm7,ymm0,ymm2
+
+ and r10,0xf
+ vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm8,ymm8,ymm0,ymm2
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+
+ vmovq xmm0,r15
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm4,ymm4,ymm0,3
+
+
+
+ vpsrlq ymm0,ymm4,52
+ vpsrlq ymm1,ymm9,52
+ vpsrlq ymm2,ymm10,52
+ vpsrlq ymm13,ymm11,52
+ vpsrlq ymm14,ymm12,52
+
+
+ vpermq ymm14,ymm14,144
+ vpermq ymm15,ymm13,3
+ vblendpd ymm14,ymm14,ymm15,1
+
+ vpermq ymm13,ymm13,144
+ vpermq ymm15,ymm2,3
+ vblendpd ymm13,ymm13,ymm15,1
+
+ vpermq ymm2,ymm2,144
+ vpermq ymm15,ymm1,3
+ vblendpd ymm2,ymm2,ymm15,1
+
+ vpermq ymm1,ymm1,144
+ vpermq ymm15,ymm0,3
+ vblendpd ymm1,ymm1,ymm15,1
+
+ vpermq ymm0,ymm0,144
+ vpand ymm0,ymm0,YMMWORD[$L$high64x3]
+
+
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm4,ymm4,ymm0
+ vpaddq ymm9,ymm9,ymm1
+ vpaddq ymm10,ymm10,ymm2
+ vpaddq ymm11,ymm11,ymm13
+ vpaddq ymm12,ymm12,ymm14
+
+
+
+ vpcmpgtq ymm0,ymm4,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm1,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm2,ymm10,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm14,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm0
+ vmovmskpd r13d,ymm1
+ vmovmskpd r12d,ymm2
+ vmovmskpd r11d,ymm13
+ vmovmskpd r10d,ymm14
+
+
+ vpcmpeqq ymm0,ymm4,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm1,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm2,ymm10,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm14,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm0
+ vmovmskpd r8d,ymm1
+ vmovmskpd ebx,ymm2
+ vmovmskpd ecx,ymm13
+ vmovmskpd edx,ymm14
+
+
+
+ shl r13b,4
+ or r14b,r13b
+ shl r11b,4
+ or r12b,r11b
+
+ add r14b,r14b
+ adc r12b,r12b
+ adc r10b,r10b
+
+ shl r8b,4
+ or r9b,r8b
+ shl cl,4
+ or bl,cl
+
+ add r14b,r9b
+ adc r12b,bl
+ adc r10b,dl
+
+ xor r14b,r9b
+ xor r12b,bl
+ xor r10b,dl
+
+ lea rdx,[$L$kmasklut]
+
+ mov r13b,r14b
+ and r14,0xf
+ vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm2,YMMWORD[r14*1+rdx]
+ vblendvpd ymm4,ymm4,ymm0,ymm2
+
+ shr r13b,4
+ and r13,0xf
+ vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm2,YMMWORD[r13*1+rdx]
+ vblendvpd ymm9,ymm9,ymm0,ymm2
+
+ mov r11b,r12b
+ and r12,0xf
+ vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm2,YMMWORD[r12*1+rdx]
+ vblendvpd ymm10,ymm10,ymm0,ymm2
+
+ shr r11b,4
+ and r11,0xf
+ vpsubq ymm0,ymm11,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm2,YMMWORD[r11*1+rdx]
+ vblendvpd ymm11,ymm11,ymm0,ymm2
+
+ and r10,0xf
+ vpsubq ymm0,ymm12,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm12,ymm12,ymm0,ymm2
+
+
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+ vmovdqu YMMWORD[rdi],ymm3
+ vmovdqu YMMWORD[32+rdi],ymm5
+ vmovdqu YMMWORD[64+rdi],ymm6
+ vmovdqu YMMWORD[96+rdi],ymm7
+ vmovdqu YMMWORD[128+rdi],ymm8
+
+ vmovdqu YMMWORD[160+rdi],ymm4
+ vmovdqu YMMWORD[192+rdi],ymm9
+ vmovdqu YMMWORD[224+rdi],ymm10
+ vmovdqu YMMWORD[256+rdi],ymm11
+ vmovdqu YMMWORD[288+rdi],ymm12
+
+ vzeroupper
+ mov r15,QWORD[rsp]
+
+ mov r14,QWORD[8+rsp]
+
+ mov r13,QWORD[16+rsp]
+
+ mov r12,QWORD[24+rsp]
+
+ mov rbp,QWORD[32+rsp]
+
+ mov rbx,QWORD[40+rsp]
+
+ lea rsp,[48+rsp]
+
+$L$ossl_rsaz_amm52x20_x2_avxifma256_epilogue:
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$SEH_end_ossl_rsaz_amm52x20_x2_avxifma256:
+section .text code align=64
+
+
+ALIGN 32
+global ossl_extract_multiplier_2x20_win5_avx
+
+ossl_extract_multiplier_2x20_win5_avx:
+
+DB 243,15,30,250
+ vmovapd ymm14,YMMWORD[$L$ones]
+ vmovq xmm10,r8
+ vpbroadcastq ymm12,xmm10
+ vmovq xmm10,r9
+ vpbroadcastq ymm13,xmm10
+ lea rax,[10240+rdx]
+
+
+ vpxor xmm0,xmm0,xmm0
+ vmovapd ymm11,ymm0
+ vmovapd ymm1,ymm0
+ vmovapd ymm2,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+
+ALIGN 32
+$L$loop:
+ vpcmpeqq ymm15,ymm12,ymm11
+ vmovdqu ymm10,YMMWORD[rdx]
+ vblendvpd ymm0,ymm0,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[32+rdx]
+ vblendvpd ymm1,ymm1,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[64+rdx]
+ vblendvpd ymm2,ymm2,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[96+rdx]
+ vblendvpd ymm3,ymm3,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[128+rdx]
+ vblendvpd ymm4,ymm4,ymm10,ymm15
+ vpcmpeqq ymm15,ymm13,ymm11
+ vmovdqu ymm10,YMMWORD[160+rdx]
+ vblendvpd ymm5,ymm5,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[192+rdx]
+ vblendvpd ymm6,ymm6,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[224+rdx]
+ vblendvpd ymm7,ymm7,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[256+rdx]
+ vblendvpd ymm8,ymm8,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[288+rdx]
+ vblendvpd ymm9,ymm9,ymm10,ymm15
+ vpaddq ymm11,ymm11,ymm14
+ add rdx,320
+ cmp rax,rdx
+ jne NEAR $L$loop
+ vmovdqu YMMWORD[rcx],ymm0
+ vmovdqu YMMWORD[32+rcx],ymm1
+ vmovdqu YMMWORD[64+rcx],ymm2
+ vmovdqu YMMWORD[96+rcx],ymm3
+ vmovdqu YMMWORD[128+rcx],ymm4
+ vmovdqu YMMWORD[160+rcx],ymm5
+ vmovdqu YMMWORD[192+rcx],ymm6
+ vmovdqu YMMWORD[224+rcx],ymm7
+ vmovdqu YMMWORD[256+rcx],ymm8
+ vmovdqu YMMWORD[288+rcx],ymm9
+ DB 0F3h,0C3h ;repret
+
+
+section .rdata rdata align=32
+ALIGN 32
+$L$ones:
+ DQ 1,1,1,1
+$L$zeros:
+ DQ 0,0,0,0
+EXTERN __imp_RtlVirtualUnwind
+
+ALIGN 16
+rsaz_def_handler:
+ push rsi
+ push rdi
+ push rbx
+ push rbp
+ push r12
+ push r13
+ push r14
+ push r15
+ pushfq
+ sub rsp,64
+
+ mov rax,QWORD[120+r8]
+ mov rbx,QWORD[248+r8]
+
+ mov rsi,QWORD[8+r9]
+ mov r11,QWORD[56+r9]
+
+ mov r10d,DWORD[r11]
+ lea r10,[r10*1+rsi]
+ cmp rbx,r10
+ jb NEAR $L$common_seh_tail
+
+ mov rax,QWORD[152+r8]
+
+ mov r10d,DWORD[4+r11]
+ lea r10,[r10*1+rsi]
+ cmp rbx,r10
+ jae NEAR $L$common_seh_tail
+
+ lea rax,[48+rax]
+
+ mov rbx,QWORD[((-8))+rax]
+ mov rbp,QWORD[((-16))+rax]
+ mov r12,QWORD[((-24))+rax]
+ mov r13,QWORD[((-32))+rax]
+ mov r14,QWORD[((-40))+rax]
+ mov r15,QWORD[((-48))+rax]
+ mov QWORD[144+r8],rbx
+ mov QWORD[160+r8],rbp
+ mov QWORD[216+r8],r12
+ mov QWORD[224+r8],r13
+ mov QWORD[232+r8],r14
+ mov QWORD[240+r8],r15
+
+$L$common_seh_tail:
+ mov rdi,QWORD[8+rax]
+ mov rsi,QWORD[16+rax]
+ mov QWORD[152+r8],rax
+ mov QWORD[168+r8],rsi
+ mov QWORD[176+r8],rdi
+
+ mov rdi,QWORD[40+r9]
+ mov rsi,r8
+ mov ecx,154
+ DD 0xa548f3fc
+
+ mov rsi,r9
+ xor rcx,rcx
+ mov rdx,QWORD[8+rsi]
+ mov r8,QWORD[rsi]
+ mov r9,QWORD[16+rsi]
+ mov r10,QWORD[40+rsi]
+ lea r11,[56+rsi]
+ lea r12,[24+rsi]
+ mov QWORD[32+rsp],r10
+ mov QWORD[40+rsp],r11
+ mov QWORD[48+rsp],r12
+ mov QWORD[56+rsp],rcx
+ call QWORD[__imp_RtlVirtualUnwind]
+
+ mov eax,1
+ add rsp,64
+ popfq
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop rbp
+ pop rbx
+ pop rdi
+ pop rsi
+ DB 0F3h,0C3h ;repret
+
+
+section .pdata rdata align=4
+ALIGN 4
+ DD $L$SEH_begin_ossl_rsaz_amm52x20_x1_avxifma256 wrt ..imagebase
+ DD $L$SEH_end_ossl_rsaz_amm52x20_x1_avxifma256 wrt ..imagebase
+ DD $L$SEH_info_ossl_rsaz_amm52x20_x1_avxifma256 wrt ..imagebase
+
+ DD $L$SEH_begin_ossl_rsaz_amm52x20_x2_avxifma256 wrt ..imagebase
+ DD $L$SEH_end_ossl_rsaz_amm52x20_x2_avxifma256 wrt ..imagebase
+ DD $L$SEH_info_ossl_rsaz_amm52x20_x2_avxifma256 wrt ..imagebase
+
+section .xdata rdata align=8
+ALIGN 8
+$L$SEH_info_ossl_rsaz_amm52x20_x1_avxifma256:
+DB 9,0,0,0
+ DD rsaz_def_handler wrt ..imagebase
+ DD $L$ossl_rsaz_amm52x20_x1_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x20_x1_avxifma256_epilogue wrt ..imagebase
+$L$SEH_info_ossl_rsaz_amm52x20_x2_avxifma256:
+DB 9,0,0,0
+ DD rsaz_def_handler wrt ..imagebase
+ DD $L$ossl_rsaz_amm52x20_x2_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x20_x2_avxifma256_epilogue wrt ..imagebase
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm
new file mode 100644
index 0000000..98b1073
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm
@@ -0,0 +1,1927 @@
+default rel
+%define XMMWORD
+%define YMMWORD
+%define ZMMWORD
+section .text code align=64
+
+
+global ossl_rsaz_amm52x30_x1_avxifma256
+
+ALIGN 32
+ossl_rsaz_amm52x30_x1_avxifma256:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_ossl_rsaz_amm52x30_x1_avxifma256:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+
+
+
+DB 243,15,30,250
+ push rbx
+
+ push rbp
+
+ push r12
+
+ push r13
+
+ push r14
+
+ push r15
+
+ lea rsp,[((-168))+rsp]
+ vmovapd XMMWORD[rsp],xmm6
+ vmovapd XMMWORD[16+rsp],xmm7
+ vmovapd XMMWORD[32+rsp],xmm8
+ vmovapd XMMWORD[48+rsp],xmm9
+ vmovapd XMMWORD[64+rsp],xmm10
+ vmovapd XMMWORD[80+rsp],xmm11
+ vmovapd XMMWORD[96+rsp],xmm12
+ vmovapd XMMWORD[112+rsp],xmm13
+ vmovapd XMMWORD[128+rsp],xmm14
+ vmovapd XMMWORD[144+rsp],xmm15
+$L$ossl_rsaz_amm52x30_x1_avxifma256_body:
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm10,ymm0
+
+ xor r9d,r9d
+
+ mov r11,rdx
+ mov rax,0xfffffffffffff
+
+
+ mov ebx,7
+
+ALIGN 32
+$L$loop7:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+
+ lea rsp,[264+rsp]
+ mov r13,QWORD[8+r11]
+
+ vpbroadcastq ymm1,QWORD[8+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+
+ lea rsp,[264+rsp]
+ mov r13,QWORD[16+r11]
+
+ vpbroadcastq ymm1,QWORD[16+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+
+ lea rsp,[264+rsp]
+ mov r13,QWORD[24+r11]
+
+ vpbroadcastq ymm1,QWORD[24+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+
+ lea rsp,[264+rsp]
+ lea r11,[32+r11]
+ dec ebx
+ jne NEAR $L$loop7
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+
+ lea rsp,[264+rsp]
+ mov r13,QWORD[8+r11]
+
+ vpbroadcastq ymm1,QWORD[8+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+
+ lea rsp,[264+rsp]
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+
+
+ vpsrlq ymm0,ymm3,52
+ vpsrlq ymm1,ymm4,52
+ vpsrlq ymm2,ymm5,52
+ vpsrlq ymm11,ymm6,52
+ vpsrlq ymm12,ymm7,52
+ vpsrlq ymm13,ymm8,52
+ vpsrlq ymm14,ymm9,52
+ vpsrlq ymm15,ymm10,52
+
+ lea rsp,[((-32))+rsp]
+ vmovupd YMMWORD[rsp],ymm3
+
+
+ vpermq ymm15,ymm15,144
+ vpermq ymm3,ymm14,3
+ vblendpd ymm15,ymm15,ymm3,1
+
+ vpermq ymm14,ymm14,144
+ vpermq ymm3,ymm13,3
+ vblendpd ymm14,ymm14,ymm3,1
+
+ vpermq ymm13,ymm13,144
+ vpermq ymm3,ymm12,3
+ vblendpd ymm13,ymm13,ymm3,1
+
+ vpermq ymm12,ymm12,144
+ vpermq ymm3,ymm11,3
+ vblendpd ymm12,ymm12,ymm3,1
+
+ vpermq ymm11,ymm11,144
+ vpermq ymm3,ymm2,3
+ vblendpd ymm11,ymm11,ymm3,1
+
+ vpermq ymm2,ymm2,144
+ vpermq ymm3,ymm1,3
+ vblendpd ymm2,ymm2,ymm3,1
+
+ vpermq ymm1,ymm1,144
+ vpermq ymm3,ymm0,3
+ vblendpd ymm1,ymm1,ymm3,1
+
+ vpermq ymm0,ymm0,144
+ vpand ymm0,ymm0,YMMWORD[$L$high64x3]
+
+ vmovupd ymm3,YMMWORD[rsp]
+ lea rsp,[32+rsp]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,ymm0
+ vpaddq ymm4,ymm4,ymm1
+ vpaddq ymm5,ymm5,ymm2
+ vpaddq ymm6,ymm6,ymm11
+ vpaddq ymm7,ymm7,ymm12
+ vpaddq ymm8,ymm8,ymm13
+ vpaddq ymm9,ymm9,ymm14
+ vpaddq ymm10,ymm10,ymm15
+
+
+
+ vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm1,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm0
+ vmovmskpd r13d,ymm1
+ shl r13b,4
+ or r14b,r13b
+
+ vpcmpgtq ymm2,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm11,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm2
+ vmovmskpd r12d,ymm11
+ shl r12b,4
+ or r13b,r12b
+
+ vpcmpgtq ymm12,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm12
+ vmovmskpd r11d,ymm13
+ shl r11b,4
+ or r12b,r11b
+
+ vpcmpgtq ymm14,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm15,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm14
+ vmovmskpd r10d,ymm15
+ shl r10b,4
+ or r11b,r10b
+
+ add r14b,r14b
+ adc r13b,r13b
+ adc r12b,r12b
+ adc r11b,r11b
+
+
+ vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm1,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm0
+ vmovmskpd r8d,ymm1
+ shl r8b,4
+ or r9b,r8b
+
+ vpcmpeqq ymm2,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm11,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm2
+ vmovmskpd edx,ymm11
+ shl dl,4
+ or r8b,dl
+
+ vpcmpeqq ymm12,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm12
+ vmovmskpd ecx,ymm13
+ shl cl,4
+ or dl,cl
+
+ vpcmpeqq ymm14,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm15,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm14
+ vmovmskpd ebx,ymm15
+ shl bl,4
+ or cl,bl
+
+ add r14b,r9b
+ adc r13b,r8b
+ adc r12b,dl
+ adc r11b,cl
+
+ xor r14b,r9b
+ xor r13b,r8b
+ xor r12b,dl
+ xor r11b,cl
+
+ lea rdx,[$L$kmasklut]
+
+ mov r10b,r14b
+ and r14,0xf
+ vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm2,YMMWORD[r14*1+rdx]
+ vblendvpd ymm3,ymm3,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm4,ymm4,ymm0,ymm2
+
+ mov r10b,r13b
+ and r13,0xf
+ vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm2,YMMWORD[r13*1+rdx]
+ vblendvpd ymm5,ymm5,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm6,ymm6,ymm0,ymm2
+
+ mov r10b,r12b
+ and r12,0xf
+ vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm2,YMMWORD[r12*1+rdx]
+ vblendvpd ymm7,ymm7,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm8,ymm8,ymm0,ymm2
+
+ mov r10b,r11b
+ and r11,0xf
+ vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm2,YMMWORD[r11*1+rdx]
+ vblendvpd ymm9,ymm9,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm10,ymm10,ymm0,ymm2
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+
+ vmovdqu YMMWORD[rdi],ymm3
+ vmovdqu YMMWORD[32+rdi],ymm4
+ vmovdqu YMMWORD[64+rdi],ymm5
+ vmovdqu YMMWORD[96+rdi],ymm6
+ vmovdqu YMMWORD[128+rdi],ymm7
+ vmovdqu YMMWORD[160+rdi],ymm8
+ vmovdqu YMMWORD[192+rdi],ymm9
+ vmovdqu YMMWORD[224+rdi],ymm10
+
+ vzeroupper
+ lea rax,[rsp]
+
+ vmovapd xmm6,XMMWORD[rax]
+ vmovapd xmm7,XMMWORD[16+rax]
+ vmovapd xmm8,XMMWORD[32+rax]
+ vmovapd xmm9,XMMWORD[48+rax]
+ vmovapd xmm10,XMMWORD[64+rax]
+ vmovapd xmm11,XMMWORD[80+rax]
+ vmovapd xmm12,XMMWORD[96+rax]
+ vmovapd xmm13,XMMWORD[112+rax]
+ vmovapd xmm14,XMMWORD[128+rax]
+ vmovapd xmm15,XMMWORD[144+rax]
+ lea rax,[168+rsp]
+ mov r15,QWORD[rax]
+
+ mov r14,QWORD[8+rax]
+
+ mov r13,QWORD[16+rax]
+
+ mov r12,QWORD[24+rax]
+
+ mov rbp,QWORD[32+rax]
+
+ mov rbx,QWORD[40+rax]
+
+ lea rsp,[48+rax]
+
+$L$ossl_rsaz_amm52x30_x1_avxifma256_epilogue:
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$SEH_end_ossl_rsaz_amm52x30_x1_avxifma256:
+section .rdata rdata align=32
+ALIGN 32
+$L$mask52x4:
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+$L$high64x3:
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+$L$kmasklut:
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+section .text code align=64
+
+
+global ossl_rsaz_amm52x30_x2_avxifma256
+
+ALIGN 32
+ossl_rsaz_amm52x30_x2_avxifma256:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_ossl_rsaz_amm52x30_x2_avxifma256:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+
+
+
+DB 243,15,30,250
+ push rbx
+
+ push rbp
+
+ push r12
+
+ push r13
+
+ push r14
+
+ push r15
+
+ lea rsp,[((-168))+rsp]
+ vmovapd XMMWORD[rsp],xmm6
+ vmovapd XMMWORD[16+rsp],xmm7
+ vmovapd XMMWORD[32+rsp],xmm8
+ vmovapd XMMWORD[48+rsp],xmm9
+ vmovapd XMMWORD[64+rsp],xmm10
+ vmovapd XMMWORD[80+rsp],xmm11
+ vmovapd XMMWORD[96+rsp],xmm12
+ vmovapd XMMWORD[112+rsp],xmm13
+ vmovapd XMMWORD[128+rsp],xmm14
+ vmovapd XMMWORD[144+rsp],xmm15
+$L$ossl_rsaz_amm52x30_x2_avxifma256_body:
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm10,ymm0
+
+ xor r9d,r9d
+
+ mov r11,rdx
+ mov rax,0xfffffffffffff
+
+ mov ebx,30
+
+ALIGN 32
+$L$loop30:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,QWORD[r8]
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+
+ lea rsp,[264+rsp]
+ lea r11,[8+r11]
+ dec ebx
+ jne NEAR $L$loop30
+
+ push r11
+ push rsi
+ push rcx
+ push r8
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+
+
+ vpsrlq ymm0,ymm3,52
+ vpsrlq ymm1,ymm4,52
+ vpsrlq ymm2,ymm5,52
+ vpsrlq ymm11,ymm6,52
+ vpsrlq ymm12,ymm7,52
+ vpsrlq ymm13,ymm8,52
+ vpsrlq ymm14,ymm9,52
+ vpsrlq ymm15,ymm10,52
+
+ lea rsp,[((-32))+rsp]
+ vmovupd YMMWORD[rsp],ymm3
+
+
+ vpermq ymm15,ymm15,144
+ vpermq ymm3,ymm14,3
+ vblendpd ymm15,ymm15,ymm3,1
+
+ vpermq ymm14,ymm14,144
+ vpermq ymm3,ymm13,3
+ vblendpd ymm14,ymm14,ymm3,1
+
+ vpermq ymm13,ymm13,144
+ vpermq ymm3,ymm12,3
+ vblendpd ymm13,ymm13,ymm3,1
+
+ vpermq ymm12,ymm12,144
+ vpermq ymm3,ymm11,3
+ vblendpd ymm12,ymm12,ymm3,1
+
+ vpermq ymm11,ymm11,144
+ vpermq ymm3,ymm2,3
+ vblendpd ymm11,ymm11,ymm3,1
+
+ vpermq ymm2,ymm2,144
+ vpermq ymm3,ymm1,3
+ vblendpd ymm2,ymm2,ymm3,1
+
+ vpermq ymm1,ymm1,144
+ vpermq ymm3,ymm0,3
+ vblendpd ymm1,ymm1,ymm3,1
+
+ vpermq ymm0,ymm0,144
+ vpand ymm0,ymm0,YMMWORD[$L$high64x3]
+
+ vmovupd ymm3,YMMWORD[rsp]
+ lea rsp,[32+rsp]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,ymm0
+ vpaddq ymm4,ymm4,ymm1
+ vpaddq ymm5,ymm5,ymm2
+ vpaddq ymm6,ymm6,ymm11
+ vpaddq ymm7,ymm7,ymm12
+ vpaddq ymm8,ymm8,ymm13
+ vpaddq ymm9,ymm9,ymm14
+ vpaddq ymm10,ymm10,ymm15
+
+
+
+ vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm1,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm0
+ vmovmskpd r13d,ymm1
+ shl r13b,4
+ or r14b,r13b
+
+ vpcmpgtq ymm2,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm11,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm2
+ vmovmskpd r12d,ymm11
+ shl r12b,4
+ or r13b,r12b
+
+ vpcmpgtq ymm12,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm12
+ vmovmskpd r11d,ymm13
+ shl r11b,4
+ or r12b,r11b
+
+ vpcmpgtq ymm14,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm15,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm14
+ vmovmskpd r10d,ymm15
+ shl r10b,4
+ or r11b,r10b
+
+ add r14b,r14b
+ adc r13b,r13b
+ adc r12b,r12b
+ adc r11b,r11b
+
+
+ vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm1,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm0
+ vmovmskpd r8d,ymm1
+ shl r8b,4
+ or r9b,r8b
+
+ vpcmpeqq ymm2,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm11,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm2
+ vmovmskpd edx,ymm11
+ shl dl,4
+ or r8b,dl
+
+ vpcmpeqq ymm12,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm12
+ vmovmskpd ecx,ymm13
+ shl cl,4
+ or dl,cl
+
+ vpcmpeqq ymm14,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm15,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm14
+ vmovmskpd ebx,ymm15
+ shl bl,4
+ or cl,bl
+
+ add r14b,r9b
+ adc r13b,r8b
+ adc r12b,dl
+ adc r11b,cl
+
+ xor r14b,r9b
+ xor r13b,r8b
+ xor r12b,dl
+ xor r11b,cl
+
+ lea rdx,[$L$kmasklut]
+
+ mov r10b,r14b
+ and r14,0xf
+ vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm2,YMMWORD[r14*1+rdx]
+ vblendvpd ymm3,ymm3,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm4,ymm4,ymm0,ymm2
+
+ mov r10b,r13b
+ and r13,0xf
+ vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm2,YMMWORD[r13*1+rdx]
+ vblendvpd ymm5,ymm5,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm6,ymm6,ymm0,ymm2
+
+ mov r10b,r12b
+ and r12,0xf
+ vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm2,YMMWORD[r12*1+rdx]
+ vblendvpd ymm7,ymm7,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm8,ymm8,ymm0,ymm2
+
+ mov r10b,r11b
+ and r11,0xf
+ vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm2,YMMWORD[r11*1+rdx]
+ vblendvpd ymm9,ymm9,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm10,ymm10,ymm0,ymm2
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ pop r8
+ pop rcx
+ pop rsi
+ pop r11
+
+ vmovdqu YMMWORD[rdi],ymm3
+ vmovdqu YMMWORD[32+rdi],ymm4
+ vmovdqu YMMWORD[64+rdi],ymm5
+ vmovdqu YMMWORD[96+rdi],ymm6
+ vmovdqu YMMWORD[128+rdi],ymm7
+ vmovdqu YMMWORD[160+rdi],ymm8
+ vmovdqu YMMWORD[192+rdi],ymm9
+ vmovdqu YMMWORD[224+rdi],ymm10
+
+ xor r15d,r15d
+
+ lea r11,[16+r11]
+ mov rax,0xfffffffffffff
+
+ mov ebx,30
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm10,ymm0
+ALIGN 32
+$L$loop40:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[256+rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,QWORD[8+r8]
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[256+rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-264))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[288+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[320+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[352+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[384+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[416+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[448+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[480+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[288+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[320+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[352+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[384+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[416+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[448+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[480+rcx]
+
+
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ mov QWORD[256+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[288+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[320+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[352+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[384+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[416+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[448+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[480+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[288+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[320+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[352+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[384+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[416+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[448+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[480+rcx]
+
+ lea rsp,[264+rsp]
+ lea r11,[8+r11]
+ dec ebx
+ jne NEAR $L$loop40
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+
+
+ vpsrlq ymm0,ymm3,52
+ vpsrlq ymm1,ymm4,52
+ vpsrlq ymm2,ymm5,52
+ vpsrlq ymm11,ymm6,52
+ vpsrlq ymm12,ymm7,52
+ vpsrlq ymm13,ymm8,52
+ vpsrlq ymm14,ymm9,52
+ vpsrlq ymm15,ymm10,52
+
+ lea rsp,[((-32))+rsp]
+ vmovupd YMMWORD[rsp],ymm3
+
+
+ vpermq ymm15,ymm15,144
+ vpermq ymm3,ymm14,3
+ vblendpd ymm15,ymm15,ymm3,1
+
+ vpermq ymm14,ymm14,144
+ vpermq ymm3,ymm13,3
+ vblendpd ymm14,ymm14,ymm3,1
+
+ vpermq ymm13,ymm13,144
+ vpermq ymm3,ymm12,3
+ vblendpd ymm13,ymm13,ymm3,1
+
+ vpermq ymm12,ymm12,144
+ vpermq ymm3,ymm11,3
+ vblendpd ymm12,ymm12,ymm3,1
+
+ vpermq ymm11,ymm11,144
+ vpermq ymm3,ymm2,3
+ vblendpd ymm11,ymm11,ymm3,1
+
+ vpermq ymm2,ymm2,144
+ vpermq ymm3,ymm1,3
+ vblendpd ymm2,ymm2,ymm3,1
+
+ vpermq ymm1,ymm1,144
+ vpermq ymm3,ymm0,3
+ vblendpd ymm1,ymm1,ymm3,1
+
+ vpermq ymm0,ymm0,144
+ vpand ymm0,ymm0,YMMWORD[$L$high64x3]
+
+ vmovupd ymm3,YMMWORD[rsp]
+ lea rsp,[32+rsp]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,ymm0
+ vpaddq ymm4,ymm4,ymm1
+ vpaddq ymm5,ymm5,ymm2
+ vpaddq ymm6,ymm6,ymm11
+ vpaddq ymm7,ymm7,ymm12
+ vpaddq ymm8,ymm8,ymm13
+ vpaddq ymm9,ymm9,ymm14
+ vpaddq ymm10,ymm10,ymm15
+
+
+
+ vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm1,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm0
+ vmovmskpd r13d,ymm1
+ shl r13b,4
+ or r14b,r13b
+
+ vpcmpgtq ymm2,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm11,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm2
+ vmovmskpd r12d,ymm11
+ shl r12b,4
+ or r13b,r12b
+
+ vpcmpgtq ymm12,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm12
+ vmovmskpd r11d,ymm13
+ shl r11b,4
+ or r12b,r11b
+
+ vpcmpgtq ymm14,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpgtq ymm15,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm14
+ vmovmskpd r10d,ymm15
+ shl r10b,4
+ or r11b,r10b
+
+ add r14b,r14b
+ adc r13b,r13b
+ adc r12b,r12b
+ adc r11b,r11b
+
+
+ vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm1,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm0
+ vmovmskpd r8d,ymm1
+ shl r8b,4
+ or r9b,r8b
+
+ vpcmpeqq ymm2,ymm5,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm11,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm2
+ vmovmskpd edx,ymm11
+ shl dl,4
+ or r8b,dl
+
+ vpcmpeqq ymm12,ymm7,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm12
+ vmovmskpd ecx,ymm13
+ shl cl,4
+ or dl,cl
+
+ vpcmpeqq ymm14,ymm9,YMMWORD[$L$mask52x4]
+ vpcmpeqq ymm15,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm14
+ vmovmskpd ebx,ymm15
+ shl bl,4
+ or cl,bl
+
+ add r14b,r9b
+ adc r13b,r8b
+ adc r12b,dl
+ adc r11b,cl
+
+ xor r14b,r9b
+ xor r13b,r8b
+ xor r12b,dl
+ xor r11b,cl
+
+ lea rdx,[$L$kmasklut]
+
+ mov r10b,r14b
+ and r14,0xf
+ vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm2,YMMWORD[r14*1+rdx]
+ vblendvpd ymm3,ymm3,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm4,ymm4,ymm0,ymm2
+
+ mov r10b,r13b
+ and r13,0xf
+ vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm2,YMMWORD[r13*1+rdx]
+ vblendvpd ymm5,ymm5,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm6,ymm6,ymm0,ymm2
+
+ mov r10b,r12b
+ and r12,0xf
+ vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm2,YMMWORD[r12*1+rdx]
+ vblendvpd ymm7,ymm7,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm8,ymm8,ymm0,ymm2
+
+ mov r10b,r11b
+ and r11,0xf
+ vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm2,YMMWORD[r11*1+rdx]
+ vblendvpd ymm9,ymm9,ymm0,ymm2
+
+ shr r10b,4
+ and r10,0xf
+ vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm2,YMMWORD[r10*1+rdx]
+ vblendvpd ymm10,ymm10,ymm0,ymm2
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+
+ vmovdqu YMMWORD[256+rdi],ymm3
+ vmovdqu YMMWORD[288+rdi],ymm4
+ vmovdqu YMMWORD[320+rdi],ymm5
+ vmovdqu YMMWORD[352+rdi],ymm6
+ vmovdqu YMMWORD[384+rdi],ymm7
+ vmovdqu YMMWORD[416+rdi],ymm8
+ vmovdqu YMMWORD[448+rdi],ymm9
+ vmovdqu YMMWORD[480+rdi],ymm10
+
+ vzeroupper
+ lea rax,[rsp]
+
+ vmovapd xmm6,XMMWORD[rax]
+ vmovapd xmm7,XMMWORD[16+rax]
+ vmovapd xmm8,XMMWORD[32+rax]
+ vmovapd xmm9,XMMWORD[48+rax]
+ vmovapd xmm10,XMMWORD[64+rax]
+ vmovapd xmm11,XMMWORD[80+rax]
+ vmovapd xmm12,XMMWORD[96+rax]
+ vmovapd xmm13,XMMWORD[112+rax]
+ vmovapd xmm14,XMMWORD[128+rax]
+ vmovapd xmm15,XMMWORD[144+rax]
+ lea rax,[168+rsp]
+ mov r15,QWORD[rax]
+
+ mov r14,QWORD[8+rax]
+
+ mov r13,QWORD[16+rax]
+
+ mov r12,QWORD[24+rax]
+
+ mov rbp,QWORD[32+rax]
+
+ mov rbx,QWORD[40+rax]
+
+ lea rsp,[48+rax]
+
+$L$ossl_rsaz_amm52x30_x2_avxifma256_epilogue:
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$SEH_end_ossl_rsaz_amm52x30_x2_avxifma256:
+section .text code align=64
+
+
+ALIGN 32
+global ossl_extract_multiplier_2x30_win5_avx
+
+ossl_extract_multiplier_2x30_win5_avx:
+
+DB 243,15,30,250
+ vmovapd ymm12,YMMWORD[$L$ones]
+ vmovq xmm8,r8
+ vpbroadcastq ymm10,xmm8
+ vmovq xmm8,r9
+ vpbroadcastq ymm11,xmm8
+ lea rax,[16384+rdx]
+
+
+ vpxor xmm0,xmm0,xmm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm1,ymm0
+ vmovapd ymm2,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+
+ALIGN 32
+$L$loop:
+ vpcmpeqq ymm13,ymm10,ymm9
+ vmovdqu ymm8,YMMWORD[rdx]
+
+ vblendvpd ymm0,ymm0,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[32+rdx]
+
+ vblendvpd ymm1,ymm1,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[64+rdx]
+
+ vblendvpd ymm2,ymm2,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[96+rdx]
+
+ vblendvpd ymm3,ymm3,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[128+rdx]
+
+ vblendvpd ymm4,ymm4,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[160+rdx]
+
+ vblendvpd ymm5,ymm5,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[192+rdx]
+
+ vblendvpd ymm6,ymm6,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[224+rdx]
+
+ vblendvpd ymm7,ymm7,ymm8,ymm13
+ vpaddq ymm9,ymm9,ymm12
+ add rdx,512
+ cmp rax,rdx
+ jne NEAR $L$loop
+ vmovdqu YMMWORD[rcx],ymm0
+ vmovdqu YMMWORD[32+rcx],ymm1
+ vmovdqu YMMWORD[64+rcx],ymm2
+ vmovdqu YMMWORD[96+rcx],ymm3
+ vmovdqu YMMWORD[128+rcx],ymm4
+ vmovdqu YMMWORD[160+rcx],ymm5
+ vmovdqu YMMWORD[192+rcx],ymm6
+ vmovdqu YMMWORD[224+rcx],ymm7
+ lea rdx,[((-16384))+rax]
+
+
+ vpxor xmm0,xmm0,xmm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm0,ymm0
+ vmovapd ymm1,ymm0
+ vmovapd ymm2,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+
+ALIGN 32
+$L$loop_8_15:
+ vpcmpeqq ymm13,ymm11,ymm9
+ vmovdqu ymm8,YMMWORD[256+rdx]
+
+ vblendvpd ymm0,ymm0,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[288+rdx]
+
+ vblendvpd ymm1,ymm1,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[320+rdx]
+
+ vblendvpd ymm2,ymm2,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[352+rdx]
+
+ vblendvpd ymm3,ymm3,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[384+rdx]
+
+ vblendvpd ymm4,ymm4,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[416+rdx]
+
+ vblendvpd ymm5,ymm5,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[448+rdx]
+
+ vblendvpd ymm6,ymm6,ymm8,ymm13
+ vmovdqu ymm8,YMMWORD[480+rdx]
+
+ vblendvpd ymm7,ymm7,ymm8,ymm13
+ vpaddq ymm9,ymm9,ymm12
+ add rdx,512
+ cmp rax,rdx
+ jne NEAR $L$loop_8_15
+ vmovdqu YMMWORD[256+rcx],ymm0
+ vmovdqu YMMWORD[288+rcx],ymm1
+ vmovdqu YMMWORD[320+rcx],ymm2
+ vmovdqu YMMWORD[352+rcx],ymm3
+ vmovdqu YMMWORD[384+rcx],ymm4
+ vmovdqu YMMWORD[416+rcx],ymm5
+ vmovdqu YMMWORD[448+rcx],ymm6
+ vmovdqu YMMWORD[480+rcx],ymm7
+
+ DB 0F3h,0C3h ;repret
+
+
+section .rdata rdata align=32
+ALIGN 32
+$L$ones:
+ DQ 1,1,1,1
+$L$zeros:
+ DQ 0,0,0,0
+EXTERN __imp_RtlVirtualUnwind
+
+ALIGN 16
+rsaz_avx_handler:
+ push rsi
+ push rdi
+ push rbx
+ push rbp
+ push r12
+ push r13
+ push r14
+ push r15
+ pushfq
+ sub rsp,64
+
+ mov rax,QWORD[120+r8]
+ mov rbx,QWORD[248+r8]
+
+ mov rsi,QWORD[8+r9]
+ mov r11,QWORD[56+r9]
+
+ mov r10d,DWORD[r11]
+ lea r10,[r10*1+rsi]
+ cmp rbx,r10
+ jb NEAR $L$common_seh_tail
+
+ mov r10d,DWORD[4+r11]
+ lea r10,[r10*1+rsi]
+ cmp rbx,r10
+ jae NEAR $L$common_seh_tail
+
+ mov rax,QWORD[152+r8]
+
+ lea rsi,[rax]
+ lea rdi,[512+r8]
+ mov ecx,20
+ DD 0xa548f3fc
+
+ lea rax,[216+rax]
+
+ mov rbx,QWORD[((-8))+rax]
+ mov rbp,QWORD[((-16))+rax]
+ mov r12,QWORD[((-24))+rax]
+ mov r13,QWORD[((-32))+rax]
+ mov r14,QWORD[((-40))+rax]
+ mov r15,QWORD[((-48))+rax]
+ mov QWORD[144+r8],rbx
+ mov QWORD[160+r8],rbp
+ mov QWORD[216+r8],r12
+ mov QWORD[224+r8],r13
+ mov QWORD[232+r8],r14
+ mov QWORD[240+r8],r15
+
+$L$common_seh_tail:
+ mov rdi,QWORD[8+rax]
+ mov rsi,QWORD[16+rax]
+ mov QWORD[152+r8],rax
+ mov QWORD[168+r8],rsi
+ mov QWORD[176+r8],rdi
+
+ mov rdi,QWORD[40+r9]
+ mov rsi,r8
+ mov ecx,154
+ DD 0xa548f3fc
+
+ mov rsi,r9
+ xor rcx,rcx
+ mov rdx,QWORD[8+rsi]
+ mov r8,QWORD[rsi]
+ mov r9,QWORD[16+rsi]
+ mov r10,QWORD[40+rsi]
+ lea r11,[56+rsi]
+ lea r12,[24+rsi]
+ mov QWORD[32+rsp],r10
+ mov QWORD[40+rsp],r11
+ mov QWORD[48+rsp],r12
+ mov QWORD[56+rsp],rcx
+ call QWORD[__imp_RtlVirtualUnwind]
+
+ mov eax,1
+ add rsp,64
+ popfq
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop rbp
+ pop rbx
+ pop rdi
+ pop rsi
+ DB 0F3h,0C3h ;repret
+
+
+section .pdata rdata align=4
+ALIGN 4
+ DD $L$SEH_begin_ossl_rsaz_amm52x30_x1_avxifma256 wrt ..imagebase
+ DD $L$SEH_end_ossl_rsaz_amm52x30_x1_avxifma256 wrt ..imagebase
+ DD $L$SEH_info_ossl_rsaz_amm52x30_x1_avxifma256 wrt ..imagebase
+
+ DD $L$SEH_begin_ossl_rsaz_amm52x30_x2_avxifma256 wrt ..imagebase
+ DD $L$SEH_end_ossl_rsaz_amm52x30_x2_avxifma256 wrt ..imagebase
+ DD $L$SEH_info_ossl_rsaz_amm52x30_x2_avxifma256 wrt ..imagebase
+
+section .xdata rdata align=8
+ALIGN 8
+$L$SEH_info_ossl_rsaz_amm52x30_x1_avxifma256:
+DB 9,0,0,0
+ DD rsaz_avx_handler wrt ..imagebase
+ DD $L$ossl_rsaz_amm52x30_x1_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x30_x1_avxifma256_epilogue wrt ..imagebase
+$L$SEH_info_ossl_rsaz_amm52x30_x2_avxifma256:
+DB 9,0,0,0
+ DD rsaz_avx_handler wrt ..imagebase
+ DD $L$ossl_rsaz_amm52x30_x2_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x30_x2_avxifma256_epilogue wrt ..imagebase
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm
new file mode 100644
index 0000000..3c71815
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm
@@ -0,0 +1,2081 @@
+default rel
+%define XMMWORD
+%define YMMWORD
+%define ZMMWORD
+section .text code align=64
+
+
+global ossl_rsaz_amm52x40_x1_avxifma256
+
+ALIGN 32
+ossl_rsaz_amm52x40_x1_avxifma256:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_ossl_rsaz_amm52x40_x1_avxifma256:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+
+
+
+DB 243,15,30,250
+ push rbx
+
+ push rbp
+
+ push r12
+
+ push r13
+
+ push r14
+
+ push r15
+
+ lea rsp,[((-168))+rsp]
+ vmovapd XMMWORD[rsp],xmm6
+ vmovapd XMMWORD[16+rsp],xmm7
+ vmovapd XMMWORD[32+rsp],xmm8
+ vmovapd XMMWORD[48+rsp],xmm9
+ vmovapd XMMWORD[64+rsp],xmm10
+ vmovapd XMMWORD[80+rsp],xmm11
+ vmovapd XMMWORD[96+rsp],xmm12
+ vmovapd XMMWORD[112+rsp],xmm13
+ vmovapd XMMWORD[128+rsp],xmm14
+ vmovapd XMMWORD[144+rsp],xmm15
+$L$ossl_rsaz_amm52x40_x1_avxifma256_body:
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm10,ymm0
+ vmovapd ymm11,ymm0
+ vmovapd ymm12,ymm0
+
+ xor r9d,r9d
+
+ mov r11,rdx
+ mov rax,0xfffffffffffff
+
+
+ mov ebx,10
+
+ALIGN 32
+$L$loop10:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-328))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx]
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ vmovdqu YMMWORD[256+rsp],ymm11
+ vmovdqu YMMWORD[288+rsp],ymm12
+ mov QWORD[320+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+ vmovdqu ymm11,YMMWORD[264+rsp]
+ vmovdqu ymm12,YMMWORD[296+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx]
+ lea rsp,[328+rsp]
+ mov r13,QWORD[8+r11]
+
+ vpbroadcastq ymm1,QWORD[8+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-328))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx]
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ vmovdqu YMMWORD[256+rsp],ymm11
+ vmovdqu YMMWORD[288+rsp],ymm12
+ mov QWORD[320+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+ vmovdqu ymm11,YMMWORD[264+rsp]
+ vmovdqu ymm12,YMMWORD[296+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx]
+ lea rsp,[328+rsp]
+ mov r13,QWORD[16+r11]
+
+ vpbroadcastq ymm1,QWORD[16+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-328))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx]
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ vmovdqu YMMWORD[256+rsp],ymm11
+ vmovdqu YMMWORD[288+rsp],ymm12
+ mov QWORD[320+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+ vmovdqu ymm11,YMMWORD[264+rsp]
+ vmovdqu ymm12,YMMWORD[296+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx]
+ lea rsp,[328+rsp]
+ mov r13,QWORD[24+r11]
+
+ vpbroadcastq ymm1,QWORD[24+r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,r8
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-328))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx]
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ vmovdqu YMMWORD[256+rsp],ymm11
+ vmovdqu YMMWORD[288+rsp],ymm12
+ mov QWORD[320+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+ vmovdqu ymm11,YMMWORD[264+rsp]
+ vmovdqu ymm12,YMMWORD[296+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx]
+ lea rsp,[328+rsp]
+ lea r11,[32+r11]
+ dec ebx
+ jne NEAR $L$loop10
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+ lea rsp,[((-640))+rsp]
+ vmovupd YMMWORD[rsp],ymm3
+ vmovupd YMMWORD[32+rsp],ymm4
+ vmovupd YMMWORD[64+rsp],ymm5
+ vmovupd YMMWORD[96+rsp],ymm6
+ vmovupd YMMWORD[128+rsp],ymm7
+ vmovupd YMMWORD[160+rsp],ymm8
+ vmovupd YMMWORD[192+rsp],ymm9
+ vmovupd YMMWORD[224+rsp],ymm10
+ vmovupd YMMWORD[256+rsp],ymm11
+ vmovupd YMMWORD[288+rsp],ymm12
+
+
+
+ vpsrlq ymm3,ymm3,52
+ vpsrlq ymm4,ymm4,52
+ vpsrlq ymm5,ymm5,52
+ vpsrlq ymm6,ymm6,52
+ vpsrlq ymm7,ymm7,52
+ vpsrlq ymm8,ymm8,52
+ vpsrlq ymm9,ymm9,52
+ vpsrlq ymm10,ymm10,52
+ vpsrlq ymm11,ymm11,52
+ vpsrlq ymm12,ymm12,52
+
+
+ vpermq ymm12,ymm12,144
+ vpermq ymm13,ymm11,3
+ vblendpd ymm12,ymm12,ymm13,1
+
+ vpermq ymm11,ymm11,144
+ vpermq ymm13,ymm10,3
+ vblendpd ymm11,ymm11,ymm13,1
+
+ vpermq ymm10,ymm10,144
+ vpermq ymm13,ymm9,3
+ vblendpd ymm10,ymm10,ymm13,1
+
+ vpermq ymm9,ymm9,144
+ vpermq ymm13,ymm8,3
+ vblendpd ymm9,ymm9,ymm13,1
+
+ vpermq ymm8,ymm8,144
+ vpermq ymm13,ymm7,3
+ vblendpd ymm8,ymm8,ymm13,1
+
+ vpermq ymm7,ymm7,144
+ vpermq ymm13,ymm6,3
+ vblendpd ymm7,ymm7,ymm13,1
+
+ vpermq ymm6,ymm6,144
+ vpermq ymm13,ymm5,3
+ vblendpd ymm6,ymm6,ymm13,1
+
+ vpermq ymm5,ymm5,144
+ vpermq ymm13,ymm4,3
+ vblendpd ymm5,ymm5,ymm13,1
+
+ vpermq ymm4,ymm4,144
+ vpermq ymm13,ymm3,3
+ vblendpd ymm4,ymm4,ymm13,1
+
+ vpermq ymm3,ymm3,144
+ vpand ymm3,ymm3,YMMWORD[$L$high64x3]
+
+ vmovupd YMMWORD[320+rsp],ymm3
+ vmovupd YMMWORD[352+rsp],ymm4
+ vmovupd YMMWORD[384+rsp],ymm5
+ vmovupd YMMWORD[416+rsp],ymm6
+ vmovupd YMMWORD[448+rsp],ymm7
+ vmovupd YMMWORD[480+rsp],ymm8
+ vmovupd YMMWORD[512+rsp],ymm9
+ vmovupd YMMWORD[544+rsp],ymm10
+ vmovupd YMMWORD[576+rsp],ymm11
+ vmovupd YMMWORD[608+rsp],ymm12
+
+ vmovupd ymm3,YMMWORD[rsp]
+ vmovupd ymm4,YMMWORD[32+rsp]
+ vmovupd ymm5,YMMWORD[64+rsp]
+ vmovupd ymm6,YMMWORD[96+rsp]
+ vmovupd ymm7,YMMWORD[128+rsp]
+ vmovupd ymm8,YMMWORD[160+rsp]
+ vmovupd ymm9,YMMWORD[192+rsp]
+ vmovupd ymm10,YMMWORD[224+rsp]
+ vmovupd ymm11,YMMWORD[256+rsp]
+ vmovupd ymm12,YMMWORD[288+rsp]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,YMMWORD[320+rsp]
+ vpaddq ymm4,ymm4,YMMWORD[352+rsp]
+ vpaddq ymm5,ymm5,YMMWORD[384+rsp]
+ vpaddq ymm6,ymm6,YMMWORD[416+rsp]
+ vpaddq ymm7,ymm7,YMMWORD[448+rsp]
+ vpaddq ymm8,ymm8,YMMWORD[480+rsp]
+ vpaddq ymm9,ymm9,YMMWORD[512+rsp]
+ vpaddq ymm10,ymm10,YMMWORD[544+rsp]
+ vpaddq ymm11,ymm11,YMMWORD[576+rsp]
+ vpaddq ymm12,ymm12,YMMWORD[608+rsp]
+
+ lea rsp,[640+rsp]
+
+
+
+ vpcmpgtq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm13
+ vpcmpgtq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm13
+ shl r13b,4
+ or r14b,r13b
+
+ vpcmpgtq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm13
+ vpcmpgtq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm13
+ shl r12b,4
+ or r13b,r12b
+
+ vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm13
+ vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm13
+ shl r11b,4
+ or r12b,r11b
+
+ vpcmpgtq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm13
+ vpcmpgtq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd r10d,ymm13
+ shl r10b,4
+ or r11b,r10b
+
+ vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vmovmskpd r10d,ymm13
+ vpcmpgtq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm13
+ shl r9b,4
+ or r10b,r9b
+
+ add r14b,r14b
+ adc r13b,r13b
+ adc r12b,r12b
+ adc r11b,r11b
+ adc r10b,r10b
+
+
+ vpcmpeqq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm13
+ vpcmpeqq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm13
+ shl r8b,4
+ or r9b,r8b
+
+ vpcmpeqq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm13
+ vpcmpeqq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm13
+ shl dl,4
+ or r8b,dl
+
+ vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm13
+ vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm13
+ shl cl,4
+ or dl,cl
+
+ vpcmpeqq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm13
+ vpcmpeqq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd ebx,ymm13
+ shl bl,4
+ or cl,bl
+
+ vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vmovmskpd ebx,ymm13
+ vpcmpeqq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd eax,ymm13
+ shl al,4
+ or bl,al
+
+ add r14b,r9b
+ adc r13b,r8b
+ adc r12b,dl
+ adc r11b,cl
+ adc r10b,bl
+
+ xor r14b,r9b
+ xor r13b,r8b
+ xor r12b,dl
+ xor r11b,cl
+ xor r10b,bl
+
+ push r9
+ push r8
+
+ lea r8,[$L$kmasklut]
+
+ mov r9b,r14b
+ and r14,0xf
+ vpsubq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm14,YMMWORD[r14*1+r8]
+ vblendvpd ymm3,ymm3,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm4,ymm4,ymm13,ymm14
+
+ mov r9b,r13b
+ and r13,0xf
+ vpsubq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm14,YMMWORD[r13*1+r8]
+ vblendvpd ymm5,ymm5,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm6,ymm6,ymm13,ymm14
+
+ mov r9b,r12b
+ and r12,0xf
+ vpsubq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm14,YMMWORD[r12*1+r8]
+ vblendvpd ymm7,ymm7,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm8,ymm8,ymm13,ymm14
+
+ mov r9b,r11b
+ and r11,0xf
+ vpsubq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm14,YMMWORD[r11*1+r8]
+ vblendvpd ymm9,ymm9,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm10,ymm10,ymm13,ymm14
+
+ mov r9b,r10b
+ and r10,0xf
+ vpsubq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm14,YMMWORD[r10*1+r8]
+ vblendvpd ymm11,ymm11,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm12,ymm12,ymm13,ymm14
+
+ pop r8
+ pop r9
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+ vmovdqu YMMWORD[rdi],ymm3
+ vmovdqu YMMWORD[32+rdi],ymm4
+ vmovdqu YMMWORD[64+rdi],ymm5
+ vmovdqu YMMWORD[96+rdi],ymm6
+ vmovdqu YMMWORD[128+rdi],ymm7
+ vmovdqu YMMWORD[160+rdi],ymm8
+ vmovdqu YMMWORD[192+rdi],ymm9
+ vmovdqu YMMWORD[224+rdi],ymm10
+ vmovdqu YMMWORD[256+rdi],ymm11
+ vmovdqu YMMWORD[288+rdi],ymm12
+
+ vzeroupper
+ lea rax,[rsp]
+
+ vmovapd xmm6,XMMWORD[rax]
+ vmovapd xmm7,XMMWORD[16+rax]
+ vmovapd xmm8,XMMWORD[32+rax]
+ vmovapd xmm9,XMMWORD[48+rax]
+ vmovapd xmm10,XMMWORD[64+rax]
+ vmovapd xmm11,XMMWORD[80+rax]
+ vmovapd xmm12,XMMWORD[96+rax]
+ vmovapd xmm13,XMMWORD[112+rax]
+ vmovapd xmm14,XMMWORD[128+rax]
+ vmovapd xmm15,XMMWORD[144+rax]
+ lea rax,[168+rsp]
+ mov r15,QWORD[rax]
+
+ mov r14,QWORD[8+rax]
+
+ mov r13,QWORD[16+rax]
+
+ mov r12,QWORD[24+rax]
+
+ mov rbp,QWORD[32+rax]
+
+ mov rbx,QWORD[40+rax]
+
+ lea rsp,[48+rax]
+
+$L$ossl_rsaz_amm52x40_x1_avxifma256_epilogue:
+
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$SEH_end_ossl_rsaz_amm52x40_x1_avxifma256:
+section .rdata rdata align=32
+ALIGN 32
+$L$mask52x4:
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+ DQ 0xfffffffffffff
+$L$high64x3:
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+$L$kmasklut:
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0x0
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+ DQ 0xffffffffffffffff
+section .text code align=64
+
+
+global ossl_rsaz_amm52x40_x2_avxifma256
+
+ALIGN 32
+ossl_rsaz_amm52x40_x2_avxifma256:
+ mov QWORD[8+rsp],rdi ;WIN64 prologue
+ mov QWORD[16+rsp],rsi
+ mov rax,rsp
+$L$SEH_begin_ossl_rsaz_amm52x40_x2_avxifma256:
+ mov rdi,rcx
+ mov rsi,rdx
+ mov rdx,r8
+ mov rcx,r9
+ mov r8,QWORD[40+rsp]
+
+
+
+DB 243,15,30,250
+ push rbx
+
+ push rbp
+
+ push r12
+
+ push r13
+
+ push r14
+
+ push r15
+
+ lea rsp,[((-168))+rsp]
+ vmovapd XMMWORD[rsp],xmm6
+ vmovapd XMMWORD[16+rsp],xmm7
+ vmovapd XMMWORD[32+rsp],xmm8
+ vmovapd XMMWORD[48+rsp],xmm9
+ vmovapd XMMWORD[64+rsp],xmm10
+ vmovapd XMMWORD[80+rsp],xmm11
+ vmovapd XMMWORD[96+rsp],xmm12
+ vmovapd XMMWORD[112+rsp],xmm13
+ vmovapd XMMWORD[128+rsp],xmm14
+ vmovapd XMMWORD[144+rsp],xmm15
+$L$ossl_rsaz_amm52x40_x2_avxifma256_body:
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm10,ymm0
+ vmovapd ymm11,ymm0
+ vmovapd ymm12,ymm0
+
+ xor r9d,r9d
+
+ mov r11,rdx
+ mov rax,0xfffffffffffff
+
+ mov ebx,40
+
+ALIGN 32
+$L$loop40:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,QWORD[r8]
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-328))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx]
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ vmovdqu YMMWORD[256+rsp],ymm11
+ vmovdqu YMMWORD[288+rsp],ymm12
+ mov QWORD[320+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+ vmovdqu ymm11,YMMWORD[264+rsp]
+ vmovdqu ymm12,YMMWORD[296+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi]
+{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi]
+{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx]
+{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx]
+{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx]
+ lea rsp,[328+rsp]
+ lea r11,[8+r11]
+ dec ebx
+ jne NEAR $L$loop40
+
+ push r11
+ push rsi
+ push rcx
+ push r8
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+ lea rsp,[((-640))+rsp]
+ vmovupd YMMWORD[rsp],ymm3
+ vmovupd YMMWORD[32+rsp],ymm4
+ vmovupd YMMWORD[64+rsp],ymm5
+ vmovupd YMMWORD[96+rsp],ymm6
+ vmovupd YMMWORD[128+rsp],ymm7
+ vmovupd YMMWORD[160+rsp],ymm8
+ vmovupd YMMWORD[192+rsp],ymm9
+ vmovupd YMMWORD[224+rsp],ymm10
+ vmovupd YMMWORD[256+rsp],ymm11
+ vmovupd YMMWORD[288+rsp],ymm12
+
+
+
+ vpsrlq ymm3,ymm3,52
+ vpsrlq ymm4,ymm4,52
+ vpsrlq ymm5,ymm5,52
+ vpsrlq ymm6,ymm6,52
+ vpsrlq ymm7,ymm7,52
+ vpsrlq ymm8,ymm8,52
+ vpsrlq ymm9,ymm9,52
+ vpsrlq ymm10,ymm10,52
+ vpsrlq ymm11,ymm11,52
+ vpsrlq ymm12,ymm12,52
+
+
+ vpermq ymm12,ymm12,144
+ vpermq ymm13,ymm11,3
+ vblendpd ymm12,ymm12,ymm13,1
+
+ vpermq ymm11,ymm11,144
+ vpermq ymm13,ymm10,3
+ vblendpd ymm11,ymm11,ymm13,1
+
+ vpermq ymm10,ymm10,144
+ vpermq ymm13,ymm9,3
+ vblendpd ymm10,ymm10,ymm13,1
+
+ vpermq ymm9,ymm9,144
+ vpermq ymm13,ymm8,3
+ vblendpd ymm9,ymm9,ymm13,1
+
+ vpermq ymm8,ymm8,144
+ vpermq ymm13,ymm7,3
+ vblendpd ymm8,ymm8,ymm13,1
+
+ vpermq ymm7,ymm7,144
+ vpermq ymm13,ymm6,3
+ vblendpd ymm7,ymm7,ymm13,1
+
+ vpermq ymm6,ymm6,144
+ vpermq ymm13,ymm5,3
+ vblendpd ymm6,ymm6,ymm13,1
+
+ vpermq ymm5,ymm5,144
+ vpermq ymm13,ymm4,3
+ vblendpd ymm5,ymm5,ymm13,1
+
+ vpermq ymm4,ymm4,144
+ vpermq ymm13,ymm3,3
+ vblendpd ymm4,ymm4,ymm13,1
+
+ vpermq ymm3,ymm3,144
+ vpand ymm3,ymm3,YMMWORD[$L$high64x3]
+
+ vmovupd YMMWORD[320+rsp],ymm3
+ vmovupd YMMWORD[352+rsp],ymm4
+ vmovupd YMMWORD[384+rsp],ymm5
+ vmovupd YMMWORD[416+rsp],ymm6
+ vmovupd YMMWORD[448+rsp],ymm7
+ vmovupd YMMWORD[480+rsp],ymm8
+ vmovupd YMMWORD[512+rsp],ymm9
+ vmovupd YMMWORD[544+rsp],ymm10
+ vmovupd YMMWORD[576+rsp],ymm11
+ vmovupd YMMWORD[608+rsp],ymm12
+
+ vmovupd ymm3,YMMWORD[rsp]
+ vmovupd ymm4,YMMWORD[32+rsp]
+ vmovupd ymm5,YMMWORD[64+rsp]
+ vmovupd ymm6,YMMWORD[96+rsp]
+ vmovupd ymm7,YMMWORD[128+rsp]
+ vmovupd ymm8,YMMWORD[160+rsp]
+ vmovupd ymm9,YMMWORD[192+rsp]
+ vmovupd ymm10,YMMWORD[224+rsp]
+ vmovupd ymm11,YMMWORD[256+rsp]
+ vmovupd ymm12,YMMWORD[288+rsp]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,YMMWORD[320+rsp]
+ vpaddq ymm4,ymm4,YMMWORD[352+rsp]
+ vpaddq ymm5,ymm5,YMMWORD[384+rsp]
+ vpaddq ymm6,ymm6,YMMWORD[416+rsp]
+ vpaddq ymm7,ymm7,YMMWORD[448+rsp]
+ vpaddq ymm8,ymm8,YMMWORD[480+rsp]
+ vpaddq ymm9,ymm9,YMMWORD[512+rsp]
+ vpaddq ymm10,ymm10,YMMWORD[544+rsp]
+ vpaddq ymm11,ymm11,YMMWORD[576+rsp]
+ vpaddq ymm12,ymm12,YMMWORD[608+rsp]
+
+ lea rsp,[640+rsp]
+
+
+
+ vpcmpgtq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm13
+ vpcmpgtq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm13
+ shl r13b,4
+ or r14b,r13b
+
+ vpcmpgtq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm13
+ vpcmpgtq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm13
+ shl r12b,4
+ or r13b,r12b
+
+ vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm13
+ vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm13
+ shl r11b,4
+ or r12b,r11b
+
+ vpcmpgtq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm13
+ vpcmpgtq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd r10d,ymm13
+ shl r10b,4
+ or r11b,r10b
+
+ vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vmovmskpd r10d,ymm13
+ vpcmpgtq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm13
+ shl r9b,4
+ or r10b,r9b
+
+ add r14b,r14b
+ adc r13b,r13b
+ adc r12b,r12b
+ adc r11b,r11b
+ adc r10b,r10b
+
+
+ vpcmpeqq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm13
+ vpcmpeqq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm13
+ shl r8b,4
+ or r9b,r8b
+
+ vpcmpeqq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm13
+ vpcmpeqq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm13
+ shl dl,4
+ or r8b,dl
+
+ vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm13
+ vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm13
+ shl cl,4
+ or dl,cl
+
+ vpcmpeqq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm13
+ vpcmpeqq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd ebx,ymm13
+ shl bl,4
+ or cl,bl
+
+ vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vmovmskpd ebx,ymm13
+ vpcmpeqq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd eax,ymm13
+ shl al,4
+ or bl,al
+
+ add r14b,r9b
+ adc r13b,r8b
+ adc r12b,dl
+ adc r11b,cl
+ adc r10b,bl
+
+ xor r14b,r9b
+ xor r13b,r8b
+ xor r12b,dl
+ xor r11b,cl
+ xor r10b,bl
+
+ push r9
+ push r8
+
+ lea r8,[$L$kmasklut]
+
+ mov r9b,r14b
+ and r14,0xf
+ vpsubq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm14,YMMWORD[r14*1+r8]
+ vblendvpd ymm3,ymm3,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm4,ymm4,ymm13,ymm14
+
+ mov r9b,r13b
+ and r13,0xf
+ vpsubq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm14,YMMWORD[r13*1+r8]
+ vblendvpd ymm5,ymm5,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm6,ymm6,ymm13,ymm14
+
+ mov r9b,r12b
+ and r12,0xf
+ vpsubq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm14,YMMWORD[r12*1+r8]
+ vblendvpd ymm7,ymm7,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm8,ymm8,ymm13,ymm14
+
+ mov r9b,r11b
+ and r11,0xf
+ vpsubq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm14,YMMWORD[r11*1+r8]
+ vblendvpd ymm9,ymm9,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm10,ymm10,ymm13,ymm14
+
+ mov r9b,r10b
+ and r10,0xf
+ vpsubq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm14,YMMWORD[r10*1+r8]
+ vblendvpd ymm11,ymm11,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm12,ymm12,ymm13,ymm14
+
+ pop r8
+ pop r9
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+ pop r8
+ pop rcx
+ pop rsi
+ pop r11
+
+ vmovdqu YMMWORD[rdi],ymm3
+ vmovdqu YMMWORD[32+rdi],ymm4
+ vmovdqu YMMWORD[64+rdi],ymm5
+ vmovdqu YMMWORD[96+rdi],ymm6
+ vmovdqu YMMWORD[128+rdi],ymm7
+ vmovdqu YMMWORD[160+rdi],ymm8
+ vmovdqu YMMWORD[192+rdi],ymm9
+ vmovdqu YMMWORD[224+rdi],ymm10
+ vmovdqu YMMWORD[256+rdi],ymm11
+ vmovdqu YMMWORD[288+rdi],ymm12
+
+ xor r15d,r15d
+
+ mov rax,0xfffffffffffff
+
+ mov ebx,40
+
+ vpxor ymm0,ymm0,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+ vmovapd ymm10,ymm0
+ vmovapd ymm11,ymm0
+ vmovapd ymm12,ymm0
+ALIGN 32
+$L$loop40_1:
+ mov r13,QWORD[r11]
+
+ vpbroadcastq ymm1,QWORD[r11]
+ mov rdx,QWORD[320+rsi]
+ mulx r12,r13,r13
+ add r9,r13
+ mov r10,r12
+ adc r10,0
+
+ mov r13,QWORD[8+r8]
+ imul r13,r9
+ and r13,rax
+
+ vmovq xmm2,r13
+ vpbroadcastq ymm2,xmm2
+ mov rdx,QWORD[320+rcx]
+ mulx r12,r13,r13
+ add r9,r13
+ adc r10,r12
+
+ shr r9,52
+ sal r10,12
+ or r9,r10
+
+ lea rsp,[((-328))+rsp]
+
+{vex} vpmadd52luq ymm3,ymm1,YMMWORD[320+rsi]
+{vex} vpmadd52luq ymm4,ymm1,YMMWORD[352+rsi]
+{vex} vpmadd52luq ymm5,ymm1,YMMWORD[384+rsi]
+{vex} vpmadd52luq ymm6,ymm1,YMMWORD[416+rsi]
+{vex} vpmadd52luq ymm7,ymm1,YMMWORD[448+rsi]
+{vex} vpmadd52luq ymm8,ymm1,YMMWORD[480+rsi]
+{vex} vpmadd52luq ymm9,ymm1,YMMWORD[512+rsi]
+{vex} vpmadd52luq ymm10,ymm1,YMMWORD[544+rsi]
+{vex} vpmadd52luq ymm11,ymm1,YMMWORD[576+rsi]
+{vex} vpmadd52luq ymm12,ymm1,YMMWORD[608+rsi]
+
+{vex} vpmadd52luq ymm3,ymm2,YMMWORD[320+rcx]
+{vex} vpmadd52luq ymm4,ymm2,YMMWORD[352+rcx]
+{vex} vpmadd52luq ymm5,ymm2,YMMWORD[384+rcx]
+{vex} vpmadd52luq ymm6,ymm2,YMMWORD[416+rcx]
+{vex} vpmadd52luq ymm7,ymm2,YMMWORD[448+rcx]
+{vex} vpmadd52luq ymm8,ymm2,YMMWORD[480+rcx]
+{vex} vpmadd52luq ymm9,ymm2,YMMWORD[512+rcx]
+{vex} vpmadd52luq ymm10,ymm2,YMMWORD[544+rcx]
+{vex} vpmadd52luq ymm11,ymm2,YMMWORD[576+rcx]
+{vex} vpmadd52luq ymm12,ymm2,YMMWORD[608+rcx]
+ vmovdqu YMMWORD[rsp],ymm3
+ vmovdqu YMMWORD[32+rsp],ymm4
+ vmovdqu YMMWORD[64+rsp],ymm5
+ vmovdqu YMMWORD[96+rsp],ymm6
+ vmovdqu YMMWORD[128+rsp],ymm7
+ vmovdqu YMMWORD[160+rsp],ymm8
+ vmovdqu YMMWORD[192+rsp],ymm9
+ vmovdqu YMMWORD[224+rsp],ymm10
+ vmovdqu YMMWORD[256+rsp],ymm11
+ vmovdqu YMMWORD[288+rsp],ymm12
+ mov QWORD[320+rsp],0
+
+ vmovdqu ymm3,YMMWORD[8+rsp]
+ vmovdqu ymm4,YMMWORD[40+rsp]
+ vmovdqu ymm5,YMMWORD[72+rsp]
+ vmovdqu ymm6,YMMWORD[104+rsp]
+ vmovdqu ymm7,YMMWORD[136+rsp]
+ vmovdqu ymm8,YMMWORD[168+rsp]
+ vmovdqu ymm9,YMMWORD[200+rsp]
+ vmovdqu ymm10,YMMWORD[232+rsp]
+ vmovdqu ymm11,YMMWORD[264+rsp]
+ vmovdqu ymm12,YMMWORD[296+rsp]
+
+ add r9,QWORD[8+rsp]
+
+{vex} vpmadd52huq ymm3,ymm1,YMMWORD[320+rsi]
+{vex} vpmadd52huq ymm4,ymm1,YMMWORD[352+rsi]
+{vex} vpmadd52huq ymm5,ymm1,YMMWORD[384+rsi]
+{vex} vpmadd52huq ymm6,ymm1,YMMWORD[416+rsi]
+{vex} vpmadd52huq ymm7,ymm1,YMMWORD[448+rsi]
+{vex} vpmadd52huq ymm8,ymm1,YMMWORD[480+rsi]
+{vex} vpmadd52huq ymm9,ymm1,YMMWORD[512+rsi]
+{vex} vpmadd52huq ymm10,ymm1,YMMWORD[544+rsi]
+{vex} vpmadd52huq ymm11,ymm1,YMMWORD[576+rsi]
+{vex} vpmadd52huq ymm12,ymm1,YMMWORD[608+rsi]
+
+{vex} vpmadd52huq ymm3,ymm2,YMMWORD[320+rcx]
+{vex} vpmadd52huq ymm4,ymm2,YMMWORD[352+rcx]
+{vex} vpmadd52huq ymm5,ymm2,YMMWORD[384+rcx]
+{vex} vpmadd52huq ymm6,ymm2,YMMWORD[416+rcx]
+{vex} vpmadd52huq ymm7,ymm2,YMMWORD[448+rcx]
+{vex} vpmadd52huq ymm8,ymm2,YMMWORD[480+rcx]
+{vex} vpmadd52huq ymm9,ymm2,YMMWORD[512+rcx]
+{vex} vpmadd52huq ymm10,ymm2,YMMWORD[544+rcx]
+{vex} vpmadd52huq ymm11,ymm2,YMMWORD[576+rcx]
+{vex} vpmadd52huq ymm12,ymm2,YMMWORD[608+rcx]
+ lea rsp,[328+rsp]
+ lea r11,[8+r11]
+ dec ebx
+ jne NEAR $L$loop40_1
+
+ vmovq xmm0,r9
+ vpbroadcastq ymm0,xmm0
+ vpblendd ymm3,ymm3,ymm0,3
+
+ lea rsp,[((-640))+rsp]
+ vmovupd YMMWORD[rsp],ymm3
+ vmovupd YMMWORD[32+rsp],ymm4
+ vmovupd YMMWORD[64+rsp],ymm5
+ vmovupd YMMWORD[96+rsp],ymm6
+ vmovupd YMMWORD[128+rsp],ymm7
+ vmovupd YMMWORD[160+rsp],ymm8
+ vmovupd YMMWORD[192+rsp],ymm9
+ vmovupd YMMWORD[224+rsp],ymm10
+ vmovupd YMMWORD[256+rsp],ymm11
+ vmovupd YMMWORD[288+rsp],ymm12
+
+
+
+ vpsrlq ymm3,ymm3,52
+ vpsrlq ymm4,ymm4,52
+ vpsrlq ymm5,ymm5,52
+ vpsrlq ymm6,ymm6,52
+ vpsrlq ymm7,ymm7,52
+ vpsrlq ymm8,ymm8,52
+ vpsrlq ymm9,ymm9,52
+ vpsrlq ymm10,ymm10,52
+ vpsrlq ymm11,ymm11,52
+ vpsrlq ymm12,ymm12,52
+
+
+ vpermq ymm12,ymm12,144
+ vpermq ymm13,ymm11,3
+ vblendpd ymm12,ymm12,ymm13,1
+
+ vpermq ymm11,ymm11,144
+ vpermq ymm13,ymm10,3
+ vblendpd ymm11,ymm11,ymm13,1
+
+ vpermq ymm10,ymm10,144
+ vpermq ymm13,ymm9,3
+ vblendpd ymm10,ymm10,ymm13,1
+
+ vpermq ymm9,ymm9,144
+ vpermq ymm13,ymm8,3
+ vblendpd ymm9,ymm9,ymm13,1
+
+ vpermq ymm8,ymm8,144
+ vpermq ymm13,ymm7,3
+ vblendpd ymm8,ymm8,ymm13,1
+
+ vpermq ymm7,ymm7,144
+ vpermq ymm13,ymm6,3
+ vblendpd ymm7,ymm7,ymm13,1
+
+ vpermq ymm6,ymm6,144
+ vpermq ymm13,ymm5,3
+ vblendpd ymm6,ymm6,ymm13,1
+
+ vpermq ymm5,ymm5,144
+ vpermq ymm13,ymm4,3
+ vblendpd ymm5,ymm5,ymm13,1
+
+ vpermq ymm4,ymm4,144
+ vpermq ymm13,ymm3,3
+ vblendpd ymm4,ymm4,ymm13,1
+
+ vpermq ymm3,ymm3,144
+ vpand ymm3,ymm3,YMMWORD[$L$high64x3]
+
+ vmovupd YMMWORD[320+rsp],ymm3
+ vmovupd YMMWORD[352+rsp],ymm4
+ vmovupd YMMWORD[384+rsp],ymm5
+ vmovupd YMMWORD[416+rsp],ymm6
+ vmovupd YMMWORD[448+rsp],ymm7
+ vmovupd YMMWORD[480+rsp],ymm8
+ vmovupd YMMWORD[512+rsp],ymm9
+ vmovupd YMMWORD[544+rsp],ymm10
+ vmovupd YMMWORD[576+rsp],ymm11
+ vmovupd YMMWORD[608+rsp],ymm12
+
+ vmovupd ymm3,YMMWORD[rsp]
+ vmovupd ymm4,YMMWORD[32+rsp]
+ vmovupd ymm5,YMMWORD[64+rsp]
+ vmovupd ymm6,YMMWORD[96+rsp]
+ vmovupd ymm7,YMMWORD[128+rsp]
+ vmovupd ymm8,YMMWORD[160+rsp]
+ vmovupd ymm9,YMMWORD[192+rsp]
+ vmovupd ymm10,YMMWORD[224+rsp]
+ vmovupd ymm11,YMMWORD[256+rsp]
+ vmovupd ymm12,YMMWORD[288+rsp]
+
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+
+ vpaddq ymm3,ymm3,YMMWORD[320+rsp]
+ vpaddq ymm4,ymm4,YMMWORD[352+rsp]
+ vpaddq ymm5,ymm5,YMMWORD[384+rsp]
+ vpaddq ymm6,ymm6,YMMWORD[416+rsp]
+ vpaddq ymm7,ymm7,YMMWORD[448+rsp]
+ vpaddq ymm8,ymm8,YMMWORD[480+rsp]
+ vpaddq ymm9,ymm9,YMMWORD[512+rsp]
+ vpaddq ymm10,ymm10,YMMWORD[544+rsp]
+ vpaddq ymm11,ymm11,YMMWORD[576+rsp]
+ vpaddq ymm12,ymm12,YMMWORD[608+rsp]
+
+ lea rsp,[640+rsp]
+
+
+
+ vpcmpgtq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ vmovmskpd r14d,ymm13
+ vpcmpgtq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm13
+ shl r13b,4
+ or r14b,r13b
+
+ vpcmpgtq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ vmovmskpd r13d,ymm13
+ vpcmpgtq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm13
+ shl r12b,4
+ or r13b,r12b
+
+ vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vmovmskpd r12d,ymm13
+ vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm13
+ shl r11b,4
+ or r12b,r11b
+
+ vpcmpgtq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ vmovmskpd r11d,ymm13
+ vpcmpgtq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd r10d,ymm13
+ shl r10b,4
+ or r11b,r10b
+
+ vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vmovmskpd r10d,ymm13
+ vpcmpgtq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm13
+ shl r9b,4
+ or r10b,r9b
+
+ add r14b,r14b
+ adc r13b,r13b
+ adc r12b,r12b
+ adc r11b,r11b
+ adc r10b,r10b
+
+
+ vpcmpeqq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ vmovmskpd r9d,ymm13
+ vpcmpeqq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm13
+ shl r8b,4
+ or r9b,r8b
+
+ vpcmpeqq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ vmovmskpd r8d,ymm13
+ vpcmpeqq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm13
+ shl dl,4
+ or r8b,dl
+
+ vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ vmovmskpd edx,ymm13
+ vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm13
+ shl cl,4
+ or dl,cl
+
+ vpcmpeqq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ vmovmskpd ecx,ymm13
+ vpcmpeqq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ vmovmskpd ebx,ymm13
+ shl bl,4
+ or cl,bl
+
+ vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ vmovmskpd ebx,ymm13
+ vpcmpeqq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ vmovmskpd eax,ymm13
+ shl al,4
+ or bl,al
+
+ add r14b,r9b
+ adc r13b,r8b
+ adc r12b,dl
+ adc r11b,cl
+ adc r10b,bl
+
+ xor r14b,r9b
+ xor r13b,r8b
+ xor r12b,dl
+ xor r11b,cl
+ xor r10b,bl
+
+ push r9
+ push r8
+
+ lea r8,[$L$kmasklut]
+
+ mov r9b,r14b
+ and r14,0xf
+ vpsubq ymm13,ymm3,YMMWORD[$L$mask52x4]
+ shl r14,5
+ vmovapd ymm14,YMMWORD[r14*1+r8]
+ vblendvpd ymm3,ymm3,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm4,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm4,ymm4,ymm13,ymm14
+
+ mov r9b,r13b
+ and r13,0xf
+ vpsubq ymm13,ymm5,YMMWORD[$L$mask52x4]
+ shl r13,5
+ vmovapd ymm14,YMMWORD[r13*1+r8]
+ vblendvpd ymm5,ymm5,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm6,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm6,ymm6,ymm13,ymm14
+
+ mov r9b,r12b
+ and r12,0xf
+ vpsubq ymm13,ymm7,YMMWORD[$L$mask52x4]
+ shl r12,5
+ vmovapd ymm14,YMMWORD[r12*1+r8]
+ vblendvpd ymm7,ymm7,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm8,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm8,ymm8,ymm13,ymm14
+
+ mov r9b,r11b
+ and r11,0xf
+ vpsubq ymm13,ymm9,YMMWORD[$L$mask52x4]
+ shl r11,5
+ vmovapd ymm14,YMMWORD[r11*1+r8]
+ vblendvpd ymm9,ymm9,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm10,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm10,ymm10,ymm13,ymm14
+
+ mov r9b,r10b
+ and r10,0xf
+ vpsubq ymm13,ymm11,YMMWORD[$L$mask52x4]
+ shl r10,5
+ vmovapd ymm14,YMMWORD[r10*1+r8]
+ vblendvpd ymm11,ymm11,ymm13,ymm14
+
+ shr r9b,4
+ and r9,0xf
+ vpsubq ymm13,ymm12,YMMWORD[$L$mask52x4]
+ shl r9,5
+ vmovapd ymm14,YMMWORD[r9*1+r8]
+ vblendvpd ymm12,ymm12,ymm13,ymm14
+
+ pop r8
+ pop r9
+
+ vpand ymm3,ymm3,YMMWORD[$L$mask52x4]
+ vpand ymm4,ymm4,YMMWORD[$L$mask52x4]
+ vpand ymm5,ymm5,YMMWORD[$L$mask52x4]
+ vpand ymm6,ymm6,YMMWORD[$L$mask52x4]
+ vpand ymm7,ymm7,YMMWORD[$L$mask52x4]
+ vpand ymm8,ymm8,YMMWORD[$L$mask52x4]
+ vpand ymm9,ymm9,YMMWORD[$L$mask52x4]
+
+ vpand ymm10,ymm10,YMMWORD[$L$mask52x4]
+ vpand ymm11,ymm11,YMMWORD[$L$mask52x4]
+ vpand ymm12,ymm12,YMMWORD[$L$mask52x4]
+
+ vmovdqu YMMWORD[320+rdi],ymm3
+ vmovdqu YMMWORD[352+rdi],ymm4
+ vmovdqu YMMWORD[384+rdi],ymm5
+ vmovdqu YMMWORD[416+rdi],ymm6
+ vmovdqu YMMWORD[448+rdi],ymm7
+ vmovdqu YMMWORD[480+rdi],ymm8
+ vmovdqu YMMWORD[512+rdi],ymm9
+ vmovdqu YMMWORD[544+rdi],ymm10
+ vmovdqu YMMWORD[576+rdi],ymm11
+ vmovdqu YMMWORD[608+rdi],ymm12
+
+ vzeroupper
+ lea rax,[rsp]
+
+ vmovapd xmm6,XMMWORD[rax]
+ vmovapd xmm7,XMMWORD[16+rax]
+ vmovapd xmm8,XMMWORD[32+rax]
+ vmovapd xmm9,XMMWORD[48+rax]
+ vmovapd xmm10,XMMWORD[64+rax]
+ vmovapd xmm11,XMMWORD[80+rax]
+ vmovapd xmm12,XMMWORD[96+rax]
+ vmovapd xmm13,XMMWORD[112+rax]
+ vmovapd xmm14,XMMWORD[128+rax]
+ vmovapd xmm15,XMMWORD[144+rax]
+ lea rax,[168+rsp]
+ mov r15,QWORD[rax]
+
+ mov r14,QWORD[8+rax]
+
+ mov r13,QWORD[16+rax]
+
+ mov r12,QWORD[24+rax]
+
+ mov rbp,QWORD[32+rax]
+
+ mov rbx,QWORD[40+rax]
+
+ lea rsp,[48+rax]
+
+$L$ossl_rsaz_amm52x40_x2_avxifma256_epilogue:
+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue
+ mov rsi,QWORD[16+rsp]
+ DB 0F3h,0C3h ;repret
+
+$L$SEH_end_ossl_rsaz_amm52x40_x2_avxifma256:
+section .text code align=64
+
+
+ALIGN 32
+global ossl_extract_multiplier_2x40_win5_avx
+
+ossl_extract_multiplier_2x40_win5_avx:
+
+DB 243,15,30,250
+ vmovapd ymm14,YMMWORD[$L$ones]
+ vmovq xmm10,r8
+ vpbroadcastq ymm12,xmm10
+ vmovq xmm10,r9
+ vpbroadcastq ymm13,xmm10
+ lea rax,[20480+rdx]
+
+
+ mov r10,rdx
+
+
+ vpxor xmm0,xmm0,xmm0
+ vmovapd ymm1,ymm0
+ vmovapd ymm2,ymm0
+ vmovapd ymm3,ymm0
+ vmovapd ymm4,ymm0
+ vmovapd ymm5,ymm0
+ vmovapd ymm6,ymm0
+ vmovapd ymm7,ymm0
+ vmovapd ymm8,ymm0
+ vmovapd ymm9,ymm0
+ vpxor ymm11,ymm11,ymm11
+ALIGN 32
+$L$loop_0:
+ vpcmpeqq ymm15,ymm12,ymm11
+ vmovdqu ymm10,YMMWORD[rdx]
+
+ vblendvpd ymm0,ymm0,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[32+rdx]
+
+ vblendvpd ymm1,ymm1,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[64+rdx]
+
+ vblendvpd ymm2,ymm2,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[96+rdx]
+
+ vblendvpd ymm3,ymm3,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[128+rdx]
+
+ vblendvpd ymm4,ymm4,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[160+rdx]
+
+ vblendvpd ymm5,ymm5,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[192+rdx]
+
+ vblendvpd ymm6,ymm6,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[224+rdx]
+
+ vblendvpd ymm7,ymm7,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[256+rdx]
+
+ vblendvpd ymm8,ymm8,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[288+rdx]
+
+ vblendvpd ymm9,ymm9,ymm10,ymm15
+ vpaddq ymm11,ymm11,ymm14
+ add rdx,640
+ cmp rax,rdx
+ jne NEAR $L$loop_0
+ vmovdqu YMMWORD[rcx],ymm0
+ vmovdqu YMMWORD[32+rcx],ymm1
+ vmovdqu YMMWORD[64+rcx],ymm2
+ vmovdqu YMMWORD[96+rcx],ymm3
+ vmovdqu YMMWORD[128+rcx],ymm4
+ vmovdqu YMMWORD[160+rcx],ymm5
+ vmovdqu YMMWORD[192+rcx],ymm6
+ vmovdqu YMMWORD[224+rcx],ymm7
+ vmovdqu YMMWORD[256+rcx],ymm8
+ vmovdqu YMMWORD[288+rcx],ymm9
+ mov rdx,r10
+ vpxor ymm11,ymm11,ymm11
+ALIGN 32
+$L$loop_320:
+ vpcmpeqq ymm15,ymm13,ymm11
+ vmovdqu ymm10,YMMWORD[320+rdx]
+
+ vblendvpd ymm0,ymm0,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[352+rdx]
+
+ vblendvpd ymm1,ymm1,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[384+rdx]
+
+ vblendvpd ymm2,ymm2,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[416+rdx]
+
+ vblendvpd ymm3,ymm3,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[448+rdx]
+
+ vblendvpd ymm4,ymm4,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[480+rdx]
+
+ vblendvpd ymm5,ymm5,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[512+rdx]
+
+ vblendvpd ymm6,ymm6,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[544+rdx]
+
+ vblendvpd ymm7,ymm7,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[576+rdx]
+
+ vblendvpd ymm8,ymm8,ymm10,ymm15
+ vmovdqu ymm10,YMMWORD[608+rdx]
+
+ vblendvpd ymm9,ymm9,ymm10,ymm15
+ vpaddq ymm11,ymm11,ymm14
+ add rdx,640
+ cmp rax,rdx
+ jne NEAR $L$loop_320
+ vmovdqu YMMWORD[320+rcx],ymm0
+ vmovdqu YMMWORD[352+rcx],ymm1
+ vmovdqu YMMWORD[384+rcx],ymm2
+ vmovdqu YMMWORD[416+rcx],ymm3
+ vmovdqu YMMWORD[448+rcx],ymm4
+ vmovdqu YMMWORD[480+rcx],ymm5
+ vmovdqu YMMWORD[512+rcx],ymm6
+ vmovdqu YMMWORD[544+rcx],ymm7
+ vmovdqu YMMWORD[576+rcx],ymm8
+ vmovdqu YMMWORD[608+rcx],ymm9
+
+ DB 0F3h,0C3h ;repret
+
+
+section .rdata rdata align=32
+ALIGN 32
+$L$ones:
+ DQ 1,1,1,1
+$L$zeros:
+ DQ 0,0,0,0
+EXTERN __imp_RtlVirtualUnwind
+
+ALIGN 16
+rsaz_avx_handler:
+ push rsi
+ push rdi
+ push rbx
+ push rbp
+ push r12
+ push r13
+ push r14
+ push r15
+ pushfq
+ sub rsp,64
+
+ mov rax,QWORD[120+r8]
+ mov rbx,QWORD[248+r8]
+
+ mov rsi,QWORD[8+r9]
+ mov r11,QWORD[56+r9]
+
+ mov r10d,DWORD[r11]
+ lea r10,[r10*1+rsi]
+ cmp rbx,r10
+ jb NEAR $L$common_seh_tail
+
+ mov r10d,DWORD[4+r11]
+ lea r10,[r10*1+rsi]
+ cmp rbx,r10
+ jae NEAR $L$common_seh_tail
+
+ mov rax,QWORD[152+r8]
+
+ lea rsi,[rax]
+ lea rdi,[512+r8]
+ mov ecx,20
+ DD 0xa548f3fc
+
+ lea rax,[216+rax]
+
+ mov rbx,QWORD[((-8))+rax]
+ mov rbp,QWORD[((-16))+rax]
+ mov r12,QWORD[((-24))+rax]
+ mov r13,QWORD[((-32))+rax]
+ mov r14,QWORD[((-40))+rax]
+ mov r15,QWORD[((-48))+rax]
+ mov QWORD[144+r8],rbx
+ mov QWORD[160+r8],rbp
+ mov QWORD[216+r8],r12
+ mov QWORD[224+r8],r13
+ mov QWORD[232+r8],r14
+ mov QWORD[240+r8],r15
+
+$L$common_seh_tail:
+ mov rdi,QWORD[8+rax]
+ mov rsi,QWORD[16+rax]
+ mov QWORD[152+r8],rax
+ mov QWORD[168+r8],rsi
+ mov QWORD[176+r8],rdi
+
+ mov rdi,QWORD[40+r9]
+ mov rsi,r8
+ mov ecx,154
+ DD 0xa548f3fc
+
+ mov rsi,r9
+ xor rcx,rcx
+ mov rdx,QWORD[8+rsi]
+ mov r8,QWORD[rsi]
+ mov r9,QWORD[16+rsi]
+ mov r10,QWORD[40+rsi]
+ lea r11,[56+rsi]
+ lea r12,[24+rsi]
+ mov QWORD[32+rsp],r10
+ mov QWORD[40+rsp],r11
+ mov QWORD[48+rsp],r12
+ mov QWORD[56+rsp],rcx
+ call QWORD[__imp_RtlVirtualUnwind]
+
+ mov eax,1
+ add rsp,64
+ popfq
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop rbp
+ pop rbx
+ pop rdi
+ pop rsi
+ DB 0F3h,0C3h ;repret
+
+
+section .pdata rdata align=4
+ALIGN 4
+ DD $L$SEH_begin_ossl_rsaz_amm52x40_x1_avxifma256 wrt ..imagebase
+ DD $L$SEH_end_ossl_rsaz_amm52x40_x1_avxifma256 wrt ..imagebase
+ DD $L$SEH_info_ossl_rsaz_amm52x40_x1_avxifma256 wrt ..imagebase
+
+ DD $L$SEH_begin_ossl_rsaz_amm52x40_x2_avxifma256 wrt ..imagebase
+ DD $L$SEH_end_ossl_rsaz_amm52x40_x2_avxifma256 wrt ..imagebase
+ DD $L$SEH_info_ossl_rsaz_amm52x40_x2_avxifma256 wrt ..imagebase
+
+section .xdata rdata align=8
+ALIGN 8
+$L$SEH_info_ossl_rsaz_amm52x40_x1_avxifma256:
+DB 9,0,0,0
+ DD rsaz_avx_handler wrt ..imagebase
+ DD $L$ossl_rsaz_amm52x40_x1_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x40_x1_avxifma256_epilogue wrt ..imagebase
+$L$SEH_info_ossl_rsaz_amm52x40_x2_avxifma256:
+DB 9,0,0,0
+ DD rsaz_avx_handler wrt ..imagebase
+ DD $L$ossl_rsaz_amm52x40_x2_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x40_x2_avxifma256_epilogue wrt ..imagebase
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm
index 9139d4c..f717082 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm
@@ -210,7 +210,7 @@ $L$loop:
lea eax,[((-165796510))+r10*1+rax]
and r11d,ecx
mov r10d,DWORD[24+rsi]
- or r12d,r11d
+ add eax,r11d
mov r11d,ecx
add eax,r12d
mov r12d,ecx
@@ -221,7 +221,7 @@ $L$loop:
lea edx,[((-1069501632))+r10*1+rdx]
and r11d,ebx
mov r10d,DWORD[44+rsi]
- or r12d,r11d
+ add edx,r11d
mov r11d,ebx
add edx,r12d
mov r12d,ebx
@@ -232,7 +232,7 @@ $L$loop:
lea ecx,[643717713+r10*1+rcx]
and r11d,eax
mov r10d,DWORD[rsi]
- or r12d,r11d
+ add ecx,r11d
mov r11d,eax
add ecx,r12d
mov r12d,eax
@@ -243,7 +243,7 @@ $L$loop:
lea ebx,[((-373897302))+r10*1+rbx]
and r11d,edx
mov r10d,DWORD[20+rsi]
- or r12d,r11d
+ add ebx,r11d
mov r11d,edx
add ebx,r12d
mov r12d,edx
@@ -254,7 +254,7 @@ $L$loop:
lea eax,[((-701558691))+r10*1+rax]
and r11d,ecx
mov r10d,DWORD[40+rsi]
- or r12d,r11d
+ add eax,r11d
mov r11d,ecx
add eax,r12d
mov r12d,ecx
@@ -265,7 +265,7 @@ $L$loop:
lea edx,[38016083+r10*1+rdx]
and r11d,ebx
mov r10d,DWORD[60+rsi]
- or r12d,r11d
+ add edx,r11d
mov r11d,ebx
add edx,r12d
mov r12d,ebx
@@ -276,7 +276,7 @@ $L$loop:
lea ecx,[((-660478335))+r10*1+rcx]
and r11d,eax
mov r10d,DWORD[16+rsi]
- or r12d,r11d
+ add ecx,r11d
mov r11d,eax
add ecx,r12d
mov r12d,eax
@@ -287,7 +287,7 @@ $L$loop:
lea ebx,[((-405537848))+r10*1+rbx]
and r11d,edx
mov r10d,DWORD[36+rsi]
- or r12d,r11d
+ add ebx,r11d
mov r11d,edx
add ebx,r12d
mov r12d,edx
@@ -298,7 +298,7 @@ $L$loop:
lea eax,[568446438+r10*1+rax]
and r11d,ecx
mov r10d,DWORD[56+rsi]
- or r12d,r11d
+ add eax,r11d
mov r11d,ecx
add eax,r12d
mov r12d,ecx
@@ -309,7 +309,7 @@ $L$loop:
lea edx,[((-1019803690))+r10*1+rdx]
and r11d,ebx
mov r10d,DWORD[12+rsi]
- or r12d,r11d
+ add edx,r11d
mov r11d,ebx
add edx,r12d
mov r12d,ebx
@@ -320,7 +320,7 @@ $L$loop:
lea ecx,[((-187363961))+r10*1+rcx]
and r11d,eax
mov r10d,DWORD[32+rsi]
- or r12d,r11d
+ add ecx,r11d
mov r11d,eax
add ecx,r12d
mov r12d,eax
@@ -331,7 +331,7 @@ $L$loop:
lea ebx,[1163531501+r10*1+rbx]
and r11d,edx
mov r10d,DWORD[52+rsi]
- or r12d,r11d
+ add ebx,r11d
mov r11d,edx
add ebx,r12d
mov r12d,edx
@@ -342,7 +342,7 @@ $L$loop:
lea eax,[((-1444681467))+r10*1+rax]
and r11d,ecx
mov r10d,DWORD[8+rsi]
- or r12d,r11d
+ add eax,r11d
mov r11d,ecx
add eax,r12d
mov r12d,ecx
@@ -353,7 +353,7 @@ $L$loop:
lea edx,[((-51403784))+r10*1+rdx]
and r11d,ebx
mov r10d,DWORD[28+rsi]
- or r12d,r11d
+ add edx,r11d
mov r11d,ebx
add edx,r12d
mov r12d,ebx
@@ -364,7 +364,7 @@ $L$loop:
lea ecx,[1735328473+r10*1+rcx]
and r11d,eax
mov r10d,DWORD[48+rsi]
- or r12d,r11d
+ add ecx,r11d
mov r11d,eax
add ecx,r12d
mov r12d,eax
@@ -375,7 +375,7 @@ $L$loop:
lea ebx,[((-1926607734))+r10*1+rbx]
and r11d,edx
mov r10d,DWORD[20+rsi]
- or r12d,r11d
+ add ebx,r11d
mov r11d,edx
add ebx,r12d
mov r12d,edx
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm
index 2ce2232..b58086a 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm
@@ -2,14 +2,14 @@ default rel
%define XMMWORD
%define YMMWORD
%define ZMMWORD
+
EXTERN OPENSSL_cpuid_setup
section .CRT$XCU rdata align=8
DQ OPENSSL_cpuid_setup
-common OPENSSL_ia32cap_P 16
-
+common OPENSSL_ia32cap_P 40
section .text code align=64
@@ -175,6 +175,7 @@ $L$generic:
mov eax,7
xor ecx,ecx
cpuid
+ movd xmm1,eax
bt r9d,26
jc NEAR $L$notknights
and ebx,0xfff7ffff
@@ -185,9 +186,31 @@ $L$notknights:
jne NEAR $L$notskylakex
and ebx,0xfffeffff
+
$L$notskylakex:
mov DWORD[8+rdi],ebx
mov DWORD[12+rdi],ecx
+ mov DWORD[16+rdi],edx
+
+ movd eax,xmm1
+ cmp eax,0x1
+ jb NEAR $L$no_extended_info
+ mov eax,0x7
+ mov ecx,0x1
+ cpuid
+ mov DWORD[20+rdi],eax
+ mov DWORD[24+rdi],edx
+ mov DWORD[28+rdi],ebx
+ mov DWORD[32+rdi],ecx
+
+ and edx,0x80000
+ cmp edx,0x0
+ je NEAR $L$no_extended_info
+ mov eax,0x24
+ mov ecx,0x0
+ cpuid
+ mov DWORD[36+rdi],ebx
+
$L$no_extended_info:
bt r9d,27
@@ -206,6 +229,9 @@ DB 0x0f,0x01,0xd0
cmp eax,6
je NEAR $L$done
$L$clear_avx:
+ and DWORD[20+rdi],0xff7fffff
+
+
mov eax,0xefffe7ff
and r9d,eax
mov eax,0x3fdeffdf
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c b/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c
index fd9b9ae..e77a242 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c
@@ -33,6 +33,10 @@ int ossl_param_find_pidx(const char *s)
switch(s[2]) {
default:
break;
+ case 'd':
+ if (strcmp("itional-random", s + 3) == 0)
+ return PIDX_SIGNATURE_PARAM_ADD_RANDOM;
+ break;
case '\0':
return PIDX_KDF_PARAM_ARGON2_AD;
}
@@ -322,6 +326,10 @@ int ossl_param_find_pidx(const char *s)
case 's':
if (strcmp("c", s + 3) == 0)
return PIDX_OBJECT_PARAM_DESC;
+ break;
+ case 't':
+ if (strcmp("erministic", s + 3) == 0)
+ return PIDX_SIGNATURE_PARAM_DETERMINISTIC;
}
break;
case 'h':
@@ -936,8 +944,17 @@ int ossl_param_find_pidx(const char *s)
default:
break;
case '-':
- if (strcmp("check", s + 4) == 0)
- return PIDX_PKEY_PARAM_FIPS_KEY_CHECK;
+ switch(s[4]) {
+ default:
+ break;
+ case 'c':
+ if (strcmp("heck", s + 5) == 0)
+ return PIDX_PKEY_PARAM_FIPS_KEY_CHECK;
+ break;
+ case 'l':
+ if (strcmp("ength", s + 5) == 0)
+ return PIDX_SKEY_PARAM_KEY_LENGTH;
+ }
break;
case 'b':
if (strcmp("its", s + 4) == 0)
@@ -1060,8 +1077,17 @@ int ossl_param_find_pidx(const char *s)
}
break;
case 'e':
- if (strcmp("mcost", s + 2) == 0)
- return PIDX_KDF_PARAM_ARGON2_MEMCOST;
+ switch(s[2]) {
+ default:
+ break;
+ case 'm':
+ if (strcmp("cost", s + 3) == 0)
+ return PIDX_KDF_PARAM_ARGON2_MEMCOST;
+ break;
+ case 's':
+ if (strcmp("sage-encoding", s + 3) == 0)
+ return PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING;
+ }
break;
case 'g':
switch(s[2]) {
@@ -1125,6 +1151,97 @@ int ossl_param_find_pidx(const char *s)
}
}
break;
+ case 'l':
+ switch(s[2]) {
+ default:
+ break;
+ case '-':
+ switch(s[3]) {
+ default:
+ break;
+ case 'd':
+ switch(s[4]) {
+ default:
+ break;
+ case 's':
+ switch(s[5]) {
+ default:
+ break;
+ case 'a':
+ switch(s[6]) {
+ default:
+ break;
+ case '.':
+ switch(s[7]) {
+ default:
+ break;
+ case 'i':
+ if (strcmp("nput_formats", s + 8) == 0)
+ return PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS;
+ break;
+ case 'o':
+ if (strcmp("utput_formats", s + 8) == 0)
+ return PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS;
+ break;
+ case 'p':
+ if (strcmp("refer_seed", s + 8) == 0)
+ return PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED;
+ break;
+ case 'r':
+ if (strcmp("etain_seed", s + 8) == 0)
+ return PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED;
+ }
+ }
+ }
+ }
+ break;
+ case 'k':
+ switch(s[4]) {
+ default:
+ break;
+ case 'e':
+ switch(s[5]) {
+ default:
+ break;
+ case 'm':
+ switch(s[6]) {
+ default:
+ break;
+ case '.':
+ switch(s[7]) {
+ default:
+ break;
+ case 'i':
+ switch(s[8]) {
+ default:
+ break;
+ case 'm':
+ if (strcmp("port_pct_type", s + 9) == 0)
+ return PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE;
+ break;
+ case 'n':
+ if (strcmp("put_formats", s + 9) == 0)
+ return PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS;
+ }
+ break;
+ case 'o':
+ if (strcmp("utput_formats", s + 8) == 0)
+ return PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS;
+ break;
+ case 'p':
+ if (strcmp("refer_seed", s + 8) == 0)
+ return PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED;
+ break;
+ case 'r':
+ if (strcmp("etain_seed", s + 8) == 0)
+ return PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED;
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
case 'o':
switch(s[2]) {
default:
@@ -1147,6 +1264,14 @@ int ossl_param_find_pidx(const char *s)
}
}
break;
+ case 'u':
+ switch(s[2]) {
+ default:
+ break;
+ case '\0':
+ return PIDX_SIGNATURE_PARAM_MU;
+ }
+ break;
case '\0':
return PIDX_PKEY_PARAM_EC_CHAR2_M;
}
@@ -1327,6 +1452,10 @@ int ossl_param_find_pidx(const char *s)
if (strcmp("ounter", s + 2) == 0)
return PIDX_PKEY_PARAM_FFC_PCOUNTER;
break;
+ case 'i':
+ if (strcmp("peline-tag", s + 2) == 0)
+ return PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG;
+ break;
case 'k':
if (strcmp("cs5", s + 2) == 0)
return PIDX_KDF_PARAM_PKCS5;
@@ -1473,6 +1602,10 @@ int ossl_param_find_pidx(const char *s)
return PIDX_DRBG_PARAM_RANDOM_DATA;
}
}
+ break;
+ case 'w':
+ if (strcmp("-bytes", s + 3) == 0)
+ return PIDX_SKEY_PARAM_RAW_BYTES;
}
break;
case 'e':
@@ -2064,7 +2197,7 @@ int ossl_param_find_pidx(const char *s)
break;
case 'e':
if (strcmp("d", s + 3) == 0)
- return PIDX_PKEY_PARAM_FFC_SEED;
+ return PIDX_PKEY_PARAM_SLH_DSA_SEED;
break;
case 'r':
if (strcmp("ial", s + 3) == 0)
@@ -2350,6 +2483,10 @@ int ossl_param_find_pidx(const char *s)
switch(s[4]) {
default:
break;
+ case '-':
+ if (strcmp("entropy", s + 5) == 0)
+ return PIDX_SIGNATURE_PARAM_TEST_ENTROPY;
+ break;
case '_':
switch(s[5]) {
default:
@@ -2502,7 +2639,7 @@ int ossl_param_find_pidx(const char *s)
break;
case 'd':
if (strcmp("tls", s + 9) == 0)
- return PIDX_CAPABILITY_TLS_GROUP_MAX_DTLS;
+ return PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS;
break;
case 't':
if (strcmp("ls", s + 9) == 0)
@@ -2525,7 +2662,7 @@ int ossl_param_find_pidx(const char *s)
break;
case 'd':
if (strcmp("tls", s + 9) == 0)
- return PIDX_CAPABILITY_TLS_GROUP_MIN_DTLS;
+ return PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS;
break;
case 't':
if (strcmp("ls", s + 9) == 0)
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h
index 27bcea8..10e995f 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h
@@ -14,7 +14,7 @@
int ossl_param_find_pidx(const char *s);
/* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */
-#define NUM_PIDX 329
+#define NUM_PIDX 346
#define PIDX_ALG_PARAM_ALGORITHM_ID 0
#define PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS 1
@@ -55,7 +55,9 @@ int ossl_param_find_pidx(const char *s);
#define PIDX_CAPABILITY_TLS_SIGALG_IANA_NAME 26
#define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE 27
#define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE_OID 28
+#define PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS 16
#define PIDX_CAPABILITY_TLS_SIGALG_MAX_TLS 17
+#define PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS 18
#define PIDX_CAPABILITY_TLS_SIGALG_MIN_TLS 19
#define PIDX_CAPABILITY_TLS_SIGALG_NAME 29
#define PIDX_CAPABILITY_TLS_SIGALG_OID 30
@@ -90,357 +92,378 @@ int ossl_param_find_pidx(const char *s);
#define PIDX_CIPHER_PARAM_MODE 55
#define PIDX_CIPHER_PARAM_NUM 56
#define PIDX_CIPHER_PARAM_PADDING 57
-#define PIDX_CIPHER_PARAM_RANDOM_KEY 58
-#define PIDX_CIPHER_PARAM_RC2_KEYBITS 59
-#define PIDX_CIPHER_PARAM_ROUNDS 60
-#define PIDX_CIPHER_PARAM_SPEED 61
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK 62
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD 63
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN 64
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC 65
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN 66
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN 67
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE 68
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE 69
-#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT 70
-#define PIDX_CIPHER_PARAM_TLS_MAC 71
-#define PIDX_CIPHER_PARAM_TLS_MAC_SIZE 72
-#define PIDX_CIPHER_PARAM_TLS_VERSION 73
-#define PIDX_CIPHER_PARAM_UPDATED_IV 74
-#define PIDX_CIPHER_PARAM_USE_BITS 75
-#define PIDX_CIPHER_PARAM_XTS_STANDARD 76
+#define PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG 58
+#define PIDX_CIPHER_PARAM_RANDOM_KEY 59
+#define PIDX_CIPHER_PARAM_RC2_KEYBITS 60
+#define PIDX_CIPHER_PARAM_ROUNDS 61
+#define PIDX_CIPHER_PARAM_SPEED 62
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK 63
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD 64
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN 65
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC 66
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN 67
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN 68
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE 69
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE 70
+#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT 71
+#define PIDX_CIPHER_PARAM_TLS_MAC 72
+#define PIDX_CIPHER_PARAM_TLS_MAC_SIZE 73
+#define PIDX_CIPHER_PARAM_TLS_VERSION 74
+#define PIDX_CIPHER_PARAM_UPDATED_IV 75
+#define PIDX_CIPHER_PARAM_USE_BITS 76
+#define PIDX_CIPHER_PARAM_XTS_STANDARD 77
#define PIDX_DECODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES
-#define PIDX_DIGEST_PARAM_ALGID_ABSENT 77
+#define PIDX_DIGEST_PARAM_ALGID_ABSENT 78
#define PIDX_DIGEST_PARAM_BLOCK_SIZE 45
-#define PIDX_DIGEST_PARAM_MICALG 78
-#define PIDX_DIGEST_PARAM_PAD_TYPE 79
-#define PIDX_DIGEST_PARAM_SIZE 80
-#define PIDX_DIGEST_PARAM_SSL3_MS 81
-#define PIDX_DIGEST_PARAM_XOF 82
-#define PIDX_DIGEST_PARAM_XOFLEN 83
+#define PIDX_DIGEST_PARAM_MICALG 79
+#define PIDX_DIGEST_PARAM_PAD_TYPE 80
+#define PIDX_DIGEST_PARAM_SIZE 81
+#define PIDX_DIGEST_PARAM_SSL3_MS 82
+#define PIDX_DIGEST_PARAM_XOF 83
+#define PIDX_DIGEST_PARAM_XOFLEN 84
#define PIDX_DRBG_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER
#define PIDX_DRBG_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST
-#define PIDX_DRBG_PARAM_ENTROPY_REQUIRED 84
+#define PIDX_DRBG_PARAM_ENTROPY_REQUIRED 85
#define PIDX_DRBG_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
#define PIDX_DRBG_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK
#define PIDX_DRBG_PARAM_MAC PIDX_ALG_PARAM_MAC
-#define PIDX_DRBG_PARAM_MAX_ADINLEN 85
-#define PIDX_DRBG_PARAM_MAX_ENTROPYLEN 86
-#define PIDX_DRBG_PARAM_MAX_LENGTH 87
-#define PIDX_DRBG_PARAM_MAX_NONCELEN 88
-#define PIDX_DRBG_PARAM_MAX_PERSLEN 89
-#define PIDX_DRBG_PARAM_MIN_ENTROPYLEN 90
-#define PIDX_DRBG_PARAM_MIN_LENGTH 91
-#define PIDX_DRBG_PARAM_MIN_NONCELEN 92
-#define PIDX_DRBG_PARAM_PREDICTION_RESISTANCE 93
+#define PIDX_DRBG_PARAM_MAX_ADINLEN 86
+#define PIDX_DRBG_PARAM_MAX_ENTROPYLEN 87
+#define PIDX_DRBG_PARAM_MAX_LENGTH 88
+#define PIDX_DRBG_PARAM_MAX_NONCELEN 89
+#define PIDX_DRBG_PARAM_MAX_PERSLEN 90
+#define PIDX_DRBG_PARAM_MIN_ENTROPYLEN 91
+#define PIDX_DRBG_PARAM_MIN_LENGTH 92
+#define PIDX_DRBG_PARAM_MIN_NONCELEN 93
+#define PIDX_DRBG_PARAM_PREDICTION_RESISTANCE 94
#define PIDX_DRBG_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES
-#define PIDX_DRBG_PARAM_RANDOM_DATA 94
-#define PIDX_DRBG_PARAM_RESEED_COUNTER 95
-#define PIDX_DRBG_PARAM_RESEED_REQUESTS 96
-#define PIDX_DRBG_PARAM_RESEED_TIME 97
-#define PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL 98
-#define PIDX_DRBG_PARAM_SIZE 80
-#define PIDX_DRBG_PARAM_USE_DF 99
+#define PIDX_DRBG_PARAM_RANDOM_DATA 95
+#define PIDX_DRBG_PARAM_RESEED_COUNTER 96
+#define PIDX_DRBG_PARAM_RESEED_REQUESTS 97
+#define PIDX_DRBG_PARAM_RESEED_TIME 98
+#define PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL 99
+#define PIDX_DRBG_PARAM_SIZE 81
+#define PIDX_DRBG_PARAM_USE_DF 100
#define PIDX_ENCODER_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER
-#define PIDX_ENCODER_PARAM_ENCRYPT_LEVEL 100
+#define PIDX_ENCODER_PARAM_ENCRYPT_LEVEL 101
#define PIDX_ENCODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES
-#define PIDX_ENCODER_PARAM_SAVE_PARAMETERS 101
-#define PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE 102
+#define PIDX_ENCODER_PARAM_SAVE_PARAMETERS 102
+#define PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE 103
#define PIDX_EXCHANGE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
#define PIDX_EXCHANGE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK
#define PIDX_EXCHANGE_PARAM_FIPS_ECDH_COFACTOR_CHECK PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK
#define PIDX_EXCHANGE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK
-#define PIDX_EXCHANGE_PARAM_KDF_DIGEST 103
-#define PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS 104
-#define PIDX_EXCHANGE_PARAM_KDF_OUTLEN 105
-#define PIDX_EXCHANGE_PARAM_KDF_TYPE 106
-#define PIDX_EXCHANGE_PARAM_KDF_UKM 107
-#define PIDX_EXCHANGE_PARAM_PAD 108
-#define PIDX_GEN_PARAM_ITERATION 109
-#define PIDX_GEN_PARAM_POTENTIAL 110
-#define PIDX_KDF_PARAM_ARGON2_AD 111
-#define PIDX_KDF_PARAM_ARGON2_LANES 112
-#define PIDX_KDF_PARAM_ARGON2_MEMCOST 113
-#define PIDX_KDF_PARAM_ARGON2_VERSION 114
-#define PIDX_KDF_PARAM_CEK_ALG 115
+#define PIDX_EXCHANGE_PARAM_KDF_DIGEST 104
+#define PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS 105
+#define PIDX_EXCHANGE_PARAM_KDF_OUTLEN 106
+#define PIDX_EXCHANGE_PARAM_KDF_TYPE 107
+#define PIDX_EXCHANGE_PARAM_KDF_UKM 108
+#define PIDX_EXCHANGE_PARAM_PAD 109
+#define PIDX_GEN_PARAM_ITERATION 110
+#define PIDX_GEN_PARAM_POTENTIAL 111
+#define PIDX_KDF_PARAM_ARGON2_AD 112
+#define PIDX_KDF_PARAM_ARGON2_LANES 113
+#define PIDX_KDF_PARAM_ARGON2_MEMCOST 114
+#define PIDX_KDF_PARAM_ARGON2_VERSION 115
+#define PIDX_KDF_PARAM_CEK_ALG 116
#define PIDX_KDF_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER
-#define PIDX_KDF_PARAM_CONSTANT 116
-#define PIDX_KDF_PARAM_DATA 117
+#define PIDX_KDF_PARAM_CONSTANT 117
+#define PIDX_KDF_PARAM_DATA 118
#define PIDX_KDF_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST
-#define PIDX_KDF_PARAM_EARLY_CLEAN 118
+#define PIDX_KDF_PARAM_EARLY_CLEAN 119
#define PIDX_KDF_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
#define PIDX_KDF_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK
-#define PIDX_KDF_PARAM_FIPS_EMS_CHECK 119
+#define PIDX_KDF_PARAM_FIPS_EMS_CHECK 120
#define PIDX_KDF_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK
-#define PIDX_KDF_PARAM_HMACDRBG_ENTROPY 120
-#define PIDX_KDF_PARAM_HMACDRBG_NONCE 121
-#define PIDX_KDF_PARAM_INFO 122
-#define PIDX_KDF_PARAM_ITER 123
-#define PIDX_KDF_PARAM_KBKDF_R 124
-#define PIDX_KDF_PARAM_KBKDF_USE_L 125
-#define PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR 126
-#define PIDX_KDF_PARAM_KEY 127
-#define PIDX_KDF_PARAM_LABEL 128
+#define PIDX_KDF_PARAM_HMACDRBG_ENTROPY 121
+#define PIDX_KDF_PARAM_HMACDRBG_NONCE 122
+#define PIDX_KDF_PARAM_INFO 123
+#define PIDX_KDF_PARAM_ITER 124
+#define PIDX_KDF_PARAM_KBKDF_R 125
+#define PIDX_KDF_PARAM_KBKDF_USE_L 126
+#define PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR 127
+#define PIDX_KDF_PARAM_KEY 128
+#define PIDX_KDF_PARAM_LABEL 129
#define PIDX_KDF_PARAM_MAC PIDX_ALG_PARAM_MAC
-#define PIDX_KDF_PARAM_MAC_SIZE 129
+#define PIDX_KDF_PARAM_MAC_SIZE 130
#define PIDX_KDF_PARAM_MODE 55
-#define PIDX_KDF_PARAM_PASSWORD 130
-#define PIDX_KDF_PARAM_PKCS12_ID 131
-#define PIDX_KDF_PARAM_PKCS5 132
-#define PIDX_KDF_PARAM_PREFIX 133
+#define PIDX_KDF_PARAM_PASSWORD 131
+#define PIDX_KDF_PARAM_PKCS12_ID 132
+#define PIDX_KDF_PARAM_PKCS5 133
+#define PIDX_KDF_PARAM_PREFIX 134
#define PIDX_KDF_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES
-#define PIDX_KDF_PARAM_SALT 134
-#define PIDX_KDF_PARAM_SCRYPT_MAXMEM 135
-#define PIDX_KDF_PARAM_SCRYPT_N 136
-#define PIDX_KDF_PARAM_SCRYPT_P 137
-#define PIDX_KDF_PARAM_SCRYPT_R 124
-#define PIDX_KDF_PARAM_SECRET 138
-#define PIDX_KDF_PARAM_SEED 139
-#define PIDX_KDF_PARAM_SIZE 80
-#define PIDX_KDF_PARAM_SSHKDF_SESSION_ID 140
-#define PIDX_KDF_PARAM_SSHKDF_TYPE 141
-#define PIDX_KDF_PARAM_SSHKDF_XCGHASH 142
-#define PIDX_KDF_PARAM_THREADS 143
-#define PIDX_KDF_PARAM_UKM 144
-#define PIDX_KDF_PARAM_X942_ACVPINFO 145
-#define PIDX_KDF_PARAM_X942_PARTYUINFO 146
-#define PIDX_KDF_PARAM_X942_PARTYVINFO 147
-#define PIDX_KDF_PARAM_X942_SUPP_PRIVINFO 148
-#define PIDX_KDF_PARAM_X942_SUPP_PUBINFO 149
-#define PIDX_KDF_PARAM_X942_USE_KEYBITS 150
+#define PIDX_KDF_PARAM_SALT 135
+#define PIDX_KDF_PARAM_SCRYPT_MAXMEM 136
+#define PIDX_KDF_PARAM_SCRYPT_N 137
+#define PIDX_KDF_PARAM_SCRYPT_P 138
+#define PIDX_KDF_PARAM_SCRYPT_R 125
+#define PIDX_KDF_PARAM_SECRET 139
+#define PIDX_KDF_PARAM_SEED 140
+#define PIDX_KDF_PARAM_SIZE 81
+#define PIDX_KDF_PARAM_SSHKDF_SESSION_ID 141
+#define PIDX_KDF_PARAM_SSHKDF_TYPE 142
+#define PIDX_KDF_PARAM_SSHKDF_XCGHASH 143
+#define PIDX_KDF_PARAM_THREADS 144
+#define PIDX_KDF_PARAM_UKM 145
+#define PIDX_KDF_PARAM_X942_ACVPINFO 146
+#define PIDX_KDF_PARAM_X942_PARTYUINFO 147
+#define PIDX_KDF_PARAM_X942_PARTYVINFO 148
+#define PIDX_KDF_PARAM_X942_SUPP_PRIVINFO 149
+#define PIDX_KDF_PARAM_X942_SUPP_PUBINFO 150
+#define PIDX_KDF_PARAM_X942_USE_KEYBITS 151
#define PIDX_KEM_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
#define PIDX_KEM_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK
-#define PIDX_KEM_PARAM_IKME 151
-#define PIDX_KEM_PARAM_OPERATION 152
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING 153
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING 154
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA 155
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN 156
+#define PIDX_KEM_PARAM_IKME 152
+#define PIDX_KEM_PARAM_OPERATION 153
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING 154
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING 155
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA 156
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN 157
#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MODE 55
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS 157
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD 158
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC 159
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE 160
-#define PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM 161
-#define PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN 162
-#define PIDX_MAC_PARAM_BLOCK_SIZE 163
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS 158
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD 159
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC 160
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE 161
+#define PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM 162
+#define PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN 163
+#define PIDX_MAC_PARAM_BLOCK_SIZE 164
#define PIDX_MAC_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER
-#define PIDX_MAC_PARAM_CUSTOM 164
-#define PIDX_MAC_PARAM_C_ROUNDS 165
+#define PIDX_MAC_PARAM_CUSTOM 165
+#define PIDX_MAC_PARAM_C_ROUNDS 166
#define PIDX_MAC_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST
-#define PIDX_MAC_PARAM_DIGEST_NOINIT 166
-#define PIDX_MAC_PARAM_DIGEST_ONESHOT 167
-#define PIDX_MAC_PARAM_D_ROUNDS 168
+#define PIDX_MAC_PARAM_DIGEST_NOINIT 167
+#define PIDX_MAC_PARAM_DIGEST_ONESHOT 168
+#define PIDX_MAC_PARAM_D_ROUNDS 169
#define PIDX_MAC_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
#define PIDX_MAC_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK
#define PIDX_MAC_PARAM_FIPS_NO_SHORT_MAC PIDX_PROV_PARAM_NO_SHORT_MAC
#define PIDX_MAC_PARAM_IV 52
-#define PIDX_MAC_PARAM_KEY 127
+#define PIDX_MAC_PARAM_KEY 128
#define PIDX_MAC_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES
-#define PIDX_MAC_PARAM_SALT 134
-#define PIDX_MAC_PARAM_SIZE 80
-#define PIDX_MAC_PARAM_TLS_DATA_SIZE 169
-#define PIDX_MAC_PARAM_XOF 82
-#define PIDX_OBJECT_PARAM_DATA 117
-#define PIDX_OBJECT_PARAM_DATA_STRUCTURE 170
-#define PIDX_OBJECT_PARAM_DATA_TYPE 171
-#define PIDX_OBJECT_PARAM_DESC 172
-#define PIDX_OBJECT_PARAM_REFERENCE 173
-#define PIDX_OBJECT_PARAM_TYPE 141
-#define PIDX_PASSPHRASE_PARAM_INFO 122
+#define PIDX_MAC_PARAM_SALT 135
+#define PIDX_MAC_PARAM_SIZE 81
+#define PIDX_MAC_PARAM_TLS_DATA_SIZE 170
+#define PIDX_MAC_PARAM_XOF 83
+#define PIDX_OBJECT_PARAM_DATA 118
+#define PIDX_OBJECT_PARAM_DATA_STRUCTURE 171
+#define PIDX_OBJECT_PARAM_DATA_TYPE 172
+#define PIDX_OBJECT_PARAM_DESC 173
+#define PIDX_OBJECT_PARAM_INPUT_TYPE 174
+#define PIDX_OBJECT_PARAM_REFERENCE 175
+#define PIDX_OBJECT_PARAM_TYPE 142
+#define PIDX_PASSPHRASE_PARAM_INFO 123
#define PIDX_PKEY_PARAM_ALGORITHM_ID PIDX_ALG_PARAM_ALGORITHM_ID
#define PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS
-#define PIDX_PKEY_PARAM_BITS 174
+#define PIDX_PKEY_PARAM_BITS 176
#define PIDX_PKEY_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER
-#define PIDX_PKEY_PARAM_DEFAULT_DIGEST 175
-#define PIDX_PKEY_PARAM_DHKEM_IKM 176
-#define PIDX_PKEY_PARAM_DH_GENERATOR 177
-#define PIDX_PKEY_PARAM_DH_PRIV_LEN 178
+#define PIDX_PKEY_PARAM_DEFAULT_DIGEST 177
+#define PIDX_PKEY_PARAM_DHKEM_IKM 178
+#define PIDX_PKEY_PARAM_DH_GENERATOR 179
+#define PIDX_PKEY_PARAM_DH_PRIV_LEN 180
#define PIDX_PKEY_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST
-#define PIDX_PKEY_PARAM_DIGEST_SIZE 179
-#define PIDX_PKEY_PARAM_DIST_ID 180
-#define PIDX_PKEY_PARAM_EC_A 181
-#define PIDX_PKEY_PARAM_EC_B 182
-#define PIDX_PKEY_PARAM_EC_CHAR2_M 183
-#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K1 184
-#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K2 185
-#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K3 186
-#define PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS 187
-#define PIDX_PKEY_PARAM_EC_CHAR2_TYPE 188
-#define PIDX_PKEY_PARAM_EC_COFACTOR 189
-#define PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS 190
-#define PIDX_PKEY_PARAM_EC_ENCODING 191
-#define PIDX_PKEY_PARAM_EC_FIELD_TYPE 192
-#define PIDX_PKEY_PARAM_EC_GENERATOR 193
-#define PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE 194
-#define PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC 195
-#define PIDX_PKEY_PARAM_EC_ORDER 196
-#define PIDX_PKEY_PARAM_EC_P 137
-#define PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT 197
-#define PIDX_PKEY_PARAM_EC_PUB_X 198
-#define PIDX_PKEY_PARAM_EC_PUB_Y 199
-#define PIDX_PKEY_PARAM_EC_SEED 139
-#define PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY 200
+#define PIDX_PKEY_PARAM_DIGEST_SIZE 181
+#define PIDX_PKEY_PARAM_DIST_ID 182
+#define PIDX_PKEY_PARAM_EC_A 183
+#define PIDX_PKEY_PARAM_EC_B 184
+#define PIDX_PKEY_PARAM_EC_CHAR2_M 185
+#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K1 186
+#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K2 187
+#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K3 188
+#define PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS 189
+#define PIDX_PKEY_PARAM_EC_CHAR2_TYPE 190
+#define PIDX_PKEY_PARAM_EC_COFACTOR 191
+#define PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS 192
+#define PIDX_PKEY_PARAM_EC_ENCODING 193
+#define PIDX_PKEY_PARAM_EC_FIELD_TYPE 194
+#define PIDX_PKEY_PARAM_EC_GENERATOR 195
+#define PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE 196
+#define PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC 197
+#define PIDX_PKEY_PARAM_EC_ORDER 198
+#define PIDX_PKEY_PARAM_EC_P 138
+#define PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT 199
+#define PIDX_PKEY_PARAM_EC_PUB_X 200
+#define PIDX_PKEY_PARAM_EC_PUB_Y 201
+#define PIDX_PKEY_PARAM_EC_SEED 140
+#define PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY 202
#define PIDX_PKEY_PARAM_ENGINE PIDX_ALG_PARAM_ENGINE
-#define PIDX_PKEY_PARAM_FFC_COFACTOR 201
+#define PIDX_PKEY_PARAM_FFC_COFACTOR 203
#define PIDX_PKEY_PARAM_FFC_DIGEST PIDX_PKEY_PARAM_DIGEST
#define PIDX_PKEY_PARAM_FFC_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES
-#define PIDX_PKEY_PARAM_FFC_G 202
-#define PIDX_PKEY_PARAM_FFC_GINDEX 203
-#define PIDX_PKEY_PARAM_FFC_H 204
-#define PIDX_PKEY_PARAM_FFC_P 137
-#define PIDX_PKEY_PARAM_FFC_PBITS 205
-#define PIDX_PKEY_PARAM_FFC_PCOUNTER 206
-#define PIDX_PKEY_PARAM_FFC_Q 207
-#define PIDX_PKEY_PARAM_FFC_QBITS 208
-#define PIDX_PKEY_PARAM_FFC_SEED 139
-#define PIDX_PKEY_PARAM_FFC_TYPE 141
-#define PIDX_PKEY_PARAM_FFC_VALIDATE_G 209
-#define PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY 210
-#define PIDX_PKEY_PARAM_FFC_VALIDATE_PQ 211
+#define PIDX_PKEY_PARAM_FFC_G 204
+#define PIDX_PKEY_PARAM_FFC_GINDEX 205
+#define PIDX_PKEY_PARAM_FFC_H 206
+#define PIDX_PKEY_PARAM_FFC_P 138
+#define PIDX_PKEY_PARAM_FFC_PBITS 207
+#define PIDX_PKEY_PARAM_FFC_PCOUNTER 208
+#define PIDX_PKEY_PARAM_FFC_Q 209
+#define PIDX_PKEY_PARAM_FFC_QBITS 210
+#define PIDX_PKEY_PARAM_FFC_SEED 140
+#define PIDX_PKEY_PARAM_FFC_TYPE 142
+#define PIDX_PKEY_PARAM_FFC_VALIDATE_G 211
+#define PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY 212
+#define PIDX_PKEY_PARAM_FFC_VALIDATE_PQ 213
#define PIDX_PKEY_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
-#define PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK 212
-#define PIDX_PKEY_PARAM_FIPS_KEY_CHECK 213
-#define PIDX_PKEY_PARAM_FIPS_SIGN_CHECK 214
-#define PIDX_PKEY_PARAM_GROUP_NAME 215
+#define PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK 214
+#define PIDX_PKEY_PARAM_FIPS_KEY_CHECK 215
+#define PIDX_PKEY_PARAM_FIPS_SIGN_CHECK 216
+#define PIDX_PKEY_PARAM_GROUP_NAME 217
#define PIDX_PKEY_PARAM_IMPLICIT_REJECTION 8
-#define PIDX_PKEY_PARAM_MANDATORY_DIGEST 216
-#define PIDX_PKEY_PARAM_MASKGENFUNC 217
-#define PIDX_PKEY_PARAM_MAX_SIZE 218
-#define PIDX_PKEY_PARAM_MGF1_DIGEST 219
-#define PIDX_PKEY_PARAM_MGF1_PROPERTIES 220
-#define PIDX_PKEY_PARAM_PAD_MODE 221
-#define PIDX_PKEY_PARAM_PRIV_KEY 222
+#define PIDX_PKEY_PARAM_MANDATORY_DIGEST 218
+#define PIDX_PKEY_PARAM_MASKGENFUNC 219
+#define PIDX_PKEY_PARAM_MAX_SIZE 220
+#define PIDX_PKEY_PARAM_MGF1_DIGEST 221
+#define PIDX_PKEY_PARAM_MGF1_PROPERTIES 222
+#define PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS 223
+#define PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS 224
+#define PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED 225
+#define PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED 226
+#define PIDX_PKEY_PARAM_ML_DSA_SEED 140
+#define PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE 227
+#define PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS 228
+#define PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS 229
+#define PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED 230
+#define PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED 231
+#define PIDX_PKEY_PARAM_ML_KEM_SEED 140
+#define PIDX_PKEY_PARAM_PAD_MODE 232
+#define PIDX_PKEY_PARAM_PRIV_KEY 233
#define PIDX_PKEY_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES
-#define PIDX_PKEY_PARAM_PUB_KEY 223
+#define PIDX_PKEY_PARAM_PUB_KEY 234
#define PIDX_PKEY_PARAM_RSA_BITS PIDX_PKEY_PARAM_BITS
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT 224
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT1 225
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT2 226
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT3 227
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT4 228
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT5 229
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT6 230
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT7 231
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT8 232
-#define PIDX_PKEY_PARAM_RSA_COEFFICIENT9 233
-#define PIDX_PKEY_PARAM_RSA_D 234
-#define PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ 235
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT 235
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT1 236
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT2 237
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT3 238
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT4 239
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT5 240
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT6 241
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT7 242
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT8 243
+#define PIDX_PKEY_PARAM_RSA_COEFFICIENT9 244
+#define PIDX_PKEY_PARAM_RSA_D 245
+#define PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ 246
#define PIDX_PKEY_PARAM_RSA_DIGEST PIDX_PKEY_PARAM_DIGEST
#define PIDX_PKEY_PARAM_RSA_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES
-#define PIDX_PKEY_PARAM_RSA_E 236
-#define PIDX_PKEY_PARAM_RSA_EXPONENT 237
-#define PIDX_PKEY_PARAM_RSA_EXPONENT1 238
-#define PIDX_PKEY_PARAM_RSA_EXPONENT10 239
-#define PIDX_PKEY_PARAM_RSA_EXPONENT2 240
-#define PIDX_PKEY_PARAM_RSA_EXPONENT3 241
-#define PIDX_PKEY_PARAM_RSA_EXPONENT4 242
-#define PIDX_PKEY_PARAM_RSA_EXPONENT5 243
-#define PIDX_PKEY_PARAM_RSA_EXPONENT6 244
-#define PIDX_PKEY_PARAM_RSA_EXPONENT7 245
-#define PIDX_PKEY_PARAM_RSA_EXPONENT8 246
-#define PIDX_PKEY_PARAM_RSA_EXPONENT9 247
-#define PIDX_PKEY_PARAM_RSA_FACTOR 248
-#define PIDX_PKEY_PARAM_RSA_FACTOR1 249
-#define PIDX_PKEY_PARAM_RSA_FACTOR10 250
-#define PIDX_PKEY_PARAM_RSA_FACTOR2 251
-#define PIDX_PKEY_PARAM_RSA_FACTOR3 252
-#define PIDX_PKEY_PARAM_RSA_FACTOR4 253
-#define PIDX_PKEY_PARAM_RSA_FACTOR5 254
-#define PIDX_PKEY_PARAM_RSA_FACTOR6 255
-#define PIDX_PKEY_PARAM_RSA_FACTOR7 256
-#define PIDX_PKEY_PARAM_RSA_FACTOR8 257
-#define PIDX_PKEY_PARAM_RSA_FACTOR9 258
+#define PIDX_PKEY_PARAM_RSA_E 247
+#define PIDX_PKEY_PARAM_RSA_EXPONENT 248
+#define PIDX_PKEY_PARAM_RSA_EXPONENT1 249
+#define PIDX_PKEY_PARAM_RSA_EXPONENT10 250
+#define PIDX_PKEY_PARAM_RSA_EXPONENT2 251
+#define PIDX_PKEY_PARAM_RSA_EXPONENT3 252
+#define PIDX_PKEY_PARAM_RSA_EXPONENT4 253
+#define PIDX_PKEY_PARAM_RSA_EXPONENT5 254
+#define PIDX_PKEY_PARAM_RSA_EXPONENT6 255
+#define PIDX_PKEY_PARAM_RSA_EXPONENT7 256
+#define PIDX_PKEY_PARAM_RSA_EXPONENT8 257
+#define PIDX_PKEY_PARAM_RSA_EXPONENT9 258
+#define PIDX_PKEY_PARAM_RSA_FACTOR 259
+#define PIDX_PKEY_PARAM_RSA_FACTOR1 260
+#define PIDX_PKEY_PARAM_RSA_FACTOR10 261
+#define PIDX_PKEY_PARAM_RSA_FACTOR2 262
+#define PIDX_PKEY_PARAM_RSA_FACTOR3 263
+#define PIDX_PKEY_PARAM_RSA_FACTOR4 264
+#define PIDX_PKEY_PARAM_RSA_FACTOR5 265
+#define PIDX_PKEY_PARAM_RSA_FACTOR6 266
+#define PIDX_PKEY_PARAM_RSA_FACTOR7 267
+#define PIDX_PKEY_PARAM_RSA_FACTOR8 268
+#define PIDX_PKEY_PARAM_RSA_FACTOR9 269
#define PIDX_PKEY_PARAM_RSA_MASKGENFUNC PIDX_PKEY_PARAM_MASKGENFUNC
#define PIDX_PKEY_PARAM_RSA_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST
-#define PIDX_PKEY_PARAM_RSA_N 136
-#define PIDX_PKEY_PARAM_RSA_PRIMES 259
-#define PIDX_PKEY_PARAM_RSA_PSS_SALTLEN 260
-#define PIDX_PKEY_PARAM_RSA_TEST_P1 261
-#define PIDX_PKEY_PARAM_RSA_TEST_P2 262
-#define PIDX_PKEY_PARAM_RSA_TEST_Q1 263
-#define PIDX_PKEY_PARAM_RSA_TEST_Q2 264
-#define PIDX_PKEY_PARAM_RSA_TEST_XP 265
-#define PIDX_PKEY_PARAM_RSA_TEST_XP1 266
-#define PIDX_PKEY_PARAM_RSA_TEST_XP2 267
-#define PIDX_PKEY_PARAM_RSA_TEST_XQ 268
-#define PIDX_PKEY_PARAM_RSA_TEST_XQ1 269
-#define PIDX_PKEY_PARAM_RSA_TEST_XQ2 270
-#define PIDX_PKEY_PARAM_SECURITY_BITS 271
+#define PIDX_PKEY_PARAM_RSA_N 137
+#define PIDX_PKEY_PARAM_RSA_PRIMES 270
+#define PIDX_PKEY_PARAM_RSA_PSS_SALTLEN 271
+#define PIDX_PKEY_PARAM_RSA_TEST_P1 272
+#define PIDX_PKEY_PARAM_RSA_TEST_P2 273
+#define PIDX_PKEY_PARAM_RSA_TEST_Q1 274
+#define PIDX_PKEY_PARAM_RSA_TEST_Q2 275
+#define PIDX_PKEY_PARAM_RSA_TEST_XP 276
+#define PIDX_PKEY_PARAM_RSA_TEST_XP1 277
+#define PIDX_PKEY_PARAM_RSA_TEST_XP2 278
+#define PIDX_PKEY_PARAM_RSA_TEST_XQ 279
+#define PIDX_PKEY_PARAM_RSA_TEST_XQ1 280
+#define PIDX_PKEY_PARAM_RSA_TEST_XQ2 281
+#define PIDX_PKEY_PARAM_SECURITY_BITS 282
+#define PIDX_PKEY_PARAM_SLH_DSA_SEED 140
#define PIDX_PKEY_PARAM_USE_COFACTOR_ECDH PIDX_PKEY_PARAM_USE_COFACTOR_FLAG
-#define PIDX_PKEY_PARAM_USE_COFACTOR_FLAG 272
-#define PIDX_PROV_PARAM_BUILDINFO 273
-#define PIDX_PROV_PARAM_CORE_MODULE_FILENAME 274
-#define PIDX_PROV_PARAM_CORE_PROV_NAME 275
-#define PIDX_PROV_PARAM_CORE_VERSION 276
-#define PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST 277
-#define PIDX_PROV_PARAM_DSA_SIGN_DISABLED 278
-#define PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK 279
-#define PIDX_PROV_PARAM_HKDF_DIGEST_CHECK 280
-#define PIDX_PROV_PARAM_HKDF_KEY_CHECK 281
-#define PIDX_PROV_PARAM_HMAC_KEY_CHECK 282
-#define PIDX_PROV_PARAM_KBKDF_KEY_CHECK 283
-#define PIDX_PROV_PARAM_KMAC_KEY_CHECK 284
-#define PIDX_PROV_PARAM_NAME 285
-#define PIDX_PROV_PARAM_NO_SHORT_MAC 286
-#define PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK 287
-#define PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED 288
-#define PIDX_PROV_PARAM_RSA_PSS_SALTLEN_CHECK 289
-#define PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED 290
-#define PIDX_PROV_PARAM_SECURITY_CHECKS 291
-#define PIDX_PROV_PARAM_SELF_TEST_DESC 292
-#define PIDX_PROV_PARAM_SELF_TEST_PHASE 293
-#define PIDX_PROV_PARAM_SELF_TEST_TYPE 294
-#define PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK 295
-#define PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK 296
-#define PIDX_PROV_PARAM_SSHKDF_KEY_CHECK 297
-#define PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK 298
-#define PIDX_PROV_PARAM_SSKDF_KEY_CHECK 299
-#define PIDX_PROV_PARAM_STATUS 300
-#define PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED 301
-#define PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK 302
-#define PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK 303
-#define PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK 304
-#define PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK 305
-#define PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK 306
-#define PIDX_PROV_PARAM_VERSION 114
-#define PIDX_PROV_PARAM_X942KDF_KEY_CHECK 307
-#define PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK 308
-#define PIDX_PROV_PARAM_X963KDF_KEY_CHECK 309
+#define PIDX_PKEY_PARAM_USE_COFACTOR_FLAG 283
+#define PIDX_PROV_PARAM_BUILDINFO 284
+#define PIDX_PROV_PARAM_CORE_MODULE_FILENAME 285
+#define PIDX_PROV_PARAM_CORE_PROV_NAME 286
+#define PIDX_PROV_PARAM_CORE_VERSION 287
+#define PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST 288
+#define PIDX_PROV_PARAM_DSA_SIGN_DISABLED 289
+#define PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK 290
+#define PIDX_PROV_PARAM_HKDF_DIGEST_CHECK 291
+#define PIDX_PROV_PARAM_HKDF_KEY_CHECK 292
+#define PIDX_PROV_PARAM_HMAC_KEY_CHECK 293
+#define PIDX_PROV_PARAM_KBKDF_KEY_CHECK 294
+#define PIDX_PROV_PARAM_KMAC_KEY_CHECK 295
+#define PIDX_PROV_PARAM_NAME 296
+#define PIDX_PROV_PARAM_NO_SHORT_MAC 297
+#define PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK 298
+#define PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED 299
+#define PIDX_PROV_PARAM_RSA_PSS_SALTLEN_CHECK 300
+#define PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED 301
+#define PIDX_PROV_PARAM_SECURITY_CHECKS 302
+#define PIDX_PROV_PARAM_SELF_TEST_DESC 303
+#define PIDX_PROV_PARAM_SELF_TEST_PHASE 304
+#define PIDX_PROV_PARAM_SELF_TEST_TYPE 305
+#define PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK 306
+#define PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK 307
+#define PIDX_PROV_PARAM_SSHKDF_KEY_CHECK 308
+#define PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK 309
+#define PIDX_PROV_PARAM_SSKDF_KEY_CHECK 310
+#define PIDX_PROV_PARAM_STATUS 311
+#define PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED 312
+#define PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK 313
+#define PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK 314
+#define PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK 315
+#define PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK 316
+#define PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK 317
+#define PIDX_PROV_PARAM_VERSION 115
+#define PIDX_PROV_PARAM_X942KDF_KEY_CHECK 318
+#define PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK 319
+#define PIDX_PROV_PARAM_X963KDF_KEY_CHECK 320
#define PIDX_RAND_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
-#define PIDX_RAND_PARAM_GENERATE 310
-#define PIDX_RAND_PARAM_MAX_REQUEST 311
-#define PIDX_RAND_PARAM_STATE 312
-#define PIDX_RAND_PARAM_STRENGTH 313
-#define PIDX_RAND_PARAM_TEST_ENTROPY 314
-#define PIDX_RAND_PARAM_TEST_NONCE 315
+#define PIDX_RAND_PARAM_GENERATE 321
+#define PIDX_RAND_PARAM_MAX_REQUEST 322
+#define PIDX_RAND_PARAM_STATE 323
+#define PIDX_RAND_PARAM_STRENGTH 324
+#define PIDX_RAND_PARAM_TEST_ENTROPY 325
+#define PIDX_RAND_PARAM_TEST_NONCE 326
+#define PIDX_SIGNATURE_PARAM_ADD_RANDOM 327
#define PIDX_SIGNATURE_PARAM_ALGORITHM_ID PIDX_PKEY_PARAM_ALGORITHM_ID
#define PIDX_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS
-#define PIDX_SIGNATURE_PARAM_CONTEXT_STRING 316
+#define PIDX_SIGNATURE_PARAM_CONTEXT_STRING 328
+#define PIDX_SIGNATURE_PARAM_DETERMINISTIC 329
#define PIDX_SIGNATURE_PARAM_DIGEST PIDX_PKEY_PARAM_DIGEST
#define PIDX_SIGNATURE_PARAM_DIGEST_SIZE PIDX_PKEY_PARAM_DIGEST_SIZE
#define PIDX_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR
#define PIDX_SIGNATURE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK
#define PIDX_SIGNATURE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK
-#define PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK 289
+#define PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK 300
#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_CHECK PIDX_PKEY_PARAM_FIPS_SIGN_CHECK
-#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK 317
-#define PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE 318
-#define PIDX_SIGNATURE_PARAM_INSTANCE 319
-#define PIDX_SIGNATURE_PARAM_KAT 320
+#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK 330
+#define PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE 331
+#define PIDX_SIGNATURE_PARAM_INSTANCE 332
+#define PIDX_SIGNATURE_PARAM_KAT 333
+#define PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING 334
#define PIDX_SIGNATURE_PARAM_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST
#define PIDX_SIGNATURE_PARAM_MGF1_PROPERTIES PIDX_PKEY_PARAM_MGF1_PROPERTIES
-#define PIDX_SIGNATURE_PARAM_NONCE_TYPE 321
+#define PIDX_SIGNATURE_PARAM_MU 335
+#define PIDX_SIGNATURE_PARAM_NONCE_TYPE 336
#define PIDX_SIGNATURE_PARAM_PAD_MODE PIDX_PKEY_PARAM_PAD_MODE
#define PIDX_SIGNATURE_PARAM_PROPERTIES PIDX_PKEY_PARAM_PROPERTIES
-#define PIDX_SIGNATURE_PARAM_PSS_SALTLEN 260
-#define PIDX_SIGNATURE_PARAM_SIGNATURE 322
-#define PIDX_STORE_PARAM_ALIAS 323
+#define PIDX_SIGNATURE_PARAM_PSS_SALTLEN 271
+#define PIDX_SIGNATURE_PARAM_SIGNATURE 337
+#define PIDX_SIGNATURE_PARAM_TEST_ENTROPY 338
+#define PIDX_SKEY_PARAM_KEY_LENGTH 339
+#define PIDX_SKEY_PARAM_RAW_BYTES 340
+#define PIDX_STORE_PARAM_ALIAS 341
#define PIDX_STORE_PARAM_DIGEST 3
-#define PIDX_STORE_PARAM_EXPECT 324
-#define PIDX_STORE_PARAM_FINGERPRINT 325
-#define PIDX_STORE_PARAM_INPUT_TYPE 326
-#define PIDX_STORE_PARAM_ISSUER 285
+#define PIDX_STORE_PARAM_EXPECT 342
+#define PIDX_STORE_PARAM_FINGERPRINT 343
+#define PIDX_STORE_PARAM_INPUT_TYPE 174
+#define PIDX_STORE_PARAM_ISSUER 296
#define PIDX_STORE_PARAM_PROPERTIES 7
-#define PIDX_STORE_PARAM_SERIAL 327
-#define PIDX_STORE_PARAM_SUBJECT 328
+#define PIDX_STORE_PARAM_SERIAL 344
+#define PIDX_STORE_PARAM_SUBJECT 345
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h
index 2425fa1..d6c943a 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/asn1.h.in
*
- * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -53,14 +53,14 @@ extern "C" {
# define V_ASN1_PRIMITIVE_TAG 0x1f
# define V_ASN1_PRIMATIVE_TAG /*compat*/ V_ASN1_PRIMITIVE_TAG
-# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */
-# define V_ASN1_OTHER -3/* used in ASN1_TYPE */
-# define V_ASN1_ANY -4/* used in ASN1 template code */
+# define V_ASN1_APP_CHOOSE -2 /* let the recipient choose */
+# define V_ASN1_OTHER -3 /* used in ASN1_TYPE */
+# define V_ASN1_ANY -4 /* used in ASN1 template code */
# define V_ASN1_UNDEF -1
/* ASN.1 tag values */
# define V_ASN1_EOC 0
-# define V_ASN1_BOOLEAN 1 /**/
+# define V_ASN1_BOOLEAN 1
# define V_ASN1_INTEGER 2
# define V_ASN1_BIT_STRING 3
# define V_ASN1_OCTET_STRING 4
@@ -73,19 +73,19 @@ extern "C" {
# define V_ASN1_UTF8STRING 12
# define V_ASN1_SEQUENCE 16
# define V_ASN1_SET 17
-# define V_ASN1_NUMERICSTRING 18 /**/
+# define V_ASN1_NUMERICSTRING 18
# define V_ASN1_PRINTABLESTRING 19
# define V_ASN1_T61STRING 20
-# define V_ASN1_TELETEXSTRING 20/* alias */
-# define V_ASN1_VIDEOTEXSTRING 21 /**/
+# define V_ASN1_TELETEXSTRING 20 /* alias */
+# define V_ASN1_VIDEOTEXSTRING 21
# define V_ASN1_IA5STRING 22
# define V_ASN1_UTCTIME 23
-# define V_ASN1_GENERALIZEDTIME 24 /**/
-# define V_ASN1_GRAPHICSTRING 25 /**/
-# define V_ASN1_ISO64STRING 26 /**/
-# define V_ASN1_VISIBLESTRING 26/* alias */
-# define V_ASN1_GENERALSTRING 27 /**/
-# define V_ASN1_UNIVERSALSTRING 28 /**/
+# define V_ASN1_GENERALIZEDTIME 24
+# define V_ASN1_GRAPHICSTRING 25
+# define V_ASN1_ISO64STRING 26
+# define V_ASN1_VISIBLESTRING 26 /* alias */
+# define V_ASN1_GENERALSTRING 27
+# define V_ASN1_UNIVERSALSTRING 28
# define V_ASN1_BMPSTRING 30
/*
@@ -278,7 +278,7 @@ typedef struct ASN1_TLC_st ASN1_TLC;
/* This is just an opaque pointer */
typedef struct ASN1_VALUE_st ASN1_VALUE;
-/* Declare ASN1 functions: the implement macro in in asn1t.h */
+/* Declare ASN1 functions: the implement macro is in asn1t.h */
/*
* The mysterious 'extern' that's passed to some macros is innocuous,
@@ -371,6 +371,7 @@ typedef struct ASN1_VALUE_st ASN1_VALUE;
typedef void *d2i_of_void(void **, const unsigned char **, long);
typedef int i2d_of_void(const void *, unsigned char **);
+typedef int OSSL_i2d_of_void_ctx(const void *, unsigned char **, void *vctx);
/*-
* The following macros and typedefs allow an ASN1_ITEM
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h
index 89ed6c0..8a1f9f0 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/bio.h.in
*
- * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -193,6 +193,7 @@ extern "C" {
# define BIO_CTRL_GET_RPOLL_DESCRIPTOR 91
# define BIO_CTRL_GET_WPOLL_DESCRIPTOR 92
# define BIO_CTRL_DGRAM_DETECT_PEER_ADDR 93
+# define BIO_CTRL_DGRAM_SET0_LOCAL_ADDR 94
# define BIO_DGRAM_CAP_NONE 0U
# define BIO_DGRAM_CAP_HANDLES_SRC_ADDR (1U << 0)
@@ -693,6 +694,8 @@ int BIO_ctrl_reset_read_request(BIO *b);
(unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU, 0, NULL)
# define BIO_dgram_set_mtu(b, mtu) \
(int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_MTU, (mtu), NULL)
+# define BIO_dgram_set0_local_addr(b, addr) \
+ (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET0_LOCAL_ADDR, 0, (addr))
/* ctrl macros for BIO_f_prefix */
# define BIO_set_prefix(b,p) BIO_ctrl((b), BIO_CTRL_SET_PREFIX, 0, (void *)(p))
@@ -965,9 +968,6 @@ ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 0)));
BIO_METHOD *BIO_meth_new(int type, const char *name);
void BIO_meth_free(BIO_METHOD *biom);
-int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *, int);
-int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *, size_t,
- size_t *);
int BIO_meth_set_write(BIO_METHOD *biom,
int (*write) (BIO *, const char *, int));
int BIO_meth_set_write_ex(BIO_METHOD *biom,
@@ -975,11 +975,6 @@ int BIO_meth_set_write_ex(BIO_METHOD *biom,
int BIO_meth_set_sendmmsg(BIO_METHOD *biom,
int (*f) (BIO *, BIO_MSG *, size_t, size_t,
uint64_t, size_t *));
-int (*BIO_meth_get_sendmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *,
- size_t, size_t,
- uint64_t, size_t *);
-int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int);
-int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *, size_t, size_t *);
int BIO_meth_set_read(BIO_METHOD *biom,
int (*read) (BIO *, char *, int));
int BIO_meth_set_read_ex(BIO_METHOD *biom,
@@ -987,28 +982,40 @@ int BIO_meth_set_read_ex(BIO_METHOD *biom,
int BIO_meth_set_recvmmsg(BIO_METHOD *biom,
int (*f) (BIO *, BIO_MSG *, size_t, size_t,
uint64_t, size_t *));
-int (*BIO_meth_get_recvmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *,
- size_t, size_t,
- uint64_t, size_t *);
-int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *);
int BIO_meth_set_puts(BIO_METHOD *biom,
int (*puts) (BIO *, const char *));
-int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int);
int BIO_meth_set_gets(BIO_METHOD *biom,
int (*ossl_gets) (BIO *, char *, int));
-long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int, long, void *);
int BIO_meth_set_ctrl(BIO_METHOD *biom,
long (*ctrl) (BIO *, int, long, void *));
-int (*BIO_meth_get_create(const BIO_METHOD *bion)) (BIO *);
int BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *));
-int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *);
int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *));
-long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom))
- (BIO *, int, BIO_info_cb *);
int BIO_meth_set_callback_ctrl(BIO_METHOD *biom,
long (*callback_ctrl) (BIO *, int,
BIO_info_cb *));
-
+# ifndef OPENSSL_NO_DEPRECATED_3_5
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *,
+ int);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *,
+ size_t, size_t *);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_sendmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *,
+ size_t, size_t,
+ uint64_t, size_t *);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *,
+ size_t, size_t *);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_recvmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *,
+ size_t, size_t,
+ uint64_t, size_t *);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int);
+OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int,
+ long, void *);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_create(const BIO_METHOD *bion)) (BIO *);
+OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *);
+OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom)) (BIO *, int,
+ BIO_info_cb *);
+# endif
# ifdef __cplusplus
}
# endif
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h
index 0f21a51..6713419 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/cms.h.in
*
- * Copyright 2008-2022 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2008-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -155,6 +155,8 @@ DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo)
DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest)
DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo)
+DECLARE_ASN1_DUP_FUNCTION(CMS_EnvelopedData)
+
CMS_ContentInfo *CMS_ContentInfo_new_ex(OSSL_LIB_CTX *libctx, const char *propq);
# define CMS_SIGNERINFO_ISSUER_SERIAL 0
@@ -194,6 +196,7 @@ CMS_ContentInfo *CMS_ContentInfo_new_ex(OSSL_LIB_CTX *libctx, const char *propq)
# define CMS_ASCIICRLF 0x80000
# define CMS_CADES 0x100000
# define CMS_USE_ORIGINATOR_KEYID 0x200000
+# define CMS_NO_SIGNING_TIME 0x400000
const ASN1_OBJECT *CMS_get0_type(const CMS_ContentInfo *cms);
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h
index a292da4..f401172 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h
@@ -166,6 +166,9 @@ extern "C" {
# ifndef OPENSSL_NO_FILENAMES
# define OPENSSL_NO_FILENAMES
# endif
+# ifndef OPENSSL_NO_FIPS_JITTER
+# define OPENSSL_NO_FIPS_JITTER
+# endif
# ifndef OPENSSL_NO_FIPS_POST
# define OPENSSL_NO_FIPS_POST
# endif
@@ -184,6 +187,9 @@ extern "C" {
# ifndef OPENSSL_NO_H3DEMO
# define OPENSSL_NO_H3DEMO
# endif
+# ifndef OPENSSL_NO_HQINTEROP
+# define OPENSSL_NO_HQINTEROP
+# endif
# ifndef OPENSSL_NO_IDEA
# define OPENSSL_NO_IDEA
# endif
@@ -205,6 +211,12 @@ extern "C" {
# ifndef OPENSSL_NO_MDC2
# define OPENSSL_NO_MDC2
# endif
+# ifndef OPENSSL_NO_ML_DSA
+# define OPENSSL_NO_ML_DSA
+# endif
+# ifndef OPENSSL_NO_ML_KEM
+# define OPENSSL_NO_ML_KEM
+# endif
# ifndef OPENSSL_NO_MSAN
# define OPENSSL_NO_MSAN
# endif
@@ -271,6 +283,9 @@ extern "C" {
# ifndef OPENSSL_NO_SIV
# define OPENSSL_NO_SIV
# endif
+# ifndef OPENSSL_NO_SLH_DSA
+# define OPENSSL_NO_SLH_DSA
+# endif
# ifndef OPENSSL_NO_SM2
# define OPENSSL_NO_SM2
# endif
@@ -295,6 +310,9 @@ extern "C" {
# ifndef OPENSSL_NO_SSL3_METHOD
# define OPENSSL_NO_SSL3_METHOD
# endif
+# ifndef OPENSSL_NO_SSLKEYLOG
+# define OPENSSL_NO_SSLKEYLOG
+# endif
# ifndef OPENSSL_NO_STDIO
# define OPENSSL_NO_STDIO
# endif
@@ -307,6 +325,9 @@ extern "C" {
# ifndef OPENSSL_NO_THREAD_POOL
# define OPENSSL_NO_THREAD_POOL
# endif
+# ifndef OPENSSL_NO_TLS_DEPRECATED_EC
+# define OPENSSL_NO_TLS_DEPRECATED_EC
+# endif
# ifndef OPENSSL_NO_TLS1_3
# define OPENSSL_NO_TLS1_3
# endif
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h
index 14bb6dc..c098fb7 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h
@@ -178,6 +178,9 @@ extern "C" {
# ifndef OPENSSL_NO_FILENAMES
# define OPENSSL_NO_FILENAMES
# endif
+# ifndef OPENSSL_NO_FIPS_JITTER
+# define OPENSSL_NO_FIPS_JITTER
+# endif
# ifndef OPENSSL_NO_FIPS_POST
# define OPENSSL_NO_FIPS_POST
# endif
@@ -196,6 +199,9 @@ extern "C" {
# ifndef OPENSSL_NO_H3DEMO
# define OPENSSL_NO_H3DEMO
# endif
+# ifndef OPENSSL_NO_HQINTEROP
+# define OPENSSL_NO_HQINTEROP
+# endif
# ifndef OPENSSL_NO_IDEA
# define OPENSSL_NO_IDEA
# endif
@@ -217,6 +223,12 @@ extern "C" {
# ifndef OPENSSL_NO_MDC2
# define OPENSSL_NO_MDC2
# endif
+# ifndef OPENSSL_NO_ML_DSA
+# define OPENSSL_NO_ML_DSA
+# endif
+# ifndef OPENSSL_NO_ML_KEM
+# define OPENSSL_NO_ML_KEM
+# endif
# ifndef OPENSSL_NO_MSAN
# define OPENSSL_NO_MSAN
# endif
@@ -283,6 +295,9 @@ extern "C" {
# ifndef OPENSSL_NO_SIV
# define OPENSSL_NO_SIV
# endif
+# ifndef OPENSSL_NO_SLH_DSA
+# define OPENSSL_NO_SLH_DSA
+# endif
# ifndef OPENSSL_NO_SM2
# define OPENSSL_NO_SM2
# endif
@@ -307,6 +322,9 @@ extern "C" {
# ifndef OPENSSL_NO_SSL3_METHOD
# define OPENSSL_NO_SSL3_METHOD
# endif
+# ifndef OPENSSL_NO_SSLKEYLOG
+# define OPENSSL_NO_SSLKEYLOG
+# endif
# ifndef OPENSSL_NO_STDIO
# define OPENSSL_NO_STDIO
# endif
@@ -319,6 +337,9 @@ extern "C" {
# ifndef OPENSSL_NO_THREAD_POOL
# define OPENSSL_NO_THREAD_POOL
# endif
+# ifndef OPENSSL_NO_TLS_DEPRECATED_EC
+# define OPENSSL_NO_TLS_DEPRECATED_EC
+# endif
# ifndef OPENSSL_NO_TLS1_3
# define OPENSSL_NO_TLS1_3
# endif
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h
index 072a6b8..3ed5246 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/core_names.h.in
*
- * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -104,10 +104,17 @@ extern "C" {
# define OSSL_PKEY_EC_GROUP_CHECK_NAMED "named"
# define OSSL_PKEY_EC_GROUP_CHECK_NAMED_NIST "named-nist"
+/* PROV_SKEY well known key types */
+# define OSSL_SKEY_TYPE_GENERIC "GENERIC-SECRET"
+# define OSSL_SKEY_TYPE_AES "AES"
+
/* OSSL_KEM_PARAM_OPERATION values */
#define OSSL_KEM_PARAM_OPERATION_RSASVE "RSASVE"
#define OSSL_KEM_PARAM_OPERATION_DHKEM "DHKEM"
+/* Provider configuration variables */
+#define OSSL_PKEY_RETAIN_SEED "pkey_retain_seed"
+
/* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */
# define OSSL_ALG_PARAM_ALGORITHM_ID "algorithm-id"
# define OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS "algorithm-id-params"
@@ -148,7 +155,9 @@ extern "C" {
# define OSSL_CAPABILITY_TLS_SIGALG_IANA_NAME "tls-sigalg-iana-name"
# define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE "tls-sigalg-keytype"
# define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE_OID "tls-sigalg-keytype-oid"
+# define OSSL_CAPABILITY_TLS_SIGALG_MAX_DTLS "tls-max-dtls"
# define OSSL_CAPABILITY_TLS_SIGALG_MAX_TLS "tls-max-tls"
+# define OSSL_CAPABILITY_TLS_SIGALG_MIN_DTLS "tls-min-dtls"
# define OSSL_CAPABILITY_TLS_SIGALG_MIN_TLS "tls-min-tls"
# define OSSL_CAPABILITY_TLS_SIGALG_NAME "tls-sigalg-name"
# define OSSL_CAPABILITY_TLS_SIGALG_OID "tls-sigalg-oid"
@@ -183,6 +192,7 @@ extern "C" {
# define OSSL_CIPHER_PARAM_MODE "mode"
# define OSSL_CIPHER_PARAM_NUM "num"
# define OSSL_CIPHER_PARAM_PADDING "padding"
+# define OSSL_CIPHER_PARAM_PIPELINE_AEAD_TAG "pipeline-tag"
# define OSSL_CIPHER_PARAM_RANDOM_KEY "randkey"
# define OSSL_CIPHER_PARAM_RC2_KEYBITS "keybits"
# define OSSL_CIPHER_PARAM_ROUNDS "rounds"
@@ -338,6 +348,7 @@ extern "C" {
# define OSSL_OBJECT_PARAM_DATA_STRUCTURE "data-structure"
# define OSSL_OBJECT_PARAM_DATA_TYPE "data-type"
# define OSSL_OBJECT_PARAM_DESC "desc"
+# define OSSL_OBJECT_PARAM_INPUT_TYPE "input-type"
# define OSSL_OBJECT_PARAM_REFERENCE "reference"
# define OSSL_OBJECT_PARAM_TYPE "type"
# define OSSL_PASSPHRASE_PARAM_INFO "info"
@@ -402,6 +413,17 @@ extern "C" {
# define OSSL_PKEY_PARAM_MAX_SIZE "max-size"
# define OSSL_PKEY_PARAM_MGF1_DIGEST "mgf1-digest"
# define OSSL_PKEY_PARAM_MGF1_PROPERTIES "mgf1-properties"
+# define OSSL_PKEY_PARAM_ML_DSA_INPUT_FORMATS "ml-dsa.input_formats"
+# define OSSL_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS "ml-dsa.output_formats"
+# define OSSL_PKEY_PARAM_ML_DSA_PREFER_SEED "ml-dsa.prefer_seed"
+# define OSSL_PKEY_PARAM_ML_DSA_RETAIN_SEED "ml-dsa.retain_seed"
+# define OSSL_PKEY_PARAM_ML_DSA_SEED "seed"
+# define OSSL_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE "ml-kem.import_pct_type"
+# define OSSL_PKEY_PARAM_ML_KEM_INPUT_FORMATS "ml-kem.input_formats"
+# define OSSL_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS "ml-kem.output_formats"
+# define OSSL_PKEY_PARAM_ML_KEM_PREFER_SEED "ml-kem.prefer_seed"
+# define OSSL_PKEY_PARAM_ML_KEM_RETAIN_SEED "ml-kem.retain_seed"
+# define OSSL_PKEY_PARAM_ML_KEM_SEED "seed"
# define OSSL_PKEY_PARAM_PAD_MODE "pad-mode"
# define OSSL_PKEY_PARAM_PRIV_KEY "priv"
# define OSSL_PKEY_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES
@@ -460,6 +482,7 @@ extern "C" {
# define OSSL_PKEY_PARAM_RSA_TEST_XQ1 "xq1"
# define OSSL_PKEY_PARAM_RSA_TEST_XQ2 "xq2"
# define OSSL_PKEY_PARAM_SECURITY_BITS "security-bits"
+# define OSSL_PKEY_PARAM_SLH_DSA_SEED "seed"
# define OSSL_PKEY_PARAM_USE_COFACTOR_ECDH OSSL_PKEY_PARAM_USE_COFACTOR_FLAG
# define OSSL_PKEY_PARAM_USE_COFACTOR_FLAG "use-cofactor-flag"
# define OSSL_PROV_PARAM_BUILDINFO "buildinfo"
@@ -507,9 +530,11 @@ extern "C" {
# define OSSL_RAND_PARAM_STRENGTH "strength"
# define OSSL_RAND_PARAM_TEST_ENTROPY "test_entropy"
# define OSSL_RAND_PARAM_TEST_NONCE "test_nonce"
+# define OSSL_SIGNATURE_PARAM_ADD_RANDOM "additional-random"
# define OSSL_SIGNATURE_PARAM_ALGORITHM_ID OSSL_PKEY_PARAM_ALGORITHM_ID
# define OSSL_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS OSSL_PKEY_PARAM_ALGORITHM_ID_PARAMS
# define OSSL_SIGNATURE_PARAM_CONTEXT_STRING "context-string"
+# define OSSL_SIGNATURE_PARAM_DETERMINISTIC "deterministic"
# define OSSL_SIGNATURE_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST
# define OSSL_SIGNATURE_PARAM_DIGEST_SIZE OSSL_PKEY_PARAM_DIGEST_SIZE
# define OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR
@@ -521,13 +546,18 @@ extern "C" {
# define OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE "verify-message"
# define OSSL_SIGNATURE_PARAM_INSTANCE "instance"
# define OSSL_SIGNATURE_PARAM_KAT "kat"
+# define OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING "message-encoding"
# define OSSL_SIGNATURE_PARAM_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST
# define OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES OSSL_PKEY_PARAM_MGF1_PROPERTIES
+# define OSSL_SIGNATURE_PARAM_MU "mu"
# define OSSL_SIGNATURE_PARAM_NONCE_TYPE "nonce-type"
# define OSSL_SIGNATURE_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE
# define OSSL_SIGNATURE_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES
# define OSSL_SIGNATURE_PARAM_PSS_SALTLEN "saltlen"
# define OSSL_SIGNATURE_PARAM_SIGNATURE "signature"
+# define OSSL_SIGNATURE_PARAM_TEST_ENTROPY "test-entropy"
+# define OSSL_SKEY_PARAM_KEY_LENGTH "key-length"
+# define OSSL_SKEY_PARAM_RAW_BYTES "raw-bytes"
# define OSSL_STORE_PARAM_ALIAS "alias"
# define OSSL_STORE_PARAM_DIGEST "digest"
# define OSSL_STORE_PARAM_EXPECT "expect"
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h
index 9900edf..551394d 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/crmf.h.in
*
- * Copyright 2007-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2007-2025 The OpenSSL Project Authors. All Rights Reserved.
* Copyright Nokia 2007-2019
* Copyright Siemens AG 2015-2019
*
@@ -26,6 +26,7 @@
# include <openssl/safestack.h>
# include <openssl/crmferr.h>
# include <openssl/x509v3.h> /* for GENERAL_NAME etc. */
+# include <openssl/cms.h>
/* explicit #includes not strictly needed since implied by the above: */
# include <openssl/types.h>
@@ -44,8 +45,11 @@ extern "C" {
# define OSSL_CRMF_SUBSEQUENTMESSAGE_ENCRCERT 0
# define OSSL_CRMF_SUBSEQUENTMESSAGE_CHALLENGERESP 1
typedef struct ossl_crmf_encryptedvalue_st OSSL_CRMF_ENCRYPTEDVALUE;
-
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDVALUE)
+
+typedef struct ossl_crmf_encryptedkey_st OSSL_CRMF_ENCRYPTEDKEY;
+DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDKEY)
+
typedef struct ossl_crmf_msg_st OSSL_CRMF_MSG;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSG)
DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_MSG)
@@ -248,10 +252,24 @@ int OSSL_CRMF_CERTTEMPLATE_fill(OSSL_CRMF_CERTTEMPLATE *tmpl,
const X509_NAME *subject,
const X509_NAME *issuer,
const ASN1_INTEGER *serial);
-X509
-*OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert,
- OSSL_LIB_CTX *libctx, const char *propq,
- EVP_PKEY *pkey);
+X509 *OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert,
+ OSSL_LIB_CTX *libctx, const char *propq,
+ EVP_PKEY *pkey);
+X509 *OSSL_CRMF_ENCRYPTEDKEY_get1_encCert(const OSSL_CRMF_ENCRYPTEDKEY *ecert,
+ OSSL_LIB_CTX *libctx, const char *propq,
+ EVP_PKEY *pkey, unsigned int flags);
+unsigned char
+*OSSL_CRMF_ENCRYPTEDVALUE_decrypt(const OSSL_CRMF_ENCRYPTEDVALUE *enc,
+ OSSL_LIB_CTX *libctx, const char *propq,
+ EVP_PKEY *pkey, int *outlen);
+EVP_PKEY *OSSL_CRMF_ENCRYPTEDKEY_get1_pkey(const OSSL_CRMF_ENCRYPTEDKEY *encryptedKey,
+ X509_STORE *ts, STACK_OF(X509) *extra, EVP_PKEY *pkey,
+ X509 *cert, ASN1_OCTET_STRING *secret,
+ OSSL_LIB_CTX *libctx, const char *propq);
+int OSSL_CRMF_MSG_centralkeygen_requested(const OSSL_CRMF_MSG *crm, const X509_REQ *p10cr);
+# ifndef OPENSSL_NO_CMS
+OSSL_CRMF_ENCRYPTEDKEY *OSSL_CRMF_ENCRYPTEDKEY_init_envdata(CMS_EnvelopedData *envdata);
+# endif
# ifdef __cplusplus
}
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h
index ae7e30a..bba69ec 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h
@@ -391,6 +391,9 @@ void OPENSSL_cleanse(void *ptr, size_t len);
# define CRYPTO_MEM_CHECK_ENABLE 0x2 /* Control and mode bit */
# define CRYPTO_MEM_CHECK_DISABLE 0x3 /* Control only */
+/* max allowed length for value of OPENSSL_MALLOC_FAILURES env var. */
+# define CRYPTO_MEM_CHECK_MAX_FS 256
+
void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount);
# ifndef OPENSSL_NO_DEPRECATED_3_0
# define OPENSSL_mem_debug_push(info) \
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h
index cf4bdbc..a19c625 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h
@@ -28,7 +28,7 @@ extern "C" {
* These macros express version number MAJOR.MINOR.PATCH exactly
*/
# define OPENSSL_VERSION_MAJOR 3
-# define OPENSSL_VERSION_MINOR 4
+# define OPENSSL_VERSION_MINOR 5
# define OPENSSL_VERSION_PATCH 1
/*
@@ -74,21 +74,21 @@ extern "C" {
* longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
* OPENSSL_VERSION_BUILD_METADATA_STR appended.
*/
-# define OPENSSL_VERSION_STR "3.4.1"
-# define OPENSSL_FULL_VERSION_STR "3.4.1"
+# define OPENSSL_VERSION_STR "3.5.1"
+# define OPENSSL_FULL_VERSION_STR "3.5.1"
/*
* SECTION 3: ADDITIONAL METADATA
*
* These strings are defined separately to allow them to be parsable.
*/
-# define OPENSSL_RELEASE_DATE "11 Feb 2025"
+# define OPENSSL_RELEASE_DATE "1 Jul 2025"
/*
* SECTION 4: BACKWARD COMPATIBILITY
*/
-# define OPENSSL_VERSION_TEXT "OpenSSL 3.4.1 11 Feb 2025"
+# define OPENSSL_VERSION_TEXT "OpenSSL 3.5.1 1 Jul 2025"
/* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
# ifdef OPENSSL_VERSION_PRE_RELEASE
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h
index 9741f3a..273b8c3 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/ssl.h.in
*
- * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
* Copyright 2005 Nokia. All rights reserved.
*
@@ -409,7 +409,7 @@ typedef int (*SSL_async_callback_fn)(SSL *s, void *arg);
*/
# define SSL_OP_CIPHER_SERVER_PREFERENCE SSL_OP_BIT(22)
/*
- * If set, a server will allow a client to issue a SSLv3.0 version
+ * If set, a server will allow a client to issue an SSLv3.0 version
* number as latest version supported in the premaster secret, even when
* TLSv1.0 (version 3.1) was announced in the client hello. Normally
* this is forbidden to prevent version rollback attacks.
@@ -1383,6 +1383,9 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
# define SSL_CTRL_SET_RETRY_VERIFY 136
# define SSL_CTRL_GET_VERIFY_CERT_STORE 137
# define SSL_CTRL_GET_CHAIN_CERT_STORE 138
+# define SSL_CTRL_GET0_IMPLEMENTED_GROUPS 139
+# define SSL_CTRL_GET_SIGNATURE_NAME 140
+# define SSL_CTRL_GET_PEER_SIGNATURE_NAME 141
# define SSL_CERT_SET_FIRST 1
# define SSL_CERT_SET_NEXT 2
# define SSL_CERT_SET_SERVER 3
@@ -1491,6 +1494,9 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist))
# define SSL_CTX_set1_groups_list(ctx, s) \
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s))
+# define SSL_CTX_get0_implemented_groups(ctx, all, out) \
+ SSL_CTX_ctrl(ctx,SSL_CTRL_GET0_IMPLEMENTED_GROUPS, all, \
+ (STACK_OF(OPENSSL_CSTRING) *)(out))
# define SSL_set1_groups(s, glist, glistlen) \
SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist))
# define SSL_set1_groups_list(s, str) \
@@ -1522,8 +1528,12 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
(char *)(clist))
# define SSL_set1_client_certificate_types(s, clist, clistlen) \
SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist))
+# define SSL_get0_signature_name(s, str) \
+ SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NAME,0,(1?(str):(const char **)NULL))
# define SSL_get_signature_nid(s, pn) \
SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn)
+# define SSL_get0_peer_signature_name(s, str) \
+ SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NAME,0,(1?(str):(const char **)NULL))
# define SSL_get_peer_signature_nid(s, pn) \
SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn)
# define SSL_get_peer_tmp_key(s, pk) \
@@ -1868,8 +1878,8 @@ __owur int SSL_set_purpose(SSL *ssl, int purpose);
__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust);
__owur int SSL_set_trust(SSL *ssl, int trust);
-__owur int SSL_set1_host(SSL *s, const char *hostname);
-__owur int SSL_add1_host(SSL *s, const char *hostname);
+__owur int SSL_set1_host(SSL *s, const char *host);
+__owur int SSL_add1_host(SSL *s, const char *host);
__owur const char *SSL_get0_peername(SSL *s);
void SSL_set_hostflags(SSL *s, unsigned int flags);
@@ -1944,6 +1954,11 @@ OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s);
typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg);
void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb,
void *arg);
+typedef int (*SSL_new_pending_conn_cb_fn) (SSL_CTX *ctx, SSL *new_ssl,
+ void *arg);
+void SSL_CTX_set_new_pending_conn_cb(SSL_CTX *c, SSL_new_pending_conn_cb_fn cb,
+ void *arg);
+
int SSL_client_hello_isv2(SSL *s);
unsigned int SSL_client_hello_get0_legacy_version(SSL *s);
size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out);
@@ -2339,6 +2354,31 @@ __owur int SSL_set1_initial_peer_addr(SSL *s, const BIO_ADDR *peer_addr);
__owur SSL *SSL_get0_connection(SSL *s);
__owur int SSL_is_connection(SSL *s);
+__owur int SSL_is_listener(SSL *ssl);
+__owur SSL *SSL_get0_listener(SSL *s);
+#define SSL_LISTENER_FLAG_NO_VALIDATE (1UL << 1)
+__owur SSL *SSL_new_listener(SSL_CTX *ctx, uint64_t flags);
+__owur SSL *SSL_new_listener_from(SSL *ssl, uint64_t flags);
+__owur SSL *SSL_new_from_listener(SSL *ssl, uint64_t flags);
+#define SSL_ACCEPT_CONNECTION_NO_BLOCK (1UL << 0)
+__owur SSL *SSL_accept_connection(SSL *ssl, uint64_t flags);
+__owur size_t SSL_get_accept_connection_queue_len(SSL *ssl);
+__owur int SSL_listen(SSL *ssl);
+
+__owur int SSL_is_domain(SSL *s);
+__owur SSL *SSL_get0_domain(SSL *s);
+__owur SSL *SSL_new_domain(SSL_CTX *ctx, uint64_t flags);
+
+#define SSL_DOMAIN_FLAG_SINGLE_THREAD (1U << 0)
+#define SSL_DOMAIN_FLAG_MULTI_THREAD (1U << 1)
+#define SSL_DOMAIN_FLAG_THREAD_ASSISTED (1U << 2)
+#define SSL_DOMAIN_FLAG_BLOCKING (1U << 3)
+#define SSL_DOMAIN_FLAG_LEGACY_BLOCKING (1U << 4)
+
+__owur int SSL_CTX_set_domain_flags(SSL_CTX *ctx, uint64_t domain_flags);
+__owur int SSL_CTX_get_domain_flags(const SSL_CTX *ctx, uint64_t *domain_flags);
+__owur int SSL_get_domain_flags(const SSL *ssl, uint64_t *domain_flags);
+
#define SSL_STREAM_TYPE_NONE 0
#define SSL_STREAM_TYPE_READ (1U << 0)
#define SSL_STREAM_TYPE_WRITE (1U << 1)
@@ -2872,6 +2912,21 @@ __owur int SSL_get0_server_cert_type(const SSL *s, unsigned char **t, size_t *le
__owur int SSL_CTX_get0_client_cert_type(const SSL_CTX *ctx, unsigned char **t, size_t *len);
__owur int SSL_CTX_get0_server_cert_type(const SSL_CTX *s, unsigned char **t, size_t *len);
+/*
+ * Protection level. For <= TLSv1.2 only "NONE" and "APPLICATION" are used.
+ */
+# define OSSL_RECORD_PROTECTION_LEVEL_NONE 0
+# define OSSL_RECORD_PROTECTION_LEVEL_EARLY 1
+# define OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE 2
+# define OSSL_RECORD_PROTECTION_LEVEL_APPLICATION 3
+
+int SSL_set_quic_tls_cbs(SSL *s, const OSSL_DISPATCH *qtdis, void *arg);
+int SSL_set_quic_tls_transport_params(SSL *s,
+ const unsigned char *params,
+ size_t params_len);
+
+int SSL_set_quic_tls_early_data_enabled(SSL *s, int enabled);
+
# ifdef __cplusplus
}
# endif
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h
index 86babde..4eaac6f 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h
@@ -260,4 +260,35 @@ DECLARE_ASN1_FUNCTIONS(OSSL_TARGET)
DECLARE_ASN1_FUNCTIONS(OSSL_TARGETS)
DECLARE_ASN1_FUNCTIONS(OSSL_TARGETING_INFORMATION)
+typedef STACK_OF(OSSL_ISSUER_SERIAL) OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX;
+DECLARE_ASN1_FUNCTIONS(OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX)
+
+SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL)
+#define sk_OSSL_ISSUER_SERIAL_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk))
+#define sk_OSSL_ISSUER_SERIAL_value(sk, idx) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_value(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), (idx)))
+#define sk_OSSL_ISSUER_SERIAL_new(cmp) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp)))
+#define sk_OSSL_ISSUER_SERIAL_new_null() ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_null())
+#define sk_OSSL_ISSUER_SERIAL_new_reserve(cmp, n) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp), (n)))
+#define sk_OSSL_ISSUER_SERIAL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (n))
+#define sk_OSSL_ISSUER_SERIAL_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))
+#define sk_OSSL_ISSUER_SERIAL_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))
+#define sk_OSSL_ISSUER_SERIAL_delete(sk, i) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (i)))
+#define sk_OSSL_ISSUER_SERIAL_delete_ptr(sk, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)))
+#define sk_OSSL_ISSUER_SERIAL_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))
+#define sk_OSSL_ISSUER_SERIAL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))
+#define sk_OSSL_ISSUER_SERIAL_pop(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_pop(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)))
+#define sk_OSSL_ISSUER_SERIAL_shift(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_shift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)))
+#define sk_OSSL_ISSUER_SERIAL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk),ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc))
+#define sk_OSSL_ISSUER_SERIAL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), (idx))
+#define sk_OSSL_ISSUER_SERIAL_set(sk, idx, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_set(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (idx), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)))
+#define sk_OSSL_ISSUER_SERIAL_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))
+#define sk_OSSL_ISSUER_SERIAL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))
+#define sk_OSSL_ISSUER_SERIAL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), pnum)
+#define sk_OSSL_ISSUER_SERIAL_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))
+#define sk_OSSL_ISSUER_SERIAL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk))
+#define sk_OSSL_ISSUER_SERIAL_dup(sk) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk)))
+#define sk_OSSL_ISSUER_SERIAL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_copyfunc_type(copyfunc), ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc)))
+#define sk_OSSL_ISSUER_SERIAL_set_cmp_func(sk, cmp) ((sk_OSSL_ISSUER_SERIAL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp)))
+
+
#endif
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h
index 68b20ee..de63bf0 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/x509_vfy.h.in
*
- * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -812,6 +812,7 @@ int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param,
unsigned long flags);
unsigned long X509_VERIFY_PARAM_get_flags(const X509_VERIFY_PARAM *param);
int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose);
+int X509_VERIFY_PARAM_get_purpose(const X509_VERIFY_PARAM *param);
int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust);
void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth);
void X509_VERIFY_PARAM_set_auth_level(X509_VERIFY_PARAM *param, int auth_level);
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h
index 5fd66fb..718157e 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by Makefile from include/openssl/x509v3.h.in
*
- * Copyright 1999-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1999-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -741,7 +741,7 @@ SKM_DEFINE_STACK_OF_INTERNAL(X509_PURPOSE, X509_PURPOSE, X509_PURPOSE)
#define sk_X509_PURPOSE_set_cmp_func(sk, cmp) ((sk_X509_PURPOSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_compfunc_type(cmp)))
-
+# define X509_PURPOSE_DEFAULT_ANY 0
# define X509_PURPOSE_SSL_CLIENT 1
# define X509_PURPOSE_SSL_SERVER 2
# define X509_PURPOSE_NS_SSL_SERVER 3
@@ -990,7 +990,6 @@ int X509V3_extensions_print(BIO *out, const char *title,
int X509_check_ca(X509 *x);
int X509_check_purpose(X509 *x, int id, int ca);
int X509_supported_extension(X509_EXTENSION *ex);
-int X509_PURPOSE_set(int *p, int purpose);
int X509_check_issued(X509 *issuer, X509 *subject);
int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid);
void X509_set_proxy_flag(X509 *x);
@@ -1006,22 +1005,26 @@ const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x);
const ASN1_INTEGER *X509_get0_authority_serial(X509 *x);
int X509_PURPOSE_get_count(void);
-X509_PURPOSE *X509_PURPOSE_get0(int idx);
+int X509_PURPOSE_get_unused_id(OSSL_LIB_CTX *libctx);
int X509_PURPOSE_get_by_sname(const char *sname);
int X509_PURPOSE_get_by_id(int id);
int X509_PURPOSE_add(int id, int trust, int flags,
int (*ck) (const X509_PURPOSE *, const X509 *, int),
const char *name, const char *sname, void *arg);
+void X509_PURPOSE_cleanup(void);
+
+X509_PURPOSE *X509_PURPOSE_get0(int idx);
+int X509_PURPOSE_get_id(const X509_PURPOSE *);
char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp);
char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp);
int X509_PURPOSE_get_trust(const X509_PURPOSE *xp);
-void X509_PURPOSE_cleanup(void);
-int X509_PURPOSE_get_id(const X509_PURPOSE *);
+int X509_PURPOSE_set(int *p, int purpose);
STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x);
STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x);
void X509_email_free(STACK_OF(OPENSSL_STRING) *sk);
STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x);
+
/* Flags for X509_check_* functions */
/*
@@ -1494,6 +1497,471 @@ SKM_DEFINE_STACK_OF_INTERNAL(USERNOTICE, USERNOTICE, USERNOTICE)
#define sk_USERNOTICE_set_cmp_func(sk, cmp) ((sk_USERNOTICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_compfunc_type(cmp)))
+typedef struct OSSL_ROLE_SPEC_CERT_ID_st {
+ GENERAL_NAME *roleName;
+ GENERAL_NAME *roleCertIssuer;
+ ASN1_INTEGER *roleCertSerialNumber;
+ GENERAL_NAMES *roleCertLocator;
+} OSSL_ROLE_SPEC_CERT_ID;
+
+DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID)
+
+SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID)
+#define sk_OSSL_ROLE_SPEC_CERT_ID_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_value(sk, idx) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_value(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_new(cmp) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_new_null() ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_null())
+#define sk_OSSL_ROLE_SPEC_CERT_ID_new_reserve(cmp, n) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp), (n)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (n))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_delete(sk, i) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (i)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_delete_ptr(sk, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_pop(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_pop(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_shift(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_shift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk),ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), (idx))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_set(sk, idx, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_set(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), pnum)
+#define sk_OSSL_ROLE_SPEC_CERT_ID_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_dup(sk) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_copyfunc_type(copyfunc), ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc)))
+#define sk_OSSL_ROLE_SPEC_CERT_ID_set_cmp_func(sk, cmp) ((sk_OSSL_ROLE_SPEC_CERT_ID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp)))
+
+
+typedef STACK_OF(OSSL_ROLE_SPEC_CERT_ID) OSSL_ROLE_SPEC_CERT_ID_SYNTAX;
+
+DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID_SYNTAX)
+typedef struct OSSL_HASH_st {
+ X509_ALGOR *algorithmIdentifier;
+ ASN1_BIT_STRING *hashValue;
+} OSSL_HASH;
+
+typedef struct OSSL_INFO_SYNTAX_POINTER_st {
+ GENERAL_NAMES *name;
+ OSSL_HASH *hash;
+} OSSL_INFO_SYNTAX_POINTER;
+
+# define OSSL_INFO_SYNTAX_TYPE_CONTENT 0
+# define OSSL_INFO_SYNTAX_TYPE_POINTER 1
+
+typedef struct OSSL_INFO_SYNTAX_st {
+ int type;
+ union {
+ ASN1_STRING *content;
+ OSSL_INFO_SYNTAX_POINTER *pointer;
+ } choice;
+} OSSL_INFO_SYNTAX;
+
+typedef struct OSSL_PRIVILEGE_POLICY_ID_st {
+ ASN1_OBJECT *privilegePolicy;
+ OSSL_INFO_SYNTAX *privPolSyntax;
+} OSSL_PRIVILEGE_POLICY_ID;
+
+typedef struct OSSL_ATTRIBUTE_DESCRIPTOR_st {
+ ASN1_OBJECT *identifier;
+ ASN1_STRING *attributeSyntax;
+ ASN1_UTF8STRING *name;
+ ASN1_UTF8STRING *description;
+ OSSL_PRIVILEGE_POLICY_ID *dominationRule;
+} OSSL_ATTRIBUTE_DESCRIPTOR;
+
+DECLARE_ASN1_FUNCTIONS(OSSL_HASH)
+DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX)
+DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX_POINTER)
+DECLARE_ASN1_FUNCTIONS(OSSL_PRIVILEGE_POLICY_ID)
+DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_DESCRIPTOR)
+
+typedef struct OSSL_TIME_SPEC_ABSOLUTE_st {
+ ASN1_GENERALIZEDTIME *startTime;
+ ASN1_GENERALIZEDTIME *endTime;
+} OSSL_TIME_SPEC_ABSOLUTE;
+
+typedef struct OSSL_DAY_TIME_st {
+ ASN1_INTEGER *hour;
+ ASN1_INTEGER *minute;
+ ASN1_INTEGER *second;
+} OSSL_DAY_TIME;
+
+typedef struct OSSL_DAY_TIME_BAND_st {
+ OSSL_DAY_TIME *startDayTime;
+ OSSL_DAY_TIME *endDayTime;
+} OSSL_DAY_TIME_BAND;
+
+# define OSSL_NAMED_DAY_TYPE_INT 0
+# define OSSL_NAMED_DAY_TYPE_BIT 1
+# define OSSL_NAMED_DAY_INT_SUN 1
+# define OSSL_NAMED_DAY_INT_MON 2
+# define OSSL_NAMED_DAY_INT_TUE 3
+# define OSSL_NAMED_DAY_INT_WED 4
+# define OSSL_NAMED_DAY_INT_THU 5
+# define OSSL_NAMED_DAY_INT_FRI 6
+# define OSSL_NAMED_DAY_INT_SAT 7
+# define OSSL_NAMED_DAY_BIT_SUN 0
+# define OSSL_NAMED_DAY_BIT_MON 1
+# define OSSL_NAMED_DAY_BIT_TUE 2
+# define OSSL_NAMED_DAY_BIT_WED 3
+# define OSSL_NAMED_DAY_BIT_THU 4
+# define OSSL_NAMED_DAY_BIT_FRI 5
+# define OSSL_NAMED_DAY_BIT_SAT 6
+
+typedef struct OSSL_NAMED_DAY_st {
+ int type;
+ union {
+ ASN1_INTEGER *intNamedDays;
+ ASN1_BIT_STRING *bitNamedDays;
+ } choice;
+} OSSL_NAMED_DAY;
+
+# define OSSL_TIME_SPEC_X_DAY_OF_FIRST 0
+# define OSSL_TIME_SPEC_X_DAY_OF_SECOND 1
+# define OSSL_TIME_SPEC_X_DAY_OF_THIRD 2
+# define OSSL_TIME_SPEC_X_DAY_OF_FOURTH 3
+# define OSSL_TIME_SPEC_X_DAY_OF_FIFTH 4
+
+typedef struct OSSL_TIME_SPEC_X_DAY_OF_st {
+ int type;
+ union {
+ OSSL_NAMED_DAY *first;
+ OSSL_NAMED_DAY *second;
+ OSSL_NAMED_DAY *third;
+ OSSL_NAMED_DAY *fourth;
+ OSSL_NAMED_DAY *fifth;
+ } choice;
+} OSSL_TIME_SPEC_X_DAY_OF;
+
+# define OSSL_TIME_SPEC_DAY_TYPE_INT 0
+# define OSSL_TIME_SPEC_DAY_TYPE_BIT 1
+# define OSSL_TIME_SPEC_DAY_TYPE_DAY_OF 2
+# define OSSL_TIME_SPEC_DAY_BIT_SUN 0
+# define OSSL_TIME_SPEC_DAY_BIT_MON 1
+# define OSSL_TIME_SPEC_DAY_BIT_TUE 2
+# define OSSL_TIME_SPEC_DAY_BIT_WED 3
+# define OSSL_TIME_SPEC_DAY_BIT_THU 4
+# define OSSL_TIME_SPEC_DAY_BIT_FRI 5
+# define OSSL_TIME_SPEC_DAY_BIT_SAT 6
+# define OSSL_TIME_SPEC_DAY_INT_SUN 1
+# define OSSL_TIME_SPEC_DAY_INT_MON 2
+# define OSSL_TIME_SPEC_DAY_INT_TUE 3
+# define OSSL_TIME_SPEC_DAY_INT_WED 4
+# define OSSL_TIME_SPEC_DAY_INT_THU 5
+# define OSSL_TIME_SPEC_DAY_INT_FRI 6
+# define OSSL_TIME_SPEC_DAY_INT_SAT 7
+
+typedef struct OSSL_TIME_SPEC_DAY_st {
+ int type;
+ union {
+ STACK_OF(ASN1_INTEGER) *intDay;
+ ASN1_BIT_STRING *bitDay;
+ OSSL_TIME_SPEC_X_DAY_OF *dayOf;
+ } choice;
+} OSSL_TIME_SPEC_DAY;
+
+# define OSSL_TIME_SPEC_WEEKS_TYPE_ALL 0
+# define OSSL_TIME_SPEC_WEEKS_TYPE_INT 1
+# define OSSL_TIME_SPEC_WEEKS_TYPE_BIT 2
+# define OSSL_TIME_SPEC_BIT_WEEKS_1 0
+# define OSSL_TIME_SPEC_BIT_WEEKS_2 1
+# define OSSL_TIME_SPEC_BIT_WEEKS_3 2
+# define OSSL_TIME_SPEC_BIT_WEEKS_4 3
+# define OSSL_TIME_SPEC_BIT_WEEKS_5 4
+
+typedef struct OSSL_TIME_SPEC_WEEKS_st {
+ int type;
+ union {
+ ASN1_NULL *allWeeks;
+ STACK_OF(ASN1_INTEGER) *intWeek;
+ ASN1_BIT_STRING *bitWeek;
+ } choice;
+} OSSL_TIME_SPEC_WEEKS;
+
+# define OSSL_TIME_SPEC_MONTH_TYPE_ALL 0
+# define OSSL_TIME_SPEC_MONTH_TYPE_INT 1
+# define OSSL_TIME_SPEC_MONTH_TYPE_BIT 2
+# define OSSL_TIME_SPEC_INT_MONTH_JAN 1
+# define OSSL_TIME_SPEC_INT_MONTH_FEB 2
+# define OSSL_TIME_SPEC_INT_MONTH_MAR 3
+# define OSSL_TIME_SPEC_INT_MONTH_APR 4
+# define OSSL_TIME_SPEC_INT_MONTH_MAY 5
+# define OSSL_TIME_SPEC_INT_MONTH_JUN 6
+# define OSSL_TIME_SPEC_INT_MONTH_JUL 7
+# define OSSL_TIME_SPEC_INT_MONTH_AUG 8
+# define OSSL_TIME_SPEC_INT_MONTH_SEP 9
+# define OSSL_TIME_SPEC_INT_MONTH_OCT 10
+# define OSSL_TIME_SPEC_INT_MONTH_NOV 11
+# define OSSL_TIME_SPEC_INT_MONTH_DEC 12
+# define OSSL_TIME_SPEC_BIT_MONTH_JAN 0
+# define OSSL_TIME_SPEC_BIT_MONTH_FEB 1
+# define OSSL_TIME_SPEC_BIT_MONTH_MAR 2
+# define OSSL_TIME_SPEC_BIT_MONTH_APR 3
+# define OSSL_TIME_SPEC_BIT_MONTH_MAY 4
+# define OSSL_TIME_SPEC_BIT_MONTH_JUN 5
+# define OSSL_TIME_SPEC_BIT_MONTH_JUL 6
+# define OSSL_TIME_SPEC_BIT_MONTH_AUG 7
+# define OSSL_TIME_SPEC_BIT_MONTH_SEP 8
+# define OSSL_TIME_SPEC_BIT_MONTH_OCT 9
+# define OSSL_TIME_SPEC_BIT_MONTH_NOV 10
+# define OSSL_TIME_SPEC_BIT_MONTH_DEC 11
+
+typedef struct OSSL_TIME_SPEC_MONTH_st {
+ int type;
+ union {
+ ASN1_NULL *allMonths;
+ STACK_OF(ASN1_INTEGER) *intMonth;
+ ASN1_BIT_STRING *bitMonth;
+ } choice;
+} OSSL_TIME_SPEC_MONTH;
+
+typedef struct OSSL_TIME_PERIOD_st {
+ STACK_OF(OSSL_DAY_TIME_BAND) *timesOfDay;
+ OSSL_TIME_SPEC_DAY *days;
+ OSSL_TIME_SPEC_WEEKS *weeks;
+ OSSL_TIME_SPEC_MONTH *months;
+ STACK_OF(ASN1_INTEGER) *years;
+} OSSL_TIME_PERIOD;
+
+# define OSSL_TIME_SPEC_TIME_TYPE_ABSOLUTE 0
+# define OSSL_TIME_SPEC_TIME_TYPE_PERIODIC 1
+
+typedef struct OSSL_TIME_SPEC_TIME_st {
+ int type;
+ union {
+ OSSL_TIME_SPEC_ABSOLUTE *absolute;
+ STACK_OF(OSSL_TIME_PERIOD) *periodic;
+ } choice;
+} OSSL_TIME_SPEC_TIME;
+
+typedef struct OSSL_TIME_SPEC_st {
+ OSSL_TIME_SPEC_TIME *time;
+ ASN1_BOOLEAN notThisTime;
+ ASN1_INTEGER *timeZone;
+} OSSL_TIME_SPEC;
+
+DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME)
+DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME_BAND)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_DAY)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_WEEKS)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_MONTH)
+DECLARE_ASN1_FUNCTIONS(OSSL_NAMED_DAY)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_X_DAY_OF)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_ABSOLUTE)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_TIME)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC)
+DECLARE_ASN1_FUNCTIONS(OSSL_TIME_PERIOD)
+
+SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TIME_PERIOD, OSSL_TIME_PERIOD, OSSL_TIME_PERIOD)
+#define sk_OSSL_TIME_PERIOD_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk))
+#define sk_OSSL_TIME_PERIOD_value(sk, idx) ((OSSL_TIME_PERIOD *)OPENSSL_sk_value(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), (idx)))
+#define sk_OSSL_TIME_PERIOD_new(cmp) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp)))
+#define sk_OSSL_TIME_PERIOD_new_null() ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_null())
+#define sk_OSSL_TIME_PERIOD_new_reserve(cmp, n) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp), (n)))
+#define sk_OSSL_TIME_PERIOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (n))
+#define sk_OSSL_TIME_PERIOD_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))
+#define sk_OSSL_TIME_PERIOD_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))
+#define sk_OSSL_TIME_PERIOD_delete(sk, i) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (i)))
+#define sk_OSSL_TIME_PERIOD_delete_ptr(sk, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)))
+#define sk_OSSL_TIME_PERIOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr))
+#define sk_OSSL_TIME_PERIOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr))
+#define sk_OSSL_TIME_PERIOD_pop(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_pop(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)))
+#define sk_OSSL_TIME_PERIOD_shift(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_shift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)))
+#define sk_OSSL_TIME_PERIOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk),ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc))
+#define sk_OSSL_TIME_PERIOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), (idx))
+#define sk_OSSL_TIME_PERIOD_set(sk, idx, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_set(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (idx), ossl_check_OSSL_TIME_PERIOD_type(ptr)))
+#define sk_OSSL_TIME_PERIOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr))
+#define sk_OSSL_TIME_PERIOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr))
+#define sk_OSSL_TIME_PERIOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), pnum)
+#define sk_OSSL_TIME_PERIOD_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))
+#define sk_OSSL_TIME_PERIOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk))
+#define sk_OSSL_TIME_PERIOD_dup(sk) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk)))
+#define sk_OSSL_TIME_PERIOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_copyfunc_type(copyfunc), ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc)))
+#define sk_OSSL_TIME_PERIOD_set_cmp_func(sk, cmp) ((sk_OSSL_TIME_PERIOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp)))
+
+
+SKM_DEFINE_STACK_OF_INTERNAL(OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND)
+#define sk_OSSL_DAY_TIME_BAND_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk))
+#define sk_OSSL_DAY_TIME_BAND_value(sk, idx) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_value(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), (idx)))
+#define sk_OSSL_DAY_TIME_BAND_new(cmp) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp)))
+#define sk_OSSL_DAY_TIME_BAND_new_null() ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_null())
+#define sk_OSSL_DAY_TIME_BAND_new_reserve(cmp, n) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp), (n)))
+#define sk_OSSL_DAY_TIME_BAND_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (n))
+#define sk_OSSL_DAY_TIME_BAND_free(sk) OPENSSL_sk_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))
+#define sk_OSSL_DAY_TIME_BAND_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))
+#define sk_OSSL_DAY_TIME_BAND_delete(sk, i) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (i)))
+#define sk_OSSL_DAY_TIME_BAND_delete_ptr(sk, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)))
+#define sk_OSSL_DAY_TIME_BAND_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))
+#define sk_OSSL_DAY_TIME_BAND_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))
+#define sk_OSSL_DAY_TIME_BAND_pop(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_pop(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)))
+#define sk_OSSL_DAY_TIME_BAND_shift(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_shift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)))
+#define sk_OSSL_DAY_TIME_BAND_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk),ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc))
+#define sk_OSSL_DAY_TIME_BAND_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), (idx))
+#define sk_OSSL_DAY_TIME_BAND_set(sk, idx, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_set(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (idx), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)))
+#define sk_OSSL_DAY_TIME_BAND_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))
+#define sk_OSSL_DAY_TIME_BAND_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))
+#define sk_OSSL_DAY_TIME_BAND_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), pnum)
+#define sk_OSSL_DAY_TIME_BAND_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))
+#define sk_OSSL_DAY_TIME_BAND_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk))
+#define sk_OSSL_DAY_TIME_BAND_dup(sk) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_dup(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk)))
+#define sk_OSSL_DAY_TIME_BAND_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_copyfunc_type(copyfunc), ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc)))
+#define sk_OSSL_DAY_TIME_BAND_set_cmp_func(sk, cmp) ((sk_OSSL_DAY_TIME_BAND_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp)))
+
+
+/* Attribute Type and Value */
+typedef struct atav_st {
+ ASN1_OBJECT *type;
+ ASN1_TYPE *value;
+} OSSL_ATAV;
+
+typedef struct ATTRIBUTE_TYPE_MAPPING_st {
+ ASN1_OBJECT *local;
+ ASN1_OBJECT *remote;
+} OSSL_ATTRIBUTE_TYPE_MAPPING;
+
+typedef struct ATTRIBUTE_VALUE_MAPPING_st {
+ OSSL_ATAV *local;
+ OSSL_ATAV *remote;
+} OSSL_ATTRIBUTE_VALUE_MAPPING;
+
+# define OSSL_ATTR_MAP_TYPE 0
+# define OSSL_ATTR_MAP_VALUE 1
+
+typedef struct ATTRIBUTE_MAPPING_st {
+ int type;
+ union {
+ OSSL_ATTRIBUTE_TYPE_MAPPING *typeMappings;
+ OSSL_ATTRIBUTE_VALUE_MAPPING *typeValueMappings;
+ } choice;
+} OSSL_ATTRIBUTE_MAPPING;
+
+typedef STACK_OF(OSSL_ATTRIBUTE_MAPPING) OSSL_ATTRIBUTE_MAPPINGS;
+DECLARE_ASN1_FUNCTIONS(OSSL_ATAV)
+DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_TYPE_MAPPING)
+DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_VALUE_MAPPING)
+DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPING)
+DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPINGS)
+
+SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING)
+#define sk_OSSL_ATTRIBUTE_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))
+#define sk_OSSL_ATTRIBUTE_MAPPING_value(sk, idx) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_value(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_new(cmp) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_new_null() ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_null())
+#define sk_OSSL_ATTRIBUTE_MAPPING_new_reserve(cmp, n) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp), (n)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (n))
+#define sk_OSSL_ATTRIBUTE_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))
+#define sk_OSSL_ATTRIBUTE_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))
+#define sk_OSSL_ATTRIBUTE_MAPPING_delete(sk, i) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (i)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_delete_ptr(sk, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))
+#define sk_OSSL_ATTRIBUTE_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))
+#define sk_OSSL_ATTRIBUTE_MAPPING_pop(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_pop(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_shift(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_shift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk),ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc))
+#define sk_OSSL_ATTRIBUTE_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), (idx))
+#define sk_OSSL_ATTRIBUTE_MAPPING_set(sk, idx, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_set(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))
+#define sk_OSSL_ATTRIBUTE_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))
+#define sk_OSSL_ATTRIBUTE_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), pnum)
+#define sk_OSSL_ATTRIBUTE_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))
+#define sk_OSSL_ATTRIBUTE_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))
+#define sk_OSSL_ATTRIBUTE_MAPPING_dup(sk) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_copyfunc_type(copyfunc), ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc)))
+#define sk_OSSL_ATTRIBUTE_MAPPING_set_cmp_func(sk, cmp) ((sk_OSSL_ATTRIBUTE_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp)))
+
+
+# define OSSL_AAA_ATTRIBUTE_TYPE 0
+# define OSSL_AAA_ATTRIBUTE_VALUES 1
+
+typedef struct ALLOWED_ATTRIBUTES_CHOICE_st {
+ int type;
+ union {
+ ASN1_OBJECT *attributeType;
+ X509_ATTRIBUTE *attributeTypeandValues;
+ } choice;
+} OSSL_ALLOWED_ATTRIBUTES_CHOICE;
+
+typedef struct ALLOWED_ATTRIBUTES_ITEM_st {
+ STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *attributes;
+ GENERAL_NAME *holderDomain;
+} OSSL_ALLOWED_ATTRIBUTES_ITEM;
+
+typedef STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) OSSL_ALLOWED_ATTRIBUTES_SYNTAX;
+
+DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_CHOICE)
+DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_ITEM)
+DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_SYNTAX)
+
+SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE)
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_null())
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp), (n)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (n))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (i)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), (idx))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), pnum)
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp)))
+
+
+SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM)
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_null())
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp), (n)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (n))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (i)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), (idx))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), pnum)
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc)))
+#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp)))
+
+
+typedef struct AA_DIST_POINT_st {
+ DIST_POINT_NAME *distpoint;
+ ASN1_BIT_STRING *reasons;
+ int dp_reasons;
+ ASN1_BOOLEAN indirectCRL;
+ ASN1_BOOLEAN containsUserAttributeCerts;
+ ASN1_BOOLEAN containsAACerts;
+ ASN1_BOOLEAN containsSOAPublicKeyCerts;
+} OSSL_AA_DIST_POINT;
+
+DECLARE_ASN1_FUNCTIONS(OSSL_AA_DIST_POINT)
+
# ifdef __cplusplus
}
# endif
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c
new file mode 100644
index 0000000..d4c6cfc
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c
@@ -0,0 +1,37 @@
+/*
+ * WARNING: do not edit!
+ * Generated by Makefile from providers/common/der/der_ml_dsa_gen.c.in
+ *
+ * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include "prov/der_ml_dsa.h"
+
+/* Well known OIDs precompiled */
+
+/*
+ * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 }
+ */
+const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44] = {
+ DER_OID_V_id_ml_dsa_44
+};
+
+/*
+ * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 }
+ */
+const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65] = {
+ DER_OID_V_id_ml_dsa_65
+};
+
+/*
+ * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 }
+ */
+const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87] = {
+ DER_OID_V_id_ml_dsa_87
+};
+
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c
new file mode 100644
index 0000000..f9fb0bd
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c
@@ -0,0 +1,100 @@
+/*
+ * WARNING: do not edit!
+ * Generated by Makefile from providers/common/der/der_slh_dsa_gen.c.in
+ *
+ * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include "prov/der_slh_dsa.h"
+
+/* Well known OIDs precompiled */
+
+/*
+ * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s] = {
+ DER_OID_V_id_slh_dsa_sha2_128s
+};
+
+/*
+ * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f] = {
+ DER_OID_V_id_slh_dsa_sha2_128f
+};
+
+/*
+ * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s] = {
+ DER_OID_V_id_slh_dsa_sha2_192s
+};
+
+/*
+ * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f] = {
+ DER_OID_V_id_slh_dsa_sha2_192f
+};
+
+/*
+ * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s] = {
+ DER_OID_V_id_slh_dsa_sha2_256s
+};
+
+/*
+ * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f] = {
+ DER_OID_V_id_slh_dsa_sha2_256f
+};
+
+/*
+ * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s] = {
+ DER_OID_V_id_slh_dsa_shake_128s
+};
+
+/*
+ * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f] = {
+ DER_OID_V_id_slh_dsa_shake_128f
+};
+
+/*
+ * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s] = {
+ DER_OID_V_id_slh_dsa_shake_192s
+};
+
+/*
+ * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f] = {
+ DER_OID_V_id_slh_dsa_shake_192f
+};
+
+/*
+ * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s] = {
+ DER_OID_V_id_slh_dsa_shake_256s
+};
+
+/*
+ * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 }
+ */
+const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f] = {
+ DER_OID_V_id_slh_dsa_shake_256f
+};
+
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h
new file mode 100644
index 0000000..636054f
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h
@@ -0,0 +1,40 @@
+/*
+ * WARNING: do not edit!
+ * Generated by Makefile from providers/common/include/prov/der_ml_dsa.h.in
+ *
+ * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include "internal/der.h"
+#include "crypto/ml_dsa.h"
+
+/* Well known OIDs precompiled */
+
+/*
+ * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 }
+ */
+#define DER_OID_V_id_ml_dsa_44 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x11
+#define DER_OID_SZ_id_ml_dsa_44 11
+extern const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44];
+
+/*
+ * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 }
+ */
+#define DER_OID_V_id_ml_dsa_65 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x12
+#define DER_OID_SZ_id_ml_dsa_65 11
+extern const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65];
+
+/*
+ * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 }
+ */
+#define DER_OID_V_id_ml_dsa_87 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x13
+#define DER_OID_SZ_id_ml_dsa_87 11
+extern const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87];
+
+
+int ossl_DER_w_algorithmIdentifier_ML_DSA(WPACKET *pkt, int tag, ML_DSA_KEY *key);
diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h
new file mode 100644
index 0000000..0da6cdd
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h
@@ -0,0 +1,103 @@
+/*
+ * WARNING: do not edit!
+ * Generated by Makefile from providers/common/include/prov/der_slh_dsa.h.in
+ *
+ * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include "internal/der.h"
+#include "crypto/slh_dsa.h"
+
+/* Well known OIDs precompiled */
+
+/*
+ * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 }
+ */
+#define DER_OID_V_id_slh_dsa_sha2_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x14
+#define DER_OID_SZ_id_slh_dsa_sha2_128s 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s];
+
+/*
+ * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 }
+ */
+#define DER_OID_V_id_slh_dsa_sha2_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x15
+#define DER_OID_SZ_id_slh_dsa_sha2_128f 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f];
+
+/*
+ * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 }
+ */
+#define DER_OID_V_id_slh_dsa_sha2_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x16
+#define DER_OID_SZ_id_slh_dsa_sha2_192s 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s];
+
+/*
+ * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 }
+ */
+#define DER_OID_V_id_slh_dsa_sha2_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x17
+#define DER_OID_SZ_id_slh_dsa_sha2_192f 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f];
+
+/*
+ * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 }
+ */
+#define DER_OID_V_id_slh_dsa_sha2_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x18
+#define DER_OID_SZ_id_slh_dsa_sha2_256s 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s];
+
+/*
+ * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 }
+ */
+#define DER_OID_V_id_slh_dsa_sha2_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x19
+#define DER_OID_SZ_id_slh_dsa_sha2_256f 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f];
+
+/*
+ * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 }
+ */
+#define DER_OID_V_id_slh_dsa_shake_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1A
+#define DER_OID_SZ_id_slh_dsa_shake_128s 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s];
+
+/*
+ * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 }
+ */
+#define DER_OID_V_id_slh_dsa_shake_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1B
+#define DER_OID_SZ_id_slh_dsa_shake_128f 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f];
+
+/*
+ * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 }
+ */
+#define DER_OID_V_id_slh_dsa_shake_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1C
+#define DER_OID_SZ_id_slh_dsa_shake_192s 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s];
+
+/*
+ * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 }
+ */
+#define DER_OID_V_id_slh_dsa_shake_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1D
+#define DER_OID_SZ_id_slh_dsa_shake_192f 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f];
+
+/*
+ * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 }
+ */
+#define DER_OID_V_id_slh_dsa_shake_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1E
+#define DER_OID_SZ_id_slh_dsa_shake_256s 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s];
+
+/*
+ * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 }
+ */
+#define DER_OID_V_id_slh_dsa_shake_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1F
+#define DER_OID_SZ_id_slh_dsa_shake_256f 11
+extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f];
+
+
+int ossl_DER_w_algorithmIdentifier_SLH_DSA(WPACKET *pkt, int tag, SLH_DSA_KEY *key);
diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf
index 1aa22f9..0778236 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf
+++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf
@@ -289,7 +289,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -297,6 +299,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -353,6 +356,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -467,13 +471,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -501,12 +509,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -621,6 +631,8 @@
$(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_rsa_key.c
@@ -652,7 +664,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -669,6 +680,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -727,8 +740,8 @@
# C4819: The file contains a character that cannot be represented in the current code page
# C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101))
#
- MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
- MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
+ MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
+ MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
#
# Disable following Visual Studio 2015 compiler warnings brought by openssl source,
diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf
index 1138211..98ff3e8 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf
+++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf
@@ -306,7 +306,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -314,6 +316,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -369,6 +372,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -483,13 +487,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -517,12 +525,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -637,6 +647,8 @@
$(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_rsa_key.c
@@ -668,7 +680,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -685,6 +696,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -982,7 +995,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -990,6 +1005,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -1045,6 +1061,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -1158,13 +1175,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -1192,12 +1213,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -1312,6 +1335,8 @@
$(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_rsa_key.c
@@ -1343,7 +1368,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -1360,6 +1384,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -1382,6 +1408,7 @@
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha1-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha256-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
+ $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/bsaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/vpaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/x86_64cpuid.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
@@ -1400,6 +1427,7 @@
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha1-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha256-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
+ $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-xts-avx512.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/bsaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/vpaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/x86_64cpuid.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
@@ -1676,7 +1704,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -1684,6 +1714,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -1739,6 +1770,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -1852,13 +1884,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -1886,12 +1922,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -2006,6 +2044,8 @@
$(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_rsa_key.c
@@ -2037,7 +2077,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -2054,6 +2093,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -2117,8 +2158,8 @@
# C4819: The file contains a character that cannot be represented in the current code page
# C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101))
#
- MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
- MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
+ MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
+ MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
#
# Disable following Visual Studio 2015 compiler warnings brought by openssl source,
diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf
index a5dd364..42fb505 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf
+++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf
@@ -290,7 +290,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -298,6 +300,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -354,6 +357,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -468,13 +472,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -502,12 +510,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -622,6 +632,8 @@
$(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_rsa_key.c
@@ -678,8 +690,8 @@
# C4819: The file contains a character that cannot be represented in the current code page
# C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101))
#
- MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
- MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
+ MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
+ MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
#
# Disable following Visual Studio 2015 compiler warnings brought by openssl source,
diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf
index 75f40b8..3bdda0f 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf
+++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf
@@ -332,7 +332,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -340,6 +342,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -396,6 +399,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -510,13 +514,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -544,12 +552,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -673,6 +683,8 @@
$(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_ec_key.c
@@ -709,7 +721,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -726,6 +737,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -784,8 +797,8 @@
# C4819: The file contains a character that cannot be represented in the current code page
# C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101))
#
- MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
- MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
+ MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
+ MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
#
# Disable following Visual Studio 2015 compiler warnings brought by openssl source,
diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf
index f46659c..b61abdd 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf
+++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf
@@ -349,7 +349,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -357,6 +359,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -412,6 +415,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -526,13 +530,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -560,12 +568,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -689,6 +699,8 @@
$(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_ec_key.c
@@ -725,7 +737,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -742,6 +753,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -1077,7 +1090,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -1085,6 +1100,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -1140,6 +1156,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -1253,13 +1270,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -1287,12 +1308,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -1416,6 +1439,8 @@
$(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_ec_key.c
@@ -1452,7 +1477,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -1469,6 +1493,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -1491,6 +1517,7 @@
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha1-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha256-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
+ $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/bsaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/vpaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-MSFT/crypto/x86_64cpuid.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
@@ -1509,6 +1536,7 @@
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha1-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha256-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
+ $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-xts-avx512.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/bsaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/vpaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
$(OPENSSL_GEN_PATH)/X64-GCC/crypto/x86_64cpuid.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm
@@ -1823,7 +1851,9 @@
$(OPENSSL_PATH)/crypto/evp/pmeth_check.c
$(OPENSSL_PATH)/crypto/evp/pmeth_gn.c
$(OPENSSL_PATH)/crypto/evp/pmeth_lib.c
+ $(OPENSSL_PATH)/crypto/evp/s_lib.c
$(OPENSSL_PATH)/crypto/evp/signature.c
+ $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c
$(OPENSSL_PATH)/crypto/ffc/ffc_backend.c
$(OPENSSL_PATH)/crypto/ffc/ffc_dh.c
$(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c
@@ -1831,6 +1861,7 @@
$(OPENSSL_PATH)/crypto/ffc/ffc_params.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c
$(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c
+ $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c
$(OPENSSL_PATH)/crypto/hashtable/hashtable.c
$(OPENSSL_PATH)/crypto/hmac/hmac.c
$(OPENSSL_PATH)/crypto/hpke/hpke.c
@@ -1886,6 +1917,7 @@
$(OPENSSL_PATH)/crypto/self_test_core.c
$(OPENSSL_PATH)/crypto/sleep.c
$(OPENSSL_PATH)/crypto/sparse_array.c
+ $(OPENSSL_PATH)/crypto/ssl_err.c
$(OPENSSL_PATH)/crypto/threads_lib.c
$(OPENSSL_PATH)/crypto/threads_none.c
$(OPENSSL_PATH)/crypto/threads_pthread.c
@@ -1999,13 +2031,17 @@
$(OPENSSL_PATH)/crypto/x509/t_crl.c
$(OPENSSL_PATH)/crypto/x509/t_req.c
$(OPENSSL_PATH)/crypto/x509/t_x509.c
+ $(OPENSSL_PATH)/crypto/x509/v3_aaa.c
$(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c
$(OPENSSL_PATH)/crypto/x509/v3_addr.c
$(OPENSSL_PATH)/crypto/x509/v3_admis.c
$(OPENSSL_PATH)/crypto/x509/v3_akeya.c
$(OPENSSL_PATH)/crypto/x509/v3_akid.c
$(OPENSSL_PATH)/crypto/x509/v3_asid.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c
+ $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c
$(OPENSSL_PATH)/crypto/x509/v3_audit_id.c
+ $(OPENSSL_PATH)/crypto/x509/v3_authattid.c
$(OPENSSL_PATH)/crypto/x509/v3_battcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bcons.c
$(OPENSSL_PATH)/crypto/x509/v3_bitst.c
@@ -2033,12 +2069,14 @@
$(OPENSSL_PATH)/crypto/x509/v3_pmaps.c
$(OPENSSL_PATH)/crypto/x509/v3_prn.c
$(OPENSSL_PATH)/crypto/x509/v3_purp.c
+ $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c
$(OPENSSL_PATH)/crypto/x509/v3_san.c
$(OPENSSL_PATH)/crypto/x509/v3_sda.c
$(OPENSSL_PATH)/crypto/x509/v3_single_use.c
$(OPENSSL_PATH)/crypto/x509/v3_skid.c
$(OPENSSL_PATH)/crypto/x509/v3_soa_id.c
$(OPENSSL_PATH)/crypto/x509/v3_sxnet.c
+ $(OPENSSL_PATH)/crypto/x509/v3_timespec.c
$(OPENSSL_PATH)/crypto/x509/v3_tlsf.c
$(OPENSSL_PATH)/crypto/x509/v3_usernotice.c
$(OPENSSL_PATH)/crypto/x509/v3_utf8.c
@@ -2162,6 +2200,8 @@
$(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c
$(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c
+ $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c
$(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c
$(OPENSSL_GEN_PATH)/crypto/params_idx.c
$(OPENSSL_PATH)/providers/common/der/der_ec_key.c
@@ -2198,7 +2238,6 @@
$(OPENSSL_PATH)/ssl/ssl_cert_comp.c
$(OPENSSL_PATH)/ssl/ssl_ciph.c
$(OPENSSL_PATH)/ssl/ssl_conf.c
- $(OPENSSL_PATH)/ssl/ssl_err.c
$(OPENSSL_PATH)/ssl/ssl_err_legacy.c
$(OPENSSL_PATH)/ssl/ssl_init.c
$(OPENSSL_PATH)/ssl/ssl_lib.c
@@ -2215,6 +2254,8 @@
$(OPENSSL_PATH)/ssl/tls13_enc.c
$(OPENSSL_PATH)/ssl/tls_depr.c
$(OPENSSL_PATH)/ssl/tls_srp.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls.c
+ $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c
$(OPENSSL_PATH)/ssl/record/rec_layer_d1.c
$(OPENSSL_PATH)/ssl/record/rec_layer_s3.c
$(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c
@@ -2278,8 +2319,8 @@
# C4819: The file contains a character that cannot be represented in the current code page
# C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101))
#
- MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
- MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189
+ MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
+ MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189
#
# Disable following Visual Studio 2015 compiler warnings brought by openssl source,
diff --git a/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c b/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c
index f3106cf..1430696 100644
--- a/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c
+++ b/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c
@@ -362,3 +362,14 @@ ossl_encoder_store_cache_flush (
{
return -1;
}
+
+int
+ossl_bio_print_labeled_buf (
+ BIO *out,
+ const char *label,
+ const unsigned char *buf,
+ size_t buflen
+ )
+{
+ return -1;
+}
diff --git a/CryptoPkg/Library/OpensslLib/configure.py b/CryptoPkg/Library/OpensslLib/configure.py
index 37e5cf3..beb6f3e 100755
--- a/CryptoPkg/Library/OpensslLib/configure.py
+++ b/CryptoPkg/Library/OpensslLib/configure.py
@@ -53,6 +53,8 @@ def openssl_configure(openssldir, target, ec = True):
'no-module',
'no-md4',
'no-mdc2',
+ 'no-ml-dsa',
+ 'no-ml-kem',
'no-multiblock',
'no-nextprotoneg',
'no-pic',
@@ -62,6 +64,7 @@ def openssl_configure(openssldir, target, ec = True):
'no-padlockeng',
'no-poly1305',
'no-posix-io',
+ 'no-quic',
'no-rc2',
'no-rc4',
'no-rc5',
@@ -72,6 +75,7 @@ def openssl_configure(openssldir, target, ec = True):
'no-shared',
'no-siphash',
'no-siv',
+ 'no-slh-dsa',
'no-sm2',
'no-sm4',
'no-sock',
diff --git a/CryptoPkg/Library/OpensslLib/openssl b/CryptoPkg/Library/OpensslLib/openssl
-Subproject a26d85337dbdcd33c971f38eb3fa5150e75cea8
+Subproject aea7aaf2abb04789f5868cbabec406ea43aa84b
diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc
index 371efe9..95b6407 100644
--- a/DynamicTablesPkg/DynamicTables.dsc.inc
+++ b/DynamicTablesPkg/DynamicTables.dsc.inc
@@ -67,6 +67,7 @@
DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLib/AcpiMadtLib.inf
DynamicTablesPkg/Library/Acpi/X64/AcpiSsdtHpetLib/AcpiSsdtHpetLib.inf
DynamicTablesPkg/Library/Acpi/X64/AcpiWsmtLib/AcpiWsmtLib.inf
+ DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf
#
# Dynamic Table Factory Dxe
diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 9e294ac..a966148 100644
--- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
+++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
@@ -2107,4 +2107,121 @@ AmlCreatePssNode (
OUT AML_OBJECT_NODE_HANDLE *NewPssNode OPTIONAL
);
+/** Code generation for the IRQ Descriptor.
+
+ The Resource Data effectively created is an IRQ Resource
+ Data. Cf ACPI 6.5 specification:
+ - s6.4.2.1 "IRQ Descriptor"
+ - s19.6.66 "IRQ (Interrupt Resource Descriptor Macro)"
+
+
+ The created resource data node can be:
+ - appended to the list of resource data elements of the NameOpNode.
+ In such case NameOpNode must be defined by a the "Name ()" ASL statement
+ and initially contain a "ResourceTemplate ()".
+ - returned through the NewRdNode parameter.
+
+ @param [in] IsEdgeTriggered The interrupt is edge triggered or
+ level triggered.
+ @param [in] IsActiveLow The interrupt is active-high or active-low.
+ @param [in] IsShared The interrupt can be shared with other
+ devices or not (Exclusive).
+ @param [in] IrqList List of IRQ numbers. Must be non-NULL.
+ @param [in] IrqCount Number of IRQs in IrqList. Must be > 0 and <= 16.
+ @param [in] NameOpNode NameOp object node defining a named object.
+ If provided, append the new resource data node
+ to the list of resource data elements of this node.
+ @param [out] NewRdNode If provided and success, contain the created node.
+
+ @retval EFI_SUCCESS The function completed successfully.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval various Other errors as indicated.
+**/
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdIrq (
+ IN BOOLEAN IsEdgeTriggered,
+ IN BOOLEAN IsActiveLow,
+ IN BOOLEAN IsShared,
+ IN UINT8 *IrqList,
+ IN UINT8 IrqCount,
+ IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL,
+ OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL
+ );
+
+/** Code generation for the UARTSerialBusV2() ASL macro.
+
+ The Resource Data effectively created is a UART Serial Bus Connection
+ Resource Descriptor Resource Data.
+ Cf ACPI 6.5:
+ - s19.6.143 UARTSerialBusV2
+ (UART Serial Bus Connection Resource Descriptor Version 2 Macro)
+ - s6.4.3.8.2.3 UART Serial Bus Connection Resource Descriptor
+
+ The created resource data node can be:
+ - appended to the list of resource data elements of the NameOpNode.
+ In such case NameOpNode must be defined by a the "Name ()" ASL statement
+ and initially contain a "ResourceTemplate ()".
+ - returned through the NewRdNode parameter.
+
+ @param [in] InitialBaudRate Initial baud rate.
+ @param [in] BitsPerByte Number of bits per byte.
+ Optional, default is 8.
+ @param [in] StopBits Number of stop bits.
+ Optional, default is 1.
+ @param [in] LinesInUse Number of lines in use.
+ @param [in] IsBigEndian Indicates whether the bit transfer is big-endian.
+ Optional, default is FALSE (little-endian).
+ @param [in] Parity Parity format used.
+ Optional, default is no parity.
+ @param [in] FlowControl Flow control protocol used.
+ Optional, default is no flow control.
+ @param [in] ReceiveBufferSize Size of the receive buffer.
+ @param [in] TransmitBufferSize Size of the transmit buffer.
+ @param [in] ResourceSource Name of source resource used.
+ @param [in] ResourceSourceLength Length of the Resource Source.
+ @param [in] ResourceSourceIndex Resource Source index.
+ Optional, default is 0.
+ @param [in] ResourceUsage Resource usage, TRUE for consumer,
+ FALSE for producer.
+ Optional, default is TRUE (consumer).
+ @param [in] IsShared Indicates whether the resource is shared.
+ Optional, default is FALSE (exclusive).
+ @param [in] VendorDefinedData Vendor defined data.
+ Optional, can be NULL.
+ @param [in] VendorDefinedDataLength Length of the vendor defined data.
+ @param [in] NameOpNode NameOp object node defining a named object.
+ If provided, append the new resource data
+ node to the list of resource data elements
+ of this node.
+ @param [out] NewRdNode If provided and success,
+ contain the created node.
+
+ @retval EFI_SUCCESS The function completed successfully.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval various Various failure values of called functions.
+**/
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdUartSerialBusV2 (
+ IN UINT32 InitialBaudRate,
+ IN UINT8 *BitsPerByte OPTIONAL,
+ IN UINT8 *StopBits OPTIONAL,
+ IN UINT8 LinesInUse,
+ IN BOOLEAN *IsBigEndian OPTIONAL,
+ IN UINT8 *Parity OPTIONAL,
+ IN UINT8 *FlowControl OPTIONAL,
+ IN UINT16 ReceiveBufferSize,
+ IN UINT16 TransmitBufferSize,
+ IN CHAR8 *ResourceSource,
+ IN UINT16 ResourceSourceLength,
+ IN UINT8 *ResourceSourceIndex OPTIONAL,
+ IN BOOLEAN *ResourceUsage OPTIONAL,
+ IN BOOLEAN *IsShared OPTIONAL,
+ IN UINT8 *VendorDefinedData OPTIONAL,
+ IN UINT16 VendorDefinedDataLength,
+ IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL,
+ OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL
+ );
+
#endif // AML_LIB_H_
diff --git a/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c
new file mode 100644
index 0000000..b6e7c46
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c
@@ -0,0 +1,533 @@
+/** @file
+ SSDT Serial Port Fixup Library for X64.
+
+
+ Copyright (c) 2019 - 2024, Arm Limited. All rights reserved.<BR>
+ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Reference(s):
+ - Arm Server Base Boot Requirements (SBBR), s4.2.1.8 "SPCR".
+ - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015.
+ - ACPI for Arm Components 1.0 - 2020
+ - Arm Generic Interrupt Controller Architecture Specification,
+ Issue H, January 2022.
+ (https://developer.arm.com/documentation/ihi0069/)
+**/
+
+#include <IndustryStandard/DebugPort2Table.h>
+#include <Library/AcpiLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Protocol/AcpiTable.h>
+
+// Module specific include files.
+#include <AcpiTableGenerator.h>
+#include <ConfigurationManagerObject.h>
+#include <ConfigurationManagerHelper.h>
+#include <Library/AcpiHelperLib.h>
+#include <Library/AmlLib/AmlLib.h>
+#include <Protocol/ConfigurationManagerProtocol.h>
+
+/** UART address range length.
+*/
+#define MIN_UART_ADDRESS_LENGTH 0x1000U
+
+/** Validate the Serial Port Information.
+
+ @param [in] SerialPortInfoTable Table of CM_ARCH_COMMON_SERIAL_PORT_INFO.
+ @param [in] SerialPortCount Count of SerialPort in the table.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+**/
+EFI_STATUS
+EFIAPI
+ValidateSerialPortInfo (
+ IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfoTable,
+ IN UINT32 SerialPortCount
+ )
+{
+ UINT32 Index;
+ CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo;
+
+ if ((SerialPortInfoTable == NULL) ||
+ (SerialPortCount == 0))
+ {
+ ASSERT (0);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ for (Index = 0; Index < SerialPortCount; Index++) {
+ SerialPortInfo = &SerialPortInfoTable[Index];
+ ASSERT (SerialPortInfo != NULL);
+
+ if ((SerialPortInfo == NULL) ||
+ (SerialPortInfo->BaseAddress == 0))
+ {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: UART port base address is invalid. BaseAddress = 0x%llx\n",
+ SerialPortInfo->BaseAddress
+ ));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((SerialPortInfo->PortSubtype !=
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART) &&
+ (SerialPortInfo->PortSubtype !=
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART_2X) &&
+ (SerialPortInfo->PortSubtype !=
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART) &&
+ (SerialPortInfo->PortSubtype !=
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_DCC) &&
+ (SerialPortInfo->PortSubtype !=
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) &&
+ (SerialPortInfo->PortSubtype !=
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS))
+ {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: UART port subtype is invalid."
+ " UART Base = 0x%llx, PortSubtype = 0x%x\n",
+ SerialPortInfo->BaseAddress,
+ SerialPortInfo->PortSubtype
+ ));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ DEBUG ((DEBUG_INFO, "UART Configuration:\n"));
+ DEBUG ((
+ DEBUG_INFO,
+ " UART Base = 0x%llx\n",
+ SerialPortInfo->BaseAddress
+ ));
+ DEBUG ((
+ DEBUG_INFO,
+ " Length = 0x%llx\n",
+ SerialPortInfo->BaseAddressLength
+ ));
+ DEBUG ((DEBUG_INFO, " Clock = %lu\n", SerialPortInfo->Clock));
+ DEBUG ((DEBUG_INFO, " BaudRate = %llu\n", SerialPortInfo->BaudRate));
+ DEBUG ((DEBUG_INFO, " Interrupt = %lu\n", SerialPortInfo->Interrupt));
+ } // for
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Create the _CRS (Current Resource Settings) AML node for a serial port device.
+
+ @param [in] SerialPortInfo Pointer to the serial port information structure.
+ @param [in] Name The Name to give to the Device.
+ Must be a NULL-terminated ASL NameString
+ e.g.: "DEV0", "DV15.DEV0", etc.
+ @param [in] DeviceNode AML device node handle.
+
+ @retval EFI_SUCCESS The CRS node was created successfully.
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
+ @retval Others Failed to create CRS node.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+CreateSerialPortCrs (
+ IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo,
+ IN CONST CHAR8 *Name,
+ IN AML_OBJECT_NODE_HANDLE DeviceNode
+ )
+{
+ AML_OBJECT_NODE_HANDLE CrsNode;
+ EFI_STATUS Status;
+ UINT8 IrqList[1];
+
+ Status = AmlCodeGenNameResourceTemplate ("_CRS", DeviceNode, &CrsNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _CRS Node."
+ " Status = %r\n",
+ Status
+ ));
+ return Status;
+ }
+
+ IrqList[0] = SerialPortInfo->Interrupt & MAX_UINT8;
+
+ if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) {
+ Status = AmlCodeGenRdIo (
+ TRUE,
+ SerialPortInfo->BaseAddress & MAX_UINT16,
+ SerialPortInfo->BaseAddress & MAX_UINT16,
+ 1,
+ 0x8,
+ CrsNode,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate IO RD node."
+ " Status = %r\n",
+ Status
+ ));
+ return Status;
+ }
+
+ //
+ // Generate the IRQ() ASL macro.
+ // This is used for legacy X86/X64/PC-AT compatible systems.
+ //
+ Status = AmlCodeGenRdIrq (
+ TRUE,
+ TRUE,
+ TRUE,
+ IrqList,
+ ARRAY_SIZE (IrqList),
+ CrsNode,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate IRQ RD node."
+ " Status = %r\n",
+ Status
+ ));
+ return Status;
+ }
+
+ //
+ // Generate the UARTSerialBusV2() ASL macro.
+ // This describes legacy COM port resources for X86/X64/PC-AT compatible systems.
+ //
+ Status = AmlCodeGenRdUartSerialBusV2 (
+ SerialPortInfo->BaudRate & MAX_UINT32, // BaudRate
+ NULL, // Default 8 Bits Per Byte
+ NULL, // Default 1 Stop Bit
+ 0, // Lines in Use
+ NULL, // Default is little endian
+ NULL, // Default is no parity
+ NULL, // Default is no flow control
+ 0x1, // ReceiveBufferSize
+ 0x1, // TransmitBufferSize
+ (CHAR8 *)Name, // Serial Port Name
+ (AsciiStrLen (Name) + 1) & MAX_UINT16, // Serial Port Name Length
+ NULL, // Default resource index is zero
+ NULL, // Default is consumer
+ NULL, // Default is exclusive
+ NULL, // vendor defined data
+ 0, // VendorDefinedDataLength
+ CrsNode,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate UartSerialBus RD node."
+ " Status = %r\n",
+ Status
+ ));
+ return Status;
+ }
+ }
+
+ if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS) {
+ Status = AmlCodeGenRdMemory32Fixed (
+ TRUE,
+ SerialPortInfo->BaseAddress & MAX_UINT32,
+ ((SerialPortInfo->BaseAddressLength > MIN_UART_ADDRESS_LENGTH)
+ ? SerialPortInfo->BaseAddressLength
+ : MIN_UART_ADDRESS_LENGTH) & MAX_UINT32,
+ CrsNode,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate MMIO RD node."
+ " Status = %r\n",
+ Status
+ ));
+ return Status;
+ }
+
+ Status = AmlCodeGenRdIrq (
+ TRUE,
+ TRUE,
+ TRUE,
+ IrqList,
+ 1,
+ CrsNode,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate IRQ RD node."
+ " Status = %r\n",
+ Status
+ ));
+ return Status;
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+/** Build a SSDT table describing the input serial port.
+
+ The table created by this function must be freed by FreeSsdtSerialTable.
+
+ @param [in] AcpiTableInfo Pointer to the ACPI table information.
+ @param [in] SerialPortInfo Serial port to describe in the SSDT table.
+ @param [in] Name The Name to give to the Device.
+ Must be a NULL-terminated ASL NameString
+ e.g.: "DEV0", "DV15.DEV0", etc.
+ @param [in] Uid UID for the Serial Port.
+ @param [out] Table If success, pointer to the created SSDT table.
+
+ @retval EFI_SUCCESS Table generated successfully.
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
+ @retval EFI_NOT_FOUND Could not find information.
+ @retval EFI_OUT_OF_RESOURCES Could not allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+BuildSsdtSerialPortTable (
+ IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo,
+ IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo,
+ IN CONST CHAR8 *Name,
+ IN CONST UINT64 Uid,
+ OUT EFI_ACPI_DESCRIPTION_HEADER **Table
+ )
+{
+ AML_OBJECT_NODE_HANDLE DeviceNode;
+ AML_OBJECT_NODE_HANDLE ScopeNode;
+ AML_ROOT_NODE_HANDLE RootNode;
+ CONST CHAR8 *NonBsaHid;
+ EFI_STATUS Status;
+ EFI_STATUS Status1;
+ UINT32 EisaId;
+
+ ASSERT (AcpiTableInfo != NULL);
+ ASSERT (SerialPortInfo != NULL);
+ ASSERT (Name != NULL);
+ ASSERT (Table != NULL);
+
+ // Validate the Serial Port Info.
+ Status = ValidateSerialPortInfo (SerialPortInfo, 1);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = AmlCodeGenDefinitionBlock (
+ "SSDT",
+ "AMDINC",
+ "SERIAL",
+ 0x01,
+ &RootNode
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML Definition Block."
+ " Status = %r\n",
+ Status
+ ));
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ Status = AmlCodeGenScope ("\\_SB_", RootNode, &ScopeNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML Scope Node."
+ " Status = %r\n",
+ Status
+ ));
+ goto exit_handler;
+ }
+
+ // Create the Device Node, COMx, where x is the Uid.
+ Status = AmlCodeGenDevice (Name, ScopeNode, &DeviceNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML Device Node."
+ " Status = %r\n",
+ Status
+ ));
+ goto exit_handler;
+ }
+
+ NonBsaHid = (CONST CHAR8 *)PcdGetPtr (PcdNonBsaCompliant16550SerialHid);
+ if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS) {
+ if ((NonBsaHid != NULL) && (AsciiStrLen (NonBsaHid) != 0)) {
+ if (!(IsValidPnpId (NonBsaHid) || IsValidAcpiId (NonBsaHid))) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Invalid Supplied HID %a.\n",
+ NonBsaHid
+ ));
+ goto exit_handler;
+ }
+
+ Status = AmlCodeGenNameString (
+ "_HID",
+ NonBsaHid,
+ DeviceNode,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _HID Node."
+ " Status = %r\n",
+ Status
+ ));
+ goto exit_handler;
+ }
+ }
+ }
+
+ if ((SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) ||
+ ((SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS) &&
+ ((NonBsaHid == NULL) || (AsciiStrLen (NonBsaHid) == 0))))
+ {
+ Status = AmlGetEisaIdFromString ("PNP0501", &EisaId);
+ if (EFI_ERROR (Status)) {
+ goto exit_handler;
+ }
+
+ Status = AmlCodeGenNameInteger ("_HID", EisaId, DeviceNode, NULL);
+ if (EFI_ERROR (Status)) {
+ goto exit_handler;
+ }
+
+ Status = AmlGetEisaIdFromString ("PNP0500", &EisaId);
+ if (EFI_ERROR (Status)) {
+ goto exit_handler;
+ }
+
+ Status = AmlCodeGenNameInteger ("_CID", EisaId, DeviceNode, NULL);
+ if (EFI_ERROR (Status)) {
+ goto exit_handler;
+ }
+ }
+
+ // _UID
+ Status = AmlCodeGenNameInteger ("_UID", Uid, DeviceNode, NULL);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _UID Node."
+ " Status = %r\n",
+ Status
+ ));
+ goto exit_handler;
+ }
+
+ // _DDN
+ Status = AmlCodeGenNameString ("_DDN", Name, DeviceNode, NULL);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _DDN Node."
+ " Status = %r\n",
+ Status
+ ));
+ goto exit_handler;
+ }
+
+ // _STA
+ Status = AmlCodeGenMethodRetInteger (
+ "_STA",
+ 0x0F,
+ 0,
+ FALSE,
+ 0,
+ DeviceNode,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _STA Node."
+ " Status = %r\n",
+ Status
+ ));
+ goto exit_handler;
+ }
+
+ Status = CreateSerialPortCrs (SerialPortInfo, Name, DeviceNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create _CRS for Serial Port."
+ " Status = %r\n",
+ Status
+ ));
+ goto exit_handler;
+ }
+
+ // Serialize the tree.
+ Status = AmlSerializeDefinitionBlock (
+ RootNode,
+ Table
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to Serialize SSDT Table Data."
+ " Status = %r\n",
+ Status
+ ));
+ }
+
+ return EFI_SUCCESS;
+
+exit_handler:
+ // Cleanup
+ if (RootNode != NULL) {
+ Status1 = AmlDeleteTree (RootNode);
+ if (EFI_ERROR (Status1)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to cleanup AML tree."
+ " Status = %r\n",
+ Status1
+ ));
+ // If Status was success but we failed to delete the AML Tree
+ // return Status1 else return the original error code, i.e. Status.
+ if (!EFI_ERROR (Status)) {
+ return Status1;
+ }
+ }
+ }
+
+ return Status;
+}
+
+/** Free an SSDT table previously created by
+ the BuildSsdtSerialTable function.
+
+ @param [in] Table Pointer to a SSDT table allocated by
+ the BuildSsdtSerialTable function.
+
+ @retval EFI_SUCCESS Success.
+**/
+EFI_STATUS
+EFIAPI
+FreeSsdtSerialPortTable (
+ IN EFI_ACPI_DESCRIPTION_HEADER *Table
+ )
+{
+ ASSERT (Table != NULL);
+ FreePool (Table);
+ return EFI_SUCCESS;
+}
diff --git a/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf
new file mode 100644
index 0000000..73ae99b
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf
@@ -0,0 +1,32 @@
+## @file
+# SSDT Serial Port fixup Library
+#
+# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 1.30
+ BASE_NAME = DynamicSsdtSerialPortFixupLib
+ FILE_GUID = 83F367CE-9EA3-4A5B-B61F-60E06CA7D9FF
+ VERSION_STRING = 1.0
+ MODULE_TYPE = DXE_DRIVER
+ LIBRARY_CLASS = SsdtSerialPortFixupLib
+
+[Sources]
+ SsdtSerialPortFixupLib.c
+
+[Packages.common]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ EmbeddedPkg/EmbeddedPkg.dec
+ DynamicTablesPkg/DynamicTablesPkg.dec
+
+[LibraryClasses]
+ AcpiHelperLib
+ AmlLib
+ BaseLib
+
+[Pcd]
+ gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdNonBsaCompliant16550SerialHid
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
index bf0d7b0..8be5eab 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
@@ -2,7 +2,7 @@
AML Resource Data Code Generation.
Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.<BR>
- Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+ Copyright (C) 2023 - 2025 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -1670,3 +1670,461 @@ error_handler:
return Status;
}
+
+/** Code generation for the IRQ Descriptor.
+
+ The Resource Data effectively created is an IRQ Resource
+ Data. Cf ACPI 6.5 specification:
+ - s6.4.2.1 "IRQ Descriptor"
+ - s19.6.66 "IRQ (Interrupt Resource Descriptor Macro)"
+
+
+ The created resource data node can be:
+ - appended to the list of resource data elements of the NameOpNode.
+ In such case NameOpNode must be defined by a the "Name ()" ASL statement
+ and initially contain a "ResourceTemplate ()".
+ - returned through the NewRdNode parameter.
+
+ @param [in] IsEdgeTriggered The interrupt is edge triggered or
+ level triggered.
+ @param [in] IsActiveLow The interrupt is active-high or active-low.
+ @param [in] IsShared The interrupt can be shared with other
+ devices or not (Exclusive).
+ @param [in] IrqList List of IRQ numbers. Must be non-NULL.
+ @param [in] IrqCount Number of IRQs in IrqList. Must be > 0 and <= 16.
+ @param [in] NameOpNode NameOp object node defining a named object.
+ If provided, append the new resource data node
+ to the list of resource data elements of this node.
+ @param [out] NewRdNode If provided and success, contain the created node.
+
+ @retval EFI_SUCCESS The function completed successfully.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval various Other errors as indicated.
+**/
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdIrq (
+ IN BOOLEAN IsEdgeTriggered,
+ IN BOOLEAN IsActiveLow,
+ IN BOOLEAN IsShared,
+ IN UINT8 *IrqList,
+ IN UINT8 IrqCount,
+ IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL,
+ OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL
+ )
+{
+ AML_DATA_NODE *RdNode;
+ EFI_ACPI_IRQ_DESCRIPTOR IrqDesc;
+ EFI_STATUS Status;
+ UINT8 Index;
+ UINT16 Mask;
+
+ if ((NameOpNode == NULL) && (NewRdNode == NULL)) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((IsEdgeTriggered && !IsActiveLow) ||
+ (!IsEdgeTriggered && IsActiveLow))
+ {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((IrqList == NULL) || (IrqCount == 0) || (IrqCount > 16)) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Mask = 0;
+ for (Index = 0; Index < IrqCount; Index++) {
+ if (IrqList[Index] > 16) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((Mask & (1 << IrqList[Index])) != 0) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Mask |= (1 << IrqList[Index]);
+ }
+
+ if (Mask == 0) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ IrqDesc.Header.Bits.Type = ACPI_SMALL_ITEM_FLAG;
+ IrqDesc.Header.Bits.Name = ACPI_SMALL_IRQ_DESCRIPTOR_NAME;
+ IrqDesc.Header.Bits.Length = sizeof (EFI_ACPI_IRQ_DESCRIPTOR) -
+ sizeof (ACPI_SMALL_RESOURCE_HEADER);
+ IrqDesc.Mask = Mask;
+ IrqDesc.Information = (IsEdgeTriggered ? BIT0 : 0) |
+ (IsActiveLow ? BIT3 : 0) |
+ (IsShared ? BIT4 : 0);
+
+ Status = AmlCreateDataNode (
+ EAmlNodeDataTypeResourceData,
+ (UINT8 *)&IrqDesc,
+ sizeof (EFI_ACPI_IRQ_DESCRIPTOR),
+ &RdNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ return LinkRdNode (RdNode, NameOpNode, NewRdNode);
+}
+
+/** Code generation for the UART Serial Bus Connection Resource Descriptor.
+
+ The Resource Data effectively created is a UART Serial Bus Connection
+ Resource Descriptor Resource Data.
+ Cf ACPI 6.5:
+ - s19.6.143 UARTSerialBusV2
+ (UART Serial Bus Connection Resource Descriptor Version 2 Macro)
+ - s6.4.3.8.2.3 UART Serial Bus Connection Resource Descriptor
+
+ The created resource data node can be:
+ - appended to the list of resource data elements of the NameOpNode.
+ In such case NameOpNode must be defined by a the "Name ()" ASL statement
+ and initially contain a "ResourceTemplate ()".
+ - returned through the NewRdNode parameter.
+
+ @param [in] IsResourceConsumer ResourceUsage parameter.
+ @param [in] IsSlaveMode Indicates whether the uart operates in slave mode.
+ @param [in] IsBigEndian Indicates whether the bit transfer is big-endian.
+ @param [in] BitsPerByte Indicates the number of bits per byte.
+ @param [in] StopBits Specifies the stop bits format used.
+ @param [in] FlowControl Specifies the flow control protocol used.
+ @param [in] BaudRate Specifies the baud rate.
+ @param [in] RxFifo Number of bytes in the receiver FIFO.
+ @param [in] TxFifo Number of bytes in the transmitter FIFO.
+ @param [in] Parity Specifies the parity format used.
+ @param [in] SerialLinesEnabled Specifies which serial lines are enabled.
+ @param [in] VendorDefinedData VendorDefinedData parameter.
+ @param [in] VendorDefinedDataLength VendorDefinedDataLength parameter.
+ @param [in] ResourceSource Name of source resource used.
+ @param [in] ResourceSourceLength Resource Source Length.
+ @param [in] NameOpNode NameOpNode object node defining a named object.
+ If provided, append the new resource data
+ node to the list of resource data elements
+ of this node.
+ @param [out] NewRdNode If provided and success,
+ contain the created node.
+
+ @retval EFI_SUCCESS The function completed successfully.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Could not allocate memory.
+ @retval various Other errors as indicated.
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdUartSerialBus (
+ IN BOOLEAN IsResourceConsumer,
+ IN BOOLEAN IsSlaveMode,
+ IN BOOLEAN IsBigEndian,
+ IN UINT8 BitsPerByte,
+ IN UINT8 StopBits,
+ IN UINT8 FlowControl,
+ IN UINT32 BaudRate,
+ IN UINT16 RxFifo,
+ IN UINT16 TxFifo,
+ IN UINT8 Parity,
+ IN UINT8 SerialLinesEnabled,
+ IN UINT8 *VendorDefinedData OPTIONAL,
+ IN UINT16 VendorDefinedDataLength,
+ IN CHAR8 *ResourceSource,
+ IN UINT16 ResourceSourceLength,
+ IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL,
+ OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL
+ )
+{
+ AML_DATA_NODE *RdNode;
+ EFI_STATUS Status;
+ UINT16 UartDescBuffLength;
+ UINT8 *UartDescBuff;
+ UINT8 BitsPerByteMask;
+
+ EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR UartDesc;
+
+ if ((NameOpNode == NULL) && (NewRdNode == NULL)) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (((VendorDefinedData == NULL) && (VendorDefinedDataLength > 0)) ||
+ ((VendorDefinedData != NULL) && (VendorDefinedDataLength == 0)))
+ {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((ResourceSource == NULL) || (ResourceSourceLength <= 0)) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (StopBits > EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_2) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (FlowControl > EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_XON_XOFF) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Parity > EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_SPACE) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ switch (BitsPerByte) {
+ case 5:
+ BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_5_BITS_PER_BYTE;
+ break;
+ case 6:
+ BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_6_BITS_PER_BYTE;
+ break;
+ case 7:
+ BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_7_BITS_PER_BYTE;
+ break;
+ case 8:
+ BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_8_BITS_PER_BYTE;
+ break;
+ case 9:
+ BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_9_BITS_PER_BYTE;
+ break;
+ default:
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ /// as per spec last two bits are reserved and must be 0.
+ if ((SerialLinesEnabled &
+ ~(EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RTS |
+ EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_CTS |
+ EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTR |
+ EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DSR |
+ EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RI |
+ EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTD)) != 0)
+ {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ UartDesc.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG;
+ UartDesc.Header.Header.Bits.Name = ACPI_LARGE_GENERIC_SERIAL_BUS_CONNECTION_DESCRIPTOR_NAME;
+ UartDesc.RevisionId = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_REVISION_ID;
+ UartDesc.ResourceSourceIndex = 0;
+ UartDesc.SerialBusType = EFI_ACPI_SERIAL_BUS_RESOURCE_TYPE_UART;
+ UartDesc.GeneralFlags = (IsResourceConsumer ? BIT1 : 0) |
+ (IsSlaveMode ? BIT0 : 0);
+ UartDesc.TypeSpecificFlags = (IsBigEndian ? BIT7 : 0) |
+ (BitsPerByteMask << 4) |
+ (StopBits << 2) |
+ (FlowControl);
+ UartDesc.TypeSpecificRevisionId = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_REVISION_ID;
+ /// TypeDataLength is the length of the data following the TypeDataLength,
+ /// up to the Additional vendor supplied data (not included).
+ UartDesc.TypeDataLength = sizeof (UartDesc.DefaultBaudRate) +
+ sizeof (UartDesc.RxFIFO) +
+ sizeof (UartDesc.TxFIFO) +
+ sizeof (UartDesc.Parity) +
+ sizeof (UartDesc.SerialLinesEnabled) +
+ VendorDefinedDataLength;
+ UartDesc.DefaultBaudRate = BaudRate;
+ UartDesc.RxFIFO = RxFifo;
+ UartDesc.TxFIFO = TxFifo;
+ UartDesc.Parity = Parity;
+ UartDesc.SerialLinesEnabled = SerialLinesEnabled;
+
+ UartDescBuffLength = sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR) +
+ VendorDefinedDataLength +
+ ResourceSourceLength;
+
+ UartDesc.Header.Length = UartDescBuffLength - sizeof (ACPI_LARGE_RESOURCE_HEADER);
+
+ UartDescBuff = AllocateZeroPool (UartDescBuffLength);
+ if (UartDescBuff == NULL) {
+ ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ CopyMem (
+ UartDescBuff,
+ &UartDesc,
+ sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR)
+ );
+
+ if (VendorDefinedData != NULL) {
+ CopyMem (
+ UartDescBuff + sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR),
+ VendorDefinedData,
+ VendorDefinedDataLength
+ );
+ }
+
+ CopyMem (
+ UartDescBuff +
+ sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR) +
+ VendorDefinedDataLength,
+ ResourceSource,
+ ResourceSourceLength
+ );
+
+ Status = AmlCreateDataNode (
+ EAmlNodeDataTypeResourceData,
+ UartDescBuff,
+ UartDescBuffLength,
+ &RdNode
+ );
+ FreePool (UartDescBuff);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ return LinkRdNode (RdNode, NameOpNode, NewRdNode);
+}
+
+/** Code generation for the UARTSerialBusV2() ASL macro.
+
+ The Resource Data effectively created is a UART Serial Bus Connection
+ Resource Descriptor Resource Data.
+ Cf ACPI 6.5:
+ - s19.6.143 UARTSerialBusV2
+ (UART Serial Bus Connection Resource Descriptor Version 2 Macro)
+ - s6.4.3.8.2.3 UART Serial Bus Connection Resource Descriptor
+
+ The created resource data node can be:
+ - appended to the list of resource data elements of the NameOpNode.
+ In such case NameOpNode must be defined by a the "Name ()" ASL statement
+ and initially contain a "ResourceTemplate ()".
+ - returned through the NewRdNode parameter.
+
+ @param [in] InitialBaudRate Initial baud rate.
+ @param [in] BitsPerByte Number of bits per byte.
+ Optional, default is 8.
+ @param [in] StopBits Number of stop bits.
+ Optional, default is 1.
+ @param [in] LinesInUse Number of lines in use.
+ @param [in] IsBigEndian Indicates whether the bit transfer is big-endian.
+ Optional, default is FALSE (little-endian).
+ @param [in] Parity Parity format used.
+ Optional, default is no parity.
+ @param [in] FlowControl Flow control protocol used.
+ Optional, default is no flow control.
+ @param [in] ReceiveBufferSize Size of the receive buffer.
+ @param [in] TransmitBufferSize Size of the transmit buffer.
+ @param [in] ResourceSource Name of source resource used.
+ @param [in] ResourceSourceLength Length of the Resource Source.
+ @param [in] ResourceSourceIndex Resource Source index.
+ Optional, default is 0.
+ @param [in] ResourceUsage Resource usage, TRUE for consumer,
+ FALSE for producer.
+ Optional, default is TRUE (consumer).
+ @param [in] IsShared Indicates whether the resource is shared.
+ Optional, default is FALSE (exclusive).
+ @param [in] VendorDefinedData Vendor defined data.
+ Optional, can be NULL.
+ @param [in] VendorDefinedDataLength Length of the vendor defined data.
+ @param [in] NameOpNode NameOp object node defining a named object.
+ If provided, append the new resource data
+ node to the list of resource data elements
+ of this node.
+ @param [out] NewRdNode If provided and success,
+ contain the created node.
+
+ @retval EFI_SUCCESS The function completed successfully.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval various Various failure values of called functions.
+**/
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdUartSerialBusV2 (
+ IN UINT32 InitialBaudRate,
+ IN UINT8 *BitsPerByte OPTIONAL,
+ IN UINT8 *StopBits OPTIONAL,
+ IN UINT8 LinesInUse,
+ IN BOOLEAN *IsBigEndian OPTIONAL,
+ IN UINT8 *Parity OPTIONAL,
+ IN UINT8 *FlowControl OPTIONAL,
+ IN UINT16 ReceiveBufferSize,
+ IN UINT16 TransmitBufferSize,
+ IN CHAR8 *ResourceSource,
+ IN UINT16 ResourceSourceLength,
+ IN UINT8 *ResourceSourceIndex OPTIONAL,
+ IN BOOLEAN *ResourceUsage OPTIONAL,
+ IN BOOLEAN *IsShared OPTIONAL,
+ IN UINT8 *VendorDefinedData OPTIONAL,
+ IN UINT16 VendorDefinedDataLength,
+ IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL,
+ OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL
+ )
+{
+ EFI_STATUS Status;
+
+ if ((NameOpNode == NULL) && (NewRdNode == NULL)) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (((VendorDefinedData == NULL) && (VendorDefinedDataLength > 0)) ||
+ ((VendorDefinedData != NULL) && (VendorDefinedDataLength == 0)))
+ {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((ResourceSource == NULL) || (ResourceSourceLength <= 0)) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (ResourceSourceIndex != NULL) {
+ if (*ResourceSourceIndex != 0) {
+ ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
+ return EFI_INVALID_PARAMETER;
+ }
+ }
+
+ Status = AmlCodeGenRdUartSerialBus (
+ /// default is resource consumer
+ (ResourceUsage != NULL) ? *ResourceUsage : TRUE,
+ /// slave mode
+ TRUE,
+ /// default is little-endian
+ (IsBigEndian != NULL) ? *IsBigEndian : FALSE,
+ /// default is 8 bits per byte
+ (BitsPerByte != NULL) ? *BitsPerByte : 8,
+ /// default is 1 stop bit
+ (StopBits != NULL) ? *StopBits : EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_1,
+ /// default is no flow control
+ (FlowControl != NULL) ? *FlowControl : EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_NONE,
+ InitialBaudRate,
+ ReceiveBufferSize,
+ TransmitBufferSize,
+ /// default is no parity
+ (Parity != NULL) ? *Parity : EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_NONE,
+ LinesInUse,
+ VendorDefinedData,
+ VendorDefinedDataLength,
+ ResourceSource,
+ ResourceSourceLength,
+ NameOpNode,
+ NewRdNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ return Status;
+}
diff --git a/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h b/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h
index d017a9e..d5b2f15 100644
--- a/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h
+++ b/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h
@@ -11,10 +11,10 @@
#include <Protocol/HardwareInterrupt.h>
-// 22838932-1a2d-4a47-aaba-f3f7cf569470
+// 32898322-2da1-474a-baaa-f3f7cf569470
#define EFI_HARDWARE_INTERRUPT2_PROTOCOL_GUID \
- { 0x32898322, 0x2d1a, 0x474a, \
+ { 0x32898322, 0x2da1, 0x474a, \
{ 0xba, 0xaa, 0xf3, 0xf7, 0xcf, 0x56, 0x94, 0x70 } }
typedef enum {
diff --git a/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm
index 3066156..3552f54 100644
--- a/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm
+++ b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm
@@ -1,7 +1,7 @@
;; @file
; Provide FSP API entry points.
;
-; Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2022 - 2025, Intel Corporation. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;;
DEFAULT REL
@@ -173,6 +173,24 @@ NotMultiPhaseMemoryInitApi:
push rdx
SkipPagetableSave:
+ ; Save Segment registers
+ mov rdx, ss
+ push rdx
+ mov rdx, gs
+ push rdx
+ mov rdx, fs
+ push rdx
+ mov rdx, es
+ push rdx
+ mov rdx, ds
+ push rdx
+ mov rdx, cs
+ push rdx
+
+ ; Reserve 16 bytes for GDT save/restore
+ sub rsp, 16
+ sgdt [rsp]
+
; Reserve 16 bytes for IDT save/restore
sub rsp, 16
sidt [rsp]
diff --git a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm
index b0b6b6a..873adb2 100644
--- a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm
+++ b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm
@@ -1,7 +1,7 @@
;; @file
; Provide FSP API entry points.
;
-; Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2022 - 2025, Intel Corporation. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;;
DEFAULT REL
@@ -141,6 +141,24 @@ ASM_PFX(FspApiCommonContinue):
push rdx
SkipPagetableSave:
+ ; Save Segment registers
+ mov rdx, ss
+ push rdx
+ mov rdx, gs
+ push rdx
+ mov rdx, fs
+ push rdx
+ mov rdx, es
+ push rdx
+ mov rdx, ds
+ push rdx
+ mov rdx, cs
+ push rdx
+
+ ; Reserve 16 bytes for GDT save/restore
+ sub rsp, 16
+ sgdt [rsp]
+
; Reserve 16 bytes for IDT save/restore
sub rsp, 16
sidt [rsp]
diff --git a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c
index f1b1a5e..9cb3d52 100644
--- a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c
+++ b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c
@@ -31,7 +31,9 @@ typedef struct {
} CONTEXT_STACK;
typedef struct {
- UINT64 Idtr[2]; // IDTR Limit - bit0:bi15, IDTR Base - bit16:bit79
+ UINT64 Idtr[2]; // IDTR Limit - bit0:bit15, IDTR Base - bit16:bit79
+ UINT64 Gdtr[2]; // GDTR Limit - bit0:bit15, GDTR Base - bit16:bit79
+ UINT64 Segment[6]; // Segment Registers: CS, DS, ES, FS, GS, SS
UINT64 Cr0;
UINT64 Cr3;
UINT64 Cr4;
diff --git a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm
index f40df51..d77f59b 100644
--- a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm
+++ b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm
@@ -1,6 +1,6 @@
;------------------------------------------------------------------------------
;
-; Copyright (c) 2022 - 2023, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2022 - 2025, Intel Corporation. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
; Abstract:
@@ -92,6 +92,25 @@ ASM_PFX(FspSwitchStack):
push rdx
SkipPagetableSave:
+ ; Save Segment registers
+ mov rdx, ss
+ push rdx
+ mov rdx, gs
+ push rdx
+ mov rdx, fs
+ push rdx
+ mov rdx, es
+ push rdx
+ mov rdx, ds
+ push rdx
+ mov rdx, cs
+ push rdx
+
+ ; Reserve 16 bytes for GDT save/restore
+ sub rsp, 16
+ sgdt [rsp]
+
+ ; Reserve 16 bytes for IDT save/restore
sub rsp, 16
sidt [rsp]
@@ -106,6 +125,26 @@ SkipPagetableSave:
lidt [rsp]
add rsp, 16
+ ; Restore GDTR
+ lgdt [rsp]
+ add rsp, 16
+
+ ; Restore Segment registers
+ lea rdx, [.0]
+ push rdx ; Push return address
+ retfq ; Far return to restore CS (uses CS from stack + return address)
+.0:
+ pop rdx
+ mov ds, dx
+ pop rdx
+ mov es, dx
+ pop rdx
+ mov fs, dx
+ pop rdx
+ mov gs, dx
+ pop rdx
+ mov ss, dx
+
lea rax, [ASM_PFX(FeaturePcdGet (PcdFspSaveRestorePageTableEnable))]
mov al, byte [rax]
cmp al, 0
diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c
index 8d12f93..71d267b 100644
--- a/MdeModulePkg/Core/Dxe/Image/Image.c
+++ b/MdeModulePkg/Core/Dxe/Image/Image.c
@@ -584,6 +584,9 @@ CoreLoadPeImage (
EFI_STATUS Status;
BOOLEAN DstBufAlocated;
UINTN Size;
+ UINTN Index;
+ UINTN StartIndex;
+ CHAR8 EfiFileName[512];
ZeroMem (&Image->ImageContext, sizeof (Image->ImageContext));
@@ -823,12 +826,6 @@ CoreLoadPeImage (
// Print the load address and the PDB file name if it is available
//
- DEBUG_CODE_BEGIN ();
-
- UINTN Index;
- UINTN StartIndex;
- CHAR8 EfiFileName[256];
-
DEBUG ((
DEBUG_INFO | DEBUG_LOAD,
"Loading driver at 0x%11p EntryPoint=0x%11p ",
@@ -877,8 +874,6 @@ CoreLoadPeImage (
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n"));
- DEBUG_CODE_END ();
-
return EFI_SUCCESS;
Done:
diff --git a/MdeModulePkg/Core/Pei/Image/Image.c b/MdeModulePkg/Core/Pei/Image/Image.c
index cee9f09..f74406f 100644
--- a/MdeModulePkg/Core/Pei/Image/Image.c
+++ b/MdeModulePkg/Core/Pei/Image/Image.c
@@ -623,6 +623,10 @@ PeiLoadImageLoadImage (
UINT16 Machine;
EFI_SECTION_TYPE SearchType1;
EFI_SECTION_TYPE SearchType2;
+ CHAR8 *AsciiString;
+ CHAR8 EfiFileName[512];
+ UINTN Index;
+ UINTN StartIndex;
*EntryPoint = 0;
ImageSize = 0;
@@ -706,12 +710,6 @@ PeiLoadImageLoadImage (
*ImageSizeArg = ImageSize;
}
- DEBUG_CODE_BEGIN ();
- CHAR8 *AsciiString;
- CHAR8 EfiFileName[512];
- INT32 Index;
- INT32 StartIndex;
-
//
// Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi
//
@@ -764,8 +762,6 @@ PeiLoadImageLoadImage (
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "%a", EfiFileName));
}
- DEBUG_CODE_END ();
-
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n"));
return EFI_SUCCESS;
diff --git a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c
index bb789e5..2011db1 100644
--- a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c
+++ b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c
@@ -325,6 +325,9 @@ SmmLoadImage (
EFI_DEVICE_PATH_PROTOCOL *HandleFilePath;
EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
+ UINTN Index;
+ UINTN StartIndex;
+ CHAR8 EfiFileName[512];
PERF_LOAD_IMAGE_BEGIN (DriverEntry->ImageHandle);
@@ -664,12 +667,6 @@ SmmLoadImage (
// Print the load address and the PDB file name if it is available
//
- DEBUG_CODE_BEGIN ();
-
- UINTN Index;
- UINTN StartIndex;
- CHAR8 EfiFileName[256];
-
DEBUG ((
DEBUG_INFO | DEBUG_LOAD,
"Loading SMM driver at 0x%11p EntryPoint=0x%11p ",
@@ -718,8 +715,6 @@ SmmLoadImage (
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n"));
- DEBUG_CODE_END ();
-
//
// Free buffer allocated by Fv->ReadSection.
//
diff --git a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c
index a7f0225..7d32d9a 100644
--- a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c
+++ b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c
@@ -1096,10 +1096,8 @@ ConPlatformMatchDevicePaths (
//
// If performing Delete operation, the NewDevicePath must not be NULL.
//
- if (Delete) {
- if (NewDevicePath == NULL) {
- return EFI_INVALID_PARAMETER;
- }
+ if (Delete && (NewDevicePath == NULL)) {
+ return EFI_INVALID_PARAMETER;
}
TempDevicePath1 = NULL;
@@ -1178,6 +1176,8 @@ ConPlatformUpdateDeviceVariable (
EFI_DEVICE_PATH_PROTOCOL *VariableDevicePath;
EFI_DEVICE_PATH_PROTOCOL *NewVariableDevicePath;
+ Status = EFI_SUCCESS;
+
VariableDevicePath = NULL;
NewVariableDevicePath = NULL;
@@ -1187,7 +1187,7 @@ ConPlatformUpdateDeviceVariable (
// it is the caller's responsibility to free the memory before return.
//
VariableDevicePath = ConPlatformGetVariable (VariableName);
-
+ // At this point, VariableDevicePath may be null. This is expected.
if (Operation != Delete) {
//
// Match specified DevicePath in Console Variable.
diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
index facb813..50a88f5 100644
--- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
+++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
@@ -257,7 +257,10 @@ InitializeGraphicsConsoleTextMode (
// Reserve 2 modes for 80x25, 80x50 of graphics console.
//
NewModeBuffer = AllocateZeroPool (sizeof (GRAPHICS_CONSOLE_MODE_DATA) * (Count + 2));
- ASSERT (NewModeBuffer != NULL);
+ if (NewModeBuffer == NULL) {
+ ASSERT (NewModeBuffer != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
//
// Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec.
@@ -422,7 +425,7 @@ GraphicsConsoleControllerDriverStart (
//
MaxMode = Private->GraphicsOutput->Mode->MaxMode;
- for (ModeIndex = 0; ModeIndex < MaxMode; ModeIndex++) {
+ for (ModeIndex = 0; (UINTN)ModeIndex < MaxMode; ModeIndex++) {
Status = Private->GraphicsOutput->QueryMode (
Private->GraphicsOutput,
ModeIndex,
@@ -1802,7 +1805,10 @@ RegisterFontPackage (
PackageLength = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + mNarrowFontSize + 4;
Package = AllocateZeroPool (PackageLength);
- ASSERT (Package != NULL);
+ if (Package == NULL) {
+ ASSERT (Package != NULL);
+ return;
+ }
WriteUnaligned32 ((UINT32 *)Package, PackageLength);
SimplifiedFont = (EFI_HII_SIMPLE_FONT_PACKAGE_HDR *)(Package + 4);
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
index 50f79f5..2f45571 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
@@ -1265,19 +1265,21 @@ TerminalRemoveConsoleDevVariable (
FreePool (OriginalVariable);
if (FoundOne) {
- VariableSize = GetDevicePathSize (NewVariable);
-
- Status = gRT->SetVariable (
- VariableName,
- &gEfiGlobalVariableGuid,
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
- VariableSize,
- NewVariable
- );
- //
- // Shrinking variable with existing variable driver implementation shouldn't fail.
- //
- ASSERT_EFI_ERROR (Status);
+ if (NewVariable != NULL) {
+ VariableSize = GetDevicePathSize (NewVariable);
+
+ Status = gRT->SetVariable (
+ VariableName,
+ &gEfiGlobalVariableGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+ VariableSize,
+ NewVariable
+ );
+ //
+ // Shrinking variable with existing variable driver implementation shouldn't fail.
+ //
+ ASSERT_EFI_ERROR (Status);
+ }
}
if (NewVariable != NULL) {
diff --git a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c
index 0252db1..42ab3f1 100644
--- a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c
+++ b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c
@@ -562,6 +562,10 @@ FvSimpleFileSystemOpen (
// NewFileNameLength = FileNameLength + 1 + 4 = (Number of non-null character) + (file extension) + (a null character)
NewFileNameLength = FileNameLength + 1 + 4;
FileNameWithExtension = AllocatePool (NewFileNameLength * 2);
+ if (FileNameWithExtension == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
StrCpyS (FileNameWithExtension, NewFileNameLength, FileName);
StrCatS (FileNameWithExtension, NewFileNameLength, L".EFI");
diff --git a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c
index 3f96407..5d7fdaa 100644
--- a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c
+++ b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c
@@ -450,7 +450,10 @@ FvSimpleFileSystemDriverStart (
// Create an instance
//
Instance = AllocateZeroPool (sizeof (FV_FILESYSTEM_INSTANCE));
- ASSERT (Instance != NULL);
+ if (Instance == NULL) {
+ ASSERT (Instance != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
Instance->Root = NULL;
Instance->FvProtocol = FvProtocol;
diff --git a/MdePkg/Include/IndustryStandard/Acpi50.h b/MdePkg/Include/IndustryStandard/Acpi50.h
index c98c35f..dd96ab5 100644
--- a/MdePkg/Include/IndustryStandard/Acpi50.h
+++ b/MdePkg/Include/IndustryStandard/Acpi50.h
@@ -132,6 +132,40 @@ typedef PACKED struct {
UINT16 DeviceSelection;
} EFI_ACPI_SERIAL_BUS_RESOURCE_SPI_DESCRIPTOR;
+/// Revision ID of serial bus uart descriptor
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_REVISION_ID 0x1
+
+/// Type specific flags
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_LITTLE_ENDIAN 0x0
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_BIG_ENDIAN 0x1
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_5_BITS_PER_BYTE 0x0
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_6_BITS_PER_BYTE 0x1
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_7_BITS_PER_BYTE 0x2
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_8_BITS_PER_BYTE 0x3
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_9_BITS_PER_BYTE 0x4
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_NONE 0x0
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_1 0x1
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_1_5 0x2
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_2 0x3
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_NONE 0x0
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_HW 0x1
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_XON_XOFF 0x2
+
+/// Parity definitions
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_NONE 0x0
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_EVEN 0x1
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_ODD 0x2
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_MARK 0x3
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_SPACE 0x4
+
+/// Serial lines in use bits
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RTS BIT7
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_CTS BIT6
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTR BIT5
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DSR BIT4
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RI BIT3
+#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTD BIT2
+
///
/// Serial Bus Resource Descriptor (UART)
///
diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h
index b951668..b7bc8ea 100644
--- a/MdePkg/Include/IndustryStandard/Acpi66.h
+++ b/MdePkg/Include/IndustryStandard/Acpi66.h
@@ -206,7 +206,7 @@ typedef struct {
/// FADT Version (as defined in ACPI 6.6 spec.)
///
#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_REVISION 0x06
-#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_MINOR_REVISION 0x05
+#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_MINOR_REVISION 0x06
//
// Fixed ACPI Description Table Preferred Power Management Profile
@@ -324,7 +324,7 @@ typedef struct {
///
/// MADT Revision (as defined in ACPI 6.6 spec.)
///
-#define EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION 0x06
+#define EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION 0x07
///
/// Multiple APIC Flags
@@ -361,6 +361,10 @@ typedef struct {
#define EFI_ACPI_6_6_MSI_PIC 0x15
#define EFI_ACPI_6_6_BIO_PIC 0x16
#define EFI_ACPI_6_6_LPC_PIC 0x17
+#define EFI_ACPI_6_6_RINTC 0x18
+#define EFI_ACPI_6_6_IMSIC 0x19
+#define EFI_ACPI_6_6_APLIC 0x1A
+#define EFI_ACPI_6_6_PLIC 0x1B
//
// APIC Structure Definitions
@@ -746,6 +750,83 @@ typedef struct {
} EFI_ACPI_6_6_LPC_PIC_STRUCTURE;
///
+/// RISC-V INTC (RINTC)
+///
+typedef struct {
+ UINT8 Type;
+ UINT8 Length;
+ UINT8 Version;
+ UINT8 Reserved;
+ UINT32 Flags;
+ UINT64 HartId;
+ UINT32 Uid;
+ UINT32 ExtIntcId;
+ UINT64 ImsicAddr;
+ UINT32 ImsicSize;
+} EFI_ACPI_6_6_RINTC_STRUCTURE;
+
+#define EFI_ACPI_6_6_RINTC_STRUCTURE_VERSION 1
+
+#define EFI_ACPI_6_6_RINTC_FLAG_ENABLE 1
+
+///
+/// RISC-V Incoming MSI Controller (IMSIC)
+///
+typedef struct {
+ UINT8 Type;
+ UINT8 Length;
+ UINT8 Version;
+ UINT8 Reserved;
+ UINT32 Flags;
+ UINT16 NumIds;
+ UINT16 NumGuestIds;
+ UINT8 GuestIndexBits;
+ UINT8 HartIndexBits;
+ UINT8 GroupIndexBits;
+ UINT8 GroupIndexShift;
+} EFI_ACPI_6_6_IMSIC_STRUCTURE;
+
+#define EFI_ACPI_6_6_IMSIC_STRUCTURE_VERSION 1
+
+///
+/// RISC-V APLIC
+///
+typedef struct {
+ UINT8 Type;
+ UINT8 Length;
+ UINT8 Version;
+ UINT8 Id;
+ UINT32 Flags;
+ UINT8 HwId[8];
+ UINT16 NumIdcs;
+ UINT16 NumSources;
+ UINT32 GsiBase;
+ UINT64 BaseAddr;
+ UINT32 Size;
+} EFI_ACPI_6_6_APLIC_STRUCTURE;
+
+#define EFI_ACPI_6_6_APLIC_STRUCTURE_VERSION 1
+
+///
+/// RISC-V PLIC
+///
+typedef struct {
+ UINT8 Type;
+ UINT8 Length;
+ UINT8 Version;
+ UINT8 Id;
+ UINT8 HwId[8];
+ UINT16 NumIrqs;
+ UINT16 MaxPrio;
+ UINT32 Flags;
+ UINT32 Size;
+ UINT64 BaseAddr;
+ UINT32 GsiBase;
+} EFI_ACPI_6_6_PLIC_STRUCTURE;
+
+#define EFI_ACPI_6_6_PLIC_STRUCTURE_VERSION 1
+
+///
/// Smart Battery Description Table (SBST)
///
typedef struct {
@@ -804,6 +885,8 @@ typedef struct {
#define EFI_ACPI_6_6_GICC_AFFINITY 0x03
#define EFI_ACPI_6_6_GIC_ITS_AFFINITY 0x04
#define EFI_ACPI_6_6_GENERIC_INITIATOR_AFFINITY 0x05
+#define EFI_ACPI_6_6_GENERIC_PORT_AFFINITY 0x06
+#define EFI_ACPI_6_6_RINTC_AFFINITY 0x07
///
/// Processor Local APIC/SAPIC Affinity Structure Definition
@@ -890,6 +973,19 @@ typedef struct {
UINT32 ItsId;
} EFI_ACPI_6_6_GIC_ITS_AFFINITY_STRUCTURE;
+///
+/// RINTC Affinity Structure Definition
+///
+typedef struct {
+ UINT8 Type;
+ UINT8 Length;
+ UINT16 Reserved;
+ UINT32 ProximityDomain;
+ UINT32 AcpiProcessorUid;
+ UINT32 Flags;
+ UINT32 ClockDomain;
+} EFI_ACPI_6_6_RINTC_AFFINITY_STRUCTURE;
+
//
// Generic Initiator Affinity Structure Device Handle Types
// All other values between 0x02 an 0xFF are reserved and
@@ -3024,6 +3120,86 @@ typedef struct {
#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_POWER_LOSS 0x24
#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_POWER_BUTTON 0x25
+typedef struct {
+ EFI_ACPI_DESCRIPTION_HEADER Header;
+ UINT32 Flags;
+ UINT64 TimeBaseFreq;
+ UINT32 NodeCount;
+ UINT32 NodeOffset;
+} EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE;
+
+#define EFI_ACPI_6_6_RHCT_TABLE_REVISION 1
+//
+// RHCT Flags
+//
+#define EFI_ACPI_6_6_RHCT_FLAG_TIMER_CANNOT_WAKEUP_CPU 1
+
+//
+// RHCT subtables
+//
+typedef struct {
+ UINT16 Type;
+ UINT16 Length;
+ UINT16 Revision;
+} EFI_ACPI_6_6_RHCT_NODE_HEADER;
+
+/* Values for RHCT subtable Type above */
+#define EFI_ACPI_6_6_RHCT_NODE_TYPE_ISA_STRING 0x0000
+#define EFI_ACPI_6_6_RHCT_NODE_TYPE_CMO 0x0001
+#define EFI_ACPI_6_6_RHCT_NODE_TYPE_MMU 0x0002
+#define EFI_ACPI_6_6_RHCT_NODE_TYPE_HART_INFO 0xFFFF
+
+//
+// ISA string node structure
+//
+typedef struct {
+ EFI_ACPI_6_6_RHCT_NODE_HEADER Node;
+ UINT16 IsaLength;
+ char Isa[];
+} EFI_ACPI_6_6_RHCT_ISA_STRING_NODE;
+
+#define EFI_ACPI_6_6_RHCT_ISA_NODE_STRUCTURE_VERSION 1
+
+//
+// CMO node structure
+//
+typedef struct {
+ EFI_ACPI_6_6_RHCT_NODE_HEADER Node;
+ UINT8 Reserved;
+ UINT8 CbomBlockSize;
+ UINT8 CbopBlockSize;
+ UINT8 CbozBlockSize;
+} EFI_ACPI_6_6_RHCT_CMO_NODE;
+
+#define EFI_ACPI_6_6_RHCT_CMO_NODE_STRUCTURE_VERSION 1
+
+//
+// MMU node structure
+//
+typedef struct {
+ EFI_ACPI_6_6_RHCT_NODE_HEADER Node;
+ UINT8 Reserved;
+ UINT8 MmuType;
+} EFI_ACPI_6_6_RHCT_MMU_NODE;
+
+#define EFI_ACPI_6_6_RHCT_MMU_NODE_STRUCTURE_VERSION 1
+
+#define EFI_ACPI_6_6_RHCT_MMU_TYPE_SV39 0
+#define EFI_ACPI_6_6_RHCT_MMU_TYPE_SV48 1
+#define EFI_ACPI_6_6_RHCT_MMU_TYPE_SV57 2
+
+//
+// Hart Info node structure
+//
+typedef struct {
+ EFI_ACPI_6_6_RHCT_NODE_HEADER Node;
+ UINT16 NumOffsets;
+ UINT32 Uid;
+ UINT32 Offsets[];
+} EFI_ACPI_6_6_RHCT_HART_INFO_NODE;
+
+#define EFI_ACPI_6_6_RHCT_HART_INFO_NODE_STRUCTURE_VERSION 1
+
//
// Known table signatures
//
@@ -3284,6 +3460,10 @@ typedef struct {
#define EFI_ACPI_6_6_PLATFORM_HEALTH_ASSESSMENT_TABLE_SIGNATURE SIGNATURE_32('P', 'H', 'A', 'T')
///
+/// "RHCT" RISC-V Hart Capabilities Table (RHCT)
+///
+#define EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE_SIGNATURE SIGNATURE_32('R', 'H', 'C', 'T')
+///
/// "SDEI" Software Delegated Exceptions Interface Table
///
#define EFI_ACPI_6_6_SOFTWARE_DELEGATED_EXCEPTIONS_INTERFACE_TABLE_SIGNATURE SIGNATURE_32('S', 'D', 'E', 'I')
diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc
index d941d6d..157aa8e 100644
--- a/OvmfPkg/CloudHv/CloudHvX64.dsc
+++ b/OvmfPkg/CloudHv/CloudHvX64.dsc
@@ -628,7 +628,7 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|FALSE
# UefiCpuPkg PCDs related to initial AP bringup and general AP management.
- gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|64
+ gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|254
gUefiCpuPkgTokenSpaceGuid.PcdCpuBootLogicalProcessorNumber|0
# Set memory encryption mask
diff --git a/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf b/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf
index ebcc7e2..0996968 100644
--- a/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf
+++ b/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf
@@ -42,6 +42,7 @@
BaseMemoryLib
CpuLib
DebugLib
+ HobLib
LocalApicLib
MmServicesTableLib
PcdLib
@@ -53,6 +54,9 @@
gEfiMmCpuIoProtocolGuid ## CONSUMES
gEfiSmmCpuServiceProtocolGuid ## CONSUMES
+[Guids]
+ gUefiOvmfPkgPlatformInfoGuid ## CONSUMES
+
[Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuHotPlugDataAddress ## CONSUMES
gUefiOvmfPkgTokenSpaceGuid.PcdCpuHotEjectDataAddress ## CONSUMES
diff --git a/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm b/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm
index 5399b5f..b38f94c 100644
--- a/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm
+++ b/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm
@@ -41,9 +41,12 @@ SMM_DEFAULT_SMBASE: equ 0x3_0000
; Field offsets in FIRST_SMI_HANDLER_CONTEXT, which resides at
; SMM_DEFAULT_SMBASE.
;
-ApicIdGate: equ 0 ; UINT64
-NewSmbase: equ 8 ; UINT32
-AboutToLeaveSmm: equ 12 ; UINT8
+ApicIdGate: equ 0 ; UINT64
+NewSmbase: equ 8 ; UINT32
+FeatureControlHighValue: equ 12 ; UINT32
+FeatureControlLowValue: equ 16 ; UINT32
+FeatureControl: equ 20 ; UINT8
+AboutToLeaveSmm: equ 21 ; UINT8
;
; SMRAM Save State Map field offsets, per the AMD (not Intel) layout that QEMU
@@ -60,6 +63,11 @@ CPUID_SIGNATURE: equ 0x00
CPUID_EXTENDED_TOPOLOGY: equ 0x0B
CPUID_VERSION_INFO: equ 0x01
+;
+; MSR constants, from "MdePkg/Include/Register/Intel/ArchitecturalMsr.h".
+;
+MSR_IA32_FEATURE_CONTROL: equ 0x0000003A
+
GLOBAL ASM_PFX (mFirstSmiHandler) ; UINT8[]
GLOBAL ASM_PFX (mFirstSmiHandlerSize) ; UINT16
@@ -141,6 +149,18 @@ UpdateSmbase:
; Save it to the SMBASE field whose address we calculated in EBX.
;
mov dword [ds : dword ebx], eax
+
+ ;
+ ; Set MSR_IA32_FEATURE_CONTROL if requested.
+ ;
+ cmp byte [ds : dword (SMM_DEFAULT_SMBASE + FeatureControl)], 0
+ je NoFeatureControl
+ mov ecx, MSR_IA32_FEATURE_CONTROL
+ mov edx, dword [ds : dword (SMM_DEFAULT_SMBASE + FeatureControlHighValue)]
+ mov eax, dword [ds : dword (SMM_DEFAULT_SMBASE + FeatureControlLowValue)]
+ wrmsr
+
+NoFeatureControl:
;
; Set AboutToLeaveSmm.
;
diff --git a/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h b/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h
index 6039532..0c6deed 100644
--- a/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h
+++ b/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h
@@ -36,6 +36,14 @@ typedef struct {
//
UINT32 NewSmbase;
//
+ // The High:Low value for the hot-added CPU to store in
+ // MSR_IA32_FEATURE_CONTROL, assuming MSR_IA32_FEATURE_CONTROL setting is
+ // enabled (i.e., if "FeatureControl" is nonzero).
+ //
+ UINT32 FeatureControlHighValue;
+ UINT32 FeatureControlLowValue;
+ UINT8 FeatureControl;
+ //
// The hot-added CPU sets this field to 1 right before executing the RSM
// instruction. This tells the SMM Monarch to proceed to polling the last
// byte of the normal RAM reserved page (Post-SMM Pen).
diff --git a/OvmfPkg/CpuHotplugSmm/Smbase.c b/OvmfPkg/CpuHotplugSmm/Smbase.c
index dc6f4f4..433633d 100644
--- a/OvmfPkg/CpuHotplugSmm/Smbase.c
+++ b/OvmfPkg/CpuHotplugSmm/Smbase.c
@@ -10,7 +10,9 @@
#include <Library/BaseLib.h> // CpuPause()
#include <Library/BaseMemoryLib.h> // CopyMem()
#include <Library/DebugLib.h> // DEBUG()
+#include <Library/HobLib.h> // GetFirstGuidHob()
#include <Library/LocalApicLib.h> // SendInitSipiSipi()
+#include <Library/PlatformInitLib.h> // EFI_HOB_PLATFORM_INFO
#include <Library/SynchronizationLib.h> // InterlockedCompareExchange64()
#include <Register/Intel/SmramSaveStateMap.h> // SMM_DEFAULT_SMBASE
@@ -132,7 +134,10 @@ SmbaseReleasePostSmmPen (
Note that this effects an "SMRAM to SMRAM" copy.
- Additionally, shut the APIC ID gate in FIRST_SMI_HANDLER_CONTEXT.
+ Additionally, shut the APIC ID gate in FIRST_SMI_HANDLER_CONTEXT, and prepare
+ for configuring MSR_IA32_FEATURE_CONTROL. (The latter depends on a GUID HOB,
+ which does not live in SMRAM; however, if we can't trust the HOB list at this
+ stage, we're doomed anyway.)
This function may only be called from the entry point function of the driver,
and only after PcdQ35SmramAtDefaultSmbase has been determined to be TRUE.
@@ -143,6 +148,7 @@ SmbaseInstallFirstSmiHandler (
)
{
FIRST_SMI_HANDLER_CONTEXT *Context;
+ EFI_HOB_GUID_TYPE *GuidHob;
CopyMem (
(VOID *)(UINTN)(SMM_DEFAULT_SMBASE + SMM_HANDLER_OFFSET),
@@ -152,6 +158,22 @@ SmbaseInstallFirstSmiHandler (
Context = (VOID *)(UINTN)SMM_DEFAULT_SMBASE;
Context->ApicIdGate = MAX_UINT64;
+
+ Context->FeatureControl = 0;
+ GuidHob = GetFirstGuidHob (&gUefiOvmfPkgPlatformInfoGuid);
+ if (GuidHob != NULL) {
+ EFI_HOB_PLATFORM_INFO *Info;
+
+ Info = GET_GUID_HOB_DATA (GuidHob);
+ if (Info->FeatureControl) {
+ Context->FeatureControlHighValue = (UINT32)RShiftU64 (
+ Info->FeatureControlValue,
+ 32
+ );
+ Context->FeatureControlLowValue = (UINT32)Info->FeatureControlValue;
+ Context->FeatureControl = 1;
+ }
+ }
}
/**
diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Library/PlatformInitLib.h
index 2d9c662..dc0c280 100644
--- a/OvmfPkg/Include/Library/PlatformInitLib.h
+++ b/OvmfPkg/Include/Library/PlatformInitLib.h
@@ -64,6 +64,7 @@ typedef struct {
UINT32 S3AcpiReservedMemoryBase;
UINT32 S3AcpiReservedMemorySize;
+ BOOLEAN FeatureControl;
UINT64 FeatureControlValue;
BOOLEAN QemuFwCfgChecked;
diff --git a/OvmfPkg/PlatformPei/FeatureControl.c b/OvmfPkg/PlatformPei/FeatureControl.c
index d2ec496..749a07c 100644
--- a/OvmfPkg/PlatformPei/FeatureControl.c
+++ b/OvmfPkg/PlatformPei/FeatureControl.c
@@ -143,6 +143,7 @@ InstallFeatureControlCallback (
return;
}
+ PlatformInfoHob->FeatureControl = TRUE;
QemuFwCfgSelectItem (FwCfgItem);
QemuFwCfgReadBytes (
sizeof (PlatformInfoHob->FeatureControlValue),
diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S
index de42a90..b52becd 100644
--- a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S
+++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S
@@ -8,6 +8,9 @@
#include "PlatformSecLib.h"
ASM_FUNC (_ModuleEntryPoint)
+/* Prevent stack unwinding from going further */
+li s0, 0
+
/* Use Temp memory as the stack for calling to C code */
li a2, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase)
li a3, FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)
diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc
index 4c3eff7..47248f2 100644
--- a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc
+++ b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc
@@ -79,7 +79,6 @@
!endif
# RISC-V Architectural Libraries
- CpuExceptionHandlerLib|UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf
RiscVSbiLib|MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.inf
RiscVMmuLib|UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.inf
PlatformBootManagerLib|OvmfPkg/RiscVVirt/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -153,6 +152,7 @@
PrePiHobListPointerLib|OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf
PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf
+ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
[LibraryClasses.common.PEI_CORE]
HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
@@ -163,6 +163,7 @@
ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
PeiResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf
ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
+ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
[LibraryClasses.common.PEIM]
HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
@@ -174,16 +175,19 @@
ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
PeiResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf
ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
+ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
[LibraryClasses.common.DXE_CORE]
PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf
DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
+ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
[LibraryClasses.common.DXE_DRIVER]
SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
[LibraryClasses.common.UEFI_APPLICATION]
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
diff --git a/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c b/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c
index 5287cda..8547c76 100644
--- a/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c
+++ b/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c
@@ -806,6 +806,7 @@ TdGetEventLog (
@retval FALSE This is NOT a Tcg800155PlatformIdEvent.
**/
+STATIC
BOOLEAN
Is800155Event (
IN VOID *NewEventHdr,
@@ -814,18 +815,26 @@ Is800155Event (
IN UINT32 NewEventSize
)
{
- if ((((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType == EV_NO_ACTION) &&
- (NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) &&
- ((CompareMem (
- NewEventData,
- TCG_Sp800_155_PlatformId_Event2_SIGNATURE,
- sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1
- ) == 0) ||
- (CompareMem (
- NewEventData,
- TCG_Sp800_155_PlatformId_Event3_SIGNATURE,
- sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1
- ) == 0)))
+ if (((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType != EV_NO_ACTION) {
+ return FALSE;
+ }
+
+ if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) &&
+ (CompareMem (
+ NewEventData,
+ TCG_Sp800_155_PlatformId_Event2_SIGNATURE,
+ sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1
+ ) == 0))
+ {
+ return TRUE;
+ }
+
+ if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event3)) &&
+ (CompareMem (
+ NewEventData,
+ TCG_Sp800_155_PlatformId_Event3_SIGNATURE,
+ sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1
+ ) == 0))
{
return TRUE;
}
diff --git a/SecurityPkg/FvReportPei/FvReportPei.c b/SecurityPkg/FvReportPei/FvReportPei.c
index 50773db..4376f52 100644
--- a/SecurityPkg/FvReportPei/FvReportPei.c
+++ b/SecurityPkg/FvReportPei/FvReportPei.c
@@ -71,7 +71,10 @@ InstallPreHashFvPpi (
+ HashSize;
PreHashedFvPpi = AllocatePool (PpiSize);
- ASSERT (PreHashedFvPpi != NULL);
+ if (PreHashedFvPpi == NULL) {
+ ASSERT (PreHashedFvPpi != NULL);
+ return;
+ }
PreHashedFvPpi->FvBase = (UINT32)(UINTN)FvBuffer;
PreHashedFvPpi->FvLength = (UINT32)FvLength;
@@ -83,7 +86,11 @@ InstallPreHashFvPpi (
CopyMem (HASH_VALUE_PTR (HashInfo), HashValue, HashSize);
FvInfoPpiDescriptor = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
- ASSERT (FvInfoPpiDescriptor != NULL);
+ if (FvInfoPpiDescriptor == NULL) {
+ ASSERT (FvInfoPpiDescriptor != NULL);
+ FreePool (PreHashedFvPpi);
+ return;
+ }
FvInfoPpiDescriptor->Guid = &gEdkiiPeiFirmwareVolumeInfoPrehashedFvPpiGuid;
FvInfoPpiDescriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
@@ -202,8 +209,11 @@ VerifyHashedFv (
// Copy FV to permanent memory to avoid potential TOC/TOU.
//
FvBuffer = AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)FvInfo[FvIndex].Length));
-
- ASSERT (FvBuffer != NULL);
+ if (FvBuffer == NULL) {
+ ASSERT (FvBuffer != NULL);
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Done;
+ }
if (FvShadowPpi != NULL) {
Status = FvShadowPpi->FirmwareVolumeShadow (
@@ -379,12 +389,17 @@ CheckStoredHashFv (
);
if (!EFI_ERROR (Status) && (StoredHashFvPpi != NULL) && (StoredHashFvPpi->FvNumber > 0)) {
HashInfo = GetHashInfo (StoredHashFvPpi, BootMode);
- Status = VerifyHashedFv (
+ if (HashInfo != NULL) {
+ Status = VerifyHashedFv (
HashInfo,
StoredHashFvPpi->FvInfo,
StoredHashFvPpi->FvNumber,
BootMode
);
+ } else {
+ Status = EFI_NOT_FOUND;
+ }
+
if (!EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "OBB verification passed (%r)\r\n", Status));
diff --git a/SecurityPkg/HddPassword/HddPasswordDxe.c b/SecurityPkg/HddPassword/HddPasswordDxe.c
index 6f36b5a..228a9f4 100644
--- a/SecurityPkg/HddPassword/HddPasswordDxe.c
+++ b/SecurityPkg/HddPassword/HddPasswordDxe.c
@@ -149,7 +149,10 @@ BuildHddPasswordDeviceInfo (
S3InitDevicesExist = FALSE;
} else if (Status == EFI_BUFFER_TOO_SMALL) {
S3InitDevices = AllocatePool (S3InitDevicesLength);
- ASSERT (S3InitDevices != NULL);
+ if (S3InitDevices == NULL) {
+ ASSERT (S3InitDevices != NULL);
+ return;
+ }
Status = RestoreLockBox (
&gS3StorageDeviceInitListGuid,
@@ -184,7 +187,10 @@ BuildHddPasswordDeviceInfo (
FreePool (S3InitDevicesBak);
}
- ASSERT (S3InitDevices != NULL);
+ if (S3InitDevices == NULL) {
+ ASSERT (S3InitDevices != NULL);
+ return;
+ }
TempDevInfo = (HDD_PASSWORD_DEVICE_INFO *)((UINTN)TempDevInfo +
sizeof (HDD_PASSWORD_DEVICE_INFO) +
@@ -2195,8 +2201,14 @@ HddPasswordFormExtractConfig (
// followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
//
ConfigRequestHdr = HiiConstructConfigHdr (&mHddPasswordVendorGuid, mHddPasswordVendorStorageName, Private->DriverHandle);
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
- ConfigRequest = AllocateZeroPool (Size);
+ if (ConfigRequestHdr == NULL) {
+ ASSERT (ConfigRequestHdr != NULL);
+ FreePool (IfrData);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
+ ConfigRequest = AllocateZeroPool (Size);
ASSERT (ConfigRequest != NULL);
AllocatedRequest = TRUE;
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
@@ -2386,7 +2398,11 @@ HddPasswordFormCallback (
// In case goto the device configuration form, update the device form title.
//
ConfigFormEntry = HddPasswordGetConfigFormEntryByIndex ((UINT32)(QuestionId - KEY_HDD_DEVICE_ENTRY_BASE));
- ASSERT (ConfigFormEntry != NULL);
+ if (ConfigFormEntry == NULL) {
+ ASSERT (ConfigFormEntry != NULL);
+ FreePool (IfrData);
+ return EFI_NOT_FOUND;
+ }
DeviceFormTitleToken = (EFI_STRING_ID)STR_HDD_SECURITY_HD;
HiiSetString (Private->HiiHandle, DeviceFormTitleToken, ConfigFormEntry->HddString, NULL);
diff --git a/SecurityPkg/Library/AuthVariableLib/AuthService.c b/SecurityPkg/Library/AuthVariableLib/AuthService.c
index 706cb67..2d79cc1 100644
--- a/SecurityPkg/Library/AuthVariableLib/AuthService.c
+++ b/SecurityPkg/Library/AuthVariableLib/AuthService.c
@@ -553,7 +553,7 @@ CheckSignatureListFormat (
// Walk through the input signature list and check the data format.
// If any signature is incorrectly formed, the whole check will fail.
//
- while ((SigDataSize > 0) && (SigDataSize >= SigList->SignatureListSize)) {
+ while ((SigDataSize > 0) && (SigDataSize >= (UINTN)SigList->SignatureListSize)) {
for (Index = 0; Index < (sizeof (mSupportSigItem) / sizeof (EFI_SIGNATURE_ITEM)); Index++ ) {
if (CompareGuid (&SigList->SignatureType, &mSupportSigItem[Index].SigType)) {
//
@@ -1088,7 +1088,7 @@ FilterSignatureList (
Tail = TempData;
NewCertList = (EFI_SIGNATURE_LIST *)NewData;
- while ((*NewDataSize > 0) && (*NewDataSize >= NewCertList->SignatureListSize)) {
+ while ((*NewDataSize > 0) && (*NewDataSize >= (UINTN)NewCertList->SignatureListSize)) {
NewCert = (EFI_SIGNATURE_DATA *)((UINT8 *)NewCertList + sizeof (EFI_SIGNATURE_LIST) + NewCertList->SignatureHeaderSize);
NewCertCount = (NewCertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - NewCertList->SignatureHeaderSize) / NewCertList->SignatureSize;
@@ -1098,7 +1098,7 @@ FilterSignatureList (
Size = DataSize;
CertList = (EFI_SIGNATURE_LIST *)Data;
- while ((Size > 0) && (Size >= CertList->SignatureListSize)) {
+ while ((Size > 0) && (Size >= (UINTN)CertList->SignatureListSize)) {
if (CompareGuid (&CertList->SignatureType, &NewCertList->SignatureType) &&
(CertList->SignatureSize == NewCertList->SignatureSize))
{
diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
index 2eca39d..23e25a4 100644
--- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
+++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
@@ -883,7 +883,7 @@ IsCertHashFoundInDbx (
return Status;
}
- while ((DbxSize > 0) && (SignatureListSize >= DbxList->SignatureListSize)) {
+ while ((DbxSize > 0) && (SignatureListSize >= (UINTN)DbxList->SignatureListSize)) {
//
// Determine Hash Algorithm of Certificate in the forbidden database.
//
@@ -1028,7 +1028,7 @@ IsSignatureFoundInDatabase (
// Enumerate all signature data in SigDB to check if signature exists for executable.
//
CertList = (EFI_SIGNATURE_LIST *)Data;
- while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) {
+ while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) {
CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
if ((CertList->SignatureSize == sizeof (EFI_SIGNATURE_DATA) - 1 + SignatureSize) && (CompareGuid (&CertList->SignatureType, CertType))) {
@@ -1193,7 +1193,7 @@ PassTimestampCheck (
}
CertList = (EFI_SIGNATURE_LIST *)DbtData;
- while ((DbtDataSize > 0) && (DbtDataSize >= CertList->SignatureListSize)) {
+ while ((DbtDataSize > 0) && (DbtDataSize >= (UINTN)CertList->SignatureListSize)) {
if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) {
Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
@@ -1319,7 +1319,7 @@ IsForbiddenByDbx (
//
CertList = (EFI_SIGNATURE_LIST *)Data;
CertListSize = DataSize;
- while ((CertListSize > 0) && (CertListSize >= CertList->SignatureListSize)) {
+ while ((CertListSize > 0) && (CertListSize >= (UINTN)CertList->SignatureListSize)) {
if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) {
CertData = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
@@ -1524,7 +1524,7 @@ IsAllowedByDb (
// Find X509 certificate in Signature List to verify the signature in pkcs7 signed data.
//
CertList = (EFI_SIGNATURE_LIST *)Data;
- while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) {
+ while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) {
if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) {
CertData = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
@@ -2050,8 +2050,9 @@ Failed:
// executable information table in either case.
//
NameStr = ConvertDevicePathToText (File, FALSE, TRUE);
- AddImageExeInfo (Action, NameStr, File, SignatureList, SignatureListSize);
+
if (NameStr != NULL) {
+ AddImageExeInfo (Action, NameStr, File, SignatureList, SignatureListSize);
DEBUG ((DEBUG_INFO, "The image doesn't pass verification: %s\n", NameStr));
FreePool (NameStr);
}
diff --git a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c
index de4f5e5..f81519d 100644
--- a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c
+++ b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c
@@ -387,7 +387,10 @@ Tcg2UserConfirm (
NoPpiInfo = FALSE;
BufSize = CONFIRM_BUFFER_SIZE;
ConfirmText = AllocateZeroPool (BufSize);
- ASSERT (ConfirmText != NULL);
+ if (ConfirmText == NULL) {
+ ASSERT (ConfirmText != NULL);
+ return FALSE;
+ }
mTcg2PpStringPackHandle = HiiAddPackages (&gEfiTcg2PhysicalPresenceGuid, gImageHandle, DxeTcg2PhysicalPresenceLibStrings, NULL);
ASSERT (mTcg2PpStringPackHandle != NULL);
@@ -401,10 +404,20 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CLEAR));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
@@ -417,14 +430,29 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_PPI_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_NOTE_CLEAR));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CLEAR));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
@@ -452,14 +480,29 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_SET_PCR_BANKS));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_SET_PCR_BANKS_1));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_SET_PCR_BANKS_2));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
@@ -467,7 +510,11 @@ Tcg2UserConfirm (
Tcg2FillBufferWithBootHashAlg (TempBuffer2, sizeof (TempBuffer2), CurrentPCRBanks);
TmpStr1 = AllocateZeroPool (BufSize);
- ASSERT (TmpStr1 != NULL);
+ if (TmpStr1 == NULL) {
+ ASSERT (TmpStr1 != NULL);
+ return FALSE;
+ }
+
UnicodeSPrint (TmpStr1, BufSize, L"Current PCRBanks is 0x%x. (%s)\nNew PCRBanks is 0x%x. (%s)\n", CurrentPCRBanks, TempBuffer2, TpmPpCommandParameter, TempBuffer);
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
@@ -481,14 +528,29 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CHANGE_EPS));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CHANGE_EPS_1));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CHANGE_EPS_2));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
@@ -498,6 +560,11 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_ENABLE_BLOCK_SID));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
break;
@@ -506,6 +573,11 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_DISABLE_BLOCK_SID));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
break;
@@ -515,6 +587,11 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PP_ENABLE_BLOCK_SID));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PPI_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
break;
@@ -524,6 +601,11 @@ Tcg2UserConfirm (
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PP_DISABLE_BLOCK_SID));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PPI_HEAD_STR));
+ if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
FreePool (TmpStr1);
break;
@@ -544,11 +626,21 @@ Tcg2UserConfirm (
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_ACCEPT_KEY));
}
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
if (NoPpiInfo) {
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_NO_PPI_INFO));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
}
@@ -561,11 +653,21 @@ Tcg2UserConfirm (
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_ACCEPT_KEY));
}
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
if (NoPpiInfo) {
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_NO_PPI_INFO));
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
}
@@ -573,6 +675,11 @@ Tcg2UserConfirm (
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_REJECT_KEY));
}
+ if (TmpStr1 == NULL) {
+ FreePool (ConfirmText);
+ return FALSE;
+ }
+
BufSize -= StrSize (ConfirmText);
UnicodeSPrint (ConfirmText + StrLen (ConfirmText), BufSize, TmpStr1, TmpStr2);
diff --git a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c
index 597ce77..d38a607 100644
--- a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c
+++ b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c
@@ -540,7 +540,7 @@ UserConfirm (
CHAR16 *TmpStr2;
UINTN BufSize;
BOOLEAN CautionKey;
- UINT16 Index;
+ UINTN Index;
CHAR16 DstStr[81];
TmpStr2 = NULL;
diff --git a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
index acba11d..b8eb5d6 100644
--- a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
+++ b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
@@ -615,6 +615,9 @@ GetMeasureBootProtocols (
@retval EFI_SUCCESS The file specified by DevicePath and non-NULL
FileBuffer did authenticate, and the platform policy dictates
that the DXE Foundation may use the file.
+
+ @retval EFI_OUT_OF_RESOURCES A necessary memory buffer could not be allocated.
+
@retval other error value
**/
EFI_STATUS
@@ -708,9 +711,16 @@ DxeTpm2MeasureBootHandler (
}
}
- FreePool (OrigDevicePathNode);
+ if (OrigDevicePathNode != NULL) {
+ FreePool (OrigDevicePathNode);
+ }
+
OrigDevicePathNode = DuplicateDevicePath (File);
- ASSERT (OrigDevicePathNode != NULL);
+ if (OrigDevicePathNode == NULL) {
+ ASSERT (OrigDevicePathNode != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
break;
}
}
diff --git a/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c b/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c
index c786c21..7b00833 100644
--- a/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c
+++ b/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c
@@ -56,7 +56,10 @@ Sha1HashInit (
CtxSize = Sha1GetContextSize ();
Sha1Ctx = AllocatePool (CtxSize);
- ASSERT (Sha1Ctx != NULL);
+ if (Sha1Ctx == NULL) {
+ ASSERT (Sha1Ctx != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
Sha1Init (Sha1Ctx);
diff --git a/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c b/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c
index 4387740..4fdc5a8 100644
--- a/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c
+++ b/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c
@@ -56,7 +56,10 @@ Sha256HashInit (
CtxSize = Sha256GetContextSize ();
Sha256Ctx = AllocatePool (CtxSize);
- ASSERT (Sha256Ctx != NULL);
+ if (Sha256Ctx == NULL) {
+ ASSERT (Sha256Ctx != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
Sha256Init (Sha256Ctx);
diff --git a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
index 2169c5e..5e0bbe5 100644
--- a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
+++ b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
@@ -80,6 +80,11 @@ HashStart (
for (Index = 0; Index < mHashInterfaceCount; Index++) {
HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);
+ if (HashCtx == NULL) {
+ // If we fail to get the hash mask we don't have resources.
+ return EFI_OUT_OF_RESOURCES;
+ }
+
if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {
mHashInterface[Index].HashInit (&HashCtx[Index]);
}
@@ -278,8 +283,16 @@ HashAndExtend (
CheckSupportedHashMaskMismatch ();
- HashStart (&HashHandle);
- HashUpdate (HashHandle, DataToHash, DataToHashLen);
+ Status = HashStart (&HashHandle);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = HashUpdate (HashHandle, DataToHash, DataToHashLen);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList);
return Status;
diff --git a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
index eeb424b..156dc04 100644
--- a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
+++ b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
@@ -106,7 +106,10 @@ CheckSupportedHashMaskMismatch (
HASH_INTERFACE_HOB *HashInterfaceHobLast;
HashInterfaceHobLast = InternalGetHashInterfaceHob (&gZeroGuid);
- ASSERT (HashInterfaceHobLast != NULL);
+ if (HashInterfaceHobLast == NULL) {
+ ASSERT (HashInterfaceHobLast != NULL);
+ return;
+ }
if ((HashInterfaceHobLast->SupportedHashMask != 0) &&
(HashInterfaceHobCurrent->SupportedHashMask != HashInterfaceHobLast->SupportedHashMask))
@@ -152,7 +155,10 @@ HashStart (
CheckSupportedHashMaskMismatch (HashInterfaceHob);
HashCtx = AllocatePool (sizeof (*HashCtx) * HashInterfaceHob->HashInterfaceCount);
- ASSERT (HashCtx != NULL);
+ if (HashCtx == NULL) {
+ ASSERT (HashCtx != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {
HashMask = Tpm2GetHashMaskFromAlgo (&HashInterfaceHob->HashInterface[Index].HashGuid);
@@ -305,8 +311,16 @@ HashAndExtend (
CheckSupportedHashMaskMismatch (HashInterfaceHob);
- HashStart (&HashHandle);
- HashUpdate (HashHandle, DataToHash, DataToHashLen);
+ Status = HashStart (&HashHandle);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = HashUpdate (HashHandle, DataToHash, DataToHashLen);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList);
return Status;
diff --git a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c
index 7f9fdd2..e45e975 100644
--- a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c
+++ b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c
@@ -59,7 +59,11 @@ SecureBootFetchData (
*SigListOut = NULL;
*SigListsSize = 0;
CertInfo = AllocatePool (sizeof (SECURE_BOOT_CERTIFICATE_INFO));
- NewCertInfo = CertInfo;
+ if (CertInfo == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ NewCertInfo = CertInfo;
while (1) {
if (NewCertInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
@@ -93,6 +97,9 @@ SecureBootFetchData (
sizeof (SECURE_BOOT_CERTIFICATE_INFO) * (KeyIndex + 1),
CertInfo
);
+ if (NewCertInfo == NULL) {
+ goto Cleanup;
+ }
}
if (Status == EFI_NOT_FOUND) {
diff --git a/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c b/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c
index e1e0f99..cbe1da3 100644
--- a/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c
+++ b/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c
@@ -106,7 +106,7 @@ MeasureFirmwareBlob (
{
if (Description != NULL) {
AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "%a", Description);
- } else {
+ } else if (FvName != NULL) {
AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "Fv(%g)", FvName);
}
diff --git a/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c b/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c
index 64bea73..5eb1a0b 100644
--- a/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c
+++ b/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c
@@ -270,7 +270,7 @@ Tpm12TisTpmCommand (
{
EFI_STATUS Status;
UINT16 BurstCount;
- UINT32 Index;
+ UINTN Index;
UINT32 TpmOutSize;
UINT16 Data16;
UINT32 Data32;
diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c
index c83838f..7b2e449 100644
--- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c
+++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c
@@ -421,7 +421,7 @@ DumpTpmPcrCommand (
// If this is an unrecognized command, we can't go much further.
if ((Command != TPM_CC_PCR_Extend) && (Command != TPM_CC_PCR_Event)) {
- DEBUG ((DEBUG_WARN, "%a - Unrecognized command! 0x%X\n", __func__, Command));
+ DEBUG ((DEBUG_SECURITY, "%a - Unrecognized command! 0x%X\n", __func__, Command));
return;
}
@@ -461,7 +461,7 @@ DumpTpmPcrCommand (
default:
// This algorithm hasn't been programmed yet. We need to bail.
- DEBUG ((DEBUG_WARN, "%a - Unknown hash algorithm! 0x%04X\n", __func__, SwapBytes16 (CurrentDigest->hashAlg)));
+ DEBUG ((DEBUG_SECURITY, "%a - Unknown hash algorithm! 0x%04X\n", __func__, SwapBytes16 (CurrentDigest->hashAlg)));
// Zero the count so we can get out of here.
DigestCount = 0;
break;
@@ -635,11 +635,11 @@ DumpTpmInputBlock (
TPM_CC NativeCode;
DEBUG ((DEBUG_SECURITY, "\n=== BEGIN TPM COMMAND ===\n"));
- DEBUG ((DEBUG_VERBOSE, "Size: %d (0x%X), Address: 0x%X\n", InputBlockSize, InputBlockSize, InputBlock));
+ DEBUG ((DEBUG_SECURITY, "Size: %d (0x%X), Address: 0x%X\n", InputBlockSize, InputBlockSize, InputBlock));
// Make sure we've got at least enough data for a valid header.
if (InputBlockSize < sizeof (*CommHeader)) {
- DEBUG ((DEBUG_WARN, "%a - Invalid buffer size!\n", __func__));
+ DEBUG ((DEBUG_SECURITY, "%a - Invalid buffer size!\n", __func__));
return;
}
@@ -704,7 +704,7 @@ DumpTpmOutputBlock (
UINT32 NativeSize;
TPM_CC NativeCode;
- DEBUG ((DEBUG_VERBOSE, "Size: %d (0x%X), Address: 0x%X\n", OutputBlockSize, OutputBlockSize, OutputBlock));
+ DEBUG ((DEBUG_SECURITY, "Size: %d (0x%X), Address: 0x%X\n", OutputBlockSize, OutputBlockSize, OutputBlock));
// Start the debugging by mapping some stuff.
RespHeader = (TPM2_RESPONSE_HEADER *)OutputBlock;
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h
index 665b594..97a558a 100644
--- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h
@@ -34,6 +34,9 @@
#ifndef TPM2_DEVICE_LIB_FFA_H_
#define TPM2_DEVICE_LIB_FFA_H_
+#define TPM2_FFA_INTERFACE_TYPE_UNKNOWN 0xFF
+#define TPM2_FFA_PARTITION_ID_INVALID 0x0000
+
/**
This function is used to get the TPM interface version.
@@ -188,6 +191,22 @@ FfaTpm2RequestUseTpm (
);
/**
+ This function is used to get the TPM service partition id via FF-A
+
+ @param[out] PartitionId - Supplies the pointer to the TPM service partition id.
+
+ @retval EFI_SUCCESS The TPM command was successfully sent to the TPM
+ and the response was copied to the Output buffer.
+ @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command
+ buffer size is 0.
+ @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM.
+**/
+EFI_STATUS
+FfaTpm2GetServicePartitionId (
+ OUT UINT16 *PartitionId
+ );
+
+/**
Dump PTP register information.
@param[in] Register Pointer to PTP register.
@@ -210,4 +229,35 @@ InternalTpm2DeviceLibFfaConstructor (
VOID
);
+/**
+ This function validate TPM interface type for TPM service over FF-A.
+
+ @retval EFI_SUCCESS TPM interface type is valid.
+
+ @retval EFI_UNSUPPORTED TPM interface type is invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+ValidateTpmInterfaceType (
+ VOID
+ );
+
+/**
+ This function is used to get the TPM service partition id.
+
+ @param[out] PartitionId - Supplies the pointer to the TPM service partition id.
+
+ @retval EFI_SUCCESS The TPM command was successfully sent to the TPM
+ and the response was copied to the Output buffer.
+ @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command
+ buffer size is 0.
+ @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM.
+**/
+EFI_STATUS
+EFIAPI
+GetTpmServicePartitionId (
+ OUT UINT16 *PartitionId
+ );
+
#endif /* _TPM2_DEVICE_LIB_SMC_H_ */
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf
index 68a0094..198a9e5 100644
--- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf
@@ -29,6 +29,7 @@
Tpm2DeviceLibFfaBase.c
Tpm2Ptp.c
Tpm2DeviceLibFfa.h
+ Tpm2InfoFfa.c
[Packages]
MdePkg/MdePkg.dec
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c
index 85815a0..058d131 100644
--- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c
@@ -21,8 +21,7 @@
#include "Tpm2DeviceLibFfa.h"
-TPM2_PTP_INTERFACE_TYPE mActiveTpmInterfaceType;
-UINT8 mCRBIdleByPass;
+UINT8 mCRBIdleByPass;
/**
Return cached PTP CRB interface IdleByPass state.
@@ -52,28 +51,18 @@ InternalTpm2DeviceLibFfaConstructor (
{
EFI_STATUS Status;
- mActiveTpmInterfaceType = PcdGet8 (PcdActiveTpmInterfaceType);
- mCRBIdleByPass = 0xFF;
+ mCRBIdleByPass = 0xFF;
if (PcdGet64 (PcdTpmBaseAddress) == 0) {
Status = EFI_NO_MAPPING;
goto Exit;
}
- //
- // Start by checking the PCD out of the gate and read from the CRB if it is invalid
- //
- if (mActiveTpmInterfaceType == 0xFF) {
- mActiveTpmInterfaceType = Tpm2GetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress));
- PcdSet8S (PcdActiveTpmInterfaceType, mActiveTpmInterfaceType);
- }
-
- if (mActiveTpmInterfaceType != Tpm2PtpInterfaceCrb) {
- Status = EFI_UNSUPPORTED;
+ Status = ValidateTpmInterfaceType ();
+ if (EFI_ERROR (Status)) {
goto Exit;
}
- DEBUG ((DEBUG_INFO, "Setting Tpm Active Interface Type %d\n", mActiveTpmInterfaceType));
mCRBIdleByPass = Tpm2GetIdleByPass ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress));
Status = EFI_SUCCESS;
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf
new file mode 100644
index 0000000..2f4ae52
--- /dev/null
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf
@@ -0,0 +1,51 @@
+## @file
+# Provides function interfaces to communicate with TPM 2.0 device
+#
+# This library helps to use TPM 2.0 device in library function API
+# based on FF-A using Command Response Buffer (CRB).
+#
+# Copyright (c), Microsoft Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = Tpm2DeviceSecLibFfa
+ FILE_GUID = d66e7482-615c-11f0-91d0-47f6d24396e9
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = Tpm2DeviceLib|SEC
+ CONSTRUCTOR = Tpm2DeviceLibFfaConstructor
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = AARCH64
+#
+
+[Sources.common]
+ Tpm2DeviceLibFfa.c
+ Tpm2ServiceFfaRaw.c
+ Tpm2DeviceLibFfaBase.c
+ Tpm2Ptp.c
+ Tpm2DeviceLibFfa.h
+ Tpm2InfoSecFfa.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ SecurityPkg/SecurityPkg.dec
+
+[LibraryClasses]
+ BaseLib
+ DebugLib
+ TimerLib
+ BaseMemoryLib
+ IoLib
+ ArmFfaLib
+
+[Guids]
+ gTpm2ServiceFfaGuid
+
+[Pcd.common]
+ gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress ## CONSUMES
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c
new file mode 100644
index 0000000..602fe34
--- /dev/null
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c
@@ -0,0 +1,87 @@
+/** @file
+ This library provides an interfaces to access DynamicPcds used
+ in Tpm2DeviceLibFfa.
+
+ Copyright (c) 2025, Arm Ltd. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/Tpm2DeviceLib.h>
+#include <Uefi/UefiBaseType.h>
+
+#include "Tpm2DeviceLibFfa.h"
+
+TPM2_PTP_INTERFACE_TYPE mActiveTpmInterfaceType;
+
+/**
+ This function validate TPM interface type for TPM service over FF-A.
+
+ @retval EFI_SUCCESS TPM interface type is valid.
+
+ @retval EFI_UNSUPPORTED TPM interface type is invalid.
+
+**/
+EFI_STATUS
+ValidateTpmInterfaceType (
+ VOID
+ )
+{
+ mActiveTpmInterfaceType = PcdGet8 (PcdActiveTpmInterfaceType);
+
+ //
+ // Start by checking the PCD out of the gate and read from the CRB if it is invalid
+ //
+ if (mActiveTpmInterfaceType == TPM2_FFA_INTERFACE_TYPE_UNKNOWN) {
+ mActiveTpmInterfaceType = Tpm2GetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress));
+ PcdSet8S (PcdActiveTpmInterfaceType, mActiveTpmInterfaceType);
+ }
+
+ if (mActiveTpmInterfaceType != Tpm2PtpInterfaceCrb) {
+ return EFI_UNSUPPORTED;
+ }
+
+ DEBUG ((DEBUG_INFO, "Setting Tpm Active Interface Type %d\n", mActiveTpmInterfaceType));
+
+ return EFI_SUCCESS;
+}
+
+/**
+ This function is used to get the TPM service partition id.
+
+ @param[out] PartitionId - Supplies the pointer to the TPM service partition id.
+
+ @retval EFI_SUCCESS The TPM command was successfully sent to the TPM
+ and the response was copied to the Output buffer.
+ @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command
+ buffer size is 0.
+ @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM.
+**/
+EFI_STATUS
+EFIAPI
+GetTpmServicePartitionId (
+ OUT UINT16 *PartitionId
+ )
+{
+ EFI_STATUS Status;
+
+ if (PartitionId == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (PcdGet16 (PcdTpmServiceFfaPartitionId) != TPM2_FFA_PARTITION_ID_INVALID) {
+ *PartitionId = PcdGet16 (PcdTpmServiceFfaPartitionId);
+ return EFI_SUCCESS;
+ }
+
+ Status = FfaTpm2GetServicePartitionId (PartitionId);
+ if (!EFI_ERROR (Status)) {
+ PcdSet16S (PcdTpmServiceFfaPartitionId, *PartitionId);
+ }
+
+ return Status;
+}
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c
new file mode 100644
index 0000000..2f264eb
--- /dev/null
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c
@@ -0,0 +1,62 @@
+/** @file
+ This library provides an interfaces to access DynamicPcds used
+ in Tpm2DeviceLibFfa.
+
+ Copyright (c) 2025, Arm Ltd. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/Tpm2DeviceLib.h>
+#include <Uefi/UefiBaseType.h>
+
+#include "Tpm2DeviceLibFfa.h"
+
+/**
+ This function validate TPM interface type for TPM service over FF-A.
+
+ @retval EFI_SUCCESS TPM interface type is valid.
+
+ @retval EFI_UNSUPPORTED TPM interface type is invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+ValidateTpmInterfaceType (
+ VOID
+ )
+{
+ TPM2_PTP_INTERFACE_TYPE TpmInterfaceType;
+
+ TpmInterfaceType = Tpm2GetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress));
+ if (TpmInterfaceType != Tpm2PtpInterfaceCrb) {
+ return EFI_UNSUPPORTED;
+ }
+
+ DEBUG ((DEBUG_INFO, "Setting Tpm Active Interface Type %d\n", TpmInterfaceType));
+
+ return EFI_SUCCESS;
+}
+
+/**
+ This function is used to get the TPM service partition id.
+
+ @param[out] PartitionId - Supplies the pointer to the TPM service partition id.
+
+ @retval EFI_SUCCESS The TPM command was successfully sent to the TPM
+ and the response was copied to the Output buffer.
+ @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command
+ buffer size is 0.
+ @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM.
+**/
+EFI_STATUS
+EFIAPI
+GetTpmServicePartitionId (
+ OUT UINT16 *PartitionId
+ )
+{
+ return FfaTpm2GetServicePartitionId (PartitionId);
+}
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf
index 0f5d3fa..ecf9a36 100644
--- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf
@@ -29,6 +29,7 @@
Tpm2DeviceLibFfaBase.c
Tpm2Ptp.c
Tpm2DeviceLibFfa.h
+ Tpm2InfoFfa.c
[Packages]
MdePkg/MdePkg.dec
diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c
index 3e36bcf..44159c9 100644
--- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c
+++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c
@@ -26,7 +26,7 @@
#include "Tpm2DeviceLibFfa.h"
-UINT32 mFfaTpm2PartitionId = MAX_UINT32;
+UINT16 mFfaTpm2PartitionId = TPM2_FFA_PARTITION_ID_INVALID;
/**
Check the return status from the FF-A call and returns EFI_STATUS
@@ -84,7 +84,7 @@ TranslateTpmReturnStatus (
}
/**
- This function is used to get the TPM service partition id.
+ This function is used to get the TPM service partition id via FF-A.
@param[out] PartitionId - Supplies the pointer to the TPM service partition id.
@@ -92,11 +92,12 @@ TranslateTpmReturnStatus (
and the response was copied to the Output buffer.
@retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command
buffer size is 0.
+ @retval EFI_DEVICE_ERROR The TPM partition information is wrong.
@retval EFI_DEVICE_ERROR An error occurred in communication with the TPM.
**/
EFI_STATUS
-GetTpmServicePartitionId (
- OUT UINT32 *PartitionId
+FfaTpm2GetServicePartitionId (
+ OUT UINT16 *PartitionId
)
{
EFI_STATUS Status;
@@ -114,20 +115,6 @@ GetTpmServicePartitionId (
goto Exit;
}
- if (mFfaTpm2PartitionId != MAX_UINT32) {
- *PartitionId = mFfaTpm2PartitionId;
- Status = EFI_SUCCESS;
- goto Exit;
- }
-
- if (PcdGet16 (PcdTpmServiceFfaPartitionId) != 0) {
- mFfaTpm2PartitionId = PcdGet16 (PcdTpmServiceFfaPartitionId);
- *PartitionId = mFfaTpm2PartitionId;
- Status = EFI_SUCCESS;
-
- goto Exit;
- }
-
Status = ArmFfaLibPartitionIdGet (&PartId);
if (EFI_ERROR (Status)) {
DEBUG ((
@@ -164,11 +151,14 @@ GetTpmServicePartitionId (
Status = EFI_INVALID_PARAMETER;
DEBUG ((DEBUG_ERROR, "Invalid partition Info(%g). Count: %d, Size: %d\n", &gTpm2ServiceFfaGuid, Count, Size));
} else {
- TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer;
- mFfaTpm2PartitionId = TpmPartInfo->PartitionId;
- *PartitionId = mFfaTpm2PartitionId;
-
- Status = PcdSet16S (PcdTpmServiceFfaPartitionId, mFfaTpm2PartitionId);
+ TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer;
+ *PartitionId = TpmPartInfo->PartitionId;
+ if (TpmPartInfo->PartitionId == TPM2_FFA_PARTITION_ID_INVALID) {
+ /*
+ * Tpm partition id never be TPM2_FFA_PARTITION_ID_INVALID.
+ */
+ Status = EFI_DEVICE_ERROR;
+ }
}
RxRelease:
@@ -202,7 +192,7 @@ Tpm2GetInterfaceVersion (
goto Exit;
}
- if (mFfaTpm2PartitionId == MAX_UINT32) {
+ if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) {
GetTpmServicePartitionId (&mFfaTpm2PartitionId);
}
@@ -253,7 +243,7 @@ Tpm2GetFeatureInfo (
goto Exit;
}
- if (mFfaTpm2PartitionId == MAX_UINT32) {
+ if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) {
GetTpmServicePartitionId (&mFfaTpm2PartitionId);
}
@@ -296,7 +286,7 @@ Tpm2ServiceStart (
EFI_STATUS Status;
DIRECT_MSG_ARGS FfaDirectReq2Args;
- if (mFfaTpm2PartitionId == MAX_UINT32) {
+ if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) {
GetTpmServicePartitionId (&mFfaTpm2PartitionId);
}
@@ -341,7 +331,7 @@ Tpm2RegisterNotification (
EFI_STATUS Status;
DIRECT_MSG_ARGS FfaDirectReq2Args;
- if (mFfaTpm2PartitionId == MAX_UINT32) {
+ if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) {
GetTpmServicePartitionId (&mFfaTpm2PartitionId);
}
@@ -380,7 +370,7 @@ Tpm2UnregisterNotification (
EFI_STATUS Status;
DIRECT_MSG_ARGS FfaDirectReq2Args;
- if (mFfaTpm2PartitionId == MAX_UINT32) {
+ if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) {
GetTpmServicePartitionId (&mFfaTpm2PartitionId);
}
@@ -417,7 +407,7 @@ Tpm2FinishNotified (
EFI_STATUS Status;
DIRECT_MSG_ARGS FfaDirectReq2Args;
- if (mFfaTpm2PartitionId == MAX_UINT32) {
+ if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) {
GetTpmServicePartitionId (&mFfaTpm2PartitionId);
}
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c
index 3ac20e8..1b2cddf 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c
@@ -230,6 +230,8 @@ AesEncrypt (
UINTN NbIndex;
UINTN Round;
+ EFI_STATUS Status;
+
if ((Key == NULL) || (InData == NULL) || (OutData == NULL)) {
return EFI_INVALID_PARAMETER;
}
@@ -237,7 +239,10 @@ AesEncrypt (
//
// Expands AES Key for encryption.
//
- AesExpandKey (Key, 128, &AesKey);
+ Status = AesExpandKey (Key, 128, &AesKey);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
Nr = AesKey.Nk + 6;
Ek = AesKey.EncKey;
diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc
index 430b42c..ea6fdc2 100644
--- a/SecurityPkg/SecurityPkg.dsc
+++ b/SecurityPkg/SecurityPkg.dsc
@@ -91,6 +91,9 @@
[LibraryClasses.ARM, LibraryClasses.AARCH64]
ArmTrngLib|MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
+ ArmSmcLib|MdePkg/Library/ArmSmcLib/ArmSmcLib.inf
+ ArmSvcLib|MdePkg/Library/ArmSvcLib/ArmSvcLib.inf
+ ArmFfaLib|MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf
[LibraryClasses.ARM]
RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
@@ -425,7 +428,9 @@
[Components.AARCH64]
SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf
SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf
+ SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf
SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf
+ SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf
SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf
[BuildOptions]
diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c
index 0167afd..068c3c7 100644
--- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c
+++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c
@@ -2224,7 +2224,7 @@ ProcessOpalRequest (
//
TempVariable = Variable;
while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) &&
- (VariableSize >= TempVariable->Length) &&
+ (VariableSize >= (UINTN)TempVariable->Length) &&
(TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE)))
{
DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE));
diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
index 1e0b00b..c5f1121 100644
--- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
+++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
@@ -113,7 +113,7 @@ GetSavedOpalRequest (
TempVariable = Variable;
while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) &&
- (VariableSize >= TempVariable->Length) &&
+ (VariableSize >= (UINTN)TempVariable->Length) &&
(TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE)))
{
DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE));
@@ -193,7 +193,7 @@ SaveOpalRequest (
TempVariable = Variable;
TempVariableSize = VariableSize;
while ((TempVariableSize > sizeof (OPAL_REQUEST_VARIABLE)) &&
- (TempVariableSize >= TempVariable->Length) &&
+ (TempVariableSize >= (UINTN)TempVariable->Length) &&
(TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE)))
{
DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE));
@@ -226,7 +226,11 @@ SaveOpalRequest (
DevicePathSize = GetDevicePathSize (DevicePath);
NewVariableSize = VariableSize + sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize;
NewVariable = AllocatePool (NewVariableSize);
- ASSERT (NewVariable != NULL);
+ if (NewVariable == NULL) {
+ ASSERT (NewVariable != NULL);
+ return;
+ }
+
CopyMem (NewVariable, Variable, VariableSize);
TempVariable = (OPAL_REQUEST_VARIABLE *)((UINTN)NewVariable + VariableSize);
TempVariable->Length = (UINT32)(sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize);
@@ -239,7 +243,11 @@ SaveOpalRequest (
DevicePathSize = GetDevicePathSize (DevicePath);
NewVariableSize = sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize;
NewVariable = AllocatePool (NewVariableSize);
- ASSERT (NewVariable != NULL);
+ if (NewVariable == NULL) {
+ ASSERT (NewVariable != NULL);
+ return;
+ }
+
NewVariable->Length = (UINT32)(sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize);
CopyMem (&NewVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST));
DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)NewVariable + sizeof (OPAL_REQUEST_VARIABLE));
@@ -1111,8 +1119,13 @@ ExtractConfig (
//
DriverHandle = HiiGetDriverImageHandleCB ();
ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle);
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
- ConfigRequest = AllocateZeroPool (Size);
+ if (ConfigRequestHdr == NULL) {
+ ASSERT (ConfigRequestHdr != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
+ ConfigRequest = AllocateZeroPool (Size);
if (ConfigRequest == NULL) {
return EFI_OUT_OF_RESOURCES;
}
diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
index edf5f0f..2b93733 100644
--- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
+++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
@@ -103,7 +103,11 @@ InitializeTcg2VersionInfo (
TCG2_VERSION_NAME,
PrivateData->DriverHandle
);
- ASSERT (ConfigRequestHdr != NULL);
+ if (ConfigRequestHdr == NULL) {
+ ASSERT (ConfigRequestHdr != NULL);
+ return;
+ }
+
DataSize = sizeof (Tcg2Version);
Status = gRT->GetVariable (
TCG2_VERSION_NAME,
diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf
new file mode 100644
index 0000000..e20a1f8
--- /dev/null
+++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf
@@ -0,0 +1,53 @@
+## @file
+# Set TPM device type
+#
+# This module initializes TPM device type based on CRB over FF-A interface
+#
+# Copyright (c) 2025, Arm Ltd. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x0001001B
+ BASE_NAME = Tcg2ConfigFfaPei
+ FILE_GUID = ae8c4c50-2cd7-11f0-9e39-a7fbc471b972
+ MODULE_TYPE = PEIM
+ VERSION_STRING = 1.0
+ ENTRY_POINT = Tcg2ConfigFfaPeimEntryPoint
+
+#
+# VALID_ARCHITECTURES = AARCH64
+#
+
+[Sources]
+ Tcg2ConfigFfaPeim.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ SecurityPkg/SecurityPkg.dec
+
+[LibraryClasses]
+ ArmFfaLib
+ BaseLib
+ BaseMemoryLib
+ PeiServicesLib
+ PeimEntryPoint
+ DebugLib
+ PcdLib
+ HobLib
+
+[Guids]
+ gTpm2ServiceFfaGuid ## SOMETIMES_CONSUMES
+ gEfiTpmDeviceInstanceNoneGuid ## SOMETIMES_CONSUMES
+ gEfiTpmDeviceSelectedGuid ## SOMETIMES_PRODUCES
+
+[Ppis]
+ gPeiTpmInitializationDonePpiGuid ## SOMETIMES_PRODUCES
+
+[Pcd]
+ gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid
+
+[Depex]
+ gEfiPeiMasterBootModePpiGuid
diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c
new file mode 100644
index 0000000..ea01c9b
--- /dev/null
+++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c
@@ -0,0 +1,198 @@
+/** @file
+ Set TPM device type
+
+ This module initializes the TPM device type based on a CRB over FF-A
+ interface
+
+ Copyright (C) 2025, Arm Ltd.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Reference(s):
+ - https://developer.arm.com/documentation/den0138/latest/
+**/
+
+#include <PiPei.h>
+
+#include <Guid/TpmInstance.h>
+#include <Guid/Tpm2ServiceFfa.h>
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Library/ArmFfaLib.h>
+
+#define TPM2_FFA_SERVICE_MAJOR_VERSION (1)
+#define TPM2_FFA_SERVICE_MINOR_VERSION (0)
+
+STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmSelectedPpi = {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gEfiTpmDeviceSelectedGuid,
+ NULL
+};
+
+STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmInitializationDonePpiList = {
+ EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
+ &gPeiTpmInitializationDonePpiGuid,
+ NULL
+};
+
+/**
+ Check the Tpm Service Interface version.
+
+ See the CRB over FF-A spec 6.1.
+ all of arguments' value based on the specification.
+
+ @param [in] TpmPartId TPM service partition id.
+
+ @retval EFI_SUCCESS
+ @retval EFI_DEVICE_ERROR Failed to communicate TPM SP.
+ @retval EFI_UNSUPPORTED Unsupported version of TPM service
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+Tpm2FfaCheckInterfaceVersion (
+ IN UINT16 TpmPartId
+ )
+{
+ EFI_STATUS Status;
+ DIRECT_MSG_ARGS TpmArgs;
+ UINT16 MajorVer;
+ UINT16 MinorVer;
+
+ ZeroMem (&TpmArgs, sizeof (DIRECT_MSG_ARGS));
+ TpmArgs.Arg0 = TPM2_FFA_GET_INTERFACE_VERSION;
+
+ Status = ArmFfaLibMsgSendDirectReq2 (TpmPartId, &gTpm2ServiceFfaGuid, &TpmArgs);
+ while (Status == EFI_INTERRUPT_PENDING) {
+ // We are assuming vCPU0 of the TPM SP since it is UP.
+ Status = ArmFfaLibRun (TpmPartId, 0x00);
+ }
+
+ if (EFI_ERROR (Status) || (TpmArgs.Arg0 != TPM2_FFA_SUCCESS_OK_RESULTS_RETURNED)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: Failed to get interface version... Status: %r, TpmArgs.Arg0: 0x%x\n",
+ __func__,
+ Status,
+ TpmArgs.Arg0
+ ));
+
+ return EFI_DEVICE_ERROR;
+ }
+
+ MajorVer = (TpmArgs.Arg1 & TPM2_FFA_SERVICE_MAJOR_VER_MASK) >> TPM2_FFA_SERVICE_MAJOR_VER_SHIFT;
+ MinorVer = (TpmArgs.Arg1 & TPM2_FFA_SERVICE_MINOR_VER_MASK) >> TPM2_FFA_SERVICE_MINOR_VER_SHIFT;
+ if ((MajorVer != TPM2_FFA_SERVICE_MAJOR_VERSION) || (MinorVer < TPM2_FFA_SERVICE_MINOR_VERSION)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: Wrong Tpm Ffa Interface Version...: v%d.%d\n",
+ __func__,
+ MajorVer,
+ MinorVer
+ ));
+ return EFI_UNSUPPORTED;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ The entry point for Tcg2 configuration driver.
+
+ @param FileHandle Handle of the file being invoked.
+ @param PeiServices Describes the list of possible PEI Services.
+**/
+EFI_STATUS
+EFIAPI
+Tcg2ConfigFfaPeimEntryPoint (
+ IN EFI_PEI_FILE_HANDLE FileHandle,
+ IN CONST EFI_PEI_SERVICES **PeiServices
+ )
+{
+ EFI_STATUS Status;
+ UINTN Size;
+ UINT16 PartId;
+ UINT16 TpmPartId;
+ EFI_FFA_PART_INFO_DESC *TpmPartInfo;
+ VOID *TxBuffer;
+ UINT64 TxBufferSize;
+ VOID *RxBuffer;
+ UINT64 RxBufferSize;
+ UINT32 Count;
+ CONST EFI_PEI_PPI_DESCRIPTOR *PpiList;
+ GUID *TpmInstanceGuid;
+
+ DEBUG ((DEBUG_INFO, "%a\n", __func__));
+
+ TpmInstanceGuid = &gEfiTpmDeviceInstanceNoneGuid;
+ PpiList = &mTpmInitializationDonePpiList;
+
+ Status = ArmFfaLibPartitionIdGet (&PartId);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to get partition-id. Status: %r\n", Status));
+ goto Cleanup;
+ }
+
+ Status = ArmFfaLibGetRxTxBuffers (
+ &TxBuffer,
+ &TxBufferSize,
+ &RxBuffer,
+ &RxBufferSize
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to get Rx/Tx Buffer. Status: %r\n", Status));
+ goto Cleanup;
+ }
+
+ Status = ArmFfaLibPartitionInfoGet (
+ &gTpm2ServiceFfaGuid,
+ FFA_PART_INFO_FLAG_TYPE_DESC,
+ &Count,
+ (UINT32 *)&Size
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to get Tpm2 partition info. Status: %r\n", Status));
+ goto Cleanup;
+ }
+
+ if ((Count != 1) || (Size < sizeof (EFI_FFA_PART_INFO_DESC))) {
+ Status = EFI_INVALID_PARAMETER;
+ DEBUG ((DEBUG_ERROR, "Invalid partition Info(%g). Count: %d, Size: %d\n", &gTpm2ServiceFfaGuid, Count, Size));
+ ArmFfaLibRxRelease (PartId);
+ goto Cleanup;
+ }
+
+ TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer;
+ TpmPartId = TpmPartInfo->PartitionId;
+ ArmFfaLibRxRelease (PartId);
+
+ Status = Tpm2FfaCheckInterfaceVersion (TpmPartId);
+ if (EFI_ERROR (Status)) {
+ goto Cleanup;
+ }
+
+ /*
+ * Set the PcdTpmInstanceGuid to TPM using CRB over FF-A
+ * So that Tpm2DeviceLibRouterPei/Dxe can communicate with
+ * TPM secure partition.
+ */
+ TpmInstanceGuid = &gTpm2ServiceFfaGuid;
+ PpiList = &mTpmSelectedPpi;
+
+Cleanup:
+ Size = sizeof (GUID);
+ Status = PcdSetPtrS (
+ PcdTpmInstanceGuid,
+ &Size,
+ TpmInstanceGuid
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ Status = PeiServicesInstallPpi (PpiList);
+
+ return Status;
+}
diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c
index 24a27cd..2a0307c 100644
--- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c
+++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c
@@ -626,7 +626,7 @@ DumpEventLog (
TCG_PCR_EVENT_HDR *EventHdr;
TCG_PCR_EVENT2 *TcgPcrEvent2;
TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct;
- UINTN NumberOfEvents;
+ UINT64 NumberOfEvents;
if (!DebugPrintLevelEnabled (DEBUG_SECURITY)) {
return;
@@ -637,7 +637,7 @@ DumpEventLog (
switch (EventLogFormat) {
case EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2:
EventHdr = (TCG_PCR_EVENT_HDR *)(UINTN)EventLogLocation;
- while ((UINTN)EventHdr <= EventLogLastEntry) {
+ while ((EFI_PHYSICAL_ADDRESS)(UINTN)EventHdr <= EventLogLastEntry) {
DumpEvent (EventHdr);
EventHdr = (TCG_PCR_EVENT_HDR *)((UINTN)EventHdr + sizeof (TCG_PCR_EVENT_HDR) + EventHdr->EventSize);
}
@@ -668,7 +668,7 @@ DumpEventLog (
DumpTcgEfiSpecIdEventStruct (TcgEfiSpecIdEventStruct);
TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgEfiSpecIdEventStruct + GetTcgEfiSpecIdEventStructSize (TcgEfiSpecIdEventStruct));
- while ((UINTN)TcgPcrEvent2 <= EventLogLastEntry) {
+ while ((EFI_PHYSICAL_ADDRESS)(UINTN)TcgPcrEvent2 <= EventLogLastEntry) {
DumpEvent2 (TcgPcrEvent2);
TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgPcrEvent2 + GetPcrEvent2Size (TcgPcrEvent2));
}
@@ -798,6 +798,7 @@ Tcg2GetEventLog (
@retval FALSE This is NOT a Tcg800155PlatformIdEvent.
**/
+STATIC
BOOLEAN
Is800155Event (
IN VOID *NewEventHdr,
@@ -806,18 +807,26 @@ Is800155Event (
IN UINT32 NewEventSize
)
{
- if ((((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType == EV_NO_ACTION) &&
- (NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) &&
- ((CompareMem (
- NewEventData,
- TCG_Sp800_155_PlatformId_Event2_SIGNATURE,
- sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1
- ) == 0) ||
- (CompareMem (
- NewEventData,
- TCG_Sp800_155_PlatformId_Event3_SIGNATURE,
- sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1
- ) == 0)))
+ if (((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType != EV_NO_ACTION) {
+ return FALSE;
+ }
+
+ if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) &&
+ (CompareMem (
+ NewEventData,
+ TCG_Sp800_155_PlatformId_Event2_SIGNATURE,
+ sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1
+ ) == 0))
+ {
+ return TRUE;
+ }
+
+ if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event3)) &&
+ (CompareMem (
+ NewEventData,
+ TCG_Sp800_155_PlatformId_Event3_SIGNATURE,
+ sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1
+ ) == 0))
{
return TRUE;
}
diff --git a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c
index 52ea1ac..2b4164c 100644
--- a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c
+++ b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c
@@ -193,9 +193,19 @@ TcgExtractConfig (
// followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
//
ConfigRequestHdr = HiiConstructConfigHdr (&gTcgConfigFormSetGuid, mTcgStorageName, PrivateData->DriverHandle);
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
- ConfigRequest = AllocateZeroPool (Size);
- ASSERT (ConfigRequest != NULL);
+ if (ConfigRequestHdr == NULL) {
+ ASSERT (ConfigRequestHdr != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
+ ConfigRequest = AllocateZeroPool (Size);
+ if (ConfigRequest == NULL) {
+ ASSERT (ConfigRequest != NULL);
+ FreePool (ConfigRequestHdr);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
AllocatedRequest = TRUE;
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, sizeof (TCG_CONFIGURATION));
FreePool (ConfigRequestHdr);
diff --git a/SecurityPkg/Tcg/TcgDxe/TcgDxe.c b/SecurityPkg/Tcg/TcgDxe/TcgDxe.c
index ee6c627..ea4516a 100644
--- a/SecurityPkg/Tcg/TcgDxe/TcgDxe.c
+++ b/SecurityPkg/Tcg/TcgDxe/TcgDxe.c
@@ -286,7 +286,10 @@ TpmCommHashAll (
CtxSize = Sha1GetContextSize ();
Sha1Ctx = AllocatePool (CtxSize);
- ASSERT (Sha1Ctx != NULL);
+ if (Sha1Ctx == NULL) {
+ ASSERT (Sha1Ctx != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
Sha1Init (Sha1Ctx);
Sha1Update (Sha1Ctx, Data, DataLen);
diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c
index 5a23dc5..65b3f81 100644
--- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c
+++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c
@@ -98,7 +98,11 @@ ExtractFileNameFromDevicePath (
ASSERT (DevicePath != NULL);
- String = DevicePathToStr (DevicePath);
+ String = DevicePathToStr (DevicePath);
+ if (String == NULL) {
+ return NULL;
+ }
+
MatchString = String;
LastMatch = String;
FileName = NULL;
diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c
index d262904..e79932d 100644
--- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c
+++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c
@@ -1095,7 +1095,7 @@ IsSignatureFoundInDatabase (
// Enumerate all signature data in SigDB to check if signature exists for executable.
//
CertList = (EFI_SIGNATURE_LIST *)Data;
- while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) {
+ while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) {
CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
if ((CertList->SignatureSize == sizeof (EFI_SIGNATURE_DATA) - 1 + SignatureSize) && (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid))) {
@@ -1173,7 +1173,10 @@ CalculateCertHash (
//
CtxSize = mHash[HashAlg].GetContextSize ();
HashCtx = AllocatePool (CtxSize);
- ASSERT (HashCtx != NULL);
+ if (HashCtx == NULL) {
+ ASSERT (HashCtx != NULL);
+ return FALSE;
+ }
//
// 2. Initialize a hash context.
@@ -1261,7 +1264,7 @@ IsCertHashFoundInDbx (
// Check whether the certificate hash exists in the forbidden database.
//
DbxList = (EFI_SIGNATURE_LIST *)Data;
- while ((DataSize > 0) && (DataSize >= DbxList->SignatureListSize)) {
+ while ((DataSize > 0) && (DataSize >= (UINTN)DbxList->SignatureListSize)) {
//
// Determine Hash Algorithm of Certificate in the forbidden database.
//
@@ -1348,7 +1351,7 @@ GetSignaturelistOffset (
SigList = Database;
SiglistSize = DatabaseSize;
- while ((SiglistSize > 0) && (SiglistSize >= SigList->SignatureListSize)) {
+ while ((SiglistSize > 0) && (SiglistSize >= (UINTN)SigList->SignatureListSize)) {
if (CompareGuid (&SigList->SignatureType, SignatureType)) {
*Offset = DatabaseSize - SiglistSize;
return TRUE;
@@ -1888,7 +1891,10 @@ HashPeImage (
CtxSize = mHash[HashAlg].GetContextSize ();
HashCtx = AllocatePool (CtxSize);
- ASSERT (HashCtx != NULL);
+ if (HashCtx == NULL) {
+ ASSERT (HashCtx != NULL);
+ goto Done;
+ }
// 1. Load the image header into memory.
@@ -2540,7 +2546,7 @@ UpdateDeletePage (
)
{
EFI_STATUS Status;
- UINT32 Index;
+ UINTN Index;
UINTN CertCount;
UINTN GuidIndex;
VOID *StartOpCodeHandle;
@@ -2724,7 +2730,7 @@ DeleteKeyExchangeKey (
UINT8 *Data;
UINT8 *OldData;
UINT32 Attr;
- UINT32 Index;
+ UINTN Index;
EFI_SIGNATURE_LIST *CertList;
EFI_SIGNATURE_LIST *NewCertList;
EFI_SIGNATURE_DATA *Cert;
@@ -2928,7 +2934,7 @@ DeleteSignature (
UINT8 *Data;
UINT8 *OldData;
UINT32 Attr;
- UINT32 Index;
+ UINTN Index;
EFI_SIGNATURE_LIST *CertList;
EFI_SIGNATURE_LIST *NewCertList;
EFI_SIGNATURE_DATA *Cert;
@@ -3206,7 +3212,7 @@ DeleteSignatureEx (
//
// Traverse to target EFI_SIGNATURE_LIST but others will be skipped.
//
- while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) {
+ while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) {
CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize);
Offset += ListWalker->SignatureListSize;
@@ -3513,9 +3519,19 @@ SecureBootExtractConfig (
// followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
//
ConfigRequestHdr = HiiConstructConfigHdr (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, PrivateData->DriverHandle);
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
- ConfigRequest = AllocateZeroPool (Size);
- ASSERT (ConfigRequest != NULL);
+ if (ConfigRequestHdr == NULL) {
+ ASSERT (ConfigRequestHdr != NULL);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
+ ConfigRequest = AllocateZeroPool (Size);
+ if (ConfigRequest == NULL) {
+ ASSERT (ConfigRequest != NULL);
+ FreePool (ConfigRequestHdr);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
AllocatedRequest = TRUE;
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
FreePool (ConfigRequestHdr);
@@ -3794,7 +3810,7 @@ LoadSignatureList (
RemainingSize = DataSize;
ListWalker = (EFI_SIGNATURE_LIST *)VariableData;
- while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize)) {
+ while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize)) {
if (CompareGuid (&ListWalker->SignatureType, &gEfiCertRsa2048Guid)) {
ListType = STRING_TOKEN (STR_LIST_TYPE_RSA2048_SHA256);
} else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertX509Guid)) {
@@ -4210,7 +4226,7 @@ LoadSignatureData (
VOID *EndOpCodeHandle;
UINTN DataSize;
UINTN RemainingSize;
- UINT16 Index;
+ UINT64 Index;
UINT8 *VariableData;
CHAR16 VariableName[BUFFER_MAX_SIZE];
CHAR16 NameBuffer[BUFFER_MAX_SIZE];
@@ -4294,7 +4310,7 @@ LoadSignatureData (
//
// Skip signature list.
//
- while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex-- > 0) {
+ while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize) && ListIndex-- > 0) {
RemainingSize -= ListWalker->SignatureListSize;
ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);
}
diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c
index 483fe4d..ae3e943 100644
--- a/ShellPkg/Application/Shell/Shell.c
+++ b/ShellPkg/Application/Shell/Shell.c
@@ -1262,9 +1262,11 @@ LocateStartupScript (
InternalEfiShellSetEnv (L"homefilesystem", StartupScriptPath, TRUE);
- StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, ((FILEPATH_DEVICE_PATH *)FileDevicePath)->PathName, 0);
- PathRemoveLastItem (StartupScriptPath);
- StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, mStartupScript, 0);
+ if ((DevicePathType (FileDevicePath) == MEDIA_DEVICE_PATH) && (DevicePathSubType (FileDevicePath) == MEDIA_FILEPATH_DP)) {
+ StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, ((FILEPATH_DEVICE_PATH *)FileDevicePath)->PathName, 0);
+ PathRemoveLastItem (StartupScriptPath);
+ StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, mStartupScript, 0);
+ }
}
//
diff --git a/ShellPkg/Application/Shell/ShellEnvVar.c b/ShellPkg/Application/Shell/ShellEnvVar.c
index b97cfe9..9e84d7f 100644
--- a/ShellPkg/Application/Shell/ShellEnvVar.c
+++ b/ShellPkg/Application/Shell/ShellEnvVar.c
@@ -285,19 +285,23 @@ SetEnvironmentVariableList (
//
// set all the variables from the list
//
- for ( Node = (ENV_VAR_LIST *)GetFirstNode (ListHead)
- ; !IsNull (ListHead, &Node->Link)
- ; Node = (ENV_VAR_LIST *)GetNextNode (ListHead, &Node->Link)
- )
- {
- Size = StrSize (Node->Val) - sizeof (CHAR16);
- if (Node->Atts & EFI_VARIABLE_NON_VOLATILE) {
- Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV (Node->Key, Size, Node->Val);
- } else {
- Status = SHELL_SET_ENVIRONMENT_VARIABLE_V (Node->Key, Size, Node->Val);
- }
+ if ((ListHead != NULL) && !IsListEmpty (ListHead)) {
+ for ( Node = (ENV_VAR_LIST *)GetFirstNode (ListHead)
+ ; !IsNull (ListHead, &Node->Link)
+ ; Node = (ENV_VAR_LIST *)GetNextNode (ListHead, &Node->Link)
+ )
+ {
+ if ((Node->Key != NULL) && (Node->Val != NULL)) {
+ Size = StrSize (Node->Val) - sizeof (CHAR16);
+ if (Node->Atts & EFI_VARIABLE_NON_VOLATILE) {
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV (Node->Key, Size, Node->Val);
+ } else {
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_V (Node->Key, Size, Node->Val);
+ }
- ASSERT_EFI_ERROR (Status);
+ ASSERT_EFI_ERROR (Status);
+ }
+ }
}
FreeEnvironmentVariableList (ListHead);
@@ -441,7 +445,7 @@ ShellFindEnvVarInList (
; Node = (ENV_VAR_LIST *)GetNextNode (&gShellEnvVarList.Link, &Node->Link)
)
{
- if ((Node->Key != NULL) && (StrCmp (Key, Node->Key) == 0)) {
+ if ((Node->Key != NULL) && (StrCmp (Key, Node->Key) == 0) && (Node->Val != NULL)) {
*Value = AllocateCopyPool (StrSize (Node->Val), Node->Val);
*ValueSize = StrSize (Node->Val);
if (Atts != NULL) {
diff --git a/ShellPkg/Application/Shell/ShellProtocol.c b/ShellPkg/Application/Shell/ShellProtocol.c
index 3bc6239..646294d 100644
--- a/ShellPkg/Application/Shell/ShellProtocol.c
+++ b/ShellPkg/Application/Shell/ShellProtocol.c
@@ -2853,7 +2853,11 @@ EfiShellGetEnvEx (
; Node = (ENV_VAR_LIST *)GetNextNode (&gShellEnvVarList.Link, &Node->Link)
)
{
- ASSERT (Node->Key != NULL);
+ if (Node->Key == NULL) {
+ ASSERT (FALSE);
+ continue;
+ }
+
Size += StrSize (Node->Key);
}
diff --git a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c
index b0c77e4..44c2ed9 100644
--- a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c
+++ b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c
@@ -398,7 +398,11 @@ ShellCommandIsCommandOnInternalList (
; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link)
)
{
- ASSERT (Node->CommandString != NULL);
+ if (Node->CommandString == NULL) {
+ ASSERT (FALSE);
+ continue;
+ }
+
if (gUnicodeCollation->StriColl (
gUnicodeCollation,
(CHAR16 *)CommandString,
@@ -485,7 +489,11 @@ ShellCommandGetInternalCommandHelp (
; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link)
)
{
- ASSERT (Node->CommandString != NULL);
+ if (Node->CommandString == NULL) {
+ ASSERT (FALSE);
+ continue;
+ }
+
if (gUnicodeCollation->StriColl (
gUnicodeCollation,
(CHAR16 *)CommandString,
@@ -672,23 +680,25 @@ ShellCommandRegisterCommandName (
//
// Get Lexical Comparison Value between PrevCommand and Command list entry
//
- LexicalMatchValue = gUnicodeCollation->StriColl (
- gUnicodeCollation,
- PrevCommand->CommandString,
- Command->CommandString
- );
+ if ((PrevCommand->CommandString != NULL) && (Command->CommandString != NULL)) {
+ LexicalMatchValue = gUnicodeCollation->StriColl (
+ gUnicodeCollation,
+ PrevCommand->CommandString,
+ Command->CommandString
+ );
- //
- // Swap PrevCommand and Command list entry if PrevCommand list entry
- // is alphabetically greater than Command list entry
- //
- if (LexicalMatchValue > 0) {
- Command = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)SwapListEntries (&PrevCommand->Link, &Command->Link);
- } else if (LexicalMatchValue < 0) {
//
- // PrevCommand entry is lexically lower than Command entry
+ // Swap PrevCommand and Command list entry if PrevCommand list entry
+ // is alphabetically greater than Command list entry
//
- break;
+ if (LexicalMatchValue > 0) {
+ Command = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)SwapListEntries (&PrevCommand->Link, &Command->Link);
+ } else if (LexicalMatchValue < 0) {
+ //
+ // PrevCommand entry is lexically lower than Command entry
+ //
+ break;
+ }
}
}
@@ -758,7 +768,11 @@ ShellCommandRunCommandHandler (
; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link)
)
{
- ASSERT (Node->CommandString != NULL);
+ if (Node->CommandString == NULL) {
+ ASSERT (FALSE);
+ continue;
+ }
+
if (gUnicodeCollation->StriColl (
gUnicodeCollation,
(CHAR16 *)CommandString,
@@ -831,7 +845,11 @@ ShellCommandGetManFileNameHandler (
; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link)
)
{
- ASSERT (Node->CommandString != NULL);
+ if (Node->CommandString == NULL) {
+ ASSERT (FALSE);
+ continue;
+ }
+
if (gUnicodeCollation->StriColl (
gUnicodeCollation,
(CHAR16 *)CommandString,
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c
index dd3d7a7..37bccea 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c
@@ -491,6 +491,11 @@ ShellCommandRunDmem (
continue;
}
+ if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gFdtTableGuid)) {
+ DtbTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;
+ continue;
+ }
+
if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMemoryAttributesTableGuid)) {
MemoryAttributesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;
continue;
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c
index 42d766e..bf68eb1 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c
@@ -3011,7 +3011,7 @@ DisplayMmBankConnections (
//
// Divide it to high and low
//
- High = (UINT8)(BankConnections & 0xF0);
+ High = (UINT8)((BankConnections & 0xF0)>>4);
Low = (UINT8)(BankConnections & 0x0F);
if (High != 0xF) {
if (Low != 0xF) {
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
index 91b48e8..0f4068d 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
@@ -96,6 +96,7 @@
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
MdeModulePkg/MdeModulePkg.dec
+ EmbeddedPkg/EmbeddedPkg.dec
[LibraryClasses]
MemoryAllocationLib
@@ -144,3 +145,4 @@
gEfiConfProfilesUefiSpecGuid ## SOMETIMES_CONSUMES ## GUID
gEfiConfProfilesEbbrSpec21Guid ## SOMETIMES_CONSUMES ## GUID
gEfiConfProfilesEbbrSpec22Guid ## SOMETIMES_CONSUMES ## GUID
+ gFdtTableGuid ## SOMETIMES_CONSUMES ## SystemTable
diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c
index 4f39863..3bec32b 100644
--- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c
+++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c
@@ -520,10 +520,6 @@ ShellCommandRunConnect (
}
Handle1 = ConvertHandleIndexToHandle ((UINTN)Intermediate);
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1);
- ShellStatus = SHELL_INVALID_PARAMETER;
- }
} else {
Handle1 = NULL;
}
diff --git a/ShellPkg/ShellPkg.ci.yaml b/ShellPkg/ShellPkg.ci.yaml
index 2c3a70d..4f5c69d 100644
--- a/ShellPkg/ShellPkg.ci.yaml
+++ b/ShellPkg/ShellPkg.ci.yaml
@@ -35,6 +35,7 @@
"MdePkg/MdePkg.dec",
"MdeModulePkg/MdeModulePkg.dec",
"ShellPkg/ShellPkg.dec",
+ "EmbeddedPkg/EmbeddedPkg.dec",
"NetworkPkg/NetworkPkg.dec"
],
# For host based unit tests
diff --git a/StandaloneMmPkg/Core/Dispatcher.c b/StandaloneMmPkg/Core/Dispatcher.c
index 821d9d6..086532e 100644
--- a/StandaloneMmPkg/Core/Dispatcher.c
+++ b/StandaloneMmPkg/Core/Dispatcher.c
@@ -143,6 +143,9 @@ MmLoadImage (
UINTN PageCount;
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS DstBuffer;
+ UINTN Index;
+ UINTN StartIndex;
+ CHAR8 EfiFileName[512];
DEBUG ((DEBUG_INFO, "MmLoadImage - %g\n", &DriverEntry->FileName));
@@ -254,11 +257,6 @@ MmLoadImage (
//
// Print the load address and the PDB file name if it is available
//
- DEBUG_CODE_BEGIN ();
-
- UINTN Index;
- UINTN StartIndex;
- CHAR8 EfiFileName[256];
DEBUG ((
DEBUG_INFO | DEBUG_LOAD,
@@ -308,8 +306,6 @@ MmLoadImage (
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n"));
- DEBUG_CODE_END ();
-
return Status;
}
diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf
deleted file mode 100644
index d804629..0000000
--- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf
+++ /dev/null
@@ -1,42 +0,0 @@
-## @file
-# RISC-V CPU Exception Handler Library
-#
-# Copyright (c) 2022-2023, Ventana Micro Systems Inc. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x0001001B
- BASE_NAME = BaseRiscV64CpuExceptionHandlerLib
- MODULE_UNI_FILE = BaseRiscV64CpuExceptionHandlerLib.uni
- FILE_GUID = 6AB0D5FD-E615-45A3-9374-E284FB061FC9
- MODULE_TYPE = BASE
- VERSION_STRING = 1.0
- LIBRARY_CLASS = CpuExceptionHandlerLib
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = RISCV64
-#
-
-[Sources]
- SupervisorTrapHandler.S
- CpuExceptionHandlerLib.c
- CpuExceptionHandlerLib.h
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
- UefiCpuPkg/UefiCpuPkg.dec
-
-[LibraryClasses]
- BaseLib
- SerialPortLib
- PrintLib
- SynchronizationLib
- PeCoffGetEntryPointLib
- MemoryAllocationLib
- DebugLib
diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni b/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni
deleted file mode 100644
index 00cca22..0000000
--- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni
+++ /dev/null
@@ -1,13 +0,0 @@
-// /** @file
-//
-// Copyright (c) 2016 - 2019, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
-//
-// SPDX-License-Identifier: BSD-2-Clause-Patent
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT #language en-US "RISC-V CPU Exception Handler Librarys."
-
-#string STR_MODULE_DESCRIPTION #language en-US "RISC-V CPU Exception Handler Librarys."
-
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
index 9fcba00..9e0b54e 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
@@ -19,7 +19,7 @@
#
# The following information is for reference only and not required by the build tools.
#
-# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64
+# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64 RISCV64
#
[Sources.Ia32]
@@ -46,6 +46,14 @@
LoongArch/LoongArch64/ArchExceptionHandler.c
LoongArch/LoongArch64/ExceptionHandlerAsm.S | GCC
+[Sources.RISCV64]
+ RiscV/Backtrace.h
+ RiscV/Backtrace.c
+ RiscV/BacktraceHelper.c
+ RiscV/ExceptionLib.c
+ RiscV/ExceptionHandler.h
+ RiscV/ExceptionHandlerAsm.S | GCC
+
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard
gUefiCpuPkgTokenSpaceGuid.PcdCpuStackSwitchExceptionList
@@ -75,5 +83,8 @@
[LibraryClasses.LoongArch64]
CpuLib
+[Guids.RISCV64]
+ gEfiDebugImageInfoTableGuid
+
[BuildOptions]
XCODE:*_*_X64_NASM_FLAGS = -D NO_ABSOLUTE_RELOCS_IN_TEXT
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c
new file mode 100644
index 0000000..9765d72
--- /dev/null
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c
@@ -0,0 +1,175 @@
+/** @file
+ RISC-V backtrace implementation.
+
+ Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
+ Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
+ Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "Backtrace.h"
+
+#define MAX_STACK_FRAME_SIZE SIZE_16KB
+
+STATIC
+INTN
+CheckFpValid (
+ IN UINTN Fp,
+ IN UINTN Sp
+ )
+{
+ UINTN Low, High;
+
+ Low = Sp + 2 * sizeof (UINTN);
+ High = ALIGN_VALUE (Sp, MAX_STACK_FRAME_SIZE);
+
+ return !(Fp < Low || Fp > High || Fp & 0x07);
+}
+
+STATIC
+CONST CHAR8 *
+BaseName (
+ IN CONST CHAR8 *FullName
+ )
+{
+ CONST CHAR8 *Str;
+
+ Str = FullName + AsciiStrLen (FullName);
+
+ while (--Str > FullName) {
+ if ((*Str == '/') || (*Str == '\\')) {
+ return Str + 1;
+ }
+ }
+
+ return Str;
+}
+
+/**
+ Helper for displaying a backtrace.
+
+ @param Regs Pointer to SMODE_TRAP_REGISTERS.
+ @param FirstPdb Pointer to the first symbol file used.
+ @param ListImage If true, only show the full path to symbol file, else
+ show the PC value and its decoded components.
+**/
+STATIC
+VOID
+DumpCpuBacktraceHelper (
+ IN SMODE_TRAP_REGISTERS *Regs,
+ IN CHAR8 *FirstPdb,
+ IN BOOLEAN ListImage
+ )
+{
+ UINTN ImageBase;
+ UINTN PeCoffSizeOfHeader;
+ BOOLEAN IsLeaf;
+ UINTN RootFp;
+ UINTN RootRa;
+ UINTN Sp;
+ UINTN Fp;
+ UINTN Ra;
+ UINTN Idx;
+ CHAR8 *Pdb;
+ CHAR8 *PrevPdb;
+
+ RootRa = Regs->ra;
+ RootFp = Regs->s0;
+
+ Idx = 0;
+ IsLeaf = TRUE;
+ Fp = RootFp;
+ Ra = RootRa;
+ PrevPdb = FirstPdb;
+ while (Fp != 0) {
+ Pdb = GetImageName (Ra, &ImageBase, &PeCoffSizeOfHeader);
+ if (Pdb != NULL) {
+ if (Pdb != PrevPdb) {
+ Idx++;
+ if (ListImage) {
+ DEBUG ((DEBUG_ERROR, "[% 2d] %a\n", Idx, Pdb));
+ }
+
+ PrevPdb = Pdb;
+ }
+
+ if (!ListImage) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n",
+ Ra,
+ ImageBase,
+ Ra - ImageBase,
+ Idx,
+ BaseName (Pdb)
+ ));
+ }
+ } else if (!ListImage) {
+ DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Ra));
+ }
+
+ /*
+ * After the prologue, the frame pointer register s0 will point
+ * to the Canonical Frame Address or CFA, which is the stack
+ * pointer value on entry to the current procedure. The previous
+ * frame pointer and return address pair will reside just prior
+ * to the current stack address held in s0. This puts the return
+ * address at s0 - XLEN/8, and the previous frame pointer at
+ * s0 - 2 * XLEN/8.
+ */
+ Sp = Fp;
+ Fp -= sizeof (UINTN) * 2;
+ Ra = *(UINTN *)(Fp + sizeof (UINTN));
+ Fp = *(UINTN *)(Fp);
+ if (IsLeaf && CheckFpValid (Ra, Sp)) {
+ /* We hit function where ra is not saved on the stack */
+ Fp = Ra;
+ Ra = RootRa;
+ }
+
+ IsLeaf = FALSE;
+ }
+}
+
+/**
+ Display a backtrace.
+
+ @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.
+**/
+VOID
+EFIAPI
+DumpCpuBacktrace (
+ IN EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ SMODE_TRAP_REGISTERS *Regs;
+ CHAR8 *Pdb;
+ UINTN ImageBase;
+ UINTN PeCoffSizeOfHeader;
+
+ Regs = (SMODE_TRAP_REGISTERS *)SystemContext.SystemContextRiscV64;
+ Pdb = GetImageName (Regs->sepc, &ImageBase, &PeCoffSizeOfHeader);
+ if (Pdb != NULL) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n",
+ Regs->sepc,
+ ImageBase,
+ Regs->sepc - ImageBase,
+ BaseName (Pdb)
+ ));
+ } else {
+ DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Regs->sepc));
+ }
+
+ DumpCpuBacktraceHelper (Regs, Pdb, FALSE);
+
+ if (Pdb != NULL) {
+ DEBUG ((DEBUG_ERROR, "\n[ 0] %a\n", Pdb));
+ }
+
+ DumpCpuBacktraceHelper (Regs, Pdb, TRUE);
+}
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h
new file mode 100644
index 0000000..6e29b90
--- /dev/null
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h
@@ -0,0 +1,57 @@
+/** @file
+
+ RISC-V backtrace definition file.
+
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef BACKTRACE_H_
+#define BACKTRACE_H_
+
+#include <PiPei.h>
+#include <Uefi.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseLib.h>
+#include <Library/PeCoffExtraActionLib.h>
+#include <Library/PeCoffGetEntryPointLib.h>
+#include <Library/UefiLib.h>
+#include <Guid/DebugImageInfoTable.h>
+#include "ExceptionHandler.h"
+
+/**
+ Use the EFI Debug Image Table to lookup the FaultAddress and find which PE/COFF image
+ it came from. As long as the PE/COFF image contains a debug directory entry a
+ string can be returned. For ELF and Mach-O images the string points to the Mach-O or ELF
+ image. Microsoft tools contain a pointer to the PDB file that contains the debug information.
+
+ @param FaultAddress Address to find PE/COFF image for.
+ @param ImageBase Return load address of found image
+ @param PeCoffSizeOfHeaders Return the size of the PE/COFF header for the image that was found
+
+ @retval NULL FaultAddress not in a loaded PE/COFF image.
+ @retval Path and file name of PE/COFF image.
+
+**/
+CHAR8 *
+EFIAPI
+GetImageName (
+ IN UINTN FaultAddress,
+ OUT UINTN *ImageBase,
+ OUT UINTN *PeCoffSizeOfHeaders
+ );
+
+/**
+ Display a backtrace.
+
+ @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.
+**/
+VOID
+EFIAPI
+DumpCpuBacktrace (
+ IN EFI_SYSTEM_CONTEXT SystemContext
+ );
+
+#endif // BACKTRACE_H_
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c
new file mode 100644
index 0000000..fdc5666
--- /dev/null
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c
@@ -0,0 +1,71 @@
+/** @file
+ RISC-V backtrace helper functions.
+
+ Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
+ Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
+ Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "Backtrace.h"
+
+/**
+ Use the EFI Debug Image Table to lookup the FaultAddress and find which PE/COFF image
+ it came from. As long as the PE/COFF image contains a debug directory entry a
+ string can be returned. For ELF and Mach-O images the string points to the Mach-O or ELF
+ image. Microsoft tools contain a pointer to the PDB file that contains the debug information.
+
+ @param FaultAddress Address to find PE/COFF image for.
+ @param ImageBase Return load address of found image
+ @param PeCoffSizeOfHeaders Return the size of the PE/COFF header for the image that was found
+
+ @retval NULL FaultAddress not in a loaded PE/COFF image.
+ @retval Path and file name of PE/COFF image.
+
+**/
+CHAR8 *
+EFIAPI
+GetImageName (
+ IN UINTN FaultAddress,
+ OUT UINTN *ImageBase,
+ OUT UINTN *PeCoffSizeOfHeaders
+ )
+{
+ EFI_STATUS Status;
+ EFI_DEBUG_IMAGE_INFO_TABLE_HEADER *DebugTableHeader;
+ EFI_DEBUG_IMAGE_INFO *DebugTable;
+ UINTN Entry;
+ CHAR8 *Address;
+
+ Status = EfiGetSystemConfigurationTable (&gEfiDebugImageInfoTableGuid, (VOID **)&DebugTableHeader);
+ if (EFI_ERROR (Status)) {
+ return NULL;
+ }
+
+ DebugTable = DebugTableHeader->EfiDebugImageInfoTable;
+ if (DebugTable == NULL) {
+ return NULL;
+ }
+
+ Address = (CHAR8 *)(UINTN)FaultAddress;
+ for (Entry = 0; Entry < DebugTableHeader->TableSize; Entry++, DebugTable++) {
+ if (DebugTable->NormalImage != NULL) {
+ if ((DebugTable->NormalImage->ImageInfoType == EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL) &&
+ (DebugTable->NormalImage->LoadedImageProtocolInstance != NULL))
+ {
+ if ((Address >= (CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase) &&
+ (Address <= ((CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase + DebugTable->NormalImage->LoadedImageProtocolInstance->ImageSize)))
+ {
+ *ImageBase = (UINTN)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase;
+ *PeCoffSizeOfHeaders = PeCoffGetSizeOfHeaders ((VOID *)(UINTN)*ImageBase);
+ return PeCoffLoaderGetPdbPointer (DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase);
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c
new file mode 100644
index 0000000..10e3497
--- /dev/null
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c
@@ -0,0 +1,42 @@
+/** @file
+ RISC-V backtrace helper functions for SEC.
+
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "Backtrace.h"
+
+/**
+ Use the EFI Debug Image Table to lookup the FaultAddress and find which PE/COFF image
+ it came from. As long as the PE/COFF image contains a debug directory entry a
+ string can be returned. For ELF and Mach-O images the string points to the Mach-O or ELF
+ image. Microsoft tools contain a pointer to the PDB file that contains the debug information.
+
+ @param FaultAddress Address to find PE/COFF image for.
+ @param ImageBase Return load address of found image
+ @param PeCoffSizeOfHeaders Return the size of the PE/COFF header for the image that was found
+
+ @retval NULL FaultAddress not in a loaded PE/COFF image.
+ @retval Path and file name of PE/COFF image.
+
+**/
+CHAR8 *
+EFIAPI
+GetImageName (
+ IN UINTN FaultAddress,
+ OUT UINTN *ImageBase,
+ OUT UINTN *PeCoffSizeOfHeaders
+ )
+{
+ //
+ // This function is not implemented in SEC phase.
+ // It should be implemented in DXE phase.
+ //
+ *ImageBase = 0;
+ *PeCoffSizeOfHeaders = 0;
+
+ return NULL;
+}
diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandler.h
index 9b7e130..0cf8221 100644
--- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandler.h
@@ -8,16 +8,16 @@
**/
-#ifndef RISCV_CPU_EXECPTION_HANDLER_LIB_H_
-#define RISCV_CPU_EXECPTION_HANDLER_LIB_H_
+#ifndef EXCEPTION_HANDLER_H_
+#define EXCEPTION_HANDLER_H_
#include <Register/RiscV64/RiscVImpl.h>
/**
Trap Handler for S-mode
-
**/
VOID
+EFIAPI
SupervisorModeTrap (
VOID
);
@@ -108,4 +108,4 @@ typedef struct {
} SMODE_TRAP_REGISTERS;
#pragma pack()
-#endif
+#endif /* EXCEPTION_HANDLER_H_ */
diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/SupervisorTrapHandler.S b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandlerAsm.S
index 45070b5..815e28b 100644
--- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/SupervisorTrapHandler.S
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandlerAsm.S
@@ -8,7 +8,7 @@
**/
#include <Base.h>
-#include "CpuExceptionHandlerLib.h"
+#include "ExceptionHandler.h"
.align 3
.section .entry, "ax", %progbits
diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c
index 73a9dd5..d19c992 100644
--- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c
@@ -2,6 +2,9 @@
RISC-V Exception Handler library implementation.
Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
+ Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
+ Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -14,7 +17,8 @@
#include <Library/SerialPortLib.h>
#include <Library/PrintLib.h>
#include <Register/RiscV64/RiscVEncoding.h>
-#include "CpuExceptionHandlerLib.h"
+#include "Backtrace.h"
+#include "ExceptionHandler.h"
//
// Define the maximum message length
@@ -136,11 +140,21 @@ DumpCpuContext (
)
{
UINTN Printed;
+ UINTN RecursiveException;
SMODE_TRAP_REGISTERS *Regs;
Printed = 0;
Regs = (SMODE_TRAP_REGISTERS *)SystemContext.SystemContextRiscV64;
+ RecursiveException = RiscVGetSupervisorScratch ();
+ if (RecursiveException == 0xdeaddead) {
+ InternalPrintMessage ("\nRecursive exception occurred while dumping the CPU state\n");
+
+ CpuDeadLoop ();
+ }
+
+ RiscVSetSupervisorScratch ((UINTN)0xdeaddead);
+
InternalPrintMessage (
"!!!! RISCV64 Exception Type - %016x(%a) !!!!\n",
ExceptionType,
@@ -171,6 +185,8 @@ DumpCpuContext (
#undef REG
#undef REGS
+ DumpCpuBacktrace (SystemContext);
+
DEBUG_CODE_END ();
}
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
index 64de252..00a5b49 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
@@ -20,7 +20,7 @@
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
-# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64
+# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64 RISCV64
#
[Sources.Ia32]
@@ -46,6 +46,13 @@
LoongArch/LoongArch64/ArchExceptionHandler.c
LoongArch/LoongArch64/ExceptionHandlerAsm.S | GCC
+[Sources.RISCV64]
+ RiscV/Backtrace.h
+ RiscV/Backtrace.c
+ RiscV/BacktraceHelperSec.c
+ RiscV/ExceptionLib.c
+ RiscV/ExceptionHandler.h
+ RiscV/ExceptionHandlerAsm.S | GCC
[Packages]
MdePkg/MdePkg.dec
diff --git a/UefiCpuPkg/Library/MpInitLib/AmdSev.c b/UefiCpuPkg/Library/MpInitLib/AmdSev.c
index 5108873..8ffb1b5 100644
--- a/UefiCpuPkg/Library/MpInitLib/AmdSev.c
+++ b/UefiCpuPkg/Library/MpInitLib/AmdSev.c
@@ -273,7 +273,7 @@ SevEsPlaceApHlt (
@param[in] ExchangeInfo The pointer to CPU Exchange Data structure
**/
VOID
-FillExchangeInfoDataSevEs (
+FillExchangeInfoDataSevSnp (
IN volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo
)
{
@@ -293,8 +293,6 @@ FillExchangeInfoDataSevEs (
);
ExchangeInfo->ExtTopoAvail = !!ExtTopoEbx.Bits.LogicalProcessors;
}
-
- ExchangeInfo->SevSnpKnownInitApicId = FALSE;
}
/**
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 96c0980..63b8464 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -1018,15 +1018,17 @@ FillExchangeInfoData (
ExchangeInfo->Enable5LevelPaging = (BOOLEAN)(Cr4.Bits.LA57 == 1);
DEBUG ((DEBUG_INFO, "%a: 5-Level Paging = %d\n", gEfiCallerBaseName, ExchangeInfo->Enable5LevelPaging));
- ExchangeInfo->SevEsIsEnabled = CpuMpData->SevEsIsEnabled;
- ExchangeInfo->SevSnpIsEnabled = CpuMpData->SevSnpIsEnabled;
- ExchangeInfo->GhcbBase = (UINTN)CpuMpData->GhcbBase;
+ ExchangeInfo->SevEsIsEnabled = CpuMpData->SevEsIsEnabled;
+ ExchangeInfo->SevSnpIsEnabled = CpuMpData->SevSnpIsEnabled;
+ ExchangeInfo->GhcbBase = (UINTN)CpuMpData->GhcbBase;
+ ExchangeInfo->ExtTopoAvail = FALSE;
+ ExchangeInfo->SevSnpKnownInitApicId = FALSE;
//
- // Populate SEV-ES specific exchange data.
+ // Populate SEV-SNP specific exchange data.
//
if (ExchangeInfo->SevSnpIsEnabled) {
- FillExchangeInfoDataSevEs (ExchangeInfo);
+ FillExchangeInfoDataSevSnp (ExchangeInfo);
}
//
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index 60cae3b..5d10516 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -901,7 +901,7 @@ ConfidentialComputingGuestHas (
@param[in] ExchangeInfo The pointer to CPU Exchange Data structure
**/
VOID
-FillExchangeInfoDataSevEs (
+FillExchangeInfoDataSevSnp (
IN volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo
);
diff --git a/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm b/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm
index 66d63a2..64358e5 100644
--- a/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm
@@ -24,13 +24,6 @@
;
SevSnpGetInitCpuNumber:
;
- ; If not an SNP guest, leave EBX (CpuNumber) as is
- ;
- lea edi, [esi + MP_CPU_EXCHANGE_INFO_FIELD (SevSnpIsEnabled)]
- cmp byte [edi], 1 ; SevSnpIsEnabled
- jne SevSnpGetCpuNumberDone
-
- ;
; If not starting the AP with a specific ApicId, leave EBX (CpuNumber) as is
;
lea edi, [esi + MP_CPU_EXCHANGE_INFO_FIELD (SevSnpKnownInitApicId)]
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
index 7402a28..1d53b78 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
@@ -236,12 +236,14 @@ SmmWaitForApArrival (
UINTN Index;
UINT32 DelayedCount;
UINT32 BlockedCount;
+ UINT32 DisabledCount;
BOOLEAN SyncNeeded;
PERF_FUNCTION_BEGIN ();
- DelayedCount = 0;
- BlockedCount = 0;
+ DelayedCount = 0;
+ BlockedCount = 0;
+ DisabledCount = 0;
ASSERT (SmmCpuSyncGetArrivedCpuCount (mSmmMpSyncData->SyncContext) <= mNumberOfCpus);
@@ -318,12 +320,13 @@ SmmWaitForApArrival (
}
}
+ mSmmMpSyncData->AllApArrivedWithException = AllCpusInSmmExceptBlockedDisabled ();
if (!mSmmMpSyncData->AllApArrivedWithException) {
//
- // Check for the Blocked & Delayed Case.
+ // Check for the Disabled & Blocked & Delayed Case.
//
- GetSmmDelayedBlockedDisabledCount (&DelayedCount, &BlockedCount, NULL);
- DEBUG ((DEBUG_INFO, "SmmWaitForApArrival: Delayed AP Count = %d, Blocked AP Count = %d\n", DelayedCount, BlockedCount));
+ GetSmmDelayedBlockedDisabledCount (&DelayedCount, &BlockedCount, &DisabledCount);
+ DEBUG ((DEBUG_ERROR, "SmmWaitForApArrival: Failed to wait all APs enter SMI. Delayed AP Count = %d, Blocked AP Count = %d, Disabled AP Count = %d\n", DelayedCount, BlockedCount, DisabledCount));
}
PERF_FUNCTION_END ();
diff --git a/UefiCpuPkg/UefiCpuPkg.ci.yaml b/UefiCpuPkg/UefiCpuPkg.ci.yaml
index a6fd147..57867dd 100644
--- a/UefiCpuPkg/UefiCpuPkg.ci.yaml
+++ b/UefiCpuPkg/UefiCpuPkg.ci.yaml
@@ -30,7 +30,6 @@
],
## Both file path and directory path are accepted.
"IgnoreFiles": [
- "Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h"
]
},
"CompilerPlugin": {
diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc
index aac4668..e011b18 100644
--- a/UefiCpuPkg/UefiCpuPkg.dsc
+++ b/UefiCpuPkg/UefiCpuPkg.dsc
@@ -218,7 +218,6 @@
UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf
[Components.RISCV64]
- UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf
UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf
UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.inf
UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf