mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-07-05 03:30:49 +02:00
Intel x64 ASM: Add new assembly for AES
Support AES-XTS AVX512/VAES Support AES-GCM AVX512/VAES Support AES-ECB/CBC/CTR AVX512/VAES/AVX1/AES-NI. Remove code from aes_asm.S/aes_asm.asm Add CPU defines for AVX512 and VAES Updated ASM files with new defines for AVX512. Added support for printing out the new CPU Id flags in benchmark. Added new files to Windows projects. aes.c: Supports ECB/CBC/CTR in assembly. Supports calling AVX512/VAES assembly.
This commit is contained in:
@@ -49,7 +49,7 @@ jobs:
|
||||
{
|
||||
if (($7 !~ /^[0-9]+$/) ||
|
||||
($8 ~ /^(wc_|wolf|WOLF|__pfx|fe_|sp_[a-zA-Z090-0_]*[0-9])/) ||
|
||||
($8 ~ /(_avx[12]|_AVX[12]|_sse[12]|_SSE[12]|_aesni|_AESNI|_bmi2|_x64$)/))
|
||||
($8 ~ /(_avx[12]|_AVX[12]|_sse[12]|_SSE[12]|_aesni|_AESNI|_vaes|_VAES|_avx512|_AVX512|_bmi2|_x64$)/))
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
@@ -381,6 +381,7 @@ NO_AES_DECRYPT
|
||||
NO_ARDUINO_DEFAULT
|
||||
NO_ASM
|
||||
NO_ASN_OLD_TYPE_NAMES
|
||||
NO_AVX512_SUPPORT
|
||||
NO_CAMELLIA_CBC
|
||||
NO_CERT
|
||||
NO_CERT_IN_TICKET
|
||||
@@ -459,6 +460,7 @@ NO_STDIO_FGETS_REMAP
|
||||
NO_STM32_HMAC
|
||||
NO_TKERNEL_MEM_POOL
|
||||
NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
|
||||
NO_VAES_SUPPORT
|
||||
NO_VERIFY_OID
|
||||
NO_WC_DHGENERATEPUBLIC
|
||||
NO_WC_SHE_GETUID
|
||||
|
||||
@@ -200,6 +200,8 @@ $(obj)/wolfcrypt/src/aes_gcm_asm.o: asflags-y := $(WOLFSSL_ASFLAGS) $(ASFLAGS_FP
|
||||
$(obj)/wolfcrypt/src/aes_gcm_asm.o: OBJECT_FILES_NON_STANDARD := y
|
||||
$(obj)/wolfcrypt/src/aes_xts_asm.o: asflags-y := $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE)
|
||||
$(obj)/wolfcrypt/src/aes_xts_asm.o: OBJECT_FILES_NON_STANDARD := y
|
||||
$(obj)/wolfcrypt/src/aes_x86_64_asm.o: asflags-y := $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE)
|
||||
$(obj)/wolfcrypt/src/aes_x86_64_asm.o: OBJECT_FILES_NON_STANDARD := y
|
||||
$(obj)/wolfcrypt/src/sp_x86_64_asm.o: asflags-y := $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE)
|
||||
$(obj)/wolfcrypt/src/sp_x86_64_asm.o: OBJECT_FILES_NON_STANDARD := y
|
||||
$(obj)/wolfcrypt/src/sha256_asm.o: asflags-y := $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE)
|
||||
|
||||
@@ -109,6 +109,7 @@ endif
|
||||
|
||||
if BUILD_AESNI
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_x86_64_asm.S
|
||||
if BUILD_X86_ASM
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S
|
||||
else
|
||||
@@ -259,6 +260,7 @@ endif BUILD_PPC64_ASM
|
||||
|
||||
if BUILD_AESNI
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_x86_64_asm.S
|
||||
if BUILD_X86_ASM
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S
|
||||
else
|
||||
@@ -532,6 +534,7 @@ endif BUILD_PPC64_ASM
|
||||
|
||||
if BUILD_AESNI
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_x86_64_asm.S
|
||||
if BUILD_X86_ASM
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S
|
||||
else
|
||||
@@ -867,6 +870,7 @@ endif BUILD_AES
|
||||
|
||||
if BUILD_AESNI
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_x86_64_asm.S
|
||||
if BUILD_X86_ASM
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S
|
||||
else
|
||||
@@ -1708,6 +1712,7 @@ endif
|
||||
if !BUILD_FIPS_V2_PLUS
|
||||
if BUILD_AESNI
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_x86_64_asm.S
|
||||
if BUILD_X86_ASM
|
||||
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S
|
||||
else
|
||||
|
||||
@@ -4794,6 +4794,8 @@ static void print_cpu_features(void)
|
||||
if (IS_INTEL_MOVBE(cpuid_flags)) printf(" movbe");
|
||||
if (IS_INTEL_BMI1(cpuid_flags)) printf(" bmi1");
|
||||
if (IS_INTEL_SHA(cpuid_flags)) printf(" sha");
|
||||
if (IS_INTEL_VAES(cpuid_flags)) printf(" vaes");
|
||||
if (IS_INTEL_AVX512(cpuid_flags)) printf(" avx512");
|
||||
#endif
|
||||
#ifdef __aarch64__
|
||||
printf("Aarch64 -");
|
||||
|
||||
+773
-2
File diff suppressed because it is too large
Load Diff
+2
-1309
File diff suppressed because it is too large
Load Diff
+51
-1528
File diff suppressed because it is too large
Load Diff
+14233
-16
File diff suppressed because it is too large
Load Diff
+14165
-16
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifdef WOLFSSL_X86_64_BUILD
|
||||
#ifndef __APPLE__
|
||||
|
||||
@@ -130,6 +130,8 @@
|
||||
if (cpuid_flag(1, 0, ECX, 22)) { new_cpuid_flags |= CPUID_MOVBE ; }
|
||||
if (cpuid_flag(7, 0, EBX, 3)) { new_cpuid_flags |= CPUID_BMI1 ; }
|
||||
if (cpuid_flag(7, 0, EBX, 29)) { new_cpuid_flags |= CPUID_SHA ; }
|
||||
if (cpuid_flag(7, 0, ECX, 9)) { new_cpuid_flags |= CPUID_VAES ; }
|
||||
if (cpuid_flag(7, 0, EBX, 16)) { new_cpuid_flags |= CPUID_AVX512; }
|
||||
(void)wolfSSL_Atomic_Uint_CompareExchange
|
||||
(&cpuid_flags, &old_cpuid_flags, new_cpuid_flags);
|
||||
}
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifndef __APPLE__
|
||||
.text
|
||||
|
||||
@@ -16,6 +16,7 @@ EXTRA_DIST += wolfcrypt/src/evp.c
|
||||
EXTRA_DIST += wolfcrypt/src/evp_pk.c
|
||||
EXTRA_DIST += wolfcrypt/src/asm.c
|
||||
EXTRA_DIST += wolfcrypt/src/aes_asm.asm
|
||||
EXTRA_DIST += wolfcrypt/src/aes_x86_64_asm.asm
|
||||
EXTRA_DIST += wolfcrypt/src/aes_gcm_asm.asm
|
||||
EXTRA_DIST += wolfcrypt/src/aes_xts_asm.asm
|
||||
EXTRA_DIST += wolfcrypt/src/chacha_asm.asm
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifdef WOLFSSL_X86_64_BUILD
|
||||
#ifdef HAVE_INTEL_AVX1
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifdef WOLFSSL_X86_64_BUILD
|
||||
#ifndef __APPLE__
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifndef __APPLE__
|
||||
.data
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifdef HAVE_INTEL_AVX1
|
||||
#ifndef __APPLE__
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifdef WOLFSSL_HAVE_MLDSA
|
||||
#ifdef HAVE_INTEL_AVX2
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
#define HAVE_INTEL_AVX2
|
||||
#endif /* HAVE_INTEL_AVX2 */
|
||||
#endif /* NO_AVX2_SUPPORT */
|
||||
#ifndef NO_VAES_SUPPORT
|
||||
#ifndef HAVE_INTEL_VAES
|
||||
#define HAVE_INTEL_VAES
|
||||
#endif /* HAVE_INTEL_VAES */
|
||||
#endif /* NO_VAES_SUPPORT */
|
||||
#ifndef NO_AVX512_SUPPORT
|
||||
#ifndef HAVE_INTEL_AVX512
|
||||
#define HAVE_INTEL_AVX512
|
||||
#endif /* HAVE_INTEL_AVX512 */
|
||||
#endif /* NO_AVX512_SUPPORT */
|
||||
|
||||
#ifdef WOLFSSL_HAVE_MLKEM
|
||||
#ifdef HAVE_INTEL_AVX2
|
||||
|
||||
+591
-577
File diff suppressed because it is too large
Load Diff
@@ -489,6 +489,20 @@
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)%(Filename).obj</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">$(IntDir)%(Filename).obj</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="wolfcrypt\src\aes_x86_64_asm.asm">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">false</ExcludedFromBuild>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)%(Filename).obj</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">$(IntDir)%(Filename).obj</Outputs>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">false</ExcludedFromBuild>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)%(Filename).obj</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">$(IntDir)%(Filename).obj</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="wolfcrypt\src\aes_gcm_asm.asm">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">false</ExcludedFromBuild>
|
||||
|
||||
@@ -67,6 +67,8 @@ typedef word32 cpuid_flags_t;
|
||||
#define CPUID_MOVBE 0x0080 /* Move and byte swap */
|
||||
#define CPUID_BMI1 0x0100 /* ANDN */
|
||||
#define CPUID_SHA 0x0200 /* SHA-1 and SHA-256 instructions */
|
||||
#define CPUID_VAES 0x0400
|
||||
#define CPUID_AVX512 0x0800
|
||||
|
||||
#define IS_INTEL_AVX1(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX1)
|
||||
#define IS_INTEL_AVX2(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX2)
|
||||
@@ -78,6 +80,8 @@ typedef word32 cpuid_flags_t;
|
||||
#define IS_INTEL_MOVBE(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_MOVBE)
|
||||
#define IS_INTEL_BMI1(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_BMI1)
|
||||
#define IS_INTEL_SHA(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_SHA)
|
||||
#define IS_INTEL_VAES(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_VAES)
|
||||
#define IS_INTEL_AVX512(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX512)
|
||||
|
||||
#elif defined(HAVE_CPUID_AARCH64)
|
||||
|
||||
|
||||
@@ -371,6 +371,20 @@
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)%(Filename).obj</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">$(IntDir)%(Filename).obj</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\..\wolfcrypt\src\aes_x86_64_asm.asm">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">false</ExcludedFromBuild>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)%(Filename).obj</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">$(IntDir)%(Filename).obj</Outputs>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">false</ExcludedFromBuild>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)%(Filename).obj</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">$(IntDir)%(Filename).obj</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\..\wolfcrypt\src\aes_gcm_asm.asm">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">false</ExcludedFromBuild>
|
||||
|
||||
Reference in New Issue
Block a user