xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/RISCV.td (revision 13138422bc354a1ec35f53a27c4efeccdffc5639)
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()">,
19480093f4SDimitry Andric                           AssemblerPredicate<"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()">,
26480093f4SDimitry Andric                           AssemblerPredicate<"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()">,
33480093f4SDimitry Andric                           AssemblerPredicate<"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()">,
41480093f4SDimitry Andric                           AssemblerPredicate<"FeatureStdExtD",
42480093f4SDimitry Andric                           "'D' (Double-Precision Floating-Point)">;
430b57cec5SDimitry Andric
440b57cec5SDimitry Andricdef FeatureStdExtC
450b57cec5SDimitry Andric    : SubtargetFeature<"c", "HasStdExtC", "true",
460b57cec5SDimitry Andric                       "'C' (Compressed Instructions)">;
470b57cec5SDimitry Andricdef HasStdExtC : Predicate<"Subtarget->hasStdExtC()">,
48480093f4SDimitry Andric                           AssemblerPredicate<"FeatureStdExtC",
49480093f4SDimitry Andric                           "'C' (Compressed Instructions)">;
500b57cec5SDimitry Andric
518bcb0991SDimitry Andricdef FeatureRVCHints
528bcb0991SDimitry Andric    : SubtargetFeature<"rvc-hints", "EnableRVCHintInstrs", "true",
538bcb0991SDimitry Andric                       "Enable RVC Hint Instructions.">;
548bcb0991SDimitry Andricdef HasRVCHints : Predicate<"Subtarget->enableRVCHintInstrs()">,
55480093f4SDimitry Andric                            AssemblerPredicate<"FeatureRVCHints",
56480093f4SDimitry Andric                            "RVC Hint Instructions">;
570b57cec5SDimitry Andric
580b57cec5SDimitry Andricdef Feature64Bit
590b57cec5SDimitry Andric    : SubtargetFeature<"64bit", "HasRV64", "true", "Implements RV64">;
600b57cec5SDimitry Andricdef IsRV64 : Predicate<"Subtarget->is64Bit()">,
61480093f4SDimitry Andric                       AssemblerPredicate<"Feature64Bit",
62480093f4SDimitry Andric                       "RV64I Base Instruction Set">;
630b57cec5SDimitry Andricdef IsRV32 : Predicate<"!Subtarget->is64Bit()">,
64480093f4SDimitry Andric                       AssemblerPredicate<"!Feature64Bit",
65480093f4SDimitry Andric                       "RV32I Base Instruction Set">;
660b57cec5SDimitry Andric
670b57cec5SDimitry Andricdef RV64           : HwMode<"+64bit">;
680b57cec5SDimitry Andricdef RV32           : HwMode<"-64bit">;
690b57cec5SDimitry Andric
700b57cec5SDimitry Andricdef FeatureRV32E
710b57cec5SDimitry Andric    : SubtargetFeature<"e", "IsRV32E", "true",
720b57cec5SDimitry Andric                       "Implements RV32E (provides 16 rather than 32 GPRs)">;
730b57cec5SDimitry Andricdef IsRV32E : Predicate<"Subtarget->isRV32E()">,
740b57cec5SDimitry Andric                        AssemblerPredicate<"FeatureRV32E">;
750b57cec5SDimitry Andric
760b57cec5SDimitry Andricdef FeatureRelax
770b57cec5SDimitry Andric    : SubtargetFeature<"relax", "EnableLinkerRelax", "true",
780b57cec5SDimitry Andric                       "Enable Linker relaxation.">;
790b57cec5SDimitry Andric
80480093f4SDimitry Andricforeach i = {1-31} in
81480093f4SDimitry Andric    def FeatureReserveX#i :
82480093f4SDimitry Andric        SubtargetFeature<"reserve-x"#i, "UserReservedRegister[RISCV::X"#i#"]",
83480093f4SDimitry Andric                         "true", "Reserve X"#i>;
84480093f4SDimitry Andric
850b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
860b57cec5SDimitry Andric// Named operands for CSR instructions.
870b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
880b57cec5SDimitry Andric
890b57cec5SDimitry Andricinclude "RISCVSystemOperands.td"
900b57cec5SDimitry Andric
910b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
920b57cec5SDimitry Andric// Registers, calling conventions, instruction descriptions.
930b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
940b57cec5SDimitry Andric
95*13138422SDimitry Andricinclude "RISCVSchedule.td"
960b57cec5SDimitry Andricinclude "RISCVRegisterInfo.td"
970b57cec5SDimitry Andricinclude "RISCVCallingConv.td"
980b57cec5SDimitry Andricinclude "RISCVInstrInfo.td"
998bcb0991SDimitry Andricinclude "RISCVRegisterBanks.td"
100*13138422SDimitry Andricinclude "RISCVSchedRocket32.td"
101*13138422SDimitry Andricinclude "RISCVSchedRocket64.td"
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1040b57cec5SDimitry Andric// RISC-V processors supported.
1050b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1060b57cec5SDimitry Andric
1078bcb0991SDimitry Andricdef : ProcessorModel<"generic-rv32", NoSchedModel, [FeatureRVCHints]>;
1080b57cec5SDimitry Andric
1098bcb0991SDimitry Andricdef : ProcessorModel<"generic-rv64", NoSchedModel, [Feature64Bit,
1108bcb0991SDimitry Andric                     FeatureRVCHints]>;
1110b57cec5SDimitry Andric
112*13138422SDimitry Andricdef : ProcessorModel<"rocket-rv32", Rocket32Model, [FeatureRVCHints]>;
113*13138422SDimitry Andric
114*13138422SDimitry Andricdef : ProcessorModel<"rocket-rv64", Rocket64Model, [Feature64Bit,
115*13138422SDimitry Andric                     FeatureRVCHints]>;
116*13138422SDimitry Andric
117*13138422SDimitry Andric
1180b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1190b57cec5SDimitry Andric// Define the RISC-V target.
1200b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andricdef RISCVInstrInfo : InstrInfo {
1230b57cec5SDimitry Andric  let guessInstructionProperties = 0;
1240b57cec5SDimitry Andric}
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andricdef RISCVAsmParser : AsmParser {
1270b57cec5SDimitry Andric  let ShouldEmitMatchRegisterAltName = 1;
1280b57cec5SDimitry Andric  let AllowDuplicateRegisterNames = 1;
1290b57cec5SDimitry Andric}
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andricdef RISCVAsmWriter : AsmWriter {
1320b57cec5SDimitry Andric  int PassSubtarget = 1;
1330b57cec5SDimitry Andric}
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andricdef RISCV : Target {
1360b57cec5SDimitry Andric  let InstructionSet = RISCVInstrInfo;
1370b57cec5SDimitry Andric  let AssemblyParsers = [RISCVAsmParser];
1380b57cec5SDimitry Andric  let AssemblyWriters = [RISCVAsmWriter];
1390b57cec5SDimitry Andric  let AllowRegisterRenaming = 1;
1400b57cec5SDimitry Andric}
141