1//===- TargetItinerary.td - Target Itinerary 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 detailed reservation
12// tables for each instruction class. They are most appropriate for
13// in-order machine with complicated scheduling or bundling constraints.
14//
15//===----------------------------------------------------------------------===//
16
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.
24//
25class FuncUnit;
26
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.
31class Bypass;
32def NoBypass : Bypass;
33
34class ReservationKind<bits<1> val> {
35  int Value = val;
36}
37
38def Required : ReservationKind<0>;
39def Reserved : ReservationKind<1>;
40
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:
49//
50// A stage is specified in one of two ways:
51//
52//   InstrStage<1, [FU_x, FU_y]>     - TimeInc defaults to Cycles
53//   InstrStage<1, [FU_x, FU_y], 0>  - TimeInc explicit
54//
55
56class 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
63}
64
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.
69//
70
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.
77//
78class InstrItinClass;
79def NoItinerary : InstrItinClass;
80
81//===----------------------------------------------------------------------===//
82// Instruction itinerary data - These values provide a runtime map of an
83// instruction itinerary class (name) to its itinerary data.
84//
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.
91//
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.
97//
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]>,
103//
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.
109class 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;
117}
118
119//===----------------------------------------------------------------------===//
120// Processor itineraries - These values represent the set of all itinerary
121// classes for a given chip set.
122//
123// Set property values to -1 to use the default.
124// See InstrItineraryProps for comments and defaults.
125class 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 = "";
141}
142
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.
146def NoItineraries : ProcessorItineraries<[], [], []>;
147
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.
151//
152class ComboFuncData<FuncUnit ComboFunc, list<FuncUnit> funclist> {
153  FuncUnit TheComboFunc = ComboFunc;
154  list<FuncUnit> FuncList = funclist;
155}
156
157//===----------------------------------------------------------------------===//
158// Combo Function Units - This is a list of all combo function unit data.
159class ComboFuncUnits<list<ComboFuncData> cfd> {
160  list<ComboFuncData> CFD = cfd;
161}
162
163