From patchwork Tue Jan 17 13:45:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Victor Rodriguez X-Patchwork-Id: 18927 Received: (qmail 73100 invoked by alias); 17 Jan 2017 13:45:55 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 69311 invoked by uid 89); 17 Jan 2017 13:45:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=BAYES_50, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=H*r:sk:orsmga1, H*r:10.7.209, H*r:ip*10.7.209.21, victor X-HELO: mga07.intel.com X-ExtLoop1: 1 From: Victor Rodriguez To: libc-alpha@sourceware.org Cc: Victor Rodriguez , Dimitri John Ledkov Subject: [RFC PATCH] Add AVX2 capability Date: Tue, 17 Jan 2017 13:45:40 +0000 Message-Id: <20170117134540.21324-1-victor.rodriguez.bahena@intel.com> CPU architectures often gain interesting new instructions as they evolve, but application developers often find it difficult to take advantage of those instructions. The idea of this patch is to help distributions to use the AVX2 instructions. In this patch AVX2 capability is provided to glibc, like tls was implemented. Signed-off-by: Dimitri John Ledkov Signed-off-by: Victor Rodriguez --- elf/dl-cache.c | 6 +++++- elf/dl-hwcaps.c | 17 +++++++++++++++++ elf/ldconfig.c | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/elf/dl-cache.c b/elf/dl-cache.c index cfa335e..ae50470 100644 --- a/elf/dl-cache.c +++ b/elf/dl-cache.c @@ -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); } diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c index 6004ff2..4e46b75 100644 --- a/elf/dl-hwcaps.c +++ b/elf/dl-hwcaps.c @@ -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. */ diff --git a/elf/ldconfig.c b/elf/ldconfig.c index 467ca82..ee21217 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -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 ();