On Wed, Apr 30, 2025 at 6:05 AM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> Wilco Dijkstra <wilco.dijks...@arm.com> writes:
> > Cleanup HWCAP defines - rather than including hwcap.h and then repeating it 
> > using
> > #ifndef, just define the HWCAPs we need exactly as in hwcap.h.
> >
> > libgcc:
> >         * config/aarch64/cpuinfo.c: Cleanup HWCAP defines.
>
> Thanks for doing this.  I agree it's a significant improvement over
> the status quo.  It will be a while before we can reasonably require
> a glibc that provides asm/hwcap.h.  And even once we do, new hwcaps
> will be added on a regular basis, so we can never rely totally on the
> installed header file.  And if, as now, glibc needs to extend the
> structure, we can't rely on the installed header file having the
> most up-to-date definition.
>
> So in practice, if we stuck to the current approach of trying to
> include asm/hwcaps.h, we'd always need to maintain a fallback definition,
> and would need increasingly complex code to decide whether the installed
> header file is new enough.  Having two versions doubles the amount of
> testing needed.  It also increases rather than decreases the amount of
> code.
>
> OK for trunk from my POV, but please leave 24 hrs for others to object.

While reviewing Yury's patch to stop including sys/ifunc.h, I noticed
this patch was never pushed. I was just going to recommend doing the
same thing to Yury of not including asm/hwcap.h but then I noticed
this patch.

Thanks,
Andrew




>
> Richard
>
> >
> > ---
> >
> > diff --git a/libgcc/config/aarch64/cpuinfo.c 
> > b/libgcc/config/aarch64/cpuinfo.c
> > index 
> > 14877f5d8410a51fe47f94cb1a2ff5399f95c253..a4958a00fb53d77a0c2291337543324951ca20df
> >  100644
> > --- a/libgcc/config/aarch64/cpuinfo.c
> > +++ b/libgcc/config/aarch64/cpuinfo.c
> > @@ -37,211 +37,64 @@ typedef struct __ifunc_arg_t {
> >  } __ifunc_arg_t;
> >  #endif
> >
> > -#if __has_include(<asm/hwcap.h>)
> > -#include <asm/hwcap.h>
> > -
> >  /* Architecture features used in Function Multi Versioning.  */
> >  struct {
> >    unsigned long long features;
> >    /* As features grows new fields could be added.  */
> >  } __aarch64_cpu_features __attribute__((visibility("hidden"), nocommon));
> >
> > -#ifndef _IFUNC_ARG_HWCAP
> >  #define _IFUNC_ARG_HWCAP (1ULL << 62)
> > -#endif
> > -#ifndef AT_HWCAP
> >  #define AT_HWCAP 16
> > -#endif
> > -#ifndef HWCAP_FP
> > -#define HWCAP_FP (1 << 0)
> > -#endif
> > -#ifndef HWCAP_ASIMD
> > -#define HWCAP_ASIMD (1 << 1)
> > -#endif
> > -#ifndef HWCAP_EVTSTRM
> > -#define HWCAP_EVTSTRM (1 << 2)
> > -#endif
> > -#ifndef HWCAP_AES
> > -#define HWCAP_AES (1 << 3)
> > -#endif
> > -#ifndef HWCAP_PMULL
> > -#define HWCAP_PMULL (1 << 4)
> > -#endif
> > -#ifndef HWCAP_SHA1
> > -#define HWCAP_SHA1 (1 << 5)
> > -#endif
> > -#ifndef HWCAP_SHA2
> > -#define HWCAP_SHA2 (1 << 6)
> > -#endif
> > -#ifndef HWCAP_CRC32
> > -#define HWCAP_CRC32 (1 << 7)
> > -#endif
> > -#ifndef HWCAP_ATOMICS
> > -#define HWCAP_ATOMICS (1 << 8)
> > -#endif
> > -#ifndef HWCAP_FPHP
> > -#define HWCAP_FPHP (1 << 9)
> > -#endif
> > -#ifndef HWCAP_ASIMDHP
> > -#define HWCAP_ASIMDHP (1 << 10)
> > -#endif
> > -#ifndef HWCAP_CPUID
> > -#define HWCAP_CPUID (1 << 11)
> > -#endif
> > -#ifndef HWCAP_ASIMDRDM
> > -#define HWCAP_ASIMDRDM (1 << 12)
> > -#endif
> > -#ifndef HWCAP_JSCVT
> > -#define HWCAP_JSCVT (1 << 13)
> > -#endif
> > -#ifndef HWCAP_FCMA
> > -#define HWCAP_FCMA (1 << 14)
> > -#endif
> > -#ifndef HWCAP_LRCPC
> > -#define HWCAP_LRCPC (1 << 15)
> > -#endif
> > -#ifndef HWCAP_DCPOP
> > -#define HWCAP_DCPOP (1 << 16)
> > -#endif
> > -#ifndef HWCAP_SHA3
> > -#define HWCAP_SHA3 (1 << 17)
> > -#endif
> > -#ifndef HWCAP_SM3
> > -#define HWCAP_SM3 (1 << 18)
> > -#endif
> > -#ifndef HWCAP_SM4
> > -#define HWCAP_SM4 (1 << 19)
> > -#endif
> > -#ifndef HWCAP_ASIMDDP
> > -#define HWCAP_ASIMDDP (1 << 20)
> > -#endif
> > -#ifndef HWCAP_SHA512
> > -#define HWCAP_SHA512 (1 << 21)
> > -#endif
> > -#ifndef HWCAP_SVE
> > -#define HWCAP_SVE (1 << 22)
> > -#endif
> > -#ifndef HWCAP_ASIMDFHM
> > -#define HWCAP_ASIMDFHM (1 << 23)
> > -#endif
> > -#ifndef HWCAP_DIT
> > -#define HWCAP_DIT (1 << 24)
> > -#endif
> > -#ifndef HWCAP_ILRCPC
> > -#define HWCAP_ILRCPC (1 << 26)
> > -#endif
> > -#ifndef HWCAP_FLAGM
> > -#define HWCAP_FLAGM (1 << 27)
> > -#endif
> > -#ifndef HWCAP_SSBS
> > -#define HWCAP_SSBS (1 << 28)
> > -#endif
> > -#ifndef HWCAP_SB
> > -#define HWCAP_SB (1 << 29)
> > -#endif
> > -#ifndef HWCAP_PACA
> > -#define HWCAP_PACA (1 << 30)
> > -#endif
> > -#ifndef HWCAP_PACG
> > -#define HWCAP_PACG (1UL << 31)
> > -#endif
> > -
> > -#ifndef AT_HWCAP2
> >  #define AT_HWCAP2 26
> > -#endif
> > -#ifndef HWCAP2_DCPODP
> > -#define HWCAP2_DCPODP (1 << 0)
> > -#endif
> > -#ifndef HWCAP2_SVE2
> > -#define HWCAP2_SVE2 (1 << 1)
> > -#endif
> > -#ifndef HWCAP2_SVEAES
> > -#define HWCAP2_SVEAES (1 << 2)
> > -#endif
> > -#ifndef HWCAP2_SVEPMULL
> > -#define HWCAP2_SVEPMULL (1 << 3)
> > -#endif
> > -#ifndef HWCAP2_SVEBITPERM
> > -#define HWCAP2_SVEBITPERM (1 << 4)
> > -#endif
> > -#ifndef HWCAP2_SVESHA3
> > -#define HWCAP2_SVESHA3 (1 << 5)
> > -#endif
> > -#ifndef HWCAP2_SVESM4
> > -#define HWCAP2_SVESM4 (1 << 6)
> > -#endif
> > -#ifndef HWCAP2_FLAGM2
> > -#define HWCAP2_FLAGM2 (1 << 7)
> > -#endif
> > -#ifndef HWCAP2_FRINT
> > -#define HWCAP2_FRINT (1 << 8)
> > -#endif
> > -#ifndef HWCAP2_SVEI8MM
> > -#define HWCAP2_SVEI8MM (1 << 9)
> > -#endif
> > -#ifndef HWCAP2_SVEF32MM
> > -#define HWCAP2_SVEF32MM (1 << 10)
> > -#endif
> > -#ifndef HWCAP2_SVEF64MM
> > -#define HWCAP2_SVEF64MM (1 << 11)
> > -#endif
> > -#ifndef HWCAP2_SVEBF16
> > -#define HWCAP2_SVEBF16 (1 << 12)
> > -#endif
> > -#ifndef HWCAP2_I8MM
> > -#define HWCAP2_I8MM (1 << 13)
> > -#endif
> > -#ifndef HWCAP2_BF16
> > -#define HWCAP2_BF16 (1 << 14)
> > -#endif
> > -#ifndef HWCAP2_DGH
> > -#define HWCAP2_DGH (1 << 15)
> > -#endif
> > -#ifndef HWCAP2_RNG
> > -#define HWCAP2_RNG (1 << 16)
> > -#endif
> > -#ifndef HWCAP2_BTI
> > -#define HWCAP2_BTI (1 << 17)
> > -#endif
> > -#ifndef HWCAP2_MTE
> > -#define HWCAP2_MTE (1 << 18)
> > -#endif
> > -#ifndef HWCAP2_RPRES
> > -#define HWCAP2_RPRES (1 << 21)
> > -#endif
> > -#ifndef HWCAP2_MTE3
> > -#define HWCAP2_MTE3 (1 << 22)
> > -#endif
> > -#ifndef HWCAP2_SME
> > -#define HWCAP2_SME (1 << 23)
> > -#endif
> > -#ifndef HWCAP2_SME_I16I64
> > -#define HWCAP2_SME_I16I64 (1 << 24)
> > -#endif
> > -#ifndef HWCAP2_SME_F64F64
> > -#define HWCAP2_SME_F64F64 (1 << 25)
> > -#endif
> > -#ifndef HWCAP2_WFXT
> > -#define HWCAP2_WFXT (1UL << 31)
> > -#endif
> > -#ifndef HWCAP2_EBF16
> > -#define HWCAP2_EBF16 (1UL << 32)
> > -#endif
> > -#ifndef HWCAP2_SVE_EBF16
> > -#define HWCAP2_SVE_EBF16 (1UL << 33)
> > -#endif
> > -#ifndef HWCAP2_CSSC
> > -#define HWCAP2_CSSC (1UL << 34)
> > -#endif
> > -#ifndef HWCAP2_SME2
> > -#define HWCAP2_SME2 (1UL << 37)
> > -#endif
> > -#ifndef HWCAP2_MOPS
> > -#define HWCAP2_MOPS (1UL << 43)
> > -#endif
> > -#ifndef HWCAP2_LRCPC3
> > -#define HWCAP2_LRCPC3        (1UL << 46)
> > -#endif
> > +
> > +#define HWCAP_FP             (1 << 0)
> > +#define HWCAP_ASIMD          (1 << 1)
> > +#define HWCAP_PMULL          (1 << 4)
> > +#define HWCAP_SHA2           (1 << 6)
> > +#define HWCAP_CRC32          (1 << 7)
> > +#define HWCAP_ATOMICS                (1 << 8)
> > +#define HWCAP_FPHP           (1 << 9)
> > +#define HWCAP_ASIMDHP                (1 << 10)
> > +#define HWCAP_ASIMDRDM               (1 << 12)
> > +#define HWCAP_JSCVT          (1 << 13)
> > +#define HWCAP_FCMA           (1 << 14)
> > +#define HWCAP_LRCPC          (1 << 15)
> > +#define HWCAP_DCPOP          (1 << 16)
> > +#define HWCAP_SHA3           (1 << 17)
> > +#define HWCAP_SM3            (1 << 18)
> > +#define HWCAP_SM4            (1 << 19)
> > +#define HWCAP_ASIMDDP                (1 << 20)
> > +#define HWCAP_SVE            (1 << 22)
> > +#define HWCAP_ASIMDFHM               (1 << 23)
> > +#define HWCAP_DIT            (1 << 24)
> > +#define HWCAP_ILRCPC         (1 << 26)
> > +#define HWCAP_FLAGM          (1 << 27)
> > +#define HWCAP_SSBS           (1 << 28)
> > +#define HWCAP_SB             (1 << 29)
> > +
> > +#define HWCAP2_DCPODP                (1 << 0)
> > +#define HWCAP2_SVE2          (1 << 1)
> > +#define HWCAP2_SVEPMULL              (1 << 3)
> > +#define HWCAP2_SVEBITPERM    (1 << 4)
> > +#define HWCAP2_SVESHA3               (1 << 5)
> > +#define HWCAP2_SVESM4                (1 << 6)
> > +#define HWCAP2_FLAGM2                (1 << 7)
> > +#define HWCAP2_FRINT         (1 << 8)
> > +#define HWCAP2_SVEF32MM              (1 << 10)
> > +#define HWCAP2_SVEF64MM              (1 << 11)
> > +#define HWCAP2_I8MM          (1 << 13)
> > +#define HWCAP2_BF16          (1 << 14)
> > +#define HWCAP2_RNG           (1 << 16)
> > +#define HWCAP2_BTI           (1 << 17)
> > +#define HWCAP2_MTE           (1 << 18)
> > +#define HWCAP2_SME           (1 << 23)
> > +#define HWCAP2_SME_I16I64    (1 << 24)
> > +#define HWCAP2_SME_F64F64    (1 << 25)
> > +#define HWCAP2_WFXT          (1UL << 31)
> > +#define HWCAP2_CSSC          (1UL << 34)
> > +#define HWCAP2_SME2          (1UL << 37)
> > +#define HWCAP2_MOPS          (1UL << 43)
> > +#define HWCAP2_LRCPC3                (1UL << 46)
> >
> >  static void
> >  __init_cpu_features_constructor (unsigned long hwcap,
> > @@ -382,5 +235,4 @@ __init_cpu_features(void)
> >  #undef getCPUFeature
> >  #undef setCPUFeature
> >  }
> > -#endif /* __has_include(<asm/hwcap.h>)  */
> >  #endif /* __has_include(<sys/auxv.h>)  */

Reply via email to