xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/RISCV.td (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
10b57cec5SDimitry Andric//===-- RISCV.td - Describe the RISCV Target Machine -------*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andricinclude "llvm/Target/Target.td"
100b57cec5SDimitry Andric
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric// RISC-V subtarget features and instruction predicates.
130b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric
150b57cec5SDimitry Andricdef FeatureStdExtM
160b57cec5SDimitry Andric    : SubtargetFeature<"m", "HasStdExtM", "true",
170b57cec5SDimitry Andric                       "'M' (Integer Multiplication and Division)">;
180b57cec5SDimitry Andricdef HasStdExtM : Predicate<"Subtarget->hasStdExtM()">,
195ffd83dbSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtM),
20480093f4SDimitry Andric                           "'M' (Integer Multiplication and Division)">;
210b57cec5SDimitry Andric
220b57cec5SDimitry Andricdef FeatureStdExtA
230b57cec5SDimitry Andric    : SubtargetFeature<"a", "HasStdExtA", "true",
240b57cec5SDimitry Andric                       "'A' (Atomic Instructions)">;
250b57cec5SDimitry Andricdef HasStdExtA : Predicate<"Subtarget->hasStdExtA()">,
265ffd83dbSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtA),
27480093f4SDimitry Andric                           "'A' (Atomic Instructions)">;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andricdef FeatureStdExtF
300b57cec5SDimitry Andric    : SubtargetFeature<"f", "HasStdExtF", "true",
310b57cec5SDimitry Andric                       "'F' (Single-Precision Floating-Point)">;
320b57cec5SDimitry Andricdef HasStdExtF : Predicate<"Subtarget->hasStdExtF()">,
335ffd83dbSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtF),
34480093f4SDimitry Andric                           "'F' (Single-Precision Floating-Point)">;
350b57cec5SDimitry Andric
360b57cec5SDimitry Andricdef FeatureStdExtD
370b57cec5SDimitry Andric    : SubtargetFeature<"d", "HasStdExtD", "true",
380b57cec5SDimitry Andric                       "'D' (Double-Precision Floating-Point)",
390b57cec5SDimitry Andric                       [FeatureStdExtF]>;
400b57cec5SDimitry Andricdef HasStdExtD : Predicate<"Subtarget->hasStdExtD()">,
415ffd83dbSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtD),
42480093f4SDimitry Andric                           "'D' (Double-Precision Floating-Point)">;
430b57cec5SDimitry Andric
44349cc55cSDimitry Andricdef FeatureStdExtZfhmin
45*04eeddc0SDimitry Andric    : SubtargetFeature<"zfhmin", "HasStdExtZfhmin", "true",
46349cc55cSDimitry Andric                       "'Zfhmin' (Half-Precision Floating-Point Minimal)",
47349cc55cSDimitry Andric                       [FeatureStdExtF]>;
48349cc55cSDimitry Andricdef HasStdExtZfhmin : Predicate<"Subtarget->hasStdExtZfhmin()">,
49349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZfhmin),
50349cc55cSDimitry Andric                             "'Zfhmin' (Half-Precision Floating-Point Minimal)">;
51349cc55cSDimitry Andric
52349cc55cSDimitry Andricdef FeatureStdExtZfh
53*04eeddc0SDimitry Andric    : SubtargetFeature<"zfh", "HasStdExtZfh", "true",
54e8d8bef9SDimitry Andric                       "'Zfh' (Half-Precision Floating-Point)",
55349cc55cSDimitry Andric                       [FeatureStdExtZfhmin, FeatureStdExtF]>;
56e8d8bef9SDimitry Andricdef HasStdExtZfh : Predicate<"Subtarget->hasStdExtZfh()">,
57349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZfh),
58e8d8bef9SDimitry Andric                             "'Zfh' (Half-Precision Floating-Point)">;
59e8d8bef9SDimitry Andric
600b57cec5SDimitry Andricdef FeatureStdExtC
610b57cec5SDimitry Andric    : SubtargetFeature<"c", "HasStdExtC", "true",
620b57cec5SDimitry Andric                       "'C' (Compressed Instructions)">;
630b57cec5SDimitry Andricdef HasStdExtC : Predicate<"Subtarget->hasStdExtC()">,
645ffd83dbSDimitry Andric                           AssemblerPredicate<(all_of FeatureStdExtC),
65480093f4SDimitry Andric                           "'C' (Compressed Instructions)">;
660b57cec5SDimitry Andric
67349cc55cSDimitry Andricdef FeatureStdExtZba
68*04eeddc0SDimitry Andric    : SubtargetFeature<"zba", "HasStdExtZba", "true",
69*04eeddc0SDimitry Andric                       "'Zba' (Address Generation Instructions)">;
70e8d8bef9SDimitry Andricdef HasStdExtZba : Predicate<"Subtarget->hasStdExtZba()">,
71349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZba),
72*04eeddc0SDimitry Andric                             "'Zba' (Address Generation Instructions)">;
73e8d8bef9SDimitry Andricdef NotHasStdExtZba : Predicate<"!Subtarget->hasStdExtZba()">;
74e8d8bef9SDimitry Andric
75349cc55cSDimitry Andricdef FeatureStdExtZbb
76*04eeddc0SDimitry Andric    : SubtargetFeature<"zbb", "HasStdExtZbb", "true",
77*04eeddc0SDimitry Andric                       "'Zbb' (Basic Bit-Manipulation)">;
785ffd83dbSDimitry Andricdef HasStdExtZbb : Predicate<"Subtarget->hasStdExtZbb()">,
79349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbb),
80*04eeddc0SDimitry Andric                             "'Zbb' (Basic Bit-Manipulation)">;
815ffd83dbSDimitry Andric
82349cc55cSDimitry Andricdef FeatureStdExtZbc
83*04eeddc0SDimitry Andric    : SubtargetFeature<"zbc", "HasStdExtZbc", "true",
84*04eeddc0SDimitry Andric                       "'Zbc' (Carry-Less Multiplication)">;
855ffd83dbSDimitry Andricdef HasStdExtZbc : Predicate<"Subtarget->hasStdExtZbc()">,
86349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbc),
87*04eeddc0SDimitry Andric                             "'Zbc' (Carry-Less Multiplication)">;
885ffd83dbSDimitry Andric
89349cc55cSDimitry Andricdef FeatureStdExtZbe
905ffd83dbSDimitry Andric    : SubtargetFeature<"experimental-zbe", "HasStdExtZbe", "true",
91*04eeddc0SDimitry Andric                       "'Zbe' (Extract-Deposit 'Zb' Instructions)">;
925ffd83dbSDimitry Andricdef HasStdExtZbe : Predicate<"Subtarget->hasStdExtZbe()">,
93349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbe),
94*04eeddc0SDimitry Andric                             "'Zbe' (Extract-Deposit 'Zb' Instructions)">;
955ffd83dbSDimitry Andric
96349cc55cSDimitry Andricdef FeatureStdExtZbf
975ffd83dbSDimitry Andric    : SubtargetFeature<"experimental-zbf", "HasStdExtZbf", "true",
98*04eeddc0SDimitry Andric                       "'Zbf' (Bit-Field 'Zb' Instructions)">;
995ffd83dbSDimitry Andricdef HasStdExtZbf : Predicate<"Subtarget->hasStdExtZbf()">,
100349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbf),
101*04eeddc0SDimitry Andric                             "'Zbf' (Bit-Field 'Zb' Instructions)">;
1025ffd83dbSDimitry Andric
103349cc55cSDimitry Andricdef FeatureStdExtZbm
1045ffd83dbSDimitry Andric    : SubtargetFeature<"experimental-zbm", "HasStdExtZbm", "true",
105*04eeddc0SDimitry Andric                       "'Zbm' (Matrix 'Zb' Instructions)">;
1065ffd83dbSDimitry Andricdef HasStdExtZbm : Predicate<"Subtarget->hasStdExtZbm()">,
107349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbm),
108*04eeddc0SDimitry Andric                             "'Zbm' (Matrix 'Zb' Instructions)">;
1095ffd83dbSDimitry Andric
110349cc55cSDimitry Andricdef FeatureStdExtZbp
1115ffd83dbSDimitry Andric    : SubtargetFeature<"experimental-zbp", "HasStdExtZbp", "true",
112*04eeddc0SDimitry Andric                       "'Zbp' (Permutation 'Zb' Instructions)">;
1135ffd83dbSDimitry Andricdef HasStdExtZbp : Predicate<"Subtarget->hasStdExtZbp()">,
114349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbp),
115*04eeddc0SDimitry Andric                             "'Zbp' (Permutation 'Zb' Instructions)">;
1165ffd83dbSDimitry Andric
117349cc55cSDimitry Andricdef FeatureStdExtZbr
1185ffd83dbSDimitry Andric    : SubtargetFeature<"experimental-zbr", "HasStdExtZbr", "true",
119*04eeddc0SDimitry Andric                       "'Zbr' (Polynomial Reduction 'Zb' Instructions)">;
1205ffd83dbSDimitry Andricdef HasStdExtZbr : Predicate<"Subtarget->hasStdExtZbr()">,
121349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbr),
122*04eeddc0SDimitry Andric                             "'Zbr' (Polynomial Reduction 'Zb' Instructions)">;
1235ffd83dbSDimitry Andric
124349cc55cSDimitry Andricdef FeatureStdExtZbs
125*04eeddc0SDimitry Andric    : SubtargetFeature<"zbs", "HasStdExtZbs", "true",
126*04eeddc0SDimitry Andric                       "'Zbs' (Single-Bit Instructions)">;
1275ffd83dbSDimitry Andricdef HasStdExtZbs : Predicate<"Subtarget->hasStdExtZbs()">,
128349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbs),
129*04eeddc0SDimitry Andric                             "'Zbs' (Single-Bit Instructions)">;
1305ffd83dbSDimitry Andric
131349cc55cSDimitry Andricdef FeatureStdExtZbt
1325ffd83dbSDimitry Andric    : SubtargetFeature<"experimental-zbt", "HasStdExtZbt", "true",
133*04eeddc0SDimitry Andric                       "'Zbt' (Ternary 'Zb' Instructions)">;
1345ffd83dbSDimitry Andricdef HasStdExtZbt : Predicate<"Subtarget->hasStdExtZbt()">,
135349cc55cSDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbt),
136*04eeddc0SDimitry Andric                             "'Zbt' (Ternary 'Zb' Instructions)">;
1375ffd83dbSDimitry Andric
1385ffd83dbSDimitry Andric// Some instructions belong to both the basic and the permutation
1395ffd83dbSDimitry Andric// subextensions. They should be enabled if either has been specified.
1405ffd83dbSDimitry Andricdef HasStdExtZbbOrZbp
1415ffd83dbSDimitry Andric    : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbp()">,
142349cc55cSDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbp),
143*04eeddc0SDimitry Andric                                   "'Zbb' (Basic Bit-Manipulation) or "
144*04eeddc0SDimitry Andric                                   "'Zbp' (Permutation 'Zb' Instructions)">;
145*04eeddc0SDimitry Andric
146*04eeddc0SDimitry Andricdef FeatureStdExtZbkb
147*04eeddc0SDimitry Andric    : SubtargetFeature<"zbkb", "HasStdExtZbkb", "true",
148*04eeddc0SDimitry Andric                       "'Zbkb' (Bitmanip instructions for Cryptography)">;
149*04eeddc0SDimitry Andricdef HasStdExtZbkb : Predicate<"Subtarget->hasStdExtZbkb()">,
150*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbkb),
151*04eeddc0SDimitry Andric                             "'Zbkb' (Bitmanip instructions for Cryptography)">;
152*04eeddc0SDimitry Andric
153*04eeddc0SDimitry Andricdef FeatureStdExtZbkx
154*04eeddc0SDimitry Andric    : SubtargetFeature<"zbkx", "HasStdExtZbkx", "true",
155*04eeddc0SDimitry Andric                       "'Zbkx' (Crossbar permutation instructions)">;
156*04eeddc0SDimitry Andricdef HasStdExtZbkx : Predicate<"Subtarget->hasStdExtZbkx()">,
157*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbkx),
158*04eeddc0SDimitry Andric                             "'Zbkx' (Crossbar permutation instructions)">;
159*04eeddc0SDimitry Andric
160*04eeddc0SDimitry Andricdef HasStdExtZbpOrZbkx
161*04eeddc0SDimitry Andric    : Predicate<"Subtarget->hasStdExtZbp() || Subtarget->hasStdExtZbkx()">,
162*04eeddc0SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbp, FeatureStdExtZbkx),
163*04eeddc0SDimitry Andric                                   "'Zbp' (Permutation 'Zb' Instructions) or "
164*04eeddc0SDimitry Andric                                   "'Zbkx' (Crossbar permutation instructions)">;
165*04eeddc0SDimitry Andric
166*04eeddc0SDimitry Andricdef HasStdExtZbpOrZbkb
167*04eeddc0SDimitry Andric    : Predicate<"Subtarget->hasStdExtZbp() || Subtarget->hasStdExtZbkb()">,
168*04eeddc0SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbp, FeatureStdExtZbkb),
169*04eeddc0SDimitry Andric                                   "'Zbp' (Permutation 'Zb' Instructions) or "
170*04eeddc0SDimitry Andric                                   "'Zbkb' (Bitmanip instructions for Cryptography)">;
171*04eeddc0SDimitry Andric
172*04eeddc0SDimitry Andricdef HasStdExtZbbOrZbkb
173*04eeddc0SDimitry Andric    : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbkb()">,
174*04eeddc0SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbkb),
175*04eeddc0SDimitry Andric                                   "'Zbb' (Basic Bit-Manipulation) or "
176*04eeddc0SDimitry Andric                                   "'Zbkb' (Bitmanip instructions for Cryptography)">;
177*04eeddc0SDimitry Andric
178*04eeddc0SDimitry Andricdef HasStdExtZbbOrZbpOrZbkb
179*04eeddc0SDimitry Andric    : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbp() || Subtarget->hasStdExtZbkb()">,
180*04eeddc0SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbp, FeatureStdExtZbkb),
181*04eeddc0SDimitry Andric                                   "'Zbb' (Basic Bit-Manipulation) or "
182*04eeddc0SDimitry Andric                                   "'Zbp' (Permutation 'Zb' Instructions) or "
183*04eeddc0SDimitry Andric                                   "'Zbkb' (Bitmanip instructions for Cryptography)">;
184*04eeddc0SDimitry Andric
185*04eeddc0SDimitry Andric// The Carry-less multiply subextension for cryptography is a subset of basic carry-less multiply subextension. The former should be enabled if the latter is enabled.
186*04eeddc0SDimitry Andricdef FeatureStdExtZbkc
187*04eeddc0SDimitry Andric    : SubtargetFeature<"zbkc", "HasStdExtZbkc", "true",
188*04eeddc0SDimitry Andric                       "'Zbkc' (Carry-less multiply instructions for Cryptography)">;
189*04eeddc0SDimitry Andricdef HasStdExtZbkc
190*04eeddc0SDimitry Andric    : Predicate<"Subtarget->hasStdExtZbkc()">,
191*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZbkc),
192*04eeddc0SDimitry Andric                             "'Zbkc' (Carry-less multiply instructions for Cryptography)">;
193*04eeddc0SDimitry Andric
194*04eeddc0SDimitry Andricdef HasStdExtZbcOrZbkc
195*04eeddc0SDimitry Andric    : Predicate<"Subtarget->hasStdExtZbc() || Subtarget->hasStdExtZbkc()">,
196*04eeddc0SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZbc, FeatureStdExtZbkc),
197*04eeddc0SDimitry Andric                                   "'Zbc' (Carry-Less Multiplication) or "
198*04eeddc0SDimitry Andric                                   "'Zbkc' (Carry-less multiply instructions for Cryptography)">;
199*04eeddc0SDimitry Andric
200*04eeddc0SDimitry Andricdef FeatureStdExtZknd
201*04eeddc0SDimitry Andric    : SubtargetFeature<"zknd", "HasStdExtZknd", "true",
202*04eeddc0SDimitry Andric                       "'Zknd' (NIST Suite: AES Decryption)">;
203*04eeddc0SDimitry Andricdef HasStdExtZknd : Predicate<"Subtarget->hasStdExtZknd()">,
204*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZknd),
205*04eeddc0SDimitry Andric                             "'Zknd' (NIST Suite: AES Decryption)">;
206*04eeddc0SDimitry Andric
207*04eeddc0SDimitry Andricdef FeatureStdExtZkne
208*04eeddc0SDimitry Andric    : SubtargetFeature<"zkne", "HasStdExtZkne", "true",
209*04eeddc0SDimitry Andric                       "'Zkne' (NIST Suite: AES Encryption)">;
210*04eeddc0SDimitry Andricdef HasStdExtZkne : Predicate<"Subtarget->hasStdExtZkne()">,
211*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZkne),
212*04eeddc0SDimitry Andric                             "'Zkne' (NIST Suite: AES Encryption)">;
213*04eeddc0SDimitry Andric
214*04eeddc0SDimitry Andric// Some instructions belong to both Zknd and Zkne subextensions.
215*04eeddc0SDimitry Andric// They should be enabled if either has been specified.
216*04eeddc0SDimitry Andricdef HasStdExtZkndOrZkne
217*04eeddc0SDimitry Andric    : Predicate<"Subtarget->hasStdExtZknd() || Subtarget->hasStdExtZkne()">,
218*04eeddc0SDimitry Andric                AssemblerPredicate<(any_of FeatureStdExtZknd, FeatureStdExtZkne),
219*04eeddc0SDimitry Andric                                   "'Zknd' (NIST Suite: AES Decryption) or "
220*04eeddc0SDimitry Andric                                   "'Zkne' (NIST Suite: AES Encryption)">;
221*04eeddc0SDimitry Andric
222*04eeddc0SDimitry Andricdef FeatureStdExtZknh
223*04eeddc0SDimitry Andric    : SubtargetFeature<"zknh", "HasStdExtZknh", "true",
224*04eeddc0SDimitry Andric                       "'Zknh' (NIST Suite: Hash Function Instructions)">;
225*04eeddc0SDimitry Andricdef HasStdExtZknh : Predicate<"Subtarget->hasStdExtZknh()">,
226*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZknh),
227*04eeddc0SDimitry Andric                             "'Zknh' (NIST Suite: Hash Function Instructions)">;
228*04eeddc0SDimitry Andric
229*04eeddc0SDimitry Andricdef FeatureStdExtZksed
230*04eeddc0SDimitry Andric    : SubtargetFeature<"zksed", "HasStdExtZksed", "true",
231*04eeddc0SDimitry Andric                       "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">;
232*04eeddc0SDimitry Andricdef HasStdExtZksed : Predicate<"Subtarget->hasStdExtZksed()">,
233*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZksed),
234*04eeddc0SDimitry Andric                             "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">;
235*04eeddc0SDimitry Andric
236*04eeddc0SDimitry Andricdef FeatureStdExtZksh
237*04eeddc0SDimitry Andric    : SubtargetFeature<"zksh", "HasStdExtZksh", "true",
238*04eeddc0SDimitry Andric                       "'Zksh' (ShangMi Suite: SM3 Hash Function Instructions)">;
239*04eeddc0SDimitry Andricdef HasStdExtZksh : Predicate<"Subtarget->hasStdExtZksh()">,
240*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZksh),
241*04eeddc0SDimitry Andric                             "'Zksh' (ShangMi Suite: SM3 Hash Function Instructions)">;
242*04eeddc0SDimitry Andric
243*04eeddc0SDimitry Andricdef FeatureStdExtZkr
244*04eeddc0SDimitry Andric    : SubtargetFeature<"zkr", "HasStdExtZkr", "true",
245*04eeddc0SDimitry Andric                       "'Zkr' (Entropy Source Extension)">;
246*04eeddc0SDimitry Andricdef HasStdExtZkr : Predicate<"Subtarget->hasStdExtZkr()">,
247*04eeddc0SDimitry Andric                             AssemblerPredicate<(all_of FeatureStdExtZkr),
248*04eeddc0SDimitry Andric                             "'Zkr' (Entropy Source Extension)">;
249*04eeddc0SDimitry Andric
250*04eeddc0SDimitry Andricdef FeatureStdExtZkn
251*04eeddc0SDimitry Andric    : SubtargetFeature<"zkn", "HasStdExtZkn", "true",
252*04eeddc0SDimitry Andric                       "'Zkn' (NIST Algorithm Suite)",
253*04eeddc0SDimitry Andric                       [FeatureStdExtZbkb,
254*04eeddc0SDimitry Andric                        FeatureStdExtZbkc,
255*04eeddc0SDimitry Andric                        FeatureStdExtZbkx,
256*04eeddc0SDimitry Andric                        FeatureStdExtZkne,
257*04eeddc0SDimitry Andric                        FeatureStdExtZknd,
258*04eeddc0SDimitry Andric                        FeatureStdExtZknh]>;
259*04eeddc0SDimitry Andric
260*04eeddc0SDimitry Andricdef FeatureStdExtZks
261*04eeddc0SDimitry Andric    : SubtargetFeature<"zks", "HasStdExtZks", "true",
262*04eeddc0SDimitry Andric                       "'Zks' (ShangMi Algorithm Suite)",
263*04eeddc0SDimitry Andric                       [FeatureStdExtZbkb,
264*04eeddc0SDimitry Andric                        FeatureStdExtZbkc,
265*04eeddc0SDimitry Andric                        FeatureStdExtZbkx,
266*04eeddc0SDimitry Andric                        FeatureStdExtZksed,
267*04eeddc0SDimitry Andric                        FeatureStdExtZksh]>;
268*04eeddc0SDimitry Andric
269*04eeddc0SDimitry Andricdef FeatureStdExtZkt
270*04eeddc0SDimitry Andric    : SubtargetFeature<"zkt", "HasStdExtZkt", "true",
271*04eeddc0SDimitry Andric                       "'Zkt' (Data Independent Execution Latency)">;
272*04eeddc0SDimitry Andric
273*04eeddc0SDimitry Andricdef FeatureStdExtZk
274*04eeddc0SDimitry Andric    : SubtargetFeature<"zk", "HasStdExtZk", "true",
275*04eeddc0SDimitry Andric                       "'Zk' (Standard scalar cryptography extension)",
276*04eeddc0SDimitry Andric                       [FeatureStdExtZkn,
277*04eeddc0SDimitry Andric                        FeatureStdExtZkr,
278*04eeddc0SDimitry Andric                        FeatureStdExtZkt]>;
2795ffd83dbSDimitry Andric
2805ffd83dbSDimitry Andricdef FeatureNoRVCHints
2815ffd83dbSDimitry Andric    : SubtargetFeature<"no-rvc-hints", "EnableRVCHintInstrs", "false",
2825ffd83dbSDimitry Andric                       "Disable RVC Hint Instructions.">;
2838bcb0991SDimitry Andricdef HasRVCHints : Predicate<"Subtarget->enableRVCHintInstrs()">,
2845ffd83dbSDimitry Andric                  AssemblerPredicate<(all_of(not FeatureNoRVCHints)),
285480093f4SDimitry Andric                                      "RVC Hint Instructions">;
2860b57cec5SDimitry Andric
287*04eeddc0SDimitry Andricdef FeatureStdExtZvl32b : SubtargetFeature<"zvl32b", "ZvlLen", "ExtZvl::Zvl32b",
288*04eeddc0SDimitry Andric                       "'Zvl' (Minimum Vector Length) 32">;
289*04eeddc0SDimitry Andric
290*04eeddc0SDimitry Andricforeach i = { 6-15 } in {
291*04eeddc0SDimitry Andric    defvar I = !shl(1, i);
292*04eeddc0SDimitry Andric    def FeatureStdExtZvl#I#b :
293*04eeddc0SDimitry Andric        SubtargetFeature<"zvl"#I#"b", "ZvlLen", "ExtZvl::Zvl"#I#"b",
294*04eeddc0SDimitry Andric                        "'Zvl' (Minimum Vector Length) "#I,
295*04eeddc0SDimitry Andric                        [!cast<SubtargetFeature>("FeatureStdExtZvl"#!srl(I, 1)#"b")]>;
296*04eeddc0SDimitry Andric}
297*04eeddc0SDimitry Andric
298*04eeddc0SDimitry Andricdef FeatureStdExtZve32x
299*04eeddc0SDimitry Andric    : SubtargetFeature<"zve32x", "HasStdExtZve32x", "true",
300*04eeddc0SDimitry Andric                       "'Zve32x' (Vector Extensions for Embedded Processors "
301*04eeddc0SDimitry Andric                       "with maximal 32 EEW)",
302*04eeddc0SDimitry Andric                       [FeatureStdExtZvl32b]>;
303*04eeddc0SDimitry Andric
304*04eeddc0SDimitry Andricdef FeatureStdExtZve32f
305*04eeddc0SDimitry Andric    : SubtargetFeature<"zve32f", "HasStdExtZve32f", "true",
306*04eeddc0SDimitry Andric                       "'Zve32f' (Vector Extensions for Embedded Processors "
307*04eeddc0SDimitry Andric                       "with maximal 32 EEW and F extension)",
308*04eeddc0SDimitry Andric                       [FeatureStdExtZve32x]>;
309*04eeddc0SDimitry Andric
310*04eeddc0SDimitry Andricdef FeatureStdExtZve64x
311*04eeddc0SDimitry Andric    : SubtargetFeature<"zve64x", "HasStdExtZve64x", "true",
312*04eeddc0SDimitry Andric                       "'Zve64x' (Vector Extensions for Embedded Processors "
313*04eeddc0SDimitry Andric                       "with maximal 64 EEW)", [FeatureStdExtZve32x, FeatureStdExtZvl64b]>;
314*04eeddc0SDimitry Andric
315*04eeddc0SDimitry Andricdef FeatureStdExtZve64f
316*04eeddc0SDimitry Andric    : SubtargetFeature<"zve64f", "HasStdExtZve64f", "true",
317*04eeddc0SDimitry Andric                       "'Zve64f' (Vector Extensions for Embedded Processors "
318*04eeddc0SDimitry Andric                       "with maximal 64 EEW and F extension)",
319*04eeddc0SDimitry Andric                       [FeatureStdExtZve32f, FeatureStdExtZve64x]>;
320*04eeddc0SDimitry Andric
321*04eeddc0SDimitry Andricdef FeatureStdExtZve64d
322*04eeddc0SDimitry Andric    : SubtargetFeature<"zve64d", "HasStdExtZve64d", "true",
323*04eeddc0SDimitry Andric                       "'Zve64d' (Vector Extensions for Embedded Processors "
324*04eeddc0SDimitry Andric                       "with maximal 64 EEW, F and D extension)",
325*04eeddc0SDimitry Andric                       [FeatureStdExtZve64f]>;
326*04eeddc0SDimitry Andric
3275ffd83dbSDimitry Andricdef FeatureStdExtV
328*04eeddc0SDimitry Andric    : SubtargetFeature<"v", "HasStdExtV", "true",
329*04eeddc0SDimitry Andric                       "'V' (Vector Extension for Application Processors)",
330*04eeddc0SDimitry Andric                       [FeatureStdExtZvl128b, FeatureStdExtF, FeatureStdExtD]>;
3315ffd83dbSDimitry Andric
332*04eeddc0SDimitry Andricdef HasVInstructions    : Predicate<"Subtarget->hasVInstructions()">,
333*04eeddc0SDimitry Andric      AssemblerPredicate<
334*04eeddc0SDimitry Andric          (any_of FeatureStdExtZve32x, FeatureStdExtV),
335*04eeddc0SDimitry Andric          "'V' (Vector Extension for Application Processors), 'Zve32x' or "
336*04eeddc0SDimitry Andric          "'Zve64x' (Vector Extensions for Embedded Processors)">;
337*04eeddc0SDimitry Andricdef HasVInstructionsI64 : Predicate<"Subtarget->hasVInstructionsI64()">,
338*04eeddc0SDimitry Andric      AssemblerPredicate<
339*04eeddc0SDimitry Andric          (any_of FeatureStdExtZve64x, FeatureStdExtV),
340*04eeddc0SDimitry Andric          "'V' (Vector Extension for Application Processors) or 'Zve64x' "
341*04eeddc0SDimitry Andric          "(Vector Extensions for Embedded Processors)">;
342*04eeddc0SDimitry Andricdef HasVInstructionsAnyF : Predicate<"Subtarget->hasVInstructionsAnyF()">,
343*04eeddc0SDimitry Andric      AssemblerPredicate<
344*04eeddc0SDimitry Andric          (any_of FeatureStdExtZve32f, FeatureStdExtV),
345*04eeddc0SDimitry Andric          "'V' (Vector Extension for Application Processors), 'Zve32f', "
346*04eeddc0SDimitry Andric          "'Zve64f' or 'Zve64d' (Vector Extensions for Embedded Processors)">;
347fe6060f1SDimitry Andric
3480b57cec5SDimitry Andricdef Feature64Bit
3490b57cec5SDimitry Andric    : SubtargetFeature<"64bit", "HasRV64", "true", "Implements RV64">;
3500b57cec5SDimitry Andricdef IsRV64 : Predicate<"Subtarget->is64Bit()">,
3515ffd83dbSDimitry Andric                       AssemblerPredicate<(all_of Feature64Bit),
352480093f4SDimitry Andric                       "RV64I Base Instruction Set">;
3530b57cec5SDimitry Andricdef IsRV32 : Predicate<"!Subtarget->is64Bit()">,
3545ffd83dbSDimitry Andric                       AssemblerPredicate<(all_of (not Feature64Bit)),
355480093f4SDimitry Andric                       "RV32I Base Instruction Set">;
3560b57cec5SDimitry Andric
357e8d8bef9SDimitry Andricdefvar RV32 = DefaultMode;
3580b57cec5SDimitry Andricdef RV64           : HwMode<"+64bit">;
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andricdef FeatureRV32E
3610b57cec5SDimitry Andric    : SubtargetFeature<"e", "IsRV32E", "true",
3620b57cec5SDimitry Andric                       "Implements RV32E (provides 16 rather than 32 GPRs)">;
3630b57cec5SDimitry Andricdef IsRV32E : Predicate<"Subtarget->isRV32E()">,
3645ffd83dbSDimitry Andric                        AssemblerPredicate<(all_of FeatureRV32E)>;
3650b57cec5SDimitry Andric
3660b57cec5SDimitry Andricdef FeatureRelax
3670b57cec5SDimitry Andric    : SubtargetFeature<"relax", "EnableLinkerRelax", "true",
3680b57cec5SDimitry Andric                       "Enable Linker relaxation.">;
3690b57cec5SDimitry Andric
370480093f4SDimitry Andricforeach i = {1-31} in
371480093f4SDimitry Andric    def FeatureReserveX#i :
372480093f4SDimitry Andric        SubtargetFeature<"reserve-x"#i, "UserReservedRegister[RISCV::X"#i#"]",
373480093f4SDimitry Andric                         "true", "Reserve X"#i>;
374480093f4SDimitry Andric
3755ffd83dbSDimitry Andricdef FeatureSaveRestore : SubtargetFeature<"save-restore", "EnableSaveRestore",
3765ffd83dbSDimitry Andric                                          "true", "Enable save/restore.">;
3775ffd83dbSDimitry Andric
378*04eeddc0SDimitry Andricdef TuneSiFive7 : SubtargetFeature<"sifive7", "RISCVProcFamily", "SiFive7",
379*04eeddc0SDimitry Andric                                   "SiFive 7-Series processors">;
380*04eeddc0SDimitry Andric
3810b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3820b57cec5SDimitry Andric// Named operands for CSR instructions.
3830b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3840b57cec5SDimitry Andric
3850b57cec5SDimitry Andricinclude "RISCVSystemOperands.td"
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3880b57cec5SDimitry Andric// Registers, calling conventions, instruction descriptions.
3890b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
3900b57cec5SDimitry Andric
39113138422SDimitry Andricinclude "RISCVSchedule.td"
3920b57cec5SDimitry Andricinclude "RISCVRegisterInfo.td"
3930b57cec5SDimitry Andricinclude "RISCVCallingConv.td"
3940b57cec5SDimitry Andricinclude "RISCVInstrInfo.td"
3958bcb0991SDimitry Andricinclude "RISCVRegisterBanks.td"
396e8d8bef9SDimitry Andricinclude "RISCVSchedRocket.td"
397e8d8bef9SDimitry Andricinclude "RISCVSchedSiFive7.td"
3980b57cec5SDimitry Andric
3990b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4000b57cec5SDimitry Andric// RISC-V processors supported.
4010b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4020b57cec5SDimitry Andric
4035ffd83dbSDimitry Andricdef : ProcessorModel<"generic-rv32", NoSchedModel, []>;
4045ffd83dbSDimitry Andricdef : ProcessorModel<"generic-rv64", NoSchedModel, [Feature64Bit]>;
4050b57cec5SDimitry Andric
406e8d8bef9SDimitry Andricdef : ProcessorModel<"rocket-rv32", RocketModel, []>;
407e8d8bef9SDimitry Andricdef : ProcessorModel<"rocket-rv64", RocketModel, [Feature64Bit]>;
40813138422SDimitry Andric
409*04eeddc0SDimitry Andricdef : ProcessorModel<"sifive-7-rv32", SiFive7Model, [],
410*04eeddc0SDimitry Andric                     [TuneSiFive7]>;
411*04eeddc0SDimitry Andricdef : ProcessorModel<"sifive-7-rv64", SiFive7Model, [Feature64Bit],
412*04eeddc0SDimitry Andric                     [TuneSiFive7]>;
41313138422SDimitry Andric
414349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e20", RocketModel, [FeatureStdExtM,
415349cc55cSDimitry Andric                                                 FeatureStdExtC]>;
416349cc55cSDimitry Andric
417349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e21", RocketModel, [FeatureStdExtM,
418349cc55cSDimitry Andric                                                 FeatureStdExtA,
419349cc55cSDimitry Andric                                                 FeatureStdExtC]>;
420349cc55cSDimitry Andric
421349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e24", RocketModel, [FeatureStdExtM,
422349cc55cSDimitry Andric                                                 FeatureStdExtA,
423349cc55cSDimitry Andric                                                 FeatureStdExtF,
424349cc55cSDimitry Andric                                                 FeatureStdExtC]>;
425349cc55cSDimitry Andric
426e8d8bef9SDimitry Andricdef : ProcessorModel<"sifive-e31", RocketModel, [FeatureStdExtM,
427590d96feSDimitry Andric                                                 FeatureStdExtA,
428590d96feSDimitry Andric                                                 FeatureStdExtC]>;
429590d96feSDimitry Andric
430349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e34", RocketModel, [FeatureStdExtM,
431349cc55cSDimitry Andric                                                 FeatureStdExtA,
432349cc55cSDimitry Andric                                                 FeatureStdExtF,
433349cc55cSDimitry Andric                                                 FeatureStdExtC]>;
434349cc55cSDimitry Andric
435349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e76", SiFive7Model, [FeatureStdExtM,
436349cc55cSDimitry Andric                                                  FeatureStdExtA,
437349cc55cSDimitry Andric                                                  FeatureStdExtF,
438*04eeddc0SDimitry Andric                                                  FeatureStdExtC],
439*04eeddc0SDimitry Andric                     [TuneSiFive7]>;
440349cc55cSDimitry Andric
441349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s21", RocketModel, [Feature64Bit,
442349cc55cSDimitry Andric                                                 FeatureStdExtM,
443349cc55cSDimitry Andric                                                 FeatureStdExtA,
444349cc55cSDimitry Andric                                                 FeatureStdExtC]>;
445349cc55cSDimitry Andric
446349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s51", RocketModel, [Feature64Bit,
447349cc55cSDimitry Andric                                                 FeatureStdExtM,
448349cc55cSDimitry Andric                                                 FeatureStdExtA,
449349cc55cSDimitry Andric                                                 FeatureStdExtC]>;
450349cc55cSDimitry Andric
451349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s54", RocketModel, [Feature64Bit,
452349cc55cSDimitry Andric                                                 FeatureStdExtM,
453349cc55cSDimitry Andric                                                 FeatureStdExtA,
454349cc55cSDimitry Andric                                                 FeatureStdExtF,
455349cc55cSDimitry Andric                                                 FeatureStdExtD,
456349cc55cSDimitry Andric                                                 FeatureStdExtC]>;
457349cc55cSDimitry Andric
458349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s76", SiFive7Model, [Feature64Bit,
459349cc55cSDimitry Andric                                                  FeatureStdExtM,
460349cc55cSDimitry Andric                                                  FeatureStdExtA,
461349cc55cSDimitry Andric                                                  FeatureStdExtF,
462349cc55cSDimitry Andric                                                  FeatureStdExtD,
463*04eeddc0SDimitry Andric                                                  FeatureStdExtC],
464*04eeddc0SDimitry Andric                     [TuneSiFive7]>;
465349cc55cSDimitry Andric
466e8d8bef9SDimitry Andricdef : ProcessorModel<"sifive-u54", RocketModel, [Feature64Bit,
467e8d8bef9SDimitry Andric                                                 FeatureStdExtM,
468e8d8bef9SDimitry Andric                                                 FeatureStdExtA,
469e8d8bef9SDimitry Andric                                                 FeatureStdExtF,
470e8d8bef9SDimitry Andric                                                 FeatureStdExtD,
471e8d8bef9SDimitry Andric                                                 FeatureStdExtC]>;
472e8d8bef9SDimitry Andric
473e8d8bef9SDimitry Andricdef : ProcessorModel<"sifive-u74", SiFive7Model, [Feature64Bit,
474590d96feSDimitry Andric                                                  FeatureStdExtM,
475590d96feSDimitry Andric                                                  FeatureStdExtA,
476590d96feSDimitry Andric                                                  FeatureStdExtF,
477590d96feSDimitry Andric                                                  FeatureStdExtD,
478*04eeddc0SDimitry Andric                                                  FeatureStdExtC],
479*04eeddc0SDimitry Andric                     [TuneSiFive7]>;
48013138422SDimitry Andric
4810b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4820b57cec5SDimitry Andric// Define the RISC-V target.
4830b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4840b57cec5SDimitry Andric
4850b57cec5SDimitry Andricdef RISCVInstrInfo : InstrInfo {
4860b57cec5SDimitry Andric  let guessInstructionProperties = 0;
4870b57cec5SDimitry Andric}
4880b57cec5SDimitry Andric
4890b57cec5SDimitry Andricdef RISCVAsmParser : AsmParser {
4900b57cec5SDimitry Andric  let ShouldEmitMatchRegisterAltName = 1;
4910b57cec5SDimitry Andric  let AllowDuplicateRegisterNames = 1;
4920b57cec5SDimitry Andric}
4930b57cec5SDimitry Andric
4940b57cec5SDimitry Andricdef RISCVAsmWriter : AsmWriter {
4950b57cec5SDimitry Andric  int PassSubtarget = 1;
4960b57cec5SDimitry Andric}
4970b57cec5SDimitry Andric
4980b57cec5SDimitry Andricdef RISCV : Target {
4990b57cec5SDimitry Andric  let InstructionSet = RISCVInstrInfo;
5000b57cec5SDimitry Andric  let AssemblyParsers = [RISCVAsmParser];
5010b57cec5SDimitry Andric  let AssemblyWriters = [RISCVAsmWriter];
5020b57cec5SDimitry Andric  let AllowRegisterRenaming = 1;
5030b57cec5SDimitry Andric}
504