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