From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.1 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 026621F4B4 for ; Mon, 12 Oct 2020 18:11:51 +0000 (UTC) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CBA89384607A; Mon, 12 Oct 2020 18:11:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CBA89384607A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1602526310; bh=+fndug+VzX5ZHahBQxVniLRueKTl7e9TbPQow+7Mr1U=; h=References:In-Reply-To:Date:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=UvJUbwzyF1z5JUQthT2DA/MeJIEaPUtRqOOMKWQLUkF/UjkAltlAUmkMYdUZUaoZe nzI8a69MLbXrU2U91fnK0ul4kESLY/DJbSf8GOT6YTTXvbkWEsDLczLWF2NENNrBEL 8qmfiiTy5b5N6uTZdkR0FPZrpWbzuRBJFAf/STD0= Received: from mail-oi1-x243.google.com (mail-oi1-x243.google.com [IPv6:2607:f8b0:4864:20::243]) by sourceware.org (Postfix) with ESMTPS id 56BCB385EC4E for ; Mon, 12 Oct 2020 18:11:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 56BCB385EC4E Received: by mail-oi1-x243.google.com with SMTP id q136so18437484oic.8 for ; Mon, 12 Oct 2020 11:11:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=+fndug+VzX5ZHahBQxVniLRueKTl7e9TbPQow+7Mr1U=; b=ChYrbgo2febYcxt6uaQkM4Sbtsf4iZZSYEQjkJnkVPpUTar757ZTaMmEH0vR6uiuRy 68iezhpfXEP6dnOVOZ6VwIMpOyX2akw6JJ77E8tQ1cbmUCsE5Z08asJT6NOaPItyraaW yxF2Iof1+sZglldWVon4yFq9qUhPfPO6fYCOVIy2haXYEk2EHVuPcKAt0RDrMoQxkaBB cI8Lri3BZi7BFhl8pqn33GaKIMIj94wiWtAsLM2YI0KicDolX1mHzrnKX0QNlvwYBvwV 111qcr8w1XYYeyBsE3/kMWTdEjOxV4HifG2TEUqcezgg5/1al9RlYhk9kb0RQIazQ0+0 5hZw== X-Gm-Message-State: AOAM531hkx0Ou8i+JNxhYm9bNInnerx1YbvqEWCobc6fDSiFGMsAN3lm /SZNKDww3RTa8fKHuc9pByzA2yyyJuPfg/0u3O4= X-Google-Smtp-Source: ABdhPJwHXTYlgazCtEOvi7McDdyzNK5JeiV40VzgiJbGVdkW6NtM1D7aOAvk6a1NEIZPrOkruI2uZ2OlwHXH0dDBh0g= X-Received: by 2002:aca:5058:: with SMTP id e85mr11431976oib.79.1602526307555; Mon, 12 Oct 2020 11:11:47 -0700 (PDT) MIME-Version: 1.0 References: <54bcc4776d50207d54ca1eae32bdffaa6ffe3c01.1602515612.git.fweimer@redhat.com> In-Reply-To: <54bcc4776d50207d54ca1eae32bdffaa6ffe3c01.1602515612.git.fweimer@redhat.com> Date: Mon, 12 Oct 2020 11:11:11 -0700 Message-ID: Subject: Re: [PATCH v2 2/3] x86_64: Add glibc-hwcaps support To: Florian Weimer Content-Type: text/plain; charset="UTF-8" X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: "H.J. Lu via Libc-alpha" Reply-To: "H.J. Lu" Cc: GNU C Library Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" On Mon, Oct 12, 2020 at 8:23 AM Florian Weimer via Libc-alpha wrote: > > The subdirectories match those in the x86-64 psABI: > > https://gitlab.com/x86-psABIs/x86-64-ABI/-/commit/77566eb03bc6a326811cb7e9a6b9396884b67c7c > --- > sysdeps/x86_64/Makefile | 36 +++++++++++++++- > sysdeps/x86_64/dl-hwcaps-subdirs.c | 66 ++++++++++++++++++++++++++++++ > sysdeps/x86_64/tst-glibc-hwcaps.c | 65 +++++++++++++++++++++++++++++ > 3 files changed, 166 insertions(+), 1 deletion(-) > create mode 100644 sysdeps/x86_64/dl-hwcaps-subdirs.c > create mode 100644 sysdeps/x86_64/tst-glibc-hwcaps.c > > diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile > index 42b97c5cc7..16030715e7 100644 > --- a/sysdeps/x86_64/Makefile > +++ b/sysdeps/x86_64/Makefile > @@ -144,7 +144,41 @@ CFLAGS-tst-auditmod10b.c += $(AVX512-CFLAGS) > CFLAGS-tst-avx512-aux.c += $(AVX512-CFLAGS) > CFLAGS-tst-avx512mod.c += $(AVX512-CFLAGS) > endif > -endif > + > +$(objpfx)tst-glibc-hwcaps: \ > + $(objpfx)markermod2-1.so $(objpfx)markermod3-1.so $(objpfx)markermod4-1.so > +$(objpfx)tst-glibc-hwcaps.out: \ > + $(objpfx)markermod2.so \ > + $(objpfx)glibc-hwcaps/x86-64-v2/markermod2.so \ > + $(objpfx)markermod3.so \ > + $(objpfx)glibc-hwcaps/x86-64-v2/markermod3.so \ > + $(objpfx)glibc-hwcaps/x86-64-v3/markermod3.so \ > + $(objpfx)markermod4.so \ > + $(objpfx)glibc-hwcaps/x86-64-v2/markermod4.so \ > + $(objpfx)glibc-hwcaps/x86-64-v3/markermod4.so \ > + $(objpfx)glibc-hwcaps/x86-64-v4/markermod4.so \ > + > +$(objpfx)glibc-hwcaps/x86-64-v2/markermod2.so: $(objpfx)markermod2-2.so > + $(make-target-directory) > + cp $< $@ > +$(objpfx)glibc-hwcaps/x86-64-v2/markermod3.so: $(objpfx)markermod3-2.so > + $(make-target-directory) > + cp $< $@ > +$(objpfx)glibc-hwcaps/x86-64-v3/markermod3.so: $(objpfx)markermod3-3.so > + $(make-target-directory) > + cp $< $@ > +$(objpfx)glibc-hwcaps/x86-64-v2/markermod4.so: $(objpfx)markermod4-2.so > + $(make-target-directory) > + cp $< $@ > +$(objpfx)glibc-hwcaps/x86-64-v3/markermod4.so: $(objpfx)markermod4-3.so > + $(make-target-directory) > + cp $< $@ > +$(objpfx)glibc-hwcaps/x86-64-v4/markermod4.so: $(objpfx)markermod4-4.so > + $(make-target-directory) > + cp $< $@ > + > + > +endif # $(subdir) == elf > > ifeq ($(subdir),csu) > gen-as-const-headers += tlsdesc.sym rtld-offsets.sym > diff --git a/sysdeps/x86_64/dl-hwcaps-subdirs.c b/sysdeps/x86_64/dl-hwcaps-subdirs.c > new file mode 100644 > index 0000000000..c4d8b3a02a > --- /dev/null > +++ b/sysdeps/x86_64/dl-hwcaps-subdirs.c > @@ -0,0 +1,66 @@ > +/* Architecture-specific glibc-hwcaps subdirectories. x86 version. > + Copyright (C) 2020 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > Please use . > +const char _dl_hwcaps_subdirs[] = "x86-64-v4:x86-64-v3:x86-64-v2"; > +enum { subdirs_count = 3 }; > + > +uint32_t > +_dl_hwcaps_subdirs_active (void) > +{ > + int active = 0; > + > + /* Test in reverse preference order. */ > + > + /* x86-64-v2. */ > + if (!(CPU_FEATURE_USABLE (CMPXCHG16B) > + && CPU_FEATURE_USABLE (LAHF64_SAHF64) > + && CPU_FEATURE_USABLE (POPCNT) > + && CPU_FEATURE_USABLE (SSE3) > + && CPU_FEATURE_USABLE (SSE4_1) > + && CPU_FEATURE_USABLE (SSE4_2) > + && CPU_FEATURE_USABLE (SSSE3))) > + return _dl_hwcaps_subdirs_build_bitmask (subdirs_count, active); > + ++active; > + > + /* x86-64-v3. */ > + if (!(CPU_FEATURE_USABLE (AVX) > + && CPU_FEATURE_USABLE (AVX2) > + && CPU_FEATURE_USABLE (BMI1) > + && CPU_FEATURE_USABLE (BMI2) > + && CPU_FEATURE_USABLE (F16C) > + && CPU_FEATURE_USABLE (FMA) > + && CPU_FEATURE_USABLE (LZCNT) > + && CPU_FEATURE_USABLE (MOVBE) > + && CPU_FEATURE_USABLE (OSXSAVE))) > + return _dl_hwcaps_subdirs_build_bitmask (subdirs_count, active); > + ++active; > + > + /* x86-64-v4. */ > + if (!(CPU_FEATURE_USABLE (AVX512F) > + && CPU_FEATURE_USABLE (AVX512BW) > + && CPU_FEATURE_USABLE (AVX512CD) > + && CPU_FEATURE_USABLE (AVX512DQ) > + && CPU_FEATURE_USABLE (AVX512VL))) > + return _dl_hwcaps_subdirs_build_bitmask (subdirs_count, active); > + ++active; > + > + return _dl_hwcaps_subdirs_build_bitmask (subdirs_count, active); > +} > diff --git a/sysdeps/x86_64/tst-glibc-hwcaps.c b/sysdeps/x86_64/tst-glibc-hwcaps.c > new file mode 100644 > index 0000000000..b46e7cb236 > --- /dev/null > +++ b/sysdeps/x86_64/tst-glibc-hwcaps.c > @@ -0,0 +1,65 @@ > +/* glibc-hwcaps subdirectory test. x86_64 version. > + Copyright (C) 2020 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include Please include . > +extern int marker2 (void); > +extern int marker3 (void); > +extern int marker4 (void); > + > +/* Return the x86-64-vN level, 1 for the baseline. */ > +static int > +compute_level (void) > +{ > + /* These checks are not entirely accurate because they are limited > + by GCC capabilities. But wrong results will only result from > + inconsistent CPU models involving virtualization. */ Please use const struct cpu_features *cpu_features = __x86_get_cpu_features (COMMON_CPUID_INDEX_MAX); if (CPU_FEATURE_USABLE_P (cpu_features, CMPXCHG16B) && CPU_FEATURE_USABLE_P (cpu_features, LAHF64_SAHF64) && CPU_FEATURE_USABLE_P (cpu_features, POPCNT) && CPU_FEATURE_USABLE_P (cpu_features, MMX) && CPU_FEATURE_USABLE_P (cpu_features, SSE) && CPU_FEATURE_USABLE_P (cpu_features, SSE2) && CPU_FEATURE_USABLE_P (cpu_features, SSE3) && CPU_FEATURE_USABLE_P (cpu_features, SSSE3) && CPU_FEATURE_USABLE_P (cpu_features, SSE4_1) && CPU_FEATURE_USABLE_P (cpu_features, SSE4_2)) ... > + if (!(__builtin_cpu_supports ("sse3") > + && __builtin_cpu_supports ("sse4.1") > + && __builtin_cpu_supports ("sse4.2") > + && __builtin_cpu_supports ("ssse3"))) > + return 1; > + if (!(__builtin_cpu_supports ("avx") > + && __builtin_cpu_supports ("avx2") > + && __builtin_cpu_supports ("bmi") > + && __builtin_cpu_supports ("bmi2") > + && __builtin_cpu_supports ("fma"))) > + return 2; > + if (!(__builtin_cpu_supports ("avx512f") > + && __builtin_cpu_supports ("avx512bw") > + && __builtin_cpu_supports ("avx512cd") > + && __builtin_cpu_supports ("avx512dq") > + && __builtin_cpu_supports ("avx512vl"))) > + return 3; > + return 4; > +} > + > +static int > +do_test (void) > +{ > + int level = compute_level (); > + printf ("info: detected x86-64 micro-architecture level: %d\n", level); > + TEST_COMPARE (marker2 (), MIN (level, 2)); > + TEST_COMPARE (marker3 (), MIN (level, 3)); > + TEST_COMPARE (marker4 (), MIN (level, 4)); > + return 0; > +} > + > +#include > -- > Red Hat GmbH, https://de.redhat.com/ , Registered seat: Grasbrunn, > Commercial register: Amtsgericht Muenchen, HRB 153243, > Managing Directors: Charles Cachera, Brian Klemm, Laurie Krebs, Michael O'Neill > > -- H.J.