xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVFeatures.td (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
106c3fb27SDimitry Andric//===-- RISCVFeatures.td - RISC-V Features and Extensions --*- tablegen -*-===//
2bdd1243dSDimitry Andric//
3bdd1243dSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bdd1243dSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5bdd1243dSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bdd1243dSDimitry Andric//
7bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
8bdd1243dSDimitry Andric
9bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
10bdd1243dSDimitry Andric// RISC-V subtarget features and instruction predicates.
11bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
12bdd1243dSDimitry Andric
1306c3fb27SDimitry Andricdef FeatureStdExtZicsr
1406c3fb27SDimitry Andric    : SubtargetFeature<"zicsr", "HasStdExtZicsr", "true",
1506c3fb27SDimitry Andric                       "'zicsr' (CSRs)">;
1606c3fb27SDimitry Andricdef HasStdExtZicsr : Predicate<"Subtarget->hasStdExtZicsr()">,
1706c3fb27SDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZicsr),
1806c3fb27SDimitry Andric                                "'Zicsr' (CSRs)">;
1906c3fb27SDimitry Andric
20bdd1243dSDimitry Andricdef FeatureStdExtM
21bdd1243dSDimitry Andric    : SubtargetFeature<"m", "HasStdExtM", "true",
22bdd1243dSDimitry Andric                       "'M' (Integer Multiplication and Division)">;
23bdd1243dSDimitry Andricdef HasStdExtM : Predicate<"Subtarget->hasStdExtM()">,
24bdd1243dSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtM),
25bdd1243dSDimitry Andric                           "'M' (Integer Multiplication and Division)">;
26bdd1243dSDimitry Andric
27bdd1243dSDimitry Andricdef FeatureStdExtZmmul
28bdd1243dSDimitry Andric    : SubtargetFeature<"zmmul", "HasStdExtZmmul", "true",
29bdd1243dSDimitry Andric                       "'Zmmul' (Integer Multiplication)">;
30bdd1243dSDimitry Andric
31bdd1243dSDimitry Andricdef HasStdExtMOrZmmul
32bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasStdExtM() || Subtarget->hasStdExtZmmul()">,
33bdd1243dSDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtM, FeatureStdExtZmmul),
34bdd1243dSDimitry Andric                                   "'M' (Integer Multiplication and Division) or "
35bdd1243dSDimitry Andric                                   "'Zmmul' (Integer Multiplication)">;
36bdd1243dSDimitry Andric
37bdd1243dSDimitry Andricdef FeatureStdExtA
38bdd1243dSDimitry Andric    : SubtargetFeature<"a", "HasStdExtA", "true",
39bdd1243dSDimitry Andric                       "'A' (Atomic Instructions)">;
40bdd1243dSDimitry Andricdef HasStdExtA : Predicate<"Subtarget->hasStdExtA()">,
41bdd1243dSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtA),
42bdd1243dSDimitry Andric                           "'A' (Atomic Instructions)">;
43bdd1243dSDimitry Andric
44bdd1243dSDimitry Andricdef FeatureStdExtF
45bdd1243dSDimitry Andric    : SubtargetFeature<"f", "HasStdExtF", "true",
4606c3fb27SDimitry Andric                       "'F' (Single-Precision Floating-Point)",
4706c3fb27SDimitry Andric                       [FeatureStdExtZicsr]>;
48bdd1243dSDimitry Andricdef HasStdExtF : Predicate<"Subtarget->hasStdExtF()">,
49bdd1243dSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtF),
50bdd1243dSDimitry Andric                           "'F' (Single-Precision Floating-Point)">;
51bdd1243dSDimitry Andric
52bdd1243dSDimitry Andricdef FeatureStdExtD
53bdd1243dSDimitry Andric    : SubtargetFeature<"d", "HasStdExtD", "true",
54bdd1243dSDimitry Andric                       "'D' (Double-Precision Floating-Point)",
55bdd1243dSDimitry Andric                       [FeatureStdExtF]>;
56bdd1243dSDimitry Andricdef HasStdExtD : Predicate<"Subtarget->hasStdExtD()">,
57bdd1243dSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtD),
58bdd1243dSDimitry Andric                           "'D' (Double-Precision Floating-Point)">;
59bdd1243dSDimitry Andric
60bdd1243dSDimitry Andricdef FeatureStdExtH
61bdd1243dSDimitry Andric    : SubtargetFeature<"h", "HasStdExtH", "true",
62bdd1243dSDimitry Andric                       "'H' (Hypervisor)">;
63bdd1243dSDimitry Andric
64bdd1243dSDimitry Andricdef HasStdExtH : Predicate<"Subtarget->hasStdExtH()">,
65bdd1243dSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtH),
66bdd1243dSDimitry Andric                           "'H' (Hypervisor)">;
67bdd1243dSDimitry Andric
68bdd1243dSDimitry Andricdef FeatureStdExtZihintpause
69bdd1243dSDimitry Andric    : SubtargetFeature<"zihintpause", "HasStdExtZihintpause", "true",
7006c3fb27SDimitry Andric                       "'Zihintpause' (Pause Hint)">;
71bdd1243dSDimitry Andricdef HasStdExtZihintpause : Predicate<"Subtarget->hasStdExtZihintpause()">,
72bdd1243dSDimitry Andric                                     AssemblerPredicate<(all_of FeatureStdExtZihintpause),
73bdd1243dSDimitry Andric                                     "'Zihintpause' (Pause Hint)">;
74bdd1243dSDimitry Andric
75bdd1243dSDimitry Andricdef FeatureStdExtZihintntl
765f757f3fSDimitry Andric    : SubtargetFeature<"zihintntl", "HasStdExtZihintntl", "true",
7706c3fb27SDimitry Andric                       "'Zihintntl' (Non-Temporal Locality Hints)">;
78bdd1243dSDimitry Andricdef HasStdExtZihintntl : Predicate<"Subtarget->hasStdExtZihintntl()">,
79bdd1243dSDimitry Andric                                    AssemblerPredicate<(all_of FeatureStdExtZihintntl),
80bdd1243dSDimitry Andric                                    "'Zihintntl' (Non-Temporal Locality Hints)">;
81bdd1243dSDimitry Andric
8206c3fb27SDimitry Andricdef FeatureStdExtZifencei
8306c3fb27SDimitry Andric    : SubtargetFeature<"zifencei", "HasStdExtZifencei", "true",
8406c3fb27SDimitry Andric                       "'Zifencei' (fence.i)">;
8506c3fb27SDimitry Andricdef HasStdExtZifencei : Predicate<"Subtarget->hasStdExtZifencei()">,
8606c3fb27SDimitry Andric                                   AssemblerPredicate<(all_of FeatureStdExtZifencei),
8706c3fb27SDimitry Andric                                   "'Zifencei' (fence.i)">;
8806c3fb27SDimitry Andric
8906c3fb27SDimitry Andricdef FeatureStdExtZicntr
9006c3fb27SDimitry Andric    : SubtargetFeature<"zicntr", "HasStdExtZicntr", "true",
9106c3fb27SDimitry Andric                       "'Zicntr' (Base Counters and Timers)",
9206c3fb27SDimitry Andric                       [FeatureStdExtZicsr]>;
9306c3fb27SDimitry Andric
9406c3fb27SDimitry Andricdef FeatureStdExtZihpm
9506c3fb27SDimitry Andric    : SubtargetFeature<"zihpm", "HasStdExtZihpm", "true",
9606c3fb27SDimitry Andric                       "'Zihpm' (Hardware Performance Counters)",
9706c3fb27SDimitry Andric                       [FeatureStdExtZicsr]>;
9806c3fb27SDimitry Andric
99bdd1243dSDimitry Andricdef FeatureStdExtZfhmin
100bdd1243dSDimitry Andric    : SubtargetFeature<"zfhmin", "HasStdExtZfhmin", "true",
101bdd1243dSDimitry Andric                       "'Zfhmin' (Half-Precision Floating-Point Minimal)",
102bdd1243dSDimitry Andric                       [FeatureStdExtF]>;
103bdd1243dSDimitry Andricdef HasStdExtZfhmin : Predicate<"Subtarget->hasStdExtZfhmin()">,
104bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZfhmin),
105bdd1243dSDimitry Andric                             "'Zfhmin' (Half-Precision Floating-Point Minimal)">;
106bdd1243dSDimitry Andric
107bdd1243dSDimitry Andricdef FeatureStdExtZfh
108bdd1243dSDimitry Andric    : SubtargetFeature<"zfh", "HasStdExtZfh", "true",
109bdd1243dSDimitry Andric                       "'Zfh' (Half-Precision Floating-Point)",
110cb14a3feSDimitry Andric                       [FeatureStdExtZfhmin]>;
111bdd1243dSDimitry Andricdef HasStdExtZfh : Predicate<"Subtarget->hasStdExtZfh()">,
112bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZfh),
113bdd1243dSDimitry Andric                             "'Zfh' (Half-Precision Floating-Point)">;
114bdd1243dSDimitry Andricdef NoStdExtZfh : Predicate<"!Subtarget->hasStdExtZfh()">;
115bdd1243dSDimitry Andric
116bdd1243dSDimitry Andricdef HasStdExtZfhOrZfhmin
117cb14a3feSDimitry Andric    : Predicate<"Subtarget->hasStdExtZfhmin()">,
118cb14a3feSDimitry Andric                AssemblerPredicate<(all_of FeatureStdExtZfhmin),
119bdd1243dSDimitry Andric                                   "'Zfh' (Half-Precision Floating-Point) or "
120bdd1243dSDimitry Andric                                   "'Zfhmin' (Half-Precision Floating-Point Minimal)">;
121bdd1243dSDimitry Andric
122bdd1243dSDimitry Andricdef FeatureStdExtZfinx
123bdd1243dSDimitry Andric    : SubtargetFeature<"zfinx", "HasStdExtZfinx", "true",
12406c3fb27SDimitry Andric                       "'Zfinx' (Float in Integer)",
12506c3fb27SDimitry Andric                       [FeatureStdExtZicsr]>;
126bdd1243dSDimitry Andricdef HasStdExtZfinx : Predicate<"Subtarget->hasStdExtZfinx()">,
127bdd1243dSDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZfinx),
128bdd1243dSDimitry Andric                               "'Zfinx' (Float in Integer)">;
129bdd1243dSDimitry Andric
130bdd1243dSDimitry Andricdef FeatureStdExtZdinx
131bdd1243dSDimitry Andric    : SubtargetFeature<"zdinx", "HasStdExtZdinx", "true",
132bdd1243dSDimitry Andric                       "'Zdinx' (Double in Integer)",
133bdd1243dSDimitry Andric                       [FeatureStdExtZfinx]>;
134bdd1243dSDimitry Andricdef HasStdExtZdinx : Predicate<"Subtarget->hasStdExtZdinx()">,
135bdd1243dSDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZdinx),
136bdd1243dSDimitry Andric                               "'Zdinx' (Double in Integer)">;
137bdd1243dSDimitry Andric
138bdd1243dSDimitry Andricdef FeatureStdExtZhinxmin
139bdd1243dSDimitry Andric    : SubtargetFeature<"zhinxmin", "HasStdExtZhinxmin", "true",
140bdd1243dSDimitry Andric                       "'Zhinxmin' (Half Float in Integer Minimal)",
141bdd1243dSDimitry Andric                       [FeatureStdExtZfinx]>;
142bdd1243dSDimitry Andricdef HasStdExtZhinxmin : Predicate<"Subtarget->hasStdExtZhinxmin()">,
143bdd1243dSDimitry Andric                                  AssemblerPredicate<(all_of FeatureStdExtZhinxmin),
144bdd1243dSDimitry Andric                                  "'Zhinxmin' (Half Float in Integer Minimal)">;
145bdd1243dSDimitry Andric
146bdd1243dSDimitry Andricdef FeatureStdExtZhinx
147bdd1243dSDimitry Andric    : SubtargetFeature<"zhinx", "HasStdExtZhinx", "true",
148bdd1243dSDimitry Andric                       "'Zhinx' (Half Float in Integer)",
149cb14a3feSDimitry Andric                       [FeatureStdExtZhinxmin]>;
150bdd1243dSDimitry Andricdef HasStdExtZhinx : Predicate<"Subtarget->hasStdExtZhinx()">,
151bdd1243dSDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZhinx),
152bdd1243dSDimitry Andric                               "'Zhinx' (Half Float in Integer)">;
15306c3fb27SDimitry Andricdef NoStdExtZhinx : Predicate<"!Subtarget->hasStdExtZhinx()">;
154bdd1243dSDimitry Andric
155bdd1243dSDimitry Andricdef HasStdExtZhinxOrZhinxmin
156cb14a3feSDimitry Andric    : Predicate<"Subtarget->hasStdExtZhinxmin()">,
157cb14a3feSDimitry Andric                AssemblerPredicate<(all_of FeatureStdExtZhinxmin),
158bdd1243dSDimitry Andric                                   "'Zhinx' (Half Float in Integer) or "
159bdd1243dSDimitry Andric                                   "'Zhinxmin' (Half Float in Integer Minimal)">;
160bdd1243dSDimitry Andric
16106c3fb27SDimitry Andricdef FeatureStdExtZfa
1625f757f3fSDimitry Andric    : SubtargetFeature<"zfa", "HasStdExtZfa", "true",
16306c3fb27SDimitry Andric                       "'Zfa' (Additional Floating-Point)",
16406c3fb27SDimitry Andric                       [FeatureStdExtF]>;
16506c3fb27SDimitry Andricdef HasStdExtZfa : Predicate<"Subtarget->hasStdExtZfa()">,
16606c3fb27SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZfa),
16706c3fb27SDimitry Andric                             "'Zfa' (Additional Floating-Point)">;
16806c3fb27SDimitry Andric
169bdd1243dSDimitry Andricdef FeatureStdExtC
170bdd1243dSDimitry Andric    : SubtargetFeature<"c", "HasStdExtC", "true",
171bdd1243dSDimitry Andric                       "'C' (Compressed Instructions)">;
172bdd1243dSDimitry Andricdef HasStdExtC : Predicate<"Subtarget->hasStdExtC()">,
173bdd1243dSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtC),
174bdd1243dSDimitry Andric                           "'C' (Compressed Instructions)">;
175bdd1243dSDimitry Andric
176bdd1243dSDimitry Andricdef FeatureStdExtZba
177bdd1243dSDimitry Andric    : SubtargetFeature<"zba", "HasStdExtZba", "true",
178bdd1243dSDimitry Andric                       "'Zba' (Address Generation Instructions)">;
179bdd1243dSDimitry Andricdef HasStdExtZba : Predicate<"Subtarget->hasStdExtZba()">,
180bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZba),
181bdd1243dSDimitry Andric                             "'Zba' (Address Generation Instructions)">;
182bdd1243dSDimitry Andricdef NotHasStdExtZba : Predicate<"!Subtarget->hasStdExtZba()">;
183bdd1243dSDimitry Andric
184bdd1243dSDimitry Andricdef FeatureStdExtZbb
185bdd1243dSDimitry Andric    : SubtargetFeature<"zbb", "HasStdExtZbb", "true",
186bdd1243dSDimitry Andric                       "'Zbb' (Basic Bit-Manipulation)">;
187bdd1243dSDimitry Andricdef HasStdExtZbb : Predicate<"Subtarget->hasStdExtZbb()">,
188bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbb),
189bdd1243dSDimitry Andric                             "'Zbb' (Basic Bit-Manipulation)">;
190bdd1243dSDimitry Andric
191bdd1243dSDimitry Andricdef FeatureStdExtZbc
192bdd1243dSDimitry Andric    : SubtargetFeature<"zbc", "HasStdExtZbc", "true",
193bdd1243dSDimitry Andric                       "'Zbc' (Carry-Less Multiplication)">;
194bdd1243dSDimitry Andricdef HasStdExtZbc : Predicate<"Subtarget->hasStdExtZbc()">,
195bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbc),
196bdd1243dSDimitry Andric                             "'Zbc' (Carry-Less Multiplication)">;
197bdd1243dSDimitry Andric
198bdd1243dSDimitry Andricdef FeatureStdExtZbs
199bdd1243dSDimitry Andric    : SubtargetFeature<"zbs", "HasStdExtZbs", "true",
200bdd1243dSDimitry Andric                       "'Zbs' (Single-Bit Instructions)">;
201bdd1243dSDimitry Andricdef HasStdExtZbs : Predicate<"Subtarget->hasStdExtZbs()">,
202bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbs),
203bdd1243dSDimitry Andric                             "'Zbs' (Single-Bit Instructions)">;
204bdd1243dSDimitry Andric
205bdd1243dSDimitry Andricdef FeatureStdExtZbkb
206bdd1243dSDimitry Andric    : SubtargetFeature<"zbkb", "HasStdExtZbkb", "true",
207bdd1243dSDimitry Andric                       "'Zbkb' (Bitmanip instructions for Cryptography)">;
208bdd1243dSDimitry Andricdef HasStdExtZbkb : Predicate<"Subtarget->hasStdExtZbkb()">,
209bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbkb),
210bdd1243dSDimitry Andric                             "'Zbkb' (Bitmanip instructions for Cryptography)">;
211bdd1243dSDimitry Andric
212bdd1243dSDimitry Andricdef FeatureStdExtZbkx
213bdd1243dSDimitry Andric    : SubtargetFeature<"zbkx", "HasStdExtZbkx", "true",
214bdd1243dSDimitry Andric                       "'Zbkx' (Crossbar permutation instructions)">;
215bdd1243dSDimitry Andricdef HasStdExtZbkx : Predicate<"Subtarget->hasStdExtZbkx()">,
216bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbkx),
217bdd1243dSDimitry Andric                             "'Zbkx' (Crossbar permutation instructions)">;
218bdd1243dSDimitry Andric
219bdd1243dSDimitry Andricdef HasStdExtZbbOrZbkb
220bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbkb()">,
221bdd1243dSDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbkb),
222bdd1243dSDimitry Andric                                   "'Zbb' (Basic Bit-Manipulation) or "
223bdd1243dSDimitry Andric                                   "'Zbkb' (Bitmanip instructions for Cryptography)">;
224bdd1243dSDimitry Andric
225bdd1243dSDimitry Andric// The Carry-less multiply subextension for cryptography is a subset of basic
226bdd1243dSDimitry Andric// carry-less multiply subextension. The former should be enabled if the latter
227bdd1243dSDimitry Andric// is enabled.
228bdd1243dSDimitry Andricdef FeatureStdExtZbkc
229bdd1243dSDimitry Andric    : SubtargetFeature<"zbkc", "HasStdExtZbkc", "true",
230bdd1243dSDimitry Andric                       "'Zbkc' (Carry-less multiply instructions for "
231bdd1243dSDimitry Andric                       "Cryptography)">;
232bdd1243dSDimitry Andricdef HasStdExtZbkc
233bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasStdExtZbkc()">,
234bdd1243dSDimitry Andric                AssemblerPredicate<(all_of FeatureStdExtZbkc),
235bdd1243dSDimitry Andric                "'Zbkc' (Carry-less multiply instructions for Cryptography)">;
236bdd1243dSDimitry Andric
237bdd1243dSDimitry Andricdef HasStdExtZbcOrZbkc
238bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasStdExtZbc() || Subtarget->hasStdExtZbkc()">,
239bdd1243dSDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbc, FeatureStdExtZbkc),
240bdd1243dSDimitry Andric                                   "'Zbc' (Carry-Less Multiplication) or "
241bdd1243dSDimitry Andric                                   "'Zbkc' (Carry-less multiply instructions "
242bdd1243dSDimitry Andric                                   "for Cryptography)">;
243bdd1243dSDimitry Andric
244bdd1243dSDimitry Andricdef FeatureStdExtZknd
245bdd1243dSDimitry Andric    : SubtargetFeature<"zknd", "HasStdExtZknd", "true",
246bdd1243dSDimitry Andric                       "'Zknd' (NIST Suite: AES Decryption)">;
247bdd1243dSDimitry Andricdef HasStdExtZknd : Predicate<"Subtarget->hasStdExtZknd()">,
248bdd1243dSDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZknd),
249bdd1243dSDimitry Andric                              "'Zknd' (NIST Suite: AES Decryption)">;
250bdd1243dSDimitry Andric
251bdd1243dSDimitry Andricdef FeatureStdExtZkne
252bdd1243dSDimitry Andric    : SubtargetFeature<"zkne", "HasStdExtZkne", "true",
253bdd1243dSDimitry Andric                       "'Zkne' (NIST Suite: AES Encryption)">;
254bdd1243dSDimitry Andricdef HasStdExtZkne : Predicate<"Subtarget->hasStdExtZkne()">,
255bdd1243dSDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZkne),
256bdd1243dSDimitry Andric                              "'Zkne' (NIST Suite: AES Encryption)">;
257bdd1243dSDimitry Andric
258bdd1243dSDimitry Andric// Some instructions belong to both Zknd and Zkne subextensions.
259bdd1243dSDimitry Andric// They should be enabled if either has been specified.
260bdd1243dSDimitry Andricdef HasStdExtZkndOrZkne
261bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasStdExtZknd() || Subtarget->hasStdExtZkne()">,
262bdd1243dSDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZknd, FeatureStdExtZkne),
263bdd1243dSDimitry Andric                                   "'Zknd' (NIST Suite: AES Decryption) or "
264bdd1243dSDimitry Andric                                   "'Zkne' (NIST Suite: AES Encryption)">;
265bdd1243dSDimitry Andric
266bdd1243dSDimitry Andricdef FeatureStdExtZknh
267bdd1243dSDimitry Andric    : SubtargetFeature<"zknh", "HasStdExtZknh", "true",
268bdd1243dSDimitry Andric                       "'Zknh' (NIST Suite: Hash Function Instructions)">;
269bdd1243dSDimitry Andricdef HasStdExtZknh : Predicate<"Subtarget->hasStdExtZknh()">,
270bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZknh),
271bdd1243dSDimitry Andric                             "'Zknh' (NIST Suite: Hash Function Instructions)">;
272bdd1243dSDimitry Andric
273bdd1243dSDimitry Andricdef FeatureStdExtZksed
274bdd1243dSDimitry Andric    : SubtargetFeature<"zksed", "HasStdExtZksed", "true",
275bdd1243dSDimitry Andric                       "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">;
276bdd1243dSDimitry Andricdef HasStdExtZksed : Predicate<"Subtarget->hasStdExtZksed()">,
277bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZksed),
278bdd1243dSDimitry Andric                             "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">;
279bdd1243dSDimitry Andric
280bdd1243dSDimitry Andricdef FeatureStdExtZksh
281bdd1243dSDimitry Andric    : SubtargetFeature<"zksh", "HasStdExtZksh", "true",
282bdd1243dSDimitry Andric                       "'Zksh' (ShangMi Suite: SM3 Hash Function Instructions)">;
283bdd1243dSDimitry Andricdef HasStdExtZksh : Predicate<"Subtarget->hasStdExtZksh()">,
284bdd1243dSDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZksh),
285bdd1243dSDimitry Andric                              "'Zksh' (ShangMi Suite: SM3 Hash Function "
286bdd1243dSDimitry Andric                              "Instructions)">;
287bdd1243dSDimitry Andric
288bdd1243dSDimitry Andricdef FeatureStdExtZkr
289bdd1243dSDimitry Andric    : SubtargetFeature<"zkr", "HasStdExtZkr", "true",
290bdd1243dSDimitry Andric                       "'Zkr' (Entropy Source Extension)">;
291bdd1243dSDimitry Andricdef HasStdExtZkr : Predicate<"Subtarget->hasStdExtZkr()">,
292bdd1243dSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZkr),
293bdd1243dSDimitry Andric                             "'Zkr' (Entropy Source Extension)">;
294bdd1243dSDimitry Andric
295bdd1243dSDimitry Andricdef FeatureStdExtZkn
296bdd1243dSDimitry Andric    : SubtargetFeature<"zkn", "HasStdExtZkn", "true",
297bdd1243dSDimitry Andric                       "'Zkn' (NIST Algorithm Suite)",
298bdd1243dSDimitry Andric                       [FeatureStdExtZbkb,
299bdd1243dSDimitry Andric                        FeatureStdExtZbkc,
300bdd1243dSDimitry Andric                        FeatureStdExtZbkx,
301bdd1243dSDimitry Andric                        FeatureStdExtZkne,
302bdd1243dSDimitry Andric                        FeatureStdExtZknd,
303bdd1243dSDimitry Andric                        FeatureStdExtZknh]>;
304bdd1243dSDimitry Andric
305bdd1243dSDimitry Andricdef FeatureStdExtZks
306bdd1243dSDimitry Andric    : SubtargetFeature<"zks", "HasStdExtZks", "true",
307bdd1243dSDimitry Andric                       "'Zks' (ShangMi Algorithm Suite)",
308bdd1243dSDimitry Andric                       [FeatureStdExtZbkb,
309bdd1243dSDimitry Andric                        FeatureStdExtZbkc,
310bdd1243dSDimitry Andric                        FeatureStdExtZbkx,
311bdd1243dSDimitry Andric                        FeatureStdExtZksed,
312bdd1243dSDimitry Andric                        FeatureStdExtZksh]>;
313bdd1243dSDimitry Andric
314bdd1243dSDimitry Andricdef FeatureStdExtZkt
315bdd1243dSDimitry Andric    : SubtargetFeature<"zkt", "HasStdExtZkt", "true",
316bdd1243dSDimitry Andric                       "'Zkt' (Data Independent Execution Latency)">;
317bdd1243dSDimitry Andric
318bdd1243dSDimitry Andricdef FeatureStdExtZk
319bdd1243dSDimitry Andric    : SubtargetFeature<"zk", "HasStdExtZk", "true",
320bdd1243dSDimitry Andric                       "'Zk' (Standard scalar cryptography extension)",
321bdd1243dSDimitry Andric                       [FeatureStdExtZkn,
322bdd1243dSDimitry Andric                        FeatureStdExtZkr,
323bdd1243dSDimitry Andric                        FeatureStdExtZkt]>;
324bdd1243dSDimitry Andric
32506c3fb27SDimitry Andricdef FeatureStdExtZca
32606c3fb27SDimitry Andric    : SubtargetFeature<"zca", "HasStdExtZca", "true",
327bdd1243dSDimitry Andric                       "'Zca' (part of the C extension, excluding compressed "
328bdd1243dSDimitry Andric                       "floating point loads/stores)">;
329bdd1243dSDimitry Andric
330bdd1243dSDimitry Andricdef HasStdExtCOrZca
33106c3fb27SDimitry Andric    : Predicate<"Subtarget->hasStdExtCOrZca()">,
33206c3fb27SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtC, FeatureStdExtZca),
333bdd1243dSDimitry Andric                                   "'C' (Compressed Instructions) or "
334bdd1243dSDimitry Andric                                   "'Zca' (part of the C extension, excluding "
335bdd1243dSDimitry Andric                                   "compressed floating point loads/stores)">;
336bdd1243dSDimitry Andric
33706c3fb27SDimitry Andricdef FeatureStdExtZcb
33806c3fb27SDimitry Andric    : SubtargetFeature<"zcb", "HasStdExtZcb", "true",
33906c3fb27SDimitry Andric                       "'Zcb' (Compressed basic bit manipulation instructions)",
34006c3fb27SDimitry Andric                       [FeatureStdExtZca]>;
34106c3fb27SDimitry Andricdef HasStdExtZcb : Predicate<"Subtarget->hasStdExtZcb()">,
34206c3fb27SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZcb),
34306c3fb27SDimitry Andric                             "'Zcb' (Compressed basic bit manipulation instructions)">;
34406c3fb27SDimitry Andric
34506c3fb27SDimitry Andricdef FeatureStdExtZcd
34606c3fb27SDimitry Andric    : SubtargetFeature<"zcd", "HasStdExtZcd", "true",
34706c3fb27SDimitry Andric                       "'Zcd' (Compressed Double-Precision Floating-Point Instructions)",
34806c3fb27SDimitry Andric                       [FeatureStdExtZca]>;
349bdd1243dSDimitry Andric
350bdd1243dSDimitry Andricdef HasStdExtCOrZcd
351bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasStdExtC() || Subtarget->hasStdExtZcd()">,
35206c3fb27SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtC, FeatureStdExtZcd),
353bdd1243dSDimitry Andric                                   "'C' (Compressed Instructions) or "
354bdd1243dSDimitry Andric                                   "'Zcd' (Compressed Double-Precision Floating-Point Instructions)">;
355bdd1243dSDimitry Andric
35606c3fb27SDimitry Andricdef FeatureStdExtZcf
35706c3fb27SDimitry Andric    : SubtargetFeature<"zcf", "HasStdExtZcf", "true",
35806c3fb27SDimitry Andric                       "'Zcf' (Compressed Single-Precision Floating-Point Instructions)",
35906c3fb27SDimitry Andric                       [FeatureStdExtZca]>;
360bdd1243dSDimitry Andric
36106c3fb27SDimitry Andricdef FeatureStdExtZcmp
36206c3fb27SDimitry Andric    : SubtargetFeature<"zcmp", "HasStdExtZcmp", "true",
36306c3fb27SDimitry Andric                       "'Zcmp' (sequenced instuctions for code-size reduction)",
36406c3fb27SDimitry Andric                       [FeatureStdExtZca]>;
36506c3fb27SDimitry Andricdef HasStdExtZcmp : Predicate<"Subtarget->hasStdExtZcmp() && !Subtarget->hasStdExtC()">,
36606c3fb27SDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZcmp),
36706c3fb27SDimitry Andric                               "'Zcmp' (sequenced instuctions for code-size reduction)">;
36806c3fb27SDimitry Andric
36906c3fb27SDimitry Andricdef FeatureStdExtZcmt
37006c3fb27SDimitry Andric    : SubtargetFeature<"zcmt", "HasStdExtZcmt", "true",
37106c3fb27SDimitry Andric                       "'Zcmt' (table jump instuctions for code-size reduction)",
37206c3fb27SDimitry Andric                       [FeatureStdExtZca, FeatureStdExtZicsr]>;
37306c3fb27SDimitry Andricdef HasStdExtZcmt : Predicate<"Subtarget->hasStdExtZcmt()">,
37406c3fb27SDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtZcmt),
37506c3fb27SDimitry Andric                           "'Zcmt' (table jump instuctions for code-size reduction)">;
37606c3fb27SDimitry Andric
37706c3fb27SDimitry Andricdef FeatureStdExtZce
37806c3fb27SDimitry Andric    : SubtargetFeature<"zce", "HasStdExtZce", "true",
37906c3fb27SDimitry Andric                       "'Zce' (Compressed extensions for microcontrollers)",
38006c3fb27SDimitry Andric                       [FeatureStdExtZca, FeatureStdExtZcb, FeatureStdExtZcmp,
38106c3fb27SDimitry Andric                        FeatureStdExtZcmt]>;
38206c3fb27SDimitry Andric
38306c3fb27SDimitry Andricdef HasStdExtCOrZcfOrZce
38406c3fb27SDimitry Andric    : Predicate<"Subtarget->hasStdExtC() || Subtarget->hasStdExtZcf() "
38506c3fb27SDimitry Andric                "Subtarget->hasStdExtZce()">,
38606c3fb27SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtC, FeatureStdExtZcf,
38706c3fb27SDimitry Andric                                           FeatureStdExtZce),
388bdd1243dSDimitry Andric                                   "'C' (Compressed Instructions) or "
389bdd1243dSDimitry Andric                                   "'Zcf' (Compressed Single-Precision Floating-Point Instructions)">;
390bdd1243dSDimitry Andric
391bdd1243dSDimitry Andricdef FeatureNoRVCHints
392bdd1243dSDimitry Andric    : SubtargetFeature<"no-rvc-hints", "EnableRVCHintInstrs", "false",
393bdd1243dSDimitry Andric                       "Disable RVC Hint Instructions.">;
394bdd1243dSDimitry Andricdef HasRVCHints : Predicate<"Subtarget->enableRVCHintInstrs()">,
395bdd1243dSDimitry Andric                  AssemblerPredicate<(all_of(not FeatureNoRVCHints)),
396bdd1243dSDimitry Andric                                      "RVC Hint Instructions">;
397bdd1243dSDimitry Andric
398bdd1243dSDimitry Andricdef FeatureStdExtZvl32b : SubtargetFeature<"zvl32b", "ZvlLen", "32",
399bdd1243dSDimitry Andric                                           "'Zvl' (Minimum Vector Length) 32">;
400bdd1243dSDimitry Andric
401bdd1243dSDimitry Andricforeach i = { 6-16 } in {
402bdd1243dSDimitry Andric  defvar I = !shl(1, i);
403bdd1243dSDimitry Andric  def FeatureStdExtZvl#I#b :
404bdd1243dSDimitry Andric      SubtargetFeature<"zvl"#I#"b", "ZvlLen", !cast<string>(I),
405bdd1243dSDimitry Andric                       "'Zvl' (Minimum Vector Length) "#I,
406bdd1243dSDimitry Andric                       [!cast<SubtargetFeature>("FeatureStdExtZvl"#!srl(I, 1)#"b")]>;
407bdd1243dSDimitry Andric}
408bdd1243dSDimitry Andric
409bdd1243dSDimitry Andricdef FeatureStdExtZve32x
410bdd1243dSDimitry Andric    : SubtargetFeature<"zve32x", "HasStdExtZve32x", "true",
411bdd1243dSDimitry Andric                       "'Zve32x' (Vector Extensions for Embedded Processors "
412bdd1243dSDimitry Andric                       "with maximal 32 EEW)",
41306c3fb27SDimitry Andric                       [FeatureStdExtZicsr, FeatureStdExtZvl32b]>;
414bdd1243dSDimitry Andric
415bdd1243dSDimitry Andricdef FeatureStdExtZve32f
416bdd1243dSDimitry Andric    : SubtargetFeature<"zve32f", "HasStdExtZve32f", "true",
417bdd1243dSDimitry Andric                       "'Zve32f' (Vector Extensions for Embedded Processors "
418bdd1243dSDimitry Andric                       "with maximal 32 EEW and F extension)",
41906c3fb27SDimitry Andric                       [FeatureStdExtZve32x, FeatureStdExtF]>;
420bdd1243dSDimitry Andric
421bdd1243dSDimitry Andricdef FeatureStdExtZve64x
422bdd1243dSDimitry Andric    : SubtargetFeature<"zve64x", "HasStdExtZve64x", "true",
423bdd1243dSDimitry Andric                       "'Zve64x' (Vector Extensions for Embedded Processors "
424bdd1243dSDimitry Andric                       "with maximal 64 EEW)",
425bdd1243dSDimitry Andric                       [FeatureStdExtZve32x, FeatureStdExtZvl64b]>;
426bdd1243dSDimitry Andric
427bdd1243dSDimitry Andricdef FeatureStdExtZve64f
428bdd1243dSDimitry Andric    : SubtargetFeature<"zve64f", "HasStdExtZve64f", "true",
429bdd1243dSDimitry Andric                       "'Zve64f' (Vector Extensions for Embedded Processors "
430bdd1243dSDimitry Andric                       "with maximal 64 EEW and F extension)",
431bdd1243dSDimitry Andric                       [FeatureStdExtZve32f, FeatureStdExtZve64x]>;
432bdd1243dSDimitry Andric
433bdd1243dSDimitry Andricdef FeatureStdExtZve64d
434bdd1243dSDimitry Andric    : SubtargetFeature<"zve64d", "HasStdExtZve64d", "true",
435bdd1243dSDimitry Andric                       "'Zve64d' (Vector Extensions for Embedded Processors "
436bdd1243dSDimitry Andric                       "with maximal 64 EEW, F and D extension)",
43706c3fb27SDimitry Andric                       [FeatureStdExtZve64f, FeatureStdExtD]>;
438bdd1243dSDimitry Andric
439bdd1243dSDimitry Andricdef FeatureStdExtV
440bdd1243dSDimitry Andric    : SubtargetFeature<"v", "HasStdExtV", "true",
441bdd1243dSDimitry Andric                       "'V' (Vector Extension for Application Processors)",
44206c3fb27SDimitry Andric                       [FeatureStdExtZvl128b, FeatureStdExtZve64d]>;
443bdd1243dSDimitry Andric
444bdd1243dSDimitry Andricdef HasVInstructions    : Predicate<"Subtarget->hasVInstructions()">,
445bdd1243dSDimitry Andric      AssemblerPredicate<
446bdd1243dSDimitry Andric          (any_of FeatureStdExtZve32x),
4475f757f3fSDimitry Andric          "'V' (Vector Extension for Application Processors), 'Zve32x' "
4485f757f3fSDimitry Andric          "(Vector Extensions for Embedded Processors)">;
449bdd1243dSDimitry Andricdef HasVInstructionsI64 : Predicate<"Subtarget->hasVInstructionsI64()">,
450bdd1243dSDimitry Andric      AssemblerPredicate<
451bdd1243dSDimitry Andric          (any_of FeatureStdExtZve64x),
452bdd1243dSDimitry Andric          "'V' (Vector Extension for Application Processors) or 'Zve64x' "
453bdd1243dSDimitry Andric          "(Vector Extensions for Embedded Processors)">;
454bdd1243dSDimitry Andricdef HasVInstructionsAnyF : Predicate<"Subtarget->hasVInstructionsAnyF()">,
455bdd1243dSDimitry Andric      AssemblerPredicate<
456bdd1243dSDimitry Andric          (any_of FeatureStdExtZve32f),
4575f757f3fSDimitry Andric          "'V' (Vector Extension for Application Processors), 'Zve32f' "
4585f757f3fSDimitry Andric          "(Vector Extensions for Embedded Processors)">;
459bdd1243dSDimitry Andric
46006c3fb27SDimitry Andricdef HasVInstructionsF64 : Predicate<"Subtarget->hasVInstructionsF64()">;
46106c3fb27SDimitry Andric
46206c3fb27SDimitry Andricdef HasVInstructionsFullMultiply : Predicate<"Subtarget->hasVInstructionsFullMultiply()">;
46306c3fb27SDimitry Andric
4645f757f3fSDimitry Andricdef FeatureStdExtZfbfmin
4655f757f3fSDimitry Andric    : SubtargetFeature<"experimental-zfbfmin", "HasStdExtZfbfmin", "true",
4665f757f3fSDimitry Andric                       "'Zfbfmin' (Scalar BF16 Converts)",
4675f757f3fSDimitry Andric                       [FeatureStdExtF]>;
4685f757f3fSDimitry Andricdef HasStdExtZfbfmin : Predicate<"Subtarget->hasStdExtZfbfmin()">,
4695f757f3fSDimitry Andric                                 AssemblerPredicate<(all_of FeatureStdExtZfbfmin),
4705f757f3fSDimitry Andric                                 "'Zfbfmin' (Scalar BF16 Converts)">;
4715f757f3fSDimitry Andric
47206c3fb27SDimitry Andricdef FeatureStdExtZvfbfmin
47306c3fb27SDimitry Andric    : SubtargetFeature<"experimental-zvfbfmin", "HasStdExtZvfbfmin", "true",
47406c3fb27SDimitry Andric                       "'Zvbfmin' (Vector BF16 Converts)",
475cb14a3feSDimitry Andric                       [FeatureStdExtZve32f]>;
47606c3fb27SDimitry Andricdef HasStdExtZvfbfmin : Predicate<"Subtarget->hasStdExtZvfbfmin()">,
47706c3fb27SDimitry Andric                                  AssemblerPredicate<(all_of FeatureStdExtZvfbfmin),
47806c3fb27SDimitry Andric                                  "'Zvfbfmin' (Vector BF16 Converts)">;
47906c3fb27SDimitry Andric
48006c3fb27SDimitry Andricdef FeatureStdExtZvfbfwma
48106c3fb27SDimitry Andric    : SubtargetFeature<"experimental-zvfbfwma", "HasStdExtZvfbfwma", "true",
48206c3fb27SDimitry Andric                       "'Zvfbfwma' (Vector BF16 widening mul-add)",
483cb14a3feSDimitry Andric                       [FeatureStdExtZvfbfmin, FeatureStdExtZfbfmin]>;
48406c3fb27SDimitry Andricdef HasStdExtZvfbfwma : Predicate<"Subtarget->hasStdExtZvfbfwma()">,
48506c3fb27SDimitry Andric                                  AssemblerPredicate<(all_of FeatureStdExtZvfbfwma),
48606c3fb27SDimitry Andric                                  "'Zvfbfwma' (Vector BF16 widening mul-add)">;
48706c3fb27SDimitry Andric
4885f757f3fSDimitry Andricdef HasVInstructionsBF16 : Predicate<"Subtarget->hasVInstructionsBF16()">;
4895f757f3fSDimitry Andric
4905f757f3fSDimitry Andricdef FeatureStdExtZvfhmin
4915f757f3fSDimitry Andric    : SubtargetFeature<"zvfhmin", "HasStdExtZvfhmin", "true",
4925f757f3fSDimitry Andric                       "'Zvfhmin' (Vector Half-Precision Floating-Point Minimal)",
4935f757f3fSDimitry Andric                       [FeatureStdExtZve32f]>;
4945f757f3fSDimitry Andric
495cb14a3feSDimitry Andricdef FeatureStdExtZvfh
496cb14a3feSDimitry Andric    : SubtargetFeature<"zvfh", "HasStdExtZvfh", "true",
497cb14a3feSDimitry Andric                       "'Zvfh' (Vector Half-Precision Floating-Point)",
498cb14a3feSDimitry Andric                       [FeatureStdExtZvfhmin, FeatureStdExtZfhmin]>;
499cb14a3feSDimitry Andric
50006c3fb27SDimitry Andricdef HasVInstructionsF16 : Predicate<"Subtarget->hasVInstructionsF16()">;
50106c3fb27SDimitry Andric
5025f757f3fSDimitry Andricdef HasVInstructionsF16Minimal : Predicate<"Subtarget->hasVInstructionsF16Minimal()">,
5035f757f3fSDimitry Andric      AssemblerPredicate<(any_of FeatureStdExtZvfhmin, FeatureStdExtZvfh),
5045f757f3fSDimitry Andric                         "'Zvfhmin' (Vector Half-Precision Floating-Point Minimal) or "
5055f757f3fSDimitry Andric                         "'Zvfh' (Vector Half-Precision Floating-Point)">;
5065f757f3fSDimitry Andric
50706c3fb27SDimitry Andricdef HasStdExtZfhOrZvfh
50806c3fb27SDimitry Andric    : Predicate<"Subtarget->hasStdExtZfh() || Subtarget->hasStdExtZvfh()">,
50906c3fb27SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZfh, FeatureStdExtZvfh),
51006c3fb27SDimitry Andric                                   "'Zfh' (Half-Precision Floating-Point) or "
51106c3fb27SDimitry Andric                                   "'Zvfh' (Vector Half-Precision Floating-Point)">;
512bdd1243dSDimitry Andric
513bdd1243dSDimitry Andricdef FeatureStdExtZicbom
514bdd1243dSDimitry Andric    : SubtargetFeature<"zicbom", "HasStdExtZicbom", "true",
515bdd1243dSDimitry Andric                       "'Zicbom' (Cache-Block Management Instructions)">;
516bdd1243dSDimitry Andricdef HasStdExtZicbom : Predicate<"Subtarget->hasStdExtZicbom()">,
517bdd1243dSDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZicbom),
518bdd1243dSDimitry Andric                                "'Zicbom' (Cache-Block Management Instructions)">;
519bdd1243dSDimitry Andric
520bdd1243dSDimitry Andricdef FeatureStdExtZicboz
521bdd1243dSDimitry Andric    : SubtargetFeature<"zicboz", "HasStdExtZicboz", "true",
522bdd1243dSDimitry Andric                       "'Zicboz' (Cache-Block Zero Instructions)">;
523bdd1243dSDimitry Andricdef HasStdExtZicboz : Predicate<"Subtarget->hasStdExtZicboz()">,
524bdd1243dSDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZicboz),
525bdd1243dSDimitry Andric                                "'Zicboz' (Cache-Block Zero Instructions)">;
526bdd1243dSDimitry Andric
527bdd1243dSDimitry Andricdef FeatureStdExtZicbop
528bdd1243dSDimitry Andric    : SubtargetFeature<"zicbop", "HasStdExtZicbop", "true",
529bdd1243dSDimitry Andric                       "'Zicbop' (Cache-Block Prefetch Instructions)">;
530bdd1243dSDimitry Andricdef HasStdExtZicbop : Predicate<"Subtarget->hasStdExtZicbop()">,
531bdd1243dSDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZicbop),
532bdd1243dSDimitry Andric                                "'Zicbop' (Cache-Block Prefetch Instructions)">;
533bdd1243dSDimitry Andric
534bdd1243dSDimitry Andricdef FeatureStdExtSvnapot
535bdd1243dSDimitry Andric    : SubtargetFeature<"svnapot", "HasStdExtSvnapot", "true",
536bdd1243dSDimitry Andric                       "'Svnapot' (NAPOT Translation Contiguity)">;
537bdd1243dSDimitry Andric
538bdd1243dSDimitry Andricdef FeatureStdExtSvpbmt
539bdd1243dSDimitry Andric    : SubtargetFeature<"svpbmt", "HasStdExtSvpbmt", "true",
540bdd1243dSDimitry Andric                       "'Svpbmt' (Page-Based Memory Types)">;
541bdd1243dSDimitry Andric
542bdd1243dSDimitry Andricdef FeatureStdExtSvinval
543bdd1243dSDimitry Andric    : SubtargetFeature<"svinval", "HasStdExtSvinval", "true",
544bdd1243dSDimitry Andric                       "'Svinval' (Fine-Grained Address-Translation Cache Invalidation)">;
545bdd1243dSDimitry Andricdef HasStdExtSvinval : Predicate<"Subtarget->hasStdExtSvinval()">,
546bdd1243dSDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtSvinval),
547bdd1243dSDimitry Andric                                "'Svinval' (Fine-Grained Address-Translation Cache Invalidation)">;
548bdd1243dSDimitry Andric
549bdd1243dSDimitry Andricdef FeatureStdExtZtso
550bdd1243dSDimitry Andric    : SubtargetFeature<"experimental-ztso", "HasStdExtZtso", "true",
551bdd1243dSDimitry Andric                       "'Ztso' (Memory Model - Total Store Order)">;
5525f757f3fSDimitry Andricdef HasStdExtZtso : Predicate<"Subtarget->hasStdExtZtso()">,
553bdd1243dSDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZtso),
554bdd1243dSDimitry Andric                              "'Ztso' (Memory Model - Total Store Order)">;
5555f757f3fSDimitry Andricdef NotHasStdExtZtso : Predicate<"!Subtarget->hasStdExtZtso()">;
556bdd1243dSDimitry Andric
55706c3fb27SDimitry Andricdef FeatureStdExtZawrs : SubtargetFeature<"zawrs", "HasStdExtZawrs", "true",
558bdd1243dSDimitry Andric                                          "'Zawrs' (Wait on Reservation Set)">;
559bdd1243dSDimitry Andricdef HasStdExtZawrs : Predicate<"Subtarget->hasStdExtZawrs()">,
560bdd1243dSDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZawrs),
561bdd1243dSDimitry Andric                               "'Zawrs' (Wait on Reservation Set)">;
562bdd1243dSDimitry Andric
5635f757f3fSDimitry Andricdef FeatureStdExtZvkb
564cb14a3feSDimitry Andric    : SubtargetFeature<"zvkb", "HasStdExtZvkb", "true",
5655f757f3fSDimitry Andric                       "'Zvkb' (Vector Bit-manipulation used in Cryptography)">;
5665f757f3fSDimitry Andricdef HasStdExtZvkb : Predicate<"Subtarget->hasStdExtZvkb()">,
5675f757f3fSDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZvkb),
5685f757f3fSDimitry Andric                              "'Zvkb' (Vector Bit-manipulation used in Cryptography)">;
5695f757f3fSDimitry Andric
57006c3fb27SDimitry Andricdef FeatureStdExtZvbb
571cb14a3feSDimitry Andric    : SubtargetFeature<"zvbb", "HasStdExtZvbb", "true",
5725f757f3fSDimitry Andric                       "'Zvbb' (Vector basic bit-manipulation instructions.)",
5735f757f3fSDimitry Andric                       [FeatureStdExtZvkb]>;
57406c3fb27SDimitry Andricdef HasStdExtZvbb : Predicate<"Subtarget->hasStdExtZvbb()">,
57506c3fb27SDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZvbb),
5765f757f3fSDimitry Andric                              "'Zvbb' (Vector basic bit-manipulation instructions.)">;
57706c3fb27SDimitry Andric
57806c3fb27SDimitry Andricdef FeatureStdExtZvbc
579cb14a3feSDimitry Andric    : SubtargetFeature<"zvbc", "HasStdExtZvbc", "true",
58006c3fb27SDimitry Andric                       "'Zvbc' (Vector Carryless Multiplication)">;
58106c3fb27SDimitry Andricdef HasStdExtZvbc : Predicate<"Subtarget->hasStdExtZvbc()">,
58206c3fb27SDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZvbc),
58306c3fb27SDimitry Andric                              "'Zvbc' (Vector Carryless Multiplication)">;
58406c3fb27SDimitry Andric
58506c3fb27SDimitry Andricdef FeatureStdExtZvkg
586cb14a3feSDimitry Andric    : SubtargetFeature<"zvkg", "HasStdExtZvkg", "true",
58706c3fb27SDimitry Andric                       "'Zvkg' (Vector GCM instructions for Cryptography)">;
58806c3fb27SDimitry Andricdef HasStdExtZvkg : Predicate<"Subtarget->hasStdExtZvkg()">,
58906c3fb27SDimitry Andric                              AssemblerPredicate<(all_of FeatureStdExtZvkg),
59006c3fb27SDimitry Andric                              "'Zvkg' (Vector GCM instructions for Cryptography)">;
59106c3fb27SDimitry Andric
59206c3fb27SDimitry Andricdef FeatureStdExtZvkned
593cb14a3feSDimitry Andric    : SubtargetFeature<"zvkned", "HasStdExtZvkned", "true",
59406c3fb27SDimitry Andric                       "'Zvkned' (Vector AES Encryption & Decryption (Single Round))">;
59506c3fb27SDimitry Andricdef HasStdExtZvkned : Predicate<"Subtarget->hasStdExtZvkned()">,
59606c3fb27SDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZvkned),
59706c3fb27SDimitry Andric                                "'Zvkned' (Vector AES Encryption & Decryption (Single Round))">;
59806c3fb27SDimitry Andric
59906c3fb27SDimitry Andricdef FeatureStdExtZvknha
600cb14a3feSDimitry Andric    : SubtargetFeature<"zvknha", "HasStdExtZvknha", "true",
60106c3fb27SDimitry Andric                       "'Zvknha' (Vector SHA-2 (SHA-256 only))">;
6025f757f3fSDimitry Andricdef HasStdExtZvknha : Predicate<"Subtarget->hasStdExtZvknha()">,
6035f757f3fSDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZvknha),
6045f757f3fSDimitry Andric                                "'Zvknha' (Vector SHA-2 (SHA-256 only))">;
60506c3fb27SDimitry Andric
60606c3fb27SDimitry Andricdef FeatureStdExtZvknhb
607cb14a3feSDimitry Andric    : SubtargetFeature<"zvknhb", "HasStdExtZvknhb", "true",
60806c3fb27SDimitry Andric                       "'Zvknhb' (Vector SHA-2 (SHA-256 and SHA-512))",
6095f757f3fSDimitry Andric                       [FeatureStdExtZve64x]>;
6105f757f3fSDimitry Andricdef HasStdExtZvknhb : Predicate<"Subtarget->hasStdExtZvknhb()">,
6115f757f3fSDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZvknhb),
6125f757f3fSDimitry Andric                                "'Zvknhb' (Vector SHA-2 (SHA-256 and SHA-512))">;
61306c3fb27SDimitry Andric
6145f757f3fSDimitry Andricdef HasStdExtZvknhaOrZvknhb : Predicate<"Subtarget->hasStdExtZvknha() || Subtarget->hasStdExtZvknhb()">,
6155f757f3fSDimitry Andric                                        AssemblerPredicate<(any_of FeatureStdExtZvknha, FeatureStdExtZvknhb),
6165f757f3fSDimitry Andric                                        "'Zvknha' or 'Zvknhb' (Vector SHA-2)">;
61706c3fb27SDimitry Andric
61806c3fb27SDimitry Andricdef FeatureStdExtZvksed
619cb14a3feSDimitry Andric    : SubtargetFeature<"zvksed", "HasStdExtZvksed", "true",
62006c3fb27SDimitry Andric                       "'Zvksed' (SM4 Block Cipher Instructions)">;
62106c3fb27SDimitry Andricdef HasStdExtZvksed : Predicate<"Subtarget->hasStdExtZvksed()">,
62206c3fb27SDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZvksed),
62306c3fb27SDimitry Andric                                "'Zvksed' (SM4 Block Cipher Instructions)">;
62406c3fb27SDimitry Andric
62506c3fb27SDimitry Andricdef FeatureStdExtZvksh
626cb14a3feSDimitry Andric    : SubtargetFeature<"zvksh", "HasStdExtZvksh", "true",
62706c3fb27SDimitry Andric                       "'Zvksh' (SM3 Hash Function Instructions)">;
62806c3fb27SDimitry Andricdef HasStdExtZvksh : Predicate<"Subtarget->hasStdExtZvksh()">,
62906c3fb27SDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZvksh),
63006c3fb27SDimitry Andric                               "'Zvksh' (SM3 Hash Function Instructions)">;
63106c3fb27SDimitry Andric
63206c3fb27SDimitry Andricdef FeatureStdExtZvkt
633cb14a3feSDimitry Andric    : SubtargetFeature<"zvkt", "HasStdExtZvkt", "true",
63406c3fb27SDimitry Andric                       "'Zvkt' (Vector Data-Independent Execution Latency)">;
63506c3fb27SDimitry Andric
6365f757f3fSDimitry Andric// Zvk short-hand extensions
6375f757f3fSDimitry Andric
6385f757f3fSDimitry Andricdef FeatureStdExtZvkn
639cb14a3feSDimitry Andric    : SubtargetFeature<"zvkn", "HasStdExtZvkn", "true",
6405f757f3fSDimitry Andric                       "This extension is shorthand for the following set of "
6415f757f3fSDimitry Andric                       "other extensions: Zvkned, Zvknhb, Zvkb and Zvkt.",
6425f757f3fSDimitry Andric                       [FeatureStdExtZvkned, FeatureStdExtZvknhb,
6435f757f3fSDimitry Andric                        FeatureStdExtZvkb, FeatureStdExtZvkt]>;
6445f757f3fSDimitry Andric
6455f757f3fSDimitry Andricdef FeatureStdExtZvknc
646cb14a3feSDimitry Andric    : SubtargetFeature<"zvknc", "HasStdExtZvknc", "true",
6475f757f3fSDimitry Andric                       "This extension is shorthand for the following set of "
6485f757f3fSDimitry Andric                       "other extensions: Zvkn and Zvbc.",
6495f757f3fSDimitry Andric                       [FeatureStdExtZvkn, FeatureStdExtZvbc]>;
6505f757f3fSDimitry Andric
6515f757f3fSDimitry Andricdef FeatureStdExtZvkng
652cb14a3feSDimitry Andric    : SubtargetFeature<"zvkng", "HasStdExtZvkng", "true",
6535f757f3fSDimitry Andric                       "This extension is shorthand for the following set of "
6545f757f3fSDimitry Andric                       "other extensions: Zvkn and Zvkg.",
6555f757f3fSDimitry Andric                       [FeatureStdExtZvkn, FeatureStdExtZvkg]>;
6565f757f3fSDimitry Andric
6575f757f3fSDimitry Andricdef FeatureStdExtZvks
658cb14a3feSDimitry Andric    : SubtargetFeature<"zvks", "HasStdExtZvks", "true",
6595f757f3fSDimitry Andric                       "This extension is shorthand for the following set of "
6605f757f3fSDimitry Andric                       "other extensions: Zvksed, Zvksh, Zvkb and Zvkt.",
6615f757f3fSDimitry Andric                       [FeatureStdExtZvksed, FeatureStdExtZvksh,
6625f757f3fSDimitry Andric                        FeatureStdExtZvkb, FeatureStdExtZvkt]>;
6635f757f3fSDimitry Andric
6645f757f3fSDimitry Andricdef FeatureStdExtZvksc
665cb14a3feSDimitry Andric    : SubtargetFeature<"zvksc", "HasStdExtZvksc", "true",
6665f757f3fSDimitry Andric                       "This extension is shorthand for the following set of "
6675f757f3fSDimitry Andric                       "other extensions: Zvks and Zvbc.",
6685f757f3fSDimitry Andric                       [FeatureStdExtZvks, FeatureStdExtZvbc]>;
6695f757f3fSDimitry Andric
6705f757f3fSDimitry Andricdef FeatureStdExtZvksg
671cb14a3feSDimitry Andric    : SubtargetFeature<"zvksg", "HasStdExtZvksg", "true",
6725f757f3fSDimitry Andric                       "This extension is shorthand for the following set of "
6735f757f3fSDimitry Andric                       "other extensions: Zvks and Zvkg.",
6745f757f3fSDimitry Andric                       [FeatureStdExtZvks, FeatureStdExtZvkg]>;
6755f757f3fSDimitry Andric
6765f757f3fSDimitry Andricdef FeatureStdExtZicfilp
6775f757f3fSDimitry Andric    : SubtargetFeature<"experimental-zicfilp", "HasStdExtZicfilp", "true",
6785f757f3fSDimitry Andric                       "'Zicfilp' (Landing pad)">;
6795f757f3fSDimitry Andricdef HasStdExtZicfilp : Predicate<"Subtarget->hasStdExtZicfilp()">,
6805f757f3fSDimitry Andric                                 AssemblerPredicate<(all_of FeatureStdExtZicfilp),
6815f757f3fSDimitry Andric                                 "'Zicfilp' (Landing pad)">;
6825f757f3fSDimitry Andric
68306c3fb27SDimitry Andricdef FeatureStdExtZicond
68406c3fb27SDimitry Andric    : SubtargetFeature<"experimental-zicond", "HasStdExtZicond", "true",
68506c3fb27SDimitry Andric                       "'Zicond' (Integer Conditional Operations)">;
68606c3fb27SDimitry Andricdef HasStdExtZicond : Predicate<"Subtarget->hasStdExtZicond()">,
68706c3fb27SDimitry Andric                                AssemblerPredicate<(all_of FeatureStdExtZicond),
68806c3fb27SDimitry Andric                                "'Zicond' (Integer Conditional Operations)">;
68906c3fb27SDimitry Andric
690647cbc5dSDimitry Andricdef FeatureStdExtZimop : SubtargetFeature<"experimental-zimop", "HasStdExtZimop", "true",
691647cbc5dSDimitry Andric                                          "'Zimop' (May-Be-Operations)">;
692647cbc5dSDimitry Andricdef HasStdExtZimop : Predicate<"Subtarget->hasStdExtZimop()">,
693647cbc5dSDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZimop),
694647cbc5dSDimitry Andric                               "'Zimop' (May-Be-Operations)">;
695647cbc5dSDimitry Andric
696647cbc5dSDimitry Andricdef FeatureStdExtZcmop : SubtargetFeature<"experimental-zcmop", "HasStdExtZcmop", "true",
697647cbc5dSDimitry Andric                                          "'Zcmop' (Compressed May-Be-Operations)",
698647cbc5dSDimitry Andric                                          [FeatureStdExtZca]>;
699647cbc5dSDimitry Andricdef HasStdExtZcmop : Predicate<"Subtarget->hasStdExtZcmop()">,
700647cbc5dSDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZcmop),
701647cbc5dSDimitry Andric                               "'Zcmop' (Compressed May-Be-Operations)">;
702647cbc5dSDimitry Andric
703647cbc5dSDimitry Andricdef FeatureStdExtZicfiss
704647cbc5dSDimitry Andric    : SubtargetFeature<"experimental-zicfiss", "HasStdExtZicfiss", "true",
705647cbc5dSDimitry Andric                       "'Zicfiss' (Shadow stack)",
706647cbc5dSDimitry Andric                       [FeatureStdExtZicsr, FeatureStdExtZimop]>;
707647cbc5dSDimitry Andricdef HasStdExtZicfiss : Predicate<"Subtarget->hasStdExtZicfiss()">,
708647cbc5dSDimitry Andric                                 AssemblerPredicate<(all_of FeatureStdExtZicfiss),
709647cbc5dSDimitry Andric                                 "'Zicfiss' (Shadow stack)">;
710647cbc5dSDimitry Andricdef NoHasStdExtZicfiss : Predicate<"!Subtarget->hasStdExtZicfiss()">;
711647cbc5dSDimitry Andric
71206c3fb27SDimitry Andricdef FeatureStdExtSmaia
7135f757f3fSDimitry Andric    : SubtargetFeature<"smaia", "HasStdExtSmaia", "true",
71406c3fb27SDimitry Andric                       "'Smaia' (Smaia encompasses all added CSRs and all "
71506c3fb27SDimitry Andric                       "modifications to interrupt response behavior that the "
71606c3fb27SDimitry Andric                       "AIA specifies for a hart, over all privilege levels.)",
71706c3fb27SDimitry Andric                       []>;
71806c3fb27SDimitry Andric
71906c3fb27SDimitry Andricdef FeatureStdExtSsaia
7205f757f3fSDimitry Andric    : SubtargetFeature<"ssaia", "HasStdExtSsaia", "true",
72106c3fb27SDimitry Andric                       "'Ssaia' (Ssaia is essentially the same as Smaia except "
72206c3fb27SDimitry Andric                       "excluding the machine-level CSRs and behavior not "
72306c3fb27SDimitry Andric                       "directly visible to supervisor level.)", []>;
72406c3fb27SDimitry Andric
72506c3fb27SDimitry Andricdef HasHalfFPLoadStoreMove
72606c3fb27SDimitry Andric    : Predicate<"Subtarget->hasHalfFPLoadStoreMove()">,
72706c3fb27SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZfh, FeatureStdExtZfhmin,
7285f757f3fSDimitry Andric                                    FeatureStdExtZfbfmin),
72906c3fb27SDimitry Andric                                    "'Zfh' (Half-Precision Floating-Point) or "
73006c3fb27SDimitry Andric                                    "'Zfhmin' (Half-Precision Floating-Point Minimal) or "
7315f757f3fSDimitry Andric                                    "'Zfbfmin' (Scalar BF16 Converts)">;
73206c3fb27SDimitry Andric
73306c3fb27SDimitry Andricdef FeatureStdExtZacas
73406c3fb27SDimitry Andric    : SubtargetFeature<"experimental-zacas", "HasStdExtZacas", "true",
73506c3fb27SDimitry Andric                       "'Zacas' (Atomic Compare-And-Swap Instructions)">;
73606c3fb27SDimitry Andricdef HasStdExtZacas : Predicate<"Subtarget->hasStdExtZacas()">,
73706c3fb27SDimitry Andric                               AssemblerPredicate<(all_of FeatureStdExtZacas),
73806c3fb27SDimitry Andric                               "'Zacas' (Atomic Compare-And-Swap Instructions)">;
73906c3fb27SDimitry Andric
740bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
741bdd1243dSDimitry Andric// Vendor extensions
742bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
743bdd1243dSDimitry Andric
744bdd1243dSDimitry Andricdef FeatureVendorXVentanaCondOps
745bdd1243dSDimitry Andric    : SubtargetFeature<"xventanacondops", "HasVendorXVentanaCondOps", "true",
746bdd1243dSDimitry Andric                       "'XVentanaCondOps' (Ventana Conditional Ops)">;
747bdd1243dSDimitry Andricdef HasVendorXVentanaCondOps : Predicate<"Subtarget->hasVendorXVentanaCondOps()">,
748bdd1243dSDimitry Andric                                AssemblerPredicate<(all_of FeatureVendorXVentanaCondOps),
749bdd1243dSDimitry Andric                                "'XVentanaCondOps' (Ventana Conditional Ops)">;
750bdd1243dSDimitry Andric
75106c3fb27SDimitry Andricdef FeatureVendorXTHeadBa
75206c3fb27SDimitry Andric    : SubtargetFeature<"xtheadba", "HasVendorXTHeadBa", "true",
75306c3fb27SDimitry Andric                       "'xtheadba' (T-Head address calculation instructions)">;
75406c3fb27SDimitry Andricdef HasVendorXTHeadBa : Predicate<"Subtarget->hasVendorXTHeadBa()">,
75506c3fb27SDimitry Andric                                  AssemblerPredicate<(all_of FeatureVendorXTHeadBa),
75606c3fb27SDimitry Andric                                  "'xtheadba' (T-Head address calculation instructions)">;
75706c3fb27SDimitry Andric
75806c3fb27SDimitry Andricdef FeatureVendorXTHeadBb
75906c3fb27SDimitry Andric    : SubtargetFeature<"xtheadbb", "HasVendorXTHeadBb", "true",
76006c3fb27SDimitry Andric                       "'xtheadbb' (T-Head basic bit-manipulation instructions)">;
76106c3fb27SDimitry Andricdef HasVendorXTHeadBb : Predicate<"Subtarget->hasVendorXTHeadBb()">,
76206c3fb27SDimitry Andric                                  AssemblerPredicate<(all_of FeatureVendorXTHeadBb),
76306c3fb27SDimitry Andric                                  "'xtheadbb' (T-Head basic bit-manipulation instructions)">;
76406c3fb27SDimitry Andric
76506c3fb27SDimitry Andricdef FeatureVendorXTHeadBs
76606c3fb27SDimitry Andric    : SubtargetFeature<"xtheadbs", "HasVendorXTHeadBs", "true",
76706c3fb27SDimitry Andric                       "'xtheadbs' (T-Head single-bit instructions)">;
76806c3fb27SDimitry Andricdef HasVendorXTHeadBs : Predicate<"Subtarget->hasVendorXTHeadBs()">,
76906c3fb27SDimitry Andric                                  AssemblerPredicate<(all_of FeatureVendorXTHeadBs),
77006c3fb27SDimitry Andric                                  "'xtheadbs' (T-Head single-bit instructions)">;
77106c3fb27SDimitry Andric
77206c3fb27SDimitry Andricdef FeatureVendorXTHeadCondMov
77306c3fb27SDimitry Andric    : SubtargetFeature<"xtheadcondmov", "HasVendorXTHeadCondMov", "true",
77406c3fb27SDimitry Andric                       "'xtheadcondmov' (T-Head conditional move instructions)">;
77506c3fb27SDimitry Andricdef HasVendorXTHeadCondMov : Predicate<"Subtarget->hasVendorXTHeadCondMov()">,
77606c3fb27SDimitry Andric                                       AssemblerPredicate<(all_of FeatureVendorXTHeadCondMov),
77706c3fb27SDimitry Andric                                       "'xtheadcondmov' (T-Head conditional move instructions)">;
77806c3fb27SDimitry Andric
77906c3fb27SDimitry Andricdef FeatureVendorXTHeadCmo
78006c3fb27SDimitry Andric    : SubtargetFeature<"xtheadcmo", "HasVendorXTHeadCmo", "true",
78106c3fb27SDimitry Andric                       "'xtheadcmo' (T-Head cache management instructions)">;
78206c3fb27SDimitry Andricdef HasVendorXTHeadCmo : Predicate<"Subtarget->hasVendorXTHeadCmo()">,
78306c3fb27SDimitry Andric                                   AssemblerPredicate<(all_of FeatureVendorXTHeadCmo),
78406c3fb27SDimitry Andric                                   "'xtheadcmo' (T-Head cache management instructions)">;
78506c3fb27SDimitry Andric
78606c3fb27SDimitry Andricdef FeatureVendorXTHeadFMemIdx
78706c3fb27SDimitry Andric    : SubtargetFeature<"xtheadfmemidx", "HasVendorXTHeadFMemIdx", "true",
78806c3fb27SDimitry Andric                       "'xtheadfmemidx' (T-Head FP Indexed Memory Operations)",
78906c3fb27SDimitry Andric                       [FeatureStdExtF]>;
79006c3fb27SDimitry Andricdef HasVendorXTHeadFMemIdx : Predicate<"Subtarget->hasVendorXTHeadFMemIdx()">,
79106c3fb27SDimitry Andric                                       AssemblerPredicate<(all_of FeatureVendorXTHeadFMemIdx),
79206c3fb27SDimitry Andric                                       "'xtheadfmemidx' (T-Head FP Indexed Memory Operations)">;
79306c3fb27SDimitry Andric
79406c3fb27SDimitry Andricdef FeatureVendorXTHeadMac
79506c3fb27SDimitry Andric    : SubtargetFeature<"xtheadmac", "HasVendorXTHeadMac", "true",
79606c3fb27SDimitry Andric                       "'xtheadmac' (T-Head Multiply-Accumulate Instructions)">;
79706c3fb27SDimitry Andricdef HasVendorXTHeadMac : Predicate<"Subtarget->hasVendorXTHeadMac()">,
79806c3fb27SDimitry Andric                                   AssemblerPredicate<(all_of FeatureVendorXTHeadMac),
79906c3fb27SDimitry Andric                                   "'xtheadmac' (T-Head Multiply-Accumulate Instructions)">;
80006c3fb27SDimitry Andric
80106c3fb27SDimitry Andricdef FeatureVendorXTHeadMemIdx
80206c3fb27SDimitry Andric    : SubtargetFeature<"xtheadmemidx", "HasVendorXTHeadMemIdx", "true",
80306c3fb27SDimitry Andric                       "'xtheadmemidx' (T-Head Indexed Memory Operations)">;
80406c3fb27SDimitry Andricdef HasVendorXTHeadMemIdx : Predicate<"Subtarget->hasVendorXTHeadMemIdx()">,
80506c3fb27SDimitry Andric                                      AssemblerPredicate<(all_of FeatureVendorXTHeadMemIdx),
80606c3fb27SDimitry Andric                                      "'xtheadmemidx' (T-Head Indexed Memory Operations)">;
80706c3fb27SDimitry Andric
80806c3fb27SDimitry Andricdef FeatureVendorXTHeadMemPair
80906c3fb27SDimitry Andric    : SubtargetFeature<"xtheadmempair", "HasVendorXTHeadMemPair", "true",
81006c3fb27SDimitry Andric                       "'xtheadmempair' (T-Head two-GPR Memory Operations)">;
81106c3fb27SDimitry Andricdef HasVendorXTHeadMemPair : Predicate<"Subtarget->hasVendorXTHeadMemPair()">,
81206c3fb27SDimitry Andric                                    AssemblerPredicate<(all_of FeatureVendorXTHeadMemPair),
81306c3fb27SDimitry Andric                                    "'xtheadmempair' (T-Head two-GPR Memory Operations)">;
81406c3fb27SDimitry Andric
81506c3fb27SDimitry Andricdef FeatureVendorXTHeadSync
81606c3fb27SDimitry Andric    : SubtargetFeature<"xtheadsync", "HasVendorXTHeadSync", "true",
81706c3fb27SDimitry Andric                       "'xtheadsync' (T-Head multicore synchronization instructions)">;
81806c3fb27SDimitry Andricdef HasVendorXTHeadSync : Predicate<"Subtarget->hasVendorXTHeadSync()">,
81906c3fb27SDimitry Andric                                    AssemblerPredicate<(all_of FeatureVendorXTHeadSync),
82006c3fb27SDimitry Andric                                    "'xtheadsync' (T-Head multicore synchronization instructions)">;
82106c3fb27SDimitry Andric
822bdd1243dSDimitry Andricdef FeatureVendorXTHeadVdot
823bdd1243dSDimitry Andric    : SubtargetFeature<"xtheadvdot", "HasVendorXTHeadVdot", "true",
824bdd1243dSDimitry Andric                       "'xtheadvdot' (T-Head Vector Extensions for Dot)",
825bdd1243dSDimitry Andric                       [FeatureStdExtV]>;
826bdd1243dSDimitry Andricdef HasVendorXTHeadVdot : Predicate<"Subtarget->hasVendorXTHeadVdot()">,
827bdd1243dSDimitry Andric                                    AssemblerPredicate<(all_of FeatureVendorXTHeadVdot),
828bdd1243dSDimitry Andric                                    "'xtheadvdot' (T-Head Vector Extensions for Dot)">;
829bdd1243dSDimitry Andric
83006c3fb27SDimitry Andricdef FeatureVendorXSfvcp
83106c3fb27SDimitry Andric    : SubtargetFeature<"xsfvcp", "HasVendorXSfvcp", "true",
83206c3fb27SDimitry Andric                       "'XSfvcp' (SiFive Custom Vector Coprocessor Interface Instructions)",
83306c3fb27SDimitry Andric                       [FeatureStdExtZve32x]>;
83406c3fb27SDimitry Andricdef HasVendorXSfvcp : Predicate<"Subtarget->hasVendorXSfvcp()">,
83506c3fb27SDimitry Andric                                AssemblerPredicate<(all_of FeatureVendorXSfvcp),
83606c3fb27SDimitry Andric                                "'XSfvcp' (SiFive Custom Vector Coprocessor Interface Instructions)">;
83706c3fb27SDimitry Andric
8385f757f3fSDimitry Andricdef FeatureVendorXSfvqmaccdod
8395f757f3fSDimitry Andric    : SubtargetFeature<"xsfvqmaccdod", "HasVendorXSfvqmaccdod", "true",
8405f757f3fSDimitry Andric                       "'XSfvqmaccdod' (SiFive Int8 Matrix Multiplication Instructions (2-by-8 and 8-by-2))",
8415f757f3fSDimitry Andric                       [FeatureStdExtZve32x]>;
8425f757f3fSDimitry Andricdef HasVendorXSfvqmaccdod : Predicate<"Subtarget->hasVendorXSfvqmaccdod()">,
8435f757f3fSDimitry Andric                         AssemblerPredicate<(all_of FeatureVendorXSfvqmaccdod),
8445f757f3fSDimitry Andric                         "'XSfvqmaccdod' (SiFive Int8 Matrix Multiplication Instructions (2-by-8 and 8-by-2))">;
8455f757f3fSDimitry Andric
8465f757f3fSDimitry Andricdef FeatureVendorXSfvqmaccqoq
8475f757f3fSDimitry Andric    : SubtargetFeature<"xsfvqmaccqoq", "HasVendorXSfvqmaccqoq", "true",
8485f757f3fSDimitry Andric                       "'XSfvqmaccqoq' (SiFive Int8 Matrix Multiplication Instructions (4-by-8 and 8-by-4))",
8495f757f3fSDimitry Andric                       [FeatureStdExtZve32x]>;
8505f757f3fSDimitry Andricdef HasVendorXSfvqmaccqoq : Predicate<"Subtarget->hasVendorXSfvqmaccqoq()">,
8515f757f3fSDimitry Andric                         AssemblerPredicate<(all_of FeatureVendorXSfvqmaccqoq),
8525f757f3fSDimitry Andric                         "'XSfvqmaccqoq' (SiFive Int8 Matrix Multiplication Instructions (4-by-8 and 8-by-4))">;
8535f757f3fSDimitry Andric
8545f757f3fSDimitry Andricdef FeatureVendorXSfvfwmaccqqq
8555f757f3fSDimitry Andric    : SubtargetFeature<"xsfvfwmaccqqq", "HasVendorXSfvfwmaccqqq", "true",
8565f757f3fSDimitry Andric                       "'XSfvfwmaccqqq' (SiFive Matrix Multiply Accumulate Instruction and 4-by-4))",
8575f757f3fSDimitry Andric                       [FeatureStdExtZve32f, FeatureStdExtZvfbfmin]>;
8585f757f3fSDimitry Andricdef HasVendorXSfvfwmaccqqq : Predicate<"Subtarget->hasVendorXSfvfwmaccqqq()">,
8595f757f3fSDimitry Andric                         AssemblerPredicate<(all_of FeatureVendorXSfvfwmaccqqq),
8605f757f3fSDimitry Andric                         "'XSfvfwmaccqqq' (SiFive Matrix Multiply Accumulate Instruction and 4-by-4))">;
8615f757f3fSDimitry Andric
8625f757f3fSDimitry Andricdef FeatureVendorXSfvfnrclipxfqf
8635f757f3fSDimitry Andric    : SubtargetFeature<"xsfvfnrclipxfqf", "HasVendorXSfvfnrclipxfqf", "true",
8645f757f3fSDimitry Andric                       "'XSfvfnrclipxfqf' (SiFive FP32-to-int8 Ranged Clip Instructions)",
8655f757f3fSDimitry Andric                       [FeatureStdExtZve32f]>;
8665f757f3fSDimitry Andricdef HasVendorXSfvfnrclipxfqf : Predicate<"Subtarget->hasVendorXSfvfnrclipxfqf()">,
8675f757f3fSDimitry Andric                               AssemblerPredicate<(all_of FeatureVendorXSfvfnrclipxfqf),
8685f757f3fSDimitry Andric                               "'XSfvfnrclipxfqf' (SiFive FP32-to-int8 Ranged Clip Instructions)">;
8695f757f3fSDimitry Andricdef FeatureVendorXCVelw
8705f757f3fSDimitry Andric   : SubtargetFeature<"xcvelw", "HasVendorXCVelw", "true",
8715f757f3fSDimitry Andric                      "'XCVelw' (CORE-V Event Load Word)">;
8725f757f3fSDimitry Andricdef HasVendorXCVelw
8735f757f3fSDimitry Andric   : Predicate<"Subtarget->hasVendorXCVelw()">,
8745f757f3fSDimitry Andric              AssemblerPredicate<(any_of FeatureVendorXCVelw),
8755f757f3fSDimitry Andric              "'XCVelw' (CORE-V Event Load Word)">;
8765f757f3fSDimitry Andric
87706c3fb27SDimitry Andricdef FeatureVendorXCVbitmanip
87806c3fb27SDimitry Andric    : SubtargetFeature<"xcvbitmanip", "HasVendorXCVbitmanip", "true",
87906c3fb27SDimitry Andric                       "'XCVbitmanip' (CORE-V Bit Manipulation)">;
88006c3fb27SDimitry Andricdef HasVendorXCVbitmanip : Predicate<"Subtarget->hasVendorXCVbitmanip()">,
88106c3fb27SDimitry Andric                                AssemblerPredicate<(all_of FeatureVendorXCVbitmanip),
88206c3fb27SDimitry Andric                                "'XCVbitmanip' (CORE-V Bit Manipulation)">;
88306c3fb27SDimitry Andric
88406c3fb27SDimitry Andricdef FeatureVendorXCVmac
88506c3fb27SDimitry Andric    : SubtargetFeature<"xcvmac", "HasVendorXCVmac", "true",
88606c3fb27SDimitry Andric                       "'XCVmac' (CORE-V Multiply-Accumulate)">;
88706c3fb27SDimitry Andricdef HasVendorXCVmac : Predicate<"Subtarget->hasVendorXCVmac()">,
88806c3fb27SDimitry Andric                                AssemblerPredicate<(all_of FeatureVendorXCVmac),
88906c3fb27SDimitry Andric                                "'XCVmac' (CORE-V Multiply-Accumulate)">;
89006c3fb27SDimitry Andric
8915f757f3fSDimitry Andricdef FeatureVendorXCVmem
8925f757f3fSDimitry Andric    : SubtargetFeature<"xcvmem", "HasVendorXCVmem", "true",
8935f757f3fSDimitry Andric                       "'XCVmem' (CORE-V Post-incrementing Load & Store)">;
8945f757f3fSDimitry Andricdef HasVendorXCVmem
8955f757f3fSDimitry Andric    : Predicate<"Subtarget->hasVendorXCVmem()">,
8965f757f3fSDimitry Andric               AssemblerPredicate<(any_of FeatureVendorXCVmem),
8975f757f3fSDimitry Andric               "'XCVmem' (CORE-V Post-incrementing Load & Store)">;
8985f757f3fSDimitry Andric
8995f757f3fSDimitry Andricdef FeatureVendorXCValu
9005f757f3fSDimitry Andric    : SubtargetFeature<"xcvalu", "HasVendorXCValu", "true",
9015f757f3fSDimitry Andric                       "'XCValu' (CORE-V ALU Operations)">;
9025f757f3fSDimitry Andricdef HasVendorXCValu : Predicate<"Subtarget->hasVendorXCValu()">,
9035f757f3fSDimitry Andric                                AssemblerPredicate<(all_of FeatureVendorXCValu),
9045f757f3fSDimitry Andric                                "'XCValu' (CORE-V ALU Operations)">;
9055f757f3fSDimitry Andric
9065f757f3fSDimitry Andricdef FeatureVendorXCVsimd
9075f757f3fSDimitry Andric    : SubtargetFeature<"xcvsimd", "HasVendorXCvsimd", "true",
9085f757f3fSDimitry Andric                       "'XCVsimd' (CORE-V SIMD ALU)">;
9095f757f3fSDimitry Andricdef HasVendorXCVsimd
9105f757f3fSDimitry Andric    : Predicate<"Subtarget->hasVendorXCVsimd()">,
9115f757f3fSDimitry Andric                AssemblerPredicate<(any_of FeatureVendorXCVsimd),
9125f757f3fSDimitry Andric                "'XCVsimd' (CORE-V SIMD ALU)">;
9135f757f3fSDimitry Andric
9145f757f3fSDimitry Andricdef FeatureVendorXCVbi
9155f757f3fSDimitry Andric    : SubtargetFeature<"xcvbi", "HasVendorXCVbi", "true",
9165f757f3fSDimitry Andric                       "'XCVbi' (CORE-V Immediate Branching)">;
9175f757f3fSDimitry Andricdef HasVendorXCVbi : Predicate<"Subtarget->hasVendorXCVbi()">,
9185f757f3fSDimitry Andric                               AssemblerPredicate<(all_of FeatureVendorXCVbi),
9195f757f3fSDimitry Andric                               "'XCVbi' (CORE-V Immediate Branching)">;
9205f757f3fSDimitry Andric
921bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
922bdd1243dSDimitry Andric// LLVM specific features and extensions
923bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
924bdd1243dSDimitry Andric
925bdd1243dSDimitry Andric// Feature32Bit exists to mark CPUs that support RV32 to distinquish them from
926bdd1243dSDimitry Andric// tuning CPU names.
927bdd1243dSDimitry Andricdef Feature32Bit
92806c3fb27SDimitry Andric    : SubtargetFeature<"32bit", "IsRV32", "true", "Implements RV32">;
929bdd1243dSDimitry Andricdef Feature64Bit
93006c3fb27SDimitry Andric    : SubtargetFeature<"64bit", "IsRV64", "true", "Implements RV64">;
931bdd1243dSDimitry Andricdef IsRV64 : Predicate<"Subtarget->is64Bit()">,
932bdd1243dSDimitry Andric                       AssemblerPredicate<(all_of Feature64Bit),
933bdd1243dSDimitry Andric                                         "RV64I Base Instruction Set">;
934bdd1243dSDimitry Andricdef IsRV32 : Predicate<"!Subtarget->is64Bit()">,
935bdd1243dSDimitry Andric                       AssemblerPredicate<(all_of (not Feature64Bit)),
936bdd1243dSDimitry Andric                                          "RV32I Base Instruction Set">;
937bdd1243dSDimitry Andric
938bdd1243dSDimitry Andricdefvar RV32 = DefaultMode;
93906c3fb27SDimitry Andricdef RV64           : HwMode<"+64bit", [IsRV64]>;
940bdd1243dSDimitry Andric
94106c3fb27SDimitry Andricdef FeatureRVE
94206c3fb27SDimitry Andric    : SubtargetFeature<"e", "IsRVE", "true",
94306c3fb27SDimitry Andric                       "Implements RV{32,64}E (provides 16 rather than 32 GPRs)">;
94406c3fb27SDimitry Andricdef IsRVE : Predicate<"Subtarget->isRVE()">,
94506c3fb27SDimitry Andric                        AssemblerPredicate<(all_of FeatureRVE)>;
946bdd1243dSDimitry Andric
947bdd1243dSDimitry Andricdef FeatureRelax
948bdd1243dSDimitry Andric    : SubtargetFeature<"relax", "EnableLinkerRelax", "true",
949bdd1243dSDimitry Andric                       "Enable Linker relaxation.">;
950bdd1243dSDimitry Andric
951bdd1243dSDimitry Andricforeach i = {1-31} in
952bdd1243dSDimitry Andric  def FeatureReserveX#i :
953bdd1243dSDimitry Andric      SubtargetFeature<"reserve-x"#i, "UserReservedRegister[RISCV::X"#i#"]",
954bdd1243dSDimitry Andric                       "true", "Reserve X"#i>;
955bdd1243dSDimitry Andric
956bdd1243dSDimitry Andricdef FeatureSaveRestore : SubtargetFeature<"save-restore", "EnableSaveRestore",
957bdd1243dSDimitry Andric                                          "true", "Enable save/restore.">;
958bdd1243dSDimitry Andric
95906c3fb27SDimitry Andricdef FeatureTrailingSeqCstFence : SubtargetFeature<"seq-cst-trailing-fence",
96006c3fb27SDimitry Andric                                          "EnableSeqCstTrailingFence",
96106c3fb27SDimitry Andric                                          "true",
96206c3fb27SDimitry Andric                                          "Enable trailing fence for seq-cst store.">;
96306c3fb27SDimitry Andric
9645f757f3fSDimitry Andricdef FeatureFastUnalignedAccess
9655f757f3fSDimitry Andric   : SubtargetFeature<"fast-unaligned-access", "HasFastUnalignedAccess",
9665f757f3fSDimitry Andric                      "true", "Has reasonably performant unaligned "
9675f757f3fSDimitry Andric                      "loads and stores (both scalar and vector)">;
968bdd1243dSDimitry Andric
9695f757f3fSDimitry Andricdef FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler",
9705f757f3fSDimitry Andric    "UsePostRAScheduler", "true", "Schedule again after register allocation">;
97106c3fb27SDimitry Andric
972bdd1243dSDimitry Andricdef TuneNoOptimizedZeroStrideLoad
973bdd1243dSDimitry Andric   : SubtargetFeature<"no-optimized-zero-stride-load", "HasOptimizedZeroStrideLoad",
974bdd1243dSDimitry Andric                      "false", "Hasn't optimized (perform fewer memory operations)"
975bdd1243dSDimitry Andric                      "zero-stride vector load">;
976bdd1243dSDimitry Andric
977cb14a3feSDimitry Andricdef Experimental
978cb14a3feSDimitry Andric   : SubtargetFeature<"experimental", "HasExperimental",
979cb14a3feSDimitry Andric                      "true", "Experimental intrinsics">;
980cb14a3feSDimitry Andric
98106c3fb27SDimitry Andric// Some vector hardware implementations do not process all VLEN bits in parallel
98206c3fb27SDimitry Andric// and instead split over multiple cycles. DLEN refers to the datapath width
98306c3fb27SDimitry Andric// that can be done in parallel.
98406c3fb27SDimitry Andricdef TuneDLenFactor2
98506c3fb27SDimitry Andric   : SubtargetFeature<"dlen-factor-2", "DLenFactor2", "true",
98606c3fb27SDimitry Andric                      "Vector unit DLEN(data path width) is half of VLEN">;
98706c3fb27SDimitry Andric
988bdd1243dSDimitry Andricdef TuneLUIADDIFusion
989bdd1243dSDimitry Andric    : SubtargetFeature<"lui-addi-fusion", "HasLUIADDIFusion",
990bdd1243dSDimitry Andric                       "true", "Enable LUI+ADDI macrofusion">;
991bdd1243dSDimitry Andric
9925f757f3fSDimitry Andricdef TuneAUIPCADDIFusion
9935f757f3fSDimitry Andric    : SubtargetFeature<"auipc-addi-fusion", "HasAUIPCADDIFusion",
9945f757f3fSDimitry Andric                       "true", "Enable AUIPC+ADDI macrofusion">;
995cb14a3feSDimitry Andric
996cb14a3feSDimitry Andricdef TuneZExtHFusion
997cb14a3feSDimitry Andric    : SubtargetFeature<"zexth-fusion", "HasZExtHFusion",
998cb14a3feSDimitry Andric                       "true", "Enable SLLI+SRLI to be fused to zero extension of halfword">;
999cb14a3feSDimitry Andric
1000cb14a3feSDimitry Andricdef TuneZExtWFusion
1001cb14a3feSDimitry Andric    : SubtargetFeature<"zextw-fusion", "HasZExtWFusion",
1002cb14a3feSDimitry Andric                       "true", "Enable SLLI+SRLI to be fused to zero extension of word">;
1003cb14a3feSDimitry Andric
1004cb14a3feSDimitry Andricdef TuneShiftedZExtWFusion
1005cb14a3feSDimitry Andric    : SubtargetFeature<"shifted-zextw-fusion", "HasShiftedZExtWFusion",
1006cb14a3feSDimitry Andric                       "true", "Enable SLLI+SRLI to be fused when computing (shifted) zero extension of word">;
1007cb14a3feSDimitry Andric
10085f757f3fSDimitry Andricdef TuneLDADDFusion
10095f757f3fSDimitry Andric    : SubtargetFeature<"ld-add-fusion", "HasLDADDFusion",
10105f757f3fSDimitry Andric                       "true", "Enable LD+ADD macrofusion.">;
10115f757f3fSDimitry Andric
1012bdd1243dSDimitry Andricdef TuneNoDefaultUnroll
1013bdd1243dSDimitry Andric    : SubtargetFeature<"no-default-unroll", "EnableDefaultUnroll", "false",
1014bdd1243dSDimitry Andric                       "Disable default unroll preference.">;
1015bdd1243dSDimitry Andric
1016bdd1243dSDimitry Andric// SiFive 7 is able to fuse integer ALU operations with a preceding branch
1017bdd1243dSDimitry Andric// instruction.
1018bdd1243dSDimitry Andricdef TuneShortForwardBranchOpt
1019bdd1243dSDimitry Andric    : SubtargetFeature<"short-forward-branch-opt", "HasShortForwardBranchOpt",
1020bdd1243dSDimitry Andric                       "true", "Enable short forward branch optimization">;
1021bdd1243dSDimitry Andricdef HasShortForwardBranchOpt : Predicate<"Subtarget->hasShortForwardBranchOpt()">;
1022bdd1243dSDimitry Andricdef NoShortForwardBranchOpt : Predicate<"!Subtarget->hasShortForwardBranchOpt()">;
1023bdd1243dSDimitry Andric
1024*1db9f3b2SDimitry Andricdef TuneConditionalCompressedMoveFusion
1025*1db9f3b2SDimitry Andric    : SubtargetFeature<"conditional-cmv-fusion", "HasConditionalCompressedMoveFusion",
1026*1db9f3b2SDimitry Andric                       "true", "Enable branch+c.mv fusion">;
1027*1db9f3b2SDimitry Andricdef HasConditionalMoveFusion : Predicate<"Subtarget->hasConditionalMoveFusion()">;
1028*1db9f3b2SDimitry Andricdef NoConditionalMoveFusion  : Predicate<"!Subtarget->hasConditionalMoveFusion()">;
1029*1db9f3b2SDimitry Andric
1030bdd1243dSDimitry Andricdef TuneSiFive7 : SubtargetFeature<"sifive7", "RISCVProcFamily", "SiFive7",
1031bdd1243dSDimitry Andric                                   "SiFive 7-Series processors",
1032bdd1243dSDimitry Andric                                   [TuneNoDefaultUnroll,
1033bdd1243dSDimitry Andric                                    TuneShortForwardBranchOpt]>;
1034bdd1243dSDimitry Andric
1035cb14a3feSDimitry Andricdef TuneVentanaVeyron : SubtargetFeature<"ventana-veyron", "RISCVProcFamily", "VentanaVeyron",
1036cb14a3feSDimitry Andric                                         "Ventana Veyron-Series processors">;
10375f757f3fSDimitry Andric
1038bdd1243dSDimitry Andric// Assume that lock-free native-width atomics are available, even if the target
1039bdd1243dSDimitry Andric// and operating system combination would not usually provide them. The user
1040bdd1243dSDimitry Andric// is responsible for providing any necessary __sync implementations. Code
1041bdd1243dSDimitry Andric// built with this feature is not ABI-compatible with code built without this
1042bdd1243dSDimitry Andric// feature, if atomic variables are exposed across the ABI boundary.
1043bdd1243dSDimitry Andricdef FeatureForcedAtomics : SubtargetFeature<
1044bdd1243dSDimitry Andric    "forced-atomics", "HasForcedAtomics", "true",
1045bdd1243dSDimitry Andric    "Assume that lock-free native-width atomics are available">;
1046bdd1243dSDimitry Andricdef HasAtomicLdSt
1047bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasStdExtA() || Subtarget->hasForcedAtomics()">;
1048bdd1243dSDimitry Andric
1049bdd1243dSDimitry Andricdef FeatureTaggedGlobals : SubtargetFeature<"tagged-globals",
1050bdd1243dSDimitry Andric    "AllowTaggedGlobals",
1051bdd1243dSDimitry Andric    "true", "Use an instruction sequence for taking the address of a global "
1052bdd1243dSDimitry Andric    "that allows a memory tag in the upper address bits">;
1053