[InstCombine] Signed saturation patterns
[llvm-complete.git] / include / llvm / Target / TargetItinerary.td
blob89e5abd947d07602c86975fa363cfd94348493e5
1 //===- TargetItinerary.td - Target Itinierary Description --*- tablegen -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the target-independent scheduling interfaces
10 // which should be implemented by each target that uses instruction
11 // itineraries for scheduling. Itineraries are details reservation
12 // tables for each instruction class. They are most appropriate for
13 // in-order machine with complicated scheduling or bundling constraints.
15 //===----------------------------------------------------------------------===//
17 //===----------------------------------------------------------------------===//
18 // Processor functional unit - These values represent the function units
19 // available across all chip sets for the target.  Eg., IntUnit, FPUnit, ...
20 // These may be independent values for each chip set or may be shared across
21 // all chip sets of the target.  Each functional unit is treated as a resource
22 // during scheduling and has an affect instruction order based on availability
23 // during a time interval.
25 class FuncUnit;
27 //===----------------------------------------------------------------------===//
28 // Pipeline bypass / forwarding - These values specifies the symbolic names of
29 // pipeline bypasses which can be used to forward results of instructions
30 // that are forwarded to uses.
31 class Bypass;
32 def NoBypass : Bypass;
34 class ReservationKind<bits<1> val> {
35   int Value = val;
38 def Required : ReservationKind<0>;
39 def Reserved : ReservationKind<1>;
41 //===----------------------------------------------------------------------===//
42 // Instruction stage - These values represent a non-pipelined step in
43 // the execution of an instruction.  Cycles represents the number of
44 // discrete time slots needed to complete the stage.  Units represent
45 // the choice of functional units that can be used to complete the
46 // stage.  Eg. IntUnit1, IntUnit2. TimeInc indicates how many cycles
47 // should elapse from the start of this stage to the start of the next
48 // stage in the itinerary.  For example:
50 // A stage is specified in one of two ways:
52 //   InstrStage<1, [FU_x, FU_y]>     - TimeInc defaults to Cycles
53 //   InstrStage<1, [FU_x, FU_y], 0>  - TimeInc explicit
56 class InstrStage<int cycles, list<FuncUnit> units,
57                  int timeinc = -1,
58                  ReservationKind kind = Required> {
59   int Cycles          = cycles;       // length of stage in machine cycles
60   list<FuncUnit> Units = units;       // choice of functional units
61   int TimeInc         = timeinc;      // cycles till start of next stage
62   int Kind            = kind.Value;   // kind of FU reservation
65 //===----------------------------------------------------------------------===//
66 // Instruction itinerary - An itinerary represents a sequential series of steps
67 // required to complete an instruction.  Itineraries are represented as lists of
68 // instruction stages.
71 //===----------------------------------------------------------------------===//
72 // Instruction itinerary classes - These values represent 'named' instruction
73 // itinerary.  Using named itineraries simplifies managing groups of
74 // instructions across chip sets.  An instruction uses the same itinerary class
75 // across all chip sets.  Thus a new chip set can be added without modifying
76 // instruction information.
78 class InstrItinClass;
79 def NoItinerary : InstrItinClass;
81 //===----------------------------------------------------------------------===//
82 // Instruction itinerary data - These values provide a runtime map of an
83 // instruction itinerary class (name) to its itinerary data.
85 // NumMicroOps represents the number of micro-operations that each instruction
86 // in the class are decoded to. If the number is zero, then it means the
87 // instruction can decode into variable number of micro-ops and it must be
88 // determined dynamically. This directly relates to the itineraries
89 // global IssueWidth property, which constrains the number of microops
90 // that can issue per cycle.
92 // OperandCycles are optional "cycle counts". They specify the cycle after
93 // instruction issue the values which correspond to specific operand indices
94 // are defined or read. Bypasses are optional "pipeline forwarding paths", if
95 // a def by an instruction is available on a specific bypass and the use can
96 // read from the same bypass, then the operand use latency is reduced by one.
98 //  InstrItinData<IIC_iLoad_i , [InstrStage<1, [A9_Pipe1]>,
99 //                               InstrStage<1, [A9_AGU]>],
100 //                              [3, 1], [A9_LdBypass]>,
101 //  InstrItinData<IIC_iMVNr   , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>],
102 //                              [1, 1], [NoBypass, A9_LdBypass]>,
104 // In this example, the instruction of IIC_iLoadi reads its input on cycle 1
105 // (after issue) and the result of the load is available on cycle 3. The result
106 // is available via forwarding path A9_LdBypass. If it's used by the first
107 // source operand of instructions of IIC_iMVNr class, then the operand latency
108 // is reduced by 1.
109 class InstrItinData<InstrItinClass Class, list<InstrStage> stages,
110                     list<int> operandcycles = [],
111                     list<Bypass> bypasses = [], int uops = 1> {
112   InstrItinClass TheClass = Class;
113   int NumMicroOps = uops;
114   list<InstrStage> Stages = stages;
115   list<int> OperandCycles = operandcycles;
116   list<Bypass> Bypasses = bypasses;
119 //===----------------------------------------------------------------------===//
120 // Processor itineraries - These values represent the set of all itinerary
121 // classes for a given chip set.
123 // Set property values to -1 to use the default.
124 // See InstrItineraryProps for comments and defaults.
125 class ProcessorItineraries<list<FuncUnit> fu, list<Bypass> bp,
126                            list<InstrItinData> iid> {
127   list<FuncUnit> FU = fu;
128   list<Bypass> BP = bp;
129   list<InstrItinData> IID = iid;
130   // The packetizer automaton to use for this itinerary. By default all
131   // itineraries for a target are bundled up into the same automaton. This only
132   // works correctly when there are no conflicts in functional unit IDs between
133   // itineraries. For example, given two itineraries A<[SLOT_A]>, B<[SLOT_B]>,
134   // SLOT_A and SLOT_B will be assigned the same functional unit index, and
135   // the generated packetizer will confuse instructions referencing these slots.
136   //
137   // To avoid this, setting PacketizerNamespace to non-"" will cause this
138   // itinerary to be generated in a different automaton. The subtarget will need
139   // to declare a method "create##Namespace##DFAPacketizer()".
140   string PacketizerNamespace = "";
143 // NoItineraries - A marker that can be used by processors without schedule
144 // info. Subtargets using NoItineraries can bypass the scheduler's
145 // expensive HazardRecognizer because no reservation table is needed.
146 def NoItineraries : ProcessorItineraries<[], [], []>;
148 //===----------------------------------------------------------------------===//
149 // Combo Function Unit data - This is a map of combo function unit names to
150 // the list of functional units that are included in the combination.
152 class ComboFuncData<FuncUnit ComboFunc, list<FuncUnit> funclist> {
153   FuncUnit TheComboFunc = ComboFunc;
154   list<FuncUnit> FuncList = funclist;
157 //===----------------------------------------------------------------------===//
158 // Combo Function Units - This is a list of all combo function unit data.
159 class ComboFuncUnits<list<ComboFuncData> cfd> {
160   list<ComboFuncData> CFD = cfd;