10b57cec5SDimitry Andric//===-- Sparc.td - Describe the Sparc 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 Andric// 100b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric// Target-independent interfaces which we are implementing 140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 150b57cec5SDimitry Andric 160b57cec5SDimitry Andricinclude "llvm/Target/Target.td" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 190b57cec5SDimitry Andric// SPARC Subtarget features. 200b57cec5SDimitry Andric// 210b57cec5SDimitry Andric 220b57cec5SDimitry Andricdef FeatureSoftMulDiv 230b57cec5SDimitry Andric : SubtargetFeature<"soft-mul-div", "UseSoftMulDiv", "true", 240b57cec5SDimitry Andric "Use software emulation for integer multiply and divide">; 250b57cec5SDimitry Andric 260b57cec5SDimitry Andricdef FeatureNoFSMULD 270b57cec5SDimitry Andric : SubtargetFeature<"no-fsmuld", "HasNoFSMULD", "true", 280b57cec5SDimitry Andric "Disable the fsmuld instruction.">; 290b57cec5SDimitry Andricdef FeatureNoFMULS 300b57cec5SDimitry Andric : SubtargetFeature<"no-fmuls", "HasNoFMULS", "true", 310b57cec5SDimitry Andric "Disable the fmuls instruction.">; 320b57cec5SDimitry Andric 330b57cec5SDimitry Andricdef FeatureV9 340b57cec5SDimitry Andric : SubtargetFeature<"v9", "IsV9", "true", 350b57cec5SDimitry Andric "Enable SPARC-V9 instructions">; 360b57cec5SDimitry Andricdef FeatureV8Deprecated 3706c3fb27SDimitry Andric : SubtargetFeature<"deprecated-v8", "UseV8DeprecatedInsts", "true", 380b57cec5SDimitry Andric "Enable deprecated V8 instructions in V9 mode">; 390b57cec5SDimitry Andricdef FeatureVIS 400b57cec5SDimitry Andric : SubtargetFeature<"vis", "IsVIS", "true", 410b57cec5SDimitry Andric "Enable UltraSPARC Visual Instruction Set extensions">; 420b57cec5SDimitry Andricdef FeatureVIS2 430b57cec5SDimitry Andric : SubtargetFeature<"vis2", "IsVIS2", "true", 440b57cec5SDimitry Andric "Enable Visual Instruction Set extensions II">; 450b57cec5SDimitry Andricdef FeatureVIS3 460b57cec5SDimitry Andric : SubtargetFeature<"vis3", "IsVIS3", "true", 470b57cec5SDimitry Andric "Enable Visual Instruction Set extensions III">; 480b57cec5SDimitry Andricdef FeatureLeon 490b57cec5SDimitry Andric : SubtargetFeature<"leon", "IsLeon", "true", 500b57cec5SDimitry Andric "Enable LEON extensions">; 510b57cec5SDimitry Andricdef FeaturePWRPSR 520b57cec5SDimitry Andric : SubtargetFeature<"leonpwrpsr", "HasPWRPSR", "true", 530b57cec5SDimitry Andric "Enable the PWRPSR instruction">; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andricdef FeatureHardQuad 560b57cec5SDimitry Andric : SubtargetFeature<"hard-quad-float", "HasHardQuad", "true", 570b57cec5SDimitry Andric "Enable quad-word floating point instructions">; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andricdef UsePopc : SubtargetFeature<"popc", "UsePopc", "true", 600b57cec5SDimitry Andric "Use the popc (population count) instruction">; 610b57cec5SDimitry Andric 620b57cec5SDimitry Andricdef FeatureSoftFloat : SubtargetFeature<"soft-float", "UseSoftFloat", "true", 630b57cec5SDimitry Andric "Use software emulation for floating point">; 640b57cec5SDimitry Andric 657a6dacacSDimitry Andric//===----------------------------------------------------------------------===// 667a6dacacSDimitry Andric// SPARC Subtarget tuning features. 677a6dacacSDimitry Andric// 687a6dacacSDimitry Andric 697a6dacacSDimitry Andricdef TuneSlowRDPC : SubtargetFeature<"slow-rdpc", "HasSlowRDPC", "true", 707a6dacacSDimitry Andric "rd %pc, %XX is slow", [FeatureV9]>; 717a6dacacSDimitry Andric 720b57cec5SDimitry Andric//==== Features added predmoninantly for LEON subtarget support 730b57cec5SDimitry Andricinclude "LeonFeatures.td" 740b57cec5SDimitry Andric 75*74626c16SDimitry Andric//==== Register allocation tweaks needed by some low-level software 76*74626c16SDimitry Andricforeach i = 1 ... 7 in 77*74626c16SDimitry Andric def FeatureReserveG#i : SubtargetFeature<"reserve-g"#i, "ReserveRegister["#i#" + SP::G0]", "true", 78*74626c16SDimitry Andric "Reserve G"#i#", making it unavailable as a GPR">; 79*74626c16SDimitry Andricforeach i = 0 ... 5 in 80*74626c16SDimitry Andric def FeatureReserveO#i : SubtargetFeature<"reserve-o"#i, "ReserveRegister["#i#" + SP::O0]", "true", 81*74626c16SDimitry Andric "Reserve O"#i#", making it unavailable as a GPR">; 82*74626c16SDimitry Andricforeach i = 0 ... 7 in 83*74626c16SDimitry Andric def FeatureReserveL#i : SubtargetFeature<"reserve-l"#i, "ReserveRegister["#i#" + SP::L0]", "true", 84*74626c16SDimitry Andric "Reserve L"#i#", making it unavailable as a GPR">; 85*74626c16SDimitry Andricforeach i = 0 ... 5 in 86*74626c16SDimitry Andric def FeatureReserveI#i : SubtargetFeature<"reserve-i"#i, "ReserveRegister["#i#" + SP::I0]", "true", 87*74626c16SDimitry Andric "Reserve I"#i#", making it unavailable as a GPR">; 88*74626c16SDimitry Andric 890b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 900b57cec5SDimitry Andric// Register File, Calling Conv, Instruction Descriptions 910b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 920b57cec5SDimitry Andric 935f757f3fSDimitry Andricinclude "SparcASITags.td" 940b57cec5SDimitry Andricinclude "SparcRegisterInfo.td" 950b57cec5SDimitry Andricinclude "SparcCallingConv.td" 960b57cec5SDimitry Andricinclude "SparcSchedule.td" 970b57cec5SDimitry Andricinclude "SparcInstrInfo.td" 980b57cec5SDimitry Andric 990b57cec5SDimitry Andricdef SparcInstrInfo : InstrInfo; 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andricdef SparcAsmParser : AsmParser { 1020b57cec5SDimitry Andric bit ShouldEmitMatchRegisterName = 0; 1030b57cec5SDimitry Andric} 1040b57cec5SDimitry Andric 1055f757f3fSDimitry Andricdef SparcAsmParserVariant : AsmParserVariant { 1065f757f3fSDimitry Andric let RegisterPrefix = "%"; 1075f757f3fSDimitry Andric} 1085f757f3fSDimitry Andric 1090b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1100b57cec5SDimitry Andric// SPARC processors supported. 1110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1120b57cec5SDimitry Andric 1137a6dacacSDimitry Andricclass Proc<string Name, list<SubtargetFeature> Features, 1147a6dacacSDimitry Andric list<SubtargetFeature> TuneFeatures = []> 1157a6dacacSDimitry Andric : Processor<Name, NoItineraries, Features, TuneFeatures>; 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andricdef : Proc<"generic", []>; 1180b57cec5SDimitry Andricdef : Proc<"v7", [FeatureSoftMulDiv, FeatureNoFSMULD]>; 1190b57cec5SDimitry Andricdef : Proc<"v8", []>; 1200b57cec5SDimitry Andricdef : Proc<"supersparc", []>; 1210b57cec5SDimitry Andricdef : Proc<"sparclite", []>; 1220b57cec5SDimitry Andricdef : Proc<"f934", []>; 1230b57cec5SDimitry Andricdef : Proc<"hypersparc", []>; 1240b57cec5SDimitry Andricdef : Proc<"sparclite86x", []>; 1250b57cec5SDimitry Andricdef : Proc<"sparclet", []>; 1260b57cec5SDimitry Andricdef : Proc<"tsc701", []>; 1270b57cec5SDimitry Andricdef : Proc<"myriad2", [FeatureLeon, LeonCASA]>; 1280b57cec5SDimitry Andricdef : Proc<"myriad2.1", [FeatureLeon, LeonCASA]>; 1290b57cec5SDimitry Andricdef : Proc<"myriad2.2", [FeatureLeon, LeonCASA]>; 1300b57cec5SDimitry Andricdef : Proc<"myriad2.3", [FeatureLeon, LeonCASA]>; 1310b57cec5SDimitry Andricdef : Proc<"ma2100", [FeatureLeon, LeonCASA]>; 1320b57cec5SDimitry Andricdef : Proc<"ma2150", [FeatureLeon, LeonCASA]>; 1330b57cec5SDimitry Andricdef : Proc<"ma2155", [FeatureLeon, LeonCASA]>; 1340b57cec5SDimitry Andricdef : Proc<"ma2450", [FeatureLeon, LeonCASA]>; 1350b57cec5SDimitry Andricdef : Proc<"ma2455", [FeatureLeon, LeonCASA]>; 1360b57cec5SDimitry Andricdef : Proc<"ma2x5x", [FeatureLeon, LeonCASA]>; 1370b57cec5SDimitry Andricdef : Proc<"ma2080", [FeatureLeon, LeonCASA]>; 1380b57cec5SDimitry Andricdef : Proc<"ma2085", [FeatureLeon, LeonCASA]>; 1390b57cec5SDimitry Andricdef : Proc<"ma2480", [FeatureLeon, LeonCASA]>; 1400b57cec5SDimitry Andricdef : Proc<"ma2485", [FeatureLeon, LeonCASA]>; 1410b57cec5SDimitry Andricdef : Proc<"ma2x8x", [FeatureLeon, LeonCASA]>; 1420b57cec5SDimitry Andricdef : Proc<"v9", [FeatureV9]>; 1437a6dacacSDimitry Andricdef : Proc<"ultrasparc", [FeatureV9, FeatureV8Deprecated, FeatureVIS], 1447a6dacacSDimitry Andric [TuneSlowRDPC]>; 1450b57cec5SDimitry Andricdef : Proc<"ultrasparc3", [FeatureV9, FeatureV8Deprecated, FeatureVIS, 1467a6dacacSDimitry Andric FeatureVIS2], 1477a6dacacSDimitry Andric [TuneSlowRDPC]>; 1480b57cec5SDimitry Andricdef : Proc<"niagara", [FeatureV9, FeatureV8Deprecated, FeatureVIS, 1490b57cec5SDimitry Andric FeatureVIS2]>; 1500b57cec5SDimitry Andricdef : Proc<"niagara2", [FeatureV9, FeatureV8Deprecated, UsePopc, 1510b57cec5SDimitry Andric FeatureVIS, FeatureVIS2]>; 1520b57cec5SDimitry Andricdef : Proc<"niagara3", [FeatureV9, FeatureV8Deprecated, UsePopc, 1530b57cec5SDimitry Andric FeatureVIS, FeatureVIS2]>; 1540b57cec5SDimitry Andricdef : Proc<"niagara4", [FeatureV9, FeatureV8Deprecated, UsePopc, 1550b57cec5SDimitry Andric FeatureVIS, FeatureVIS2, FeatureVIS3]>; 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric// LEON 2 FT generic 1580b57cec5SDimitry Andricdef : Processor<"leon2", LEON2Itineraries, 1590b57cec5SDimitry Andric [FeatureLeon]>; 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric// LEON 2 FT (AT697E) 1620b57cec5SDimitry Andric// TO DO: Place-holder: Processor specific features will be added *very* soon here. 1630b57cec5SDimitry Andricdef : Processor<"at697e", LEON2Itineraries, 1640b57cec5SDimitry Andric [FeatureLeon, InsertNOPLoad]>; 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andric// LEON 2 FT (AT697F) 1670b57cec5SDimitry Andric// TO DO: Place-holder: Processor specific features will be added *very* soon here. 1680b57cec5SDimitry Andricdef : Processor<"at697f", LEON2Itineraries, 1690b57cec5SDimitry Andric [FeatureLeon, InsertNOPLoad]>; 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric// LEON 3 FT generic 1730b57cec5SDimitry Andricdef : Processor<"leon3", LEON3Itineraries, 1740b57cec5SDimitry Andric [FeatureLeon, UMACSMACSupport]>; 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andric// LEON 3 FT (UT699). Provides features for the UT699 processor 1770b57cec5SDimitry Andric// - covers all the erratum fixes for LEON3, but does not support the CASA instruction. 1780b57cec5SDimitry Andricdef : Processor<"ut699", LEON3Itineraries, 1790b57cec5SDimitry Andric [FeatureLeon, InsertNOPLoad, FeatureNoFSMULD, FeatureNoFMULS, FixAllFDIVSQRT]>; 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric// LEON3 FT (GR712RC). Provides features for the GR712RC processor. 1820b57cec5SDimitry Andric// - covers all the erratum fixed for LEON3 and support for the CASA instruction. 1830b57cec5SDimitry Andricdef : Processor<"gr712rc", LEON3Itineraries, 1840b57cec5SDimitry Andric [FeatureLeon, LeonCASA]>; 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andric// LEON 4 FT generic 1870b57cec5SDimitry Andricdef : Processor<"leon4", LEON4Itineraries, 1880b57cec5SDimitry Andric [FeatureLeon, UMACSMACSupport, LeonCASA]>; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric// LEON 4 FT (GR740) 1910b57cec5SDimitry Andric// TO DO: Place-holder: Processor specific features will be added *very* soon here. 1920b57cec5SDimitry Andricdef : Processor<"gr740", LEON4Itineraries, 1930b57cec5SDimitry Andric [FeatureLeon, UMACSMACSupport, LeonCASA, LeonCycleCounter, 1940b57cec5SDimitry Andric FeaturePWRPSR]>; 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1970b57cec5SDimitry Andric// Declare the target which we are implementing 1980b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andricdef SparcAsmWriter : AsmWriter { 2010b57cec5SDimitry Andric string AsmWriterClassName = "InstPrinter"; 2020b57cec5SDimitry Andric int PassSubtarget = 1; 2030b57cec5SDimitry Andric int Variant = 0; 2040b57cec5SDimitry Andric} 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andricdef Sparc : Target { 2070b57cec5SDimitry Andric // Pull in Instruction Info: 2080b57cec5SDimitry Andric let InstructionSet = SparcInstrInfo; 2090b57cec5SDimitry Andric let AssemblyParsers = [SparcAsmParser]; 2105f757f3fSDimitry Andric let AssemblyParserVariants = [SparcAsmParserVariant]; 2110b57cec5SDimitry Andric let AssemblyWriters = [SparcAsmWriter]; 2120b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 2130b57cec5SDimitry Andric} 214