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