10b57cec5SDimitry Andric//===-- Mips.td - Describe the Mips 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// This is the top level entry point for the Mips target. 90b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 100b57cec5SDimitry Andric 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric// Target-independent interfaces 130b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 140b57cec5SDimitry Andric 150b57cec5SDimitry Andricinclude "llvm/Target/Target.td" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric// The overall idea of the PredicateControl class is to chop the Predicates list 180b57cec5SDimitry Andric// into subsets that are usually overridden independently. This allows 190b57cec5SDimitry Andric// subclasses to partially override the predicates of their superclasses without 200b57cec5SDimitry Andric// having to re-add all the existing predicates. 210b57cec5SDimitry Andricclass PredicateControl { 220b57cec5SDimitry Andric // Predicates for the encoding scheme in use such as HasStdEnc 230b57cec5SDimitry Andric list<Predicate> EncodingPredicates = []; 240b57cec5SDimitry Andric // Predicates for the GPR size such as IsGP64bit 250b57cec5SDimitry Andric list<Predicate> GPRPredicates = []; 260b57cec5SDimitry Andric // Predicates for the PTR size such as IsPTR64bit 270b57cec5SDimitry Andric list<Predicate> PTRPredicates = []; 28f10421e9SDimitry Andric // Predicates for a symbol's size such as hasSym32. 29f10421e9SDimitry Andric list<Predicate> SYMPredicates = []; 300b57cec5SDimitry Andric // Predicates for the FGR size and layout such as IsFP64bit 310b57cec5SDimitry Andric list<Predicate> FGRPredicates = []; 320b57cec5SDimitry Andric // Predicates for the instruction group membership such as ISA's. 330b57cec5SDimitry Andric list<Predicate> InsnPredicates = []; 340b57cec5SDimitry Andric // Predicate for the ASE that an instruction belongs to. 350b57cec5SDimitry Andric list<Predicate> ASEPredicate = []; 360b57cec5SDimitry Andric // Predicate for marking the instruction as usable in hard-float mode only. 370b57cec5SDimitry Andric list<Predicate> HardFloatPredicate = []; 380b57cec5SDimitry Andric // Predicates for anything else 390b57cec5SDimitry Andric list<Predicate> AdditionalPredicates = []; 400b57cec5SDimitry Andric list<Predicate> Predicates = !listconcat(EncodingPredicates, 410b57cec5SDimitry Andric GPRPredicates, 420b57cec5SDimitry Andric PTRPredicates, 43f10421e9SDimitry Andric SYMPredicates, 440b57cec5SDimitry Andric FGRPredicates, 450b57cec5SDimitry Andric InsnPredicates, 460b57cec5SDimitry Andric HardFloatPredicate, 470b57cec5SDimitry Andric ASEPredicate, 480b57cec5SDimitry Andric AdditionalPredicates); 490b57cec5SDimitry Andric} 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric// Like Requires<> but for the AdditionalPredicates list 520b57cec5SDimitry Andricclass AdditionalRequires<list<Predicate> preds> { 530b57cec5SDimitry Andric list<Predicate> AdditionalPredicates = preds; 540b57cec5SDimitry Andric} 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 570b57cec5SDimitry Andric// Mips Subtarget features // 580b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 590b57cec5SDimitry Andric 600b57cec5SDimitry Andricdef FeatureNoABICalls : SubtargetFeature<"noabicalls", "NoABICalls", "true", 610b57cec5SDimitry Andric "Disable SVR4-style position-independent code">; 620b57cec5SDimitry Andricdef FeaturePTR64Bit : SubtargetFeature<"ptr64", "IsPTR64bit", "true", 630b57cec5SDimitry Andric "Pointers are 64-bit wide">; 640b57cec5SDimitry Andricdef FeatureGP64Bit : SubtargetFeature<"gp64", "IsGP64bit", "true", 650b57cec5SDimitry Andric "General Purpose Registers are 64-bit wide">; 660b57cec5SDimitry Andricdef FeatureFP64Bit : SubtargetFeature<"fp64", "IsFP64bit", "true", 670b57cec5SDimitry Andric "Support 64-bit FP registers">; 680b57cec5SDimitry Andricdef FeatureFPXX : SubtargetFeature<"fpxx", "IsFPXX", "true", 690b57cec5SDimitry Andric "Support for FPXX">; 700b57cec5SDimitry Andricdef FeatureNaN2008 : SubtargetFeature<"nan2008", "IsNaN2008bit", "true", 710b57cec5SDimitry Andric "IEEE 754-2008 NaN encoding">; 720b57cec5SDimitry Andricdef FeatureAbs2008 : SubtargetFeature<"abs2008", "Abs2008", "true", 730b57cec5SDimitry Andric "Disable IEEE 754-2008 abs.fmt mode">; 740b57cec5SDimitry Andricdef FeatureSingleFloat : SubtargetFeature<"single-float", "IsSingleFloat", 750b57cec5SDimitry Andric "true", "Only supports single precision float">; 760b57cec5SDimitry Andricdef FeatureSoftFloat : SubtargetFeature<"soft-float", "IsSoftFloat", "true", 770b57cec5SDimitry Andric "Does not support floating point instructions">; 780b57cec5SDimitry Andricdef FeatureNoOddSPReg : SubtargetFeature<"nooddspreg", "UseOddSPReg", "false", 790b57cec5SDimitry Andric "Disable odd numbered single-precision " 800b57cec5SDimitry Andric "registers">; 810b57cec5SDimitry Andricdef FeatureVFPU : SubtargetFeature<"vfpu", "HasVFPU", 820b57cec5SDimitry Andric "true", "Enable vector FPU instructions">; 830b57cec5SDimitry Andricdef FeatureMips1 : SubtargetFeature<"mips1", "MipsArchVersion", "Mips1", 840b57cec5SDimitry Andric "Mips I ISA Support [highly experimental]">; 850b57cec5SDimitry Andricdef FeatureMips2 : SubtargetFeature<"mips2", "MipsArchVersion", "Mips2", 860b57cec5SDimitry Andric "Mips II ISA Support [highly experimental]", 870b57cec5SDimitry Andric [FeatureMips1]>; 880b57cec5SDimitry Andricdef FeatureMips3_32 : SubtargetFeature<"mips3_32", "HasMips3_32", "true", 890b57cec5SDimitry Andric "Subset of MIPS-III that is also in MIPS32 " 900b57cec5SDimitry Andric "[highly experimental]">; 910b57cec5SDimitry Andricdef FeatureMips3_32r2 : SubtargetFeature<"mips3_32r2", "HasMips3_32r2", "true", 920b57cec5SDimitry Andric "Subset of MIPS-III that is also in MIPS32r2 " 930b57cec5SDimitry Andric "[highly experimental]">; 940b57cec5SDimitry Andricdef FeatureMips3 : SubtargetFeature<"mips3", "MipsArchVersion", "Mips3", 950b57cec5SDimitry Andric "MIPS III ISA Support [highly experimental]", 960b57cec5SDimitry Andric [FeatureMips2, FeatureMips3_32, 970b57cec5SDimitry Andric FeatureMips3_32r2, FeatureGP64Bit, 980b57cec5SDimitry Andric FeatureFP64Bit]>; 990b57cec5SDimitry Andricdef FeatureMips4_32 : SubtargetFeature<"mips4_32", "HasMips4_32", "true", 1000b57cec5SDimitry Andric "Subset of MIPS-IV that is also in MIPS32 " 1010b57cec5SDimitry Andric "[highly experimental]">; 1020b57cec5SDimitry Andricdef FeatureMips4_32r2 : SubtargetFeature<"mips4_32r2", "HasMips4_32r2", "true", 1030b57cec5SDimitry Andric "Subset of MIPS-IV that is also in MIPS32r2 " 1040b57cec5SDimitry Andric "[highly experimental]">; 1050b57cec5SDimitry Andricdef FeatureMips4 : SubtargetFeature<"mips4", "MipsArchVersion", 1060b57cec5SDimitry Andric "Mips4", "MIPS IV ISA Support", 1070b57cec5SDimitry Andric [FeatureMips3, FeatureMips4_32, 1080b57cec5SDimitry Andric FeatureMips4_32r2]>; 1090b57cec5SDimitry Andricdef FeatureMips5_32r2 : SubtargetFeature<"mips5_32r2", "HasMips5_32r2", "true", 1100b57cec5SDimitry Andric "Subset of MIPS-V that is also in MIPS32r2 " 1110b57cec5SDimitry Andric "[highly experimental]">; 1120b57cec5SDimitry Andricdef FeatureMips5 : SubtargetFeature<"mips5", "MipsArchVersion", "Mips5", 1130b57cec5SDimitry Andric "MIPS V ISA Support [highly experimental]", 1140b57cec5SDimitry Andric [FeatureMips4, FeatureMips5_32r2]>; 1150b57cec5SDimitry Andricdef FeatureMips32 : SubtargetFeature<"mips32", "MipsArchVersion", "Mips32", 1160b57cec5SDimitry Andric "Mips32 ISA Support", 1170b57cec5SDimitry Andric [FeatureMips2, FeatureMips3_32, 1180b57cec5SDimitry Andric FeatureMips4_32]>; 1190b57cec5SDimitry Andricdef FeatureMips32r2 : SubtargetFeature<"mips32r2", "MipsArchVersion", 1200b57cec5SDimitry Andric "Mips32r2", "Mips32r2 ISA Support", 1210b57cec5SDimitry Andric [FeatureMips3_32r2, FeatureMips4_32r2, 1220b57cec5SDimitry Andric FeatureMips5_32r2, FeatureMips32]>; 1230b57cec5SDimitry Andricdef FeatureMips32r3 : SubtargetFeature<"mips32r3", "MipsArchVersion", 1240b57cec5SDimitry Andric "Mips32r3", "Mips32r3 ISA Support", 1250b57cec5SDimitry Andric [FeatureMips32r2]>; 1260b57cec5SDimitry Andricdef FeatureMips32r5 : SubtargetFeature<"mips32r5", "MipsArchVersion", 1270b57cec5SDimitry Andric "Mips32r5", "Mips32r5 ISA Support", 1280b57cec5SDimitry Andric [FeatureMips32r3]>; 1290b57cec5SDimitry Andricdef FeatureMips32r6 : SubtargetFeature<"mips32r6", "MipsArchVersion", 1300b57cec5SDimitry Andric "Mips32r6", 1310b57cec5SDimitry Andric "Mips32r6 ISA Support [experimental]", 1320b57cec5SDimitry Andric [FeatureMips32r5, FeatureFP64Bit, 1330b57cec5SDimitry Andric FeatureNaN2008, FeatureAbs2008]>; 1340b57cec5SDimitry Andricdef FeatureMips64 : SubtargetFeature<"mips64", "MipsArchVersion", 1350b57cec5SDimitry Andric "Mips64", "Mips64 ISA Support", 1360b57cec5SDimitry Andric [FeatureMips5, FeatureMips32]>; 1370b57cec5SDimitry Andricdef FeatureMips64r2 : SubtargetFeature<"mips64r2", "MipsArchVersion", 1380b57cec5SDimitry Andric "Mips64r2", "Mips64r2 ISA Support", 1390b57cec5SDimitry Andric [FeatureMips64, FeatureMips32r2]>; 1400b57cec5SDimitry Andricdef FeatureMips64r3 : SubtargetFeature<"mips64r3", "MipsArchVersion", 1410b57cec5SDimitry Andric "Mips64r3", "Mips64r3 ISA Support", 1420b57cec5SDimitry Andric [FeatureMips64r2, FeatureMips32r3]>; 1430b57cec5SDimitry Andricdef FeatureMips64r5 : SubtargetFeature<"mips64r5", "MipsArchVersion", 1440b57cec5SDimitry Andric "Mips64r5", "Mips64r5 ISA Support", 1450b57cec5SDimitry Andric [FeatureMips64r3, FeatureMips32r5]>; 1460b57cec5SDimitry Andricdef FeatureMips64r6 : SubtargetFeature<"mips64r6", "MipsArchVersion", 1470b57cec5SDimitry Andric "Mips64r6", 1480b57cec5SDimitry Andric "Mips64r6 ISA Support [experimental]", 1490b57cec5SDimitry Andric [FeatureMips32r6, FeatureMips64r5, 1500b57cec5SDimitry Andric FeatureNaN2008, FeatureAbs2008]>; 1510b57cec5SDimitry Andricdef FeatureSym32 : SubtargetFeature<"sym32", "HasSym32", "true", 1520b57cec5SDimitry Andric "Symbols are 32 bit on Mips64">; 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andricdef FeatureMips16 : SubtargetFeature<"mips16", "InMips16Mode", "true", 1550b57cec5SDimitry Andric "Mips16 mode">; 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andricdef FeatureDSP : SubtargetFeature<"dsp", "HasDSP", "true", "Mips DSP ASE">; 1580b57cec5SDimitry Andricdef FeatureDSPR2 : SubtargetFeature<"dspr2", "HasDSPR2", "true", 1590b57cec5SDimitry Andric "Mips DSP-R2 ASE", [FeatureDSP]>; 1600b57cec5SDimitry Andricdef FeatureDSPR3 1610b57cec5SDimitry Andric : SubtargetFeature<"dspr3", "HasDSPR3", "true", "Mips DSP-R3 ASE", 1620b57cec5SDimitry Andric [ FeatureDSP, FeatureDSPR2 ]>; 1630b57cec5SDimitry Andric 1645ffd83dbSDimitry Andricdef FeatureMips3D : SubtargetFeature<"mips3d", "Has3D", "true", "Mips 3D ASE">; 1655ffd83dbSDimitry Andric 1660b57cec5SDimitry Andricdef FeatureMSA : SubtargetFeature<"msa", "HasMSA", "true", "Mips MSA ASE">; 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andricdef FeatureEVA : SubtargetFeature<"eva", "HasEVA", "true", "Mips EVA ASE">; 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andricdef FeatureCRC : SubtargetFeature<"crc", "HasCRC", "true", "Mips R6 CRC ASE">; 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andricdef FeatureVirt : SubtargetFeature<"virt", "HasVirt", "true", 1730b57cec5SDimitry Andric "Mips Virtualization ASE">; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andricdef FeatureGINV : SubtargetFeature<"ginv", "HasGINV", "true", 1760b57cec5SDimitry Andric "Mips Global Invalidate ASE">; 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andricdef FeatureMicroMips : SubtargetFeature<"micromips", "InMicroMipsMode", "true", 1790b57cec5SDimitry Andric "microMips mode">; 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andricdef FeatureCnMips : SubtargetFeature<"cnmips", "HasCnMips", 1820b57cec5SDimitry Andric "true", "Octeon cnMIPS Support", 1830b57cec5SDimitry Andric [FeatureMips64r2]>; 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andricdef FeatureCnMipsP : SubtargetFeature<"cnmipsp", "HasCnMipsP", 1860b57cec5SDimitry Andric "true", "Octeon+ cnMIPS Support", 1870b57cec5SDimitry Andric [FeatureCnMips]>; 1880b57cec5SDimitry Andric 1890b57cec5SDimitry Andricdef FeatureUseTCCInDIV : SubtargetFeature< 1900b57cec5SDimitry Andric "use-tcc-in-div", 1910b57cec5SDimitry Andric "UseTCCInDIV", "false", 1920b57cec5SDimitry Andric "Force the assembler to use trapping">; 1930b57cec5SDimitry Andric 194e8d8bef9SDimitry Andricdef FeatureNoMadd4 195480093f4SDimitry Andric : SubtargetFeature<"nomadd4", "DisableMadd4", "true", 1960b57cec5SDimitry Andric "Disable 4-operand madd.fmt and related instructions">; 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andricdef FeatureMT : SubtargetFeature<"mt", "HasMT", "true", "Mips MT ASE">; 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andricdef FeatureLongCalls : SubtargetFeature<"long-calls", "UseLongCalls", "true", 2010b57cec5SDimitry Andric "Disable use of the jal instruction">; 2020b57cec5SDimitry Andric 2038bcb0991SDimitry Andricdef FeatureXGOT 2048bcb0991SDimitry Andric : SubtargetFeature<"xgot", "UseXGOT", "true", "Assume 32-bit GOT">; 2058bcb0991SDimitry Andric 2060b57cec5SDimitry Andricdef FeatureUseIndirectJumpsHazard : SubtargetFeature<"use-indirect-jump-hazard", 2070b57cec5SDimitry Andric "UseIndirectJumpsHazard", 2080b57cec5SDimitry Andric "true", "Use indirect jump" 2090b57cec5SDimitry Andric " guards to prevent certain speculation based attacks">; 2105ffd83dbSDimitry Andric 211*0fca6ea1SDimitry Andricdef FeatureStrictAlign 212*0fca6ea1SDimitry Andric : SubtargetFeature<"strict-align", "StrictAlign", "true", 213*0fca6ea1SDimitry Andric "Disable unaligned load store for r6">; 214*0fca6ea1SDimitry Andric 2155ffd83dbSDimitry Andric//===----------------------------------------------------------------------===// 2165ffd83dbSDimitry Andric// Register File, Calling Conv, Instruction Descriptions 2175ffd83dbSDimitry Andric//===----------------------------------------------------------------------===// 2185ffd83dbSDimitry Andric 2195ffd83dbSDimitry Andricinclude "MipsRegisterInfo.td" 2205ffd83dbSDimitry Andricinclude "MipsSchedule.td" 2215ffd83dbSDimitry Andricinclude "MipsInstrInfo.td" 2225ffd83dbSDimitry Andricinclude "MipsCallingConv.td" 2235ffd83dbSDimitry Andricinclude "MipsRegisterBanks.td" 22481ad6265SDimitry Andricinclude "MipsCombine.td" 2255ffd83dbSDimitry Andric 2265ffd83dbSDimitry Andric// Avoid forward declaration issues. 2275ffd83dbSDimitry Andricinclude "MipsScheduleP5600.td" 2285ffd83dbSDimitry Andricinclude "MipsScheduleGeneric.td" 2295ffd83dbSDimitry Andric 230bdd1243dSDimitry Andricdef MipsInstrInfo : InstrInfo { 231bdd1243dSDimitry Andric} 2325ffd83dbSDimitry Andric 2330b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2340b57cec5SDimitry Andric// Mips processors supported. 2350b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andricdef ImplP5600 : SubtargetFeature<"p5600", "ProcImpl", 2380b57cec5SDimitry Andric "MipsSubtarget::CPU::P5600", 2390b57cec5SDimitry Andric "The P5600 Processor", [FeatureMips32r5]>; 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andricclass Proc<string Name, list<SubtargetFeature> Features> 2420b57cec5SDimitry Andric : ProcessorModel<Name, MipsGenericModel, Features>; 2430b57cec5SDimitry Andric 244480093f4SDimitry Andricdef : Proc<"generic", [FeatureMips32]>; 2450b57cec5SDimitry Andricdef : Proc<"mips1", [FeatureMips1]>; 2460b57cec5SDimitry Andricdef : Proc<"mips2", [FeatureMips2]>; 2470b57cec5SDimitry Andricdef : Proc<"mips32", [FeatureMips32]>; 2480b57cec5SDimitry Andricdef : Proc<"mips32r2", [FeatureMips32r2]>; 2490b57cec5SDimitry Andricdef : Proc<"mips32r3", [FeatureMips32r3]>; 2500b57cec5SDimitry Andricdef : Proc<"mips32r5", [FeatureMips32r5]>; 2510b57cec5SDimitry Andricdef : Proc<"mips32r6", [FeatureMips32r6]>; 2520b57cec5SDimitry Andric 2530b57cec5SDimitry Andricdef : Proc<"mips3", [FeatureMips3]>; 2540b57cec5SDimitry Andricdef : Proc<"mips4", [FeatureMips4]>; 2550b57cec5SDimitry Andricdef : Proc<"mips5", [FeatureMips5]>; 2560b57cec5SDimitry Andricdef : Proc<"mips64", [FeatureMips64]>; 2570b57cec5SDimitry Andricdef : Proc<"mips64r2", [FeatureMips64r2]>; 2580b57cec5SDimitry Andricdef : Proc<"mips64r3", [FeatureMips64r3]>; 2590b57cec5SDimitry Andricdef : Proc<"mips64r5", [FeatureMips64r5]>; 2600b57cec5SDimitry Andricdef : Proc<"mips64r6", [FeatureMips64r6]>; 2610b57cec5SDimitry Andricdef : Proc<"octeon", [FeatureMips64r2, FeatureCnMips]>; 2620b57cec5SDimitry Andricdef : Proc<"octeon+", [FeatureMips64r2, FeatureCnMips, FeatureCnMipsP]>; 2630b57cec5SDimitry Andricdef : ProcessorModel<"p5600", MipsP5600Model, [ImplP5600]>; 2640b57cec5SDimitry Andric 2650b57cec5SDimitry Andricdef MipsAsmParser : AsmParser { 2660b57cec5SDimitry Andric let ShouldEmitMatchRegisterName = 0; 2670b57cec5SDimitry Andric} 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andricdef MipsAsmParserVariant : AsmParserVariant { 2700b57cec5SDimitry Andric int Variant = 0; 2710b57cec5SDimitry Andric 2720b57cec5SDimitry Andric // Recognize hard coded registers. 2730b57cec5SDimitry Andric string RegisterPrefix = "$"; 2740b57cec5SDimitry Andric} 2750b57cec5SDimitry Andric 27681ad6265SDimitry Andricdef MipsAsmWriter : AsmWriter { 27781ad6265SDimitry Andric int PassSubtarget = 1; 27881ad6265SDimitry Andric} 27981ad6265SDimitry Andric 2800b57cec5SDimitry Andricdef Mips : Target { 2810b57cec5SDimitry Andric let InstructionSet = MipsInstrInfo; 28281ad6265SDimitry Andric let AssemblyWriters = [MipsAsmWriter]; 2830b57cec5SDimitry Andric let AssemblyParsers = [MipsAsmParser]; 2840b57cec5SDimitry Andric let AssemblyParserVariants = [MipsAsmParserVariant]; 2850b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 2860b57cec5SDimitry Andric} 2878bcb0991SDimitry Andric 2888bcb0991SDimitry Andric//===----------------------------------------------------------------------===// 2898bcb0991SDimitry Andric// Pfm Counters 2908bcb0991SDimitry Andric//===----------------------------------------------------------------------===// 2918bcb0991SDimitry Andric 2928bcb0991SDimitry Andricinclude "MipsPfmCounters.td" 293