]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Do not compile AVX2 code if AVX2 intrinsics is not supported
authorMilan Broz <gmazyland@gmail.com>
Tue, 28 Apr 2026 20:21:14 +0000 (22:21 +0200)
committerNorbert Pocs <norbertp@openssl.org>
Thu, 30 Apr 2026 11:44:15 +0000 (13:44 +0200)
Old and exotic compilers do not support AVX2 instrinsic.
Add guard for Clang, GCC >= 8 and MSVC >= 2019.

Fixes: #30958
Reviewed-by: Eugene Syromiatnikov <esyr@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Nikola Pajkovsky <nikolap@openssl.org>
MergeDate: Thu Apr 30 11:44:32 2026
(Merged from https://github.com/openssl/openssl/pull/31020)

crypto/evp/enc_b64_avx2.c
crypto/evp/enc_b64_avx2.h
crypto/evp/encode.c

index 5a3d6d921de32c056233944d51ee42cc21c3523f..dafa834a4813e38b11472b41a96992113daa27f4 100644 (file)
@@ -7,6 +7,7 @@
 
 #if defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
 #if !defined(_M_ARM64EC)
+#if defined(HAVE_AVX2_INTRINSICS)
 #define STRINGIFY_IMPLEMENTATION_(a) #a
 #define STRINGIFY(a) STRINGIFY_IMPLEMENTATION_(a)
 
@@ -668,5 +669,6 @@ size_t encode_base64_avx2(EVP_ENCODE_CTX *ctx, unsigned char *dst,
     return (size_t)(out - (uint8_t *)dst) + evp_encodeblock_int(ctx, out, src + i, srclen - i, final_wrap_cnt);
 }
 OPENSSL_UNTARGET_AVX2
+#endif /* defined(HAVE_AVX2_INTRINSICS) */
 #endif /* !defined(_M_ARM64EC) */
 #endif
index 89dba6285d54ab5ab72216148533bf5ac7bcee18..71b0a004e7d7788e28aa5da6e46b6bbad997a7ba 100644 (file)
@@ -4,11 +4,21 @@
 #include <openssl/evp.h>
 #include <stddef.h>
 
+#if defined(__clang__)
+#define HAVE_AVX2_INTRINSICS 1
+#elif defined(__GNUC__) && (__GNUC__ >= 8)
+#define HAVE_AVX2_INTRINSICS 1
+#elif defined(_MSC_VER) && (_MSC_VER >= 1920) /* MSVC 2019 */
+#define HAVE_AVX2_INTRINSICS 1
+#endif
+
 #if defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
 #if !defined(_M_ARM64EC)
+#if defined(HAVE_AVX2_INTRINSICS)
 size_t encode_base64_avx2(EVP_ENCODE_CTX *ctx,
     unsigned char *out, const unsigned char *src, int srclen,
     int newlines, int *wrap_cnt);
+#endif /* defined(HAVE_AVX2_INTRINSICS) */
 #endif /* !defined(_M_ARM64EC) */
 #endif
 
index 4f2c412c3cb62975167503fa79d36ebf8da9ac5a..4686e0d910535dd0a01feb840f7efdee27b33b75 100644 (file)
@@ -405,14 +405,14 @@ int EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
         j = evp_encodeblock_int(ctx, out, in, inl - (inl % EVP_ENCODE_B64_LENGTH),
             &wrap_cnt);
     } else {
-#if defined(__AVX2__)
+#if defined(__AVX2__) && defined(HAVE_AVX2_INTRINSICS)
         const int newlines = !(ctx->flags & EVP_ENCODE_CTX_NO_NEWLINES) ? EVP_ENCODE_B64_LENGTH : 0;
 
         j = encode_base64_avx2(ctx,
             (unsigned char *)out,
             (const unsigned char *)in,
             inl - (inl % EVP_ENCODE_B64_LENGTH), newlines, &wrap_cnt);
-#elif defined(HAS_IA32CAP_IS_64)
+#elif defined(HAS_IA32CAP_IS_64) && defined(HAVE_AVX2_INTRINSICS)
         if ((OPENSSL_ia32cap_P[2] & (1u << 5)) != 0) {
             const int newlines = !(ctx->flags & EVP_ENCODE_CTX_NO_NEWLINES) ? EVP_ENCODE_B64_LENGTH : 0;
 
@@ -473,9 +473,9 @@ int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen)
 {
     int wrap_cnt = 0;
 
-#if defined(__AVX2__)
+#if defined(__AVX2__) && defined(HAVE_AVX2_INTRINSICS)
     return (int)encode_base64_avx2(NULL, t, f, dlen, 0, &wrap_cnt);
-#elif defined(HAS_IA32CAP_IS_64)
+#elif defined(HAS_IA32CAP_IS_64) && defined(HAVE_AVX2_INTRINSICS)
     if ((OPENSSL_ia32cap_P[2] & (1u << 5)) != 0)
         return (int)encode_base64_avx2(NULL, t, f, dlen, 0, &wrap_cnt);
     else