1 //===- TargetSchedule.td - Target Independent Scheduling ---*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the target-independent scheduling interfaces which should
11 // be implemented by each target which is using TableGen based scheduling.
13 //===----------------------------------------------------------------------===//
15 //===----------------------------------------------------------------------===//
16 // Processor functional unit - These values represent the function units
17 // available across all chip sets for the target. Eg., IntUnit, FPUnit, ...
18 // These may be independent values for each chip set or may be shared across
19 // all chip sets of the target. Each functional unit is treated as a resource
20 // during scheduling and has an affect instruction order based on availability
21 // during a time interval.
25 //===----------------------------------------------------------------------===//
26 // Pipeline bypass / forwarding - These values specifies the symbolic names of
27 // pipeline bypasses which can be used to forward results of instructions
28 // that are forwarded to uses.
30 def NoBypass : Bypass;
32 class ReservationKind<bits<1> val> {
36 def Required : ReservationKind<0>;
37 def Reserved : ReservationKind<1>;
39 //===----------------------------------------------------------------------===//
40 // Instruction stage - These values represent a non-pipelined step in
41 // the execution of an instruction. Cycles represents the number of
42 // discrete time slots needed to complete the stage. Units represent
43 // the choice of functional units that can be used to complete the
44 // stage. Eg. IntUnit1, IntUnit2. NextCycles indicates how many
45 // cycles should elapse from the start of this stage to the start of
46 // the next stage in the itinerary. For example:
48 // A stage is specified in one of two ways:
50 // InstrStage<1, [FU_x, FU_y]> - TimeInc defaults to Cycles
51 // InstrStage<1, [FU_x, FU_y], 0> - TimeInc explicit
54 class InstrStage<int cycles, list<FuncUnit> units,
56 ReservationKind kind = Required> {
57 int Cycles = cycles; // length of stage in machine cycles
58 list<FuncUnit> Units = units; // choice of functional units
59 int TimeInc = timeinc; // cycles till start of next stage
60 int Kind = kind.Value; // kind of FU reservation
63 //===----------------------------------------------------------------------===//
64 // Instruction itinerary - An itinerary represents a sequential series of steps
65 // required to complete an instruction. Itineraries are represented as lists of
66 // instruction stages.
69 //===----------------------------------------------------------------------===//
70 // Instruction itinerary classes - These values represent 'named' instruction
71 // itinerary. Using named itineraries simplifies managing groups of
72 // instructions across chip sets. An instruction uses the same itinerary class
73 // across all chip sets. Thus a new chip set can be added without modifying
74 // instruction information.
76 // NumMicroOps represents the number of micro-operations that each instruction
77 // in the class are decoded to. If the number is zero, then it means the
78 // instruction can decode into variable number of micro-ops and it must be
79 // determined dynamically.
81 class InstrItinClass<int ops = 1> {
82 int NumMicroOps = ops;
84 def NoItinerary : InstrItinClass;
86 //===----------------------------------------------------------------------===//
87 // Instruction itinerary data - These values provide a runtime map of an
88 // instruction itinerary class (name) to its itinerary data.
90 // OperandCycles are optional "cycle counts". They specify the cycle after
91 // instruction issue the values which correspond to specific operand indices
92 // are defined or read. Bypasses are optional "pipeline forwarding pathes", if
93 // a def by an instruction is available on a specific bypass and the use can
94 // read from the same bypass, then the operand use latency is reduced by one.
96 // InstrItinData<IIC_iLoad_i , [InstrStage<1, [A9_Pipe1]>,
97 // InstrStage<1, [A9_AGU]>],
98 // [3, 1], [A9_LdBypass]>,
99 // InstrItinData<IIC_iMVNr , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>],
100 // [1, 1], [NoBypass, A9_LdBypass]>,
102 // In this example, the instruction of IIC_iLoadi reads its input on cycle 1
103 // (after issue) and the result of the load is available on cycle 3. The result
104 // is available via forwarding path A9_LdBypass. If it's used by the first
105 // source operand of instructions of IIC_iMVNr class, then the operand latency
107 class InstrItinData<InstrItinClass Class, list<InstrStage> stages,
108 list<int> operandcycles = [],
109 list<Bypass> bypasses = []> {
110 InstrItinClass TheClass = Class;
111 list<InstrStage> Stages = stages;
112 list<int> OperandCycles = operandcycles;
113 list<Bypass> Bypasses = bypasses;
116 //===----------------------------------------------------------------------===//
117 // Processor itineraries - These values represent the set of all itinerary
118 // classes for a given chip set.
120 // Set property values to -1 to use the default.
121 // See InstrItineraryProps for comments and defaults.
122 class ProcessorItineraries<list<FuncUnit> fu, list<Bypass> bp,
123 list<InstrItinData> iid> {
124 int IssueWidth = -1; // Max instructions that may be scheduled per cycle.
125 int MinLatency = -1; // Determines which instrucions are allowed in a group.
126 // (-1) inorder (0) ooo, (1): inorder +var latencies.
127 int LoadLatency = -1; // Cycles for loads to access the cache.
128 int HighLatency = -1; // Approximation of cycles for "high latency" ops.
130 list<FuncUnit> FU = fu;
131 list<Bypass> BP = bp;
132 list<InstrItinData> IID = iid;
135 // NoItineraries - A marker that can be used by processors without schedule
136 // info. Subtargets using NoItineraries can bypass the scheduler's
137 // expensive HazardRecognizer because no reservation table is needed.
138 def NoItineraries : ProcessorItineraries<[], [], []>;
140 // Processor itineraries with non-unit issue width. This allows issue
141 // width to be explicity specified at the beginning of the itinerary.
142 class MultiIssueItineraries<int issuewidth, int minlatency,
143 int loadlatency, int highlatency,
144 list<FuncUnit> fu, list<Bypass> bp,
145 list<InstrItinData> iid>
146 : ProcessorItineraries<fu, bp, iid> {
147 let IssueWidth = issuewidth;
148 let MinLatency = minlatency;
149 let LoadLatency = loadlatency;
150 let HighLatency = highlatency;