| /* 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 |