/* Copyright (C) 2012-2022 Free Software Foundation, Inc.
   Contributed by ARM Ltd.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   GCC 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
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with GCC; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */

/* This is a list of ISA extentsions in AArch64.

   Before using #include to read this file, define a macro:

      AARCH64_OPT_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON,
			    EXPLICIT_OFF, FEATURE_STRING)

   - NAME is the name of the extension, represented as a string constant.

   - IDENT is the canonical internal name for this flag.

   - REQUIRES is a list of features that must be enabled whenever this
     feature is enabled.  The relationship is implicitly transitive:
     if A appears in B's REQUIRES and B appears in C's REQUIRES then
     A and B must be enabled whenever C is.  Thus, turning on C also
     turns on A and B, while turning off A or B also turns off C.

   - EXPLICIT_ON is a list of features that are enabled by an explicit
     +NAME specification, in addition to those listed in REQUIRES.
     Usually this is an empty list; comments below explain the exceptions.
     The list is implicitly transitively closed wrt REQUIRES (but *not*
     to EXPLICIT_ON, since NAME is the only thing explicit in +NAME).
     Thus if A is in B's REQUIRES and B is in C's EXPLICIT_ON, +C will
     enable both B and A.  B's EXPLICIT_ON has no effect on +C.

   - EXPLICIT_OFF is a list of features that are disabled by an explicit
     +noNAME specification, in addition to the features that are transitively
     dependent on NAME (according to REQUIRES).  As with EXPLICIT_ON,
     this is usually an empty list; comments below explain the exceptions.
     If a feature A appears in this list then the list implicitly includes
     any features that are transitively dependent on A (according to REQUIRES).

   - FEAT_STRING is a string containing the entries in the 'Features' field of
     /proc/cpuinfo on a GNU/Linux system that correspond to this architecture
     extension being available.  Sometimes multiple entries are needed to enable
     the extension (for example, the 'crypto' extension depends on four
     entries: aes, pmull, sha1, sha2 being present).  In that case this field
     should contain a space (" ") separated list of the strings in 'Features'
     that are required.  Their order is not important.  An empty string means
     do not detect this feature during auto detection.

   The list of features must follow topological order wrt REQUIRES
   and EXPLICIT_ON.  For example, if A is in B's REQUIRES list, A must
   come before B.  This is enforced by aarch64-feature-deps.h.

   NOTE: Any changes to the AARCH64_OPT_EXTENSION macro need to be mirrored in
   config.gcc.  */

AARCH64_OPT_EXTENSION("fp", FP, (), (), (), "fp")

AARCH64_OPT_EXTENSION("simd", SIMD, (FP), (), (), "asimd")

AARCH64_OPT_EXTENSION("crc", CRC, (), (), (), "crc32")

AARCH64_OPT_EXTENSION("lse", LSE, (), (), (), "atomics")

/* +nofp16 disables an implicit F16FML, even though an implicit F16FML
   does not imply F16.  See F16FML for more details.  */
AARCH64_OPT_EXTENSION("fp16", F16, (FP), (), (F16FML), "fphp asimdhp")

AARCH64_OPT_EXTENSION("rcpc", RCPC, (), (), (), "lrcpc")

/* An explicit +rdma implies +simd, but +rdma+nosimd still enables scalar
   RDMA instructions.  */
AARCH64_OPT_EXTENSION("rdma", RDMA, (), (SIMD), (), "asimdrdm")

AARCH64_OPT_EXTENSION("dotprod", DOTPROD, (SIMD), (), (), "asimddp")

AARCH64_OPT_EXTENSION("aes", AES, (SIMD), (), (), "aes")

AARCH64_OPT_EXTENSION("sha2", SHA2, (SIMD), (), (), "sha1 sha2")

/* +nocrypto disables AES, SHA2 and SM4, and anything that depends on them
   (such as SHA3 and the SVE2 crypto extensions).  */
AARCH64_OPT_EXTENSION("crypto", CRYPTO, (AES, SHA2), (), (AES, SHA2, SM4),
		      "aes pmull sha1 sha2")

AARCH64_OPT_EXTENSION("sha3", SHA3, (SHA2), (), (), "sha3 sha512")

AARCH64_OPT_EXTENSION("sm4", SM4, (SIMD), (), (), "sm3 sm4")

/* An explicit +fp16fml implies +fp16, but a dependence on it does not.
   Thus -march=armv8.4-a implies F16FML but not F16.  -march=armv8.4-a+fp16
   and -march=armv8.4-a+fp16fml are equivalent and enable both F16FML and F16.
   -march=armv8.4-a+nofp16+fp16 enables F16 but not F16FML.  */
AARCH64_OPT_EXTENSION("fp16fml", F16FML, (), (F16), (), "asimdfhm")

AARCH64_OPT_EXTENSION("sve", SVE, (SIMD, F16), (), (), "sve")

AARCH64_OPT_EXTENSION("profile", PROFILE, (), (), (), "")

AARCH64_OPT_EXTENSION("rng", RNG, (), (), (), "rng")

AARCH64_OPT_EXTENSION("memtag", MEMTAG, (), (), (), "")

AARCH64_OPT_EXTENSION("sb", SB, (), (), (), "sb")

AARCH64_OPT_EXTENSION("ssbs", SSBS, (), (), (), "ssbs")

AARCH64_OPT_EXTENSION("predres", PREDRES, (), (), (), "")

AARCH64_OPT_EXTENSION("sve2", SVE2, (SVE), (), (), "sve2")

AARCH64_OPT_EXTENSION("sve2-sm4", SVE2_SM4, (SVE2, SM4), (), (), "svesm4")

AARCH64_OPT_EXTENSION("sve2-aes", SVE2_AES, (SVE2, AES), (), (), "sveaes")

AARCH64_OPT_EXTENSION("sve2-sha3", SVE2_SHA3, (SVE2, SHA3), (), (), "svesha3")

AARCH64_OPT_EXTENSION("sve2-bitperm", SVE2_BITPERM, (SVE2), (), (),
		      "svebitperm")

AARCH64_OPT_EXTENSION("tme", TME, (), (), (), "")

AARCH64_OPT_EXTENSION("i8mm", I8MM, (SIMD), (), (), "i8mm")

AARCH64_OPT_EXTENSION("f32mm", F32MM, (SVE), (), (), "f32mm")

AARCH64_OPT_EXTENSION("f64mm", F64MM, (SVE), (), (), "f64mm")

/* An explicit +bf16 implies +simd, but +bf16+nosimd still enables scalar BF16
   instructions.  */
AARCH64_OPT_EXTENSION("bf16", BF16, (FP), (SIMD), (), "bf16")

AARCH64_OPT_EXTENSION("flagm", FLAGM, (), (), (), "flagm")

AARCH64_OPT_EXTENSION("pauth", PAUTH, (), (), (), "paca pacg")

AARCH64_OPT_EXTENSION("ls64", LS64, (), (), (), "")

AARCH64_OPT_EXTENSION("mops", MOPS, (), (), (), "")

AARCH64_OPT_EXTENSION("cssc", CSSC, (), (), (), "")

#undef AARCH64_OPT_EXTENSION
