@@ -259,8 +259,9 @@ _dl_load_cache_lookup (const char *name)
platform = 1ULL << platform;
#define _DL_HWCAP_TLS_MASK (1LL << 63)
+#define _DL_HWCAP_AVX2_MASK (1LL << 62)
uint64_t hwcap_exclude = ~((GLRO(dl_hwcap) & GLRO(dl_hwcap_mask))
- | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK);
+ | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK | _DL_HWCAP_AVX2_MASK);
/* Only accept hwcap if it's for the right platform. */
#define HWCAP_CHECK \
@@ -271,6 +272,9 @@ _dl_load_cache_lookup (const char *name)
if (_DL_PLATFORMS_COUNT \
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) \
+ continue; \
+ if (!HAS_ARCH_FEATURE (AVX2_Usable) && \
+ (lib->hwcap & _DL_HWCAP_AVX2_MASK)) \
continue
SEARCH_CACHE (cache_new);
}
@@ -111,6 +111,9 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
/* For TLS enabled builds always add 'tls'. */
++cnt;
+ /* Add 'avx2' capability on x86_64 */
+ ++cnt;
+
/* Create temporary data structure to generate result table. */
struct r_strlenpair temp[cnt];
m = 0;
@@ -163,6 +166,20 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
temp[m].len = 3;
++m;
+ if (HAS_ARCH_FEATURE (AVX2_Usable))
+ {
+ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+ _dl_debug_printf (" adding avx2 cap support\n");
+ temp[m].str = "avx2";
+ temp[m].len = 4;
+ ++m;
+ }
+ else {
+ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+ _dl_debug_printf (" not adding avx2 cap support\n");
+ --cnt;
+ }
+
assert (m == cnt);
/* Determine the total size of all strings together. */
@@ -1298,6 +1298,7 @@ main (int argc, char **argv)
under which TLS support was optional. The entry is no longer needed, but
must remain for compatibility. */
hwcap_extra[63 - _DL_FIRST_EXTRA] = "tls";
+ hwcap_extra[62 - _DL_FIRST_EXTRA] = "avx2";
set_hwcap ();