aarch64: Restructure feature flag handling
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 26 Sep 2023 14:01:21 +0000 (15:01 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 26 Sep 2023 14:01:21 +0000 (15:01 +0100)
commit4abb672ac1a2a14d32bfee02f2d05ae5e01af637
tree0dfd2e84934d0cfe68521d95b0d4b24f9f112e03
parentfc21e0f029c51687c2b4ca686d0b773ad5efeff4
aarch64: Restructure feature flag handling

The AArch64 feature-flag code is currently limited to a maximum
of 64 features.  This patch reworks it so that the limit can be
increased more easily.  The basic idea is:

(1) Turn the ARM_FEATURE_FOO macros into an enum, with the enum
    counting bit positions.

(2) Make the feature-list macros take an array index argument
    (currently always 0).  The macros then return the
    aarch64_feature_set contents for that array index.

    An N-element array would then be initialised as:

      { MACRO (0), ..., MACRO (N - 1) }

(3) Provide convenience macros for initialising an
    aarch64_feature_set for:

    - a single feature
    - a list of individual features
    - an architecture version
    - an architecture version + a list of additional features

(2) and (3) use the preprocessor to generate static initialisers.
The main restriction was that uses of the same preprocessor macro
cannot be nested.  So if a macro wants to do something for N individual
arguments, it needs to use a chain of N macros to do it.  There then
needs to be a way of deriving N, as a preprocessor token suitable for
pasting.

The easiest way of doing that was to precede each list of features
by the number of features in the list.  So an aarch64_feature_set
initialiser for three features A, B and C would be written:

  AARCH64_FEATURES (3, A, B, C)

This scheme makes it difficult to keep AARCH64_FEATURE_CRYPTO as a
synonym for SHA2+AES, so the patch expands the former to the latter.
gas/config/tc-aarch64.c
include/opcode/aarch64.h
opcodes/aarch64-dis.c
opcodes/aarch64-opc.c
opcodes/aarch64-tbl.h