xref: /llvm-project/llvm/lib/Target/AArch64/AArch64FMV.td (revision 474f5d2aefb44430b89ed72774a3c1d26a0adfb1)
1//=------ AArch64FMV.td - Describe AArch64 FMV Features ------*- tablegen -*-=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Function MultiVersioning (FMV) properties. FMV features are accepted by the
10// attributes target_version and target_clones, and they correspond to a mapping
11// from the FMV feature name to:
12//  - A bit in the FMV ABI, as defined by the ACLE.
13//  - The FMV priority, as defined by the ACLE.
14//  - A list of backend features.
15//
16// The list of backend features is not a set of dependencies; it is specific to
17// LLVM and indicates how to do codegen when the FMV feature is present.
18//
19// Therefore FMVExtensions are separated from regular AArch64 Extensions, which
20// encode dependencies between themselves and other SubtargetFeatures.
21//===----------------------------------------------------------------------===//
22
23
24// Something you can add to target_version or target_clones.
25class FMVExtension<string name, string enumeration> {
26    // Name, as spelled in target_version or target_clones. e.g. "memtag".
27    string Name = name;
28
29    // A C++ expression giving the number of the bit in the FMV ABI.
30    // Currently this is given as a value from the enum "CPUFeatures".
31    string FeatureBit = "FEAT_" # enumeration;
32
33    // SubtargetFeature enabled for codegen when this FMV feature is present.
34    string BackendFeature = name;
35
36    // A C++ expression giving the number of the priority bit.
37    // Currently this is given as a value from the enum "FeatPriorities".
38    string PriorityBit = "PRIOR_" # enumeration;
39}
40
41def : FMVExtension<"aes", "PMULL">;
42def : FMVExtension<"bf16", "BF16">;
43def : FMVExtension<"bti", "BTI">;
44def : FMVExtension<"crc", "CRC">;
45def : FMVExtension<"dit", "DIT">;
46def : FMVExtension<"dotprod", "DOTPROD">;
47let BackendFeature = "ccpp" in def : FMVExtension<"dpb", "DPB">;
48let BackendFeature = "ccdp" in def : FMVExtension<"dpb2", "DPB2">;
49def : FMVExtension<"f32mm", "SVE_F32MM">;
50def : FMVExtension<"f64mm", "SVE_F64MM">;
51def : FMVExtension<"fcma", "FCMA">;
52def : FMVExtension<"flagm", "FLAGM">;
53let BackendFeature = "altnzcv" in def : FMVExtension<"flagm2", "FLAGM2">;
54def : FMVExtension<"fp", "FP">;
55def : FMVExtension<"fp16", "FP16">;
56def : FMVExtension<"fp16fml", "FP16FML">;
57let BackendFeature = "fptoint" in def : FMVExtension<"frintts", "FRINTTS">;
58def : FMVExtension<"i8mm", "I8MM">;
59def : FMVExtension<"jscvt", "JSCVT">;
60def : FMVExtension<"lse", "LSE">;
61def : FMVExtension<"memtag", "MEMTAG2">;
62def : FMVExtension<"mops", "MOPS">;
63def : FMVExtension<"rcpc", "RCPC">;
64let BackendFeature = "rcpc-immo" in def : FMVExtension<"rcpc2", "RCPC2">;
65def : FMVExtension<"rcpc3", "RCPC3">;
66def : FMVExtension<"rdm", "RDM">;
67def : FMVExtension<"rng", "RNG">;
68def : FMVExtension<"sb", "SB">;
69def : FMVExtension<"sha2", "SHA2">;
70def : FMVExtension<"sha3", "SHA3">;
71def : FMVExtension<"simd", "SIMD">;
72def : FMVExtension<"sm4", "SM4">;
73def : FMVExtension<"sme", "SME">;
74def : FMVExtension<"sme-f64f64", "SME_F64">;
75def : FMVExtension<"sme-i16i64", "SME_I64">;
76def : FMVExtension<"sme2", "SME2">;
77def : FMVExtension<"ssbs", "SSBS2">;
78def : FMVExtension<"sve", "SVE">;
79def : FMVExtension<"sve2", "SVE2">;
80def : FMVExtension<"sve2-aes", "SVE_PMULL128">;
81def : FMVExtension<"sve2-bitperm", "SVE_BITPERM">;
82def : FMVExtension<"sve2-sha3", "SVE_SHA3">;
83def : FMVExtension<"sve2-sm4", "SVE_SM4">;
84def : FMVExtension<"wfxt", "WFXT">;
85