Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- TargetInstrPredicate.td - ---------------------------*- 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 class MCInstPredicate and its subclasses.
10
//
11
// MCInstPredicate definitions are used by target scheduling models to describe
12
// constraints on instructions.
13
//
14
// Here is an example of an MCInstPredicate definition in TableGen:
15
//
16
// def MCInstPredicateExample : CheckAll<[
17
//    CheckOpcode<[BLR]>,
18
//    CheckIsRegOperand<0>,
19
//    CheckNot<CheckRegOperand<0, LR>>]>;
20
//
21
// The syntax for MCInstPredicate is declarative, and predicate definitions can
22
// be composed together in order to generate more complex constraints.
23
//
24
// The `CheckAll` from the example defines a composition of three different
25
// predicates.  Definition `MCInstPredicateExample` identifies instructions
26
// whose opcode is BLR, and whose first operand is a register different from
27
// register `LR`.
28
//
29
// Every MCInstPredicate class has a well-known semantic in tablegen. For
30
// example, `CheckOpcode` is a special type of predicate used to describe a
31
// constraint on the value of an instruction opcode.
32
//
33
// MCInstPredicate definitions are typically used by scheduling models to
34
// construct MCSchedPredicate definitions (see the definition of class
35
// MCSchedPredicate in llvm/Target/TargetSchedule.td).
36
// In particular, an MCSchedPredicate can be used instead of a SchedPredicate
37
// when defining the set of SchedReadVariant and SchedWriteVariant of a
38
// processor scheduling model.
39
//
40
// The `MCInstPredicateExample` definition above is equivalent (and therefore
41
// could replace) the following definition from a previous ExynosM3 model (see
42
// AArch64SchedExynosM3.td):
43
//
44
// def M3BranchLinkFastPred  : SchedPredicate<[{
45
//    MI->getOpcode() == AArch64::BLR &&
46
//    MI->getOperand(0).isReg() &&
47
//    MI->getOperand(0).getReg() != AArch64::LR}]>;
48
//
49
// The main advantage of using MCInstPredicate instead of SchedPredicate is
50
// portability: users don't need to specify predicates in C++. As a consequence
51
// of this, MCInstPredicate definitions are not bound to a particular
52
// representation (i.e. MachineInstr vs MCInst).
53
//
54
// Tablegen backends know how to expand MCInstPredicate definitions into actual
55
// C++ code that works on MachineInstr (and/or MCInst).
56
//
57
// Instances of class PredicateExpander (see utils/Tablegen/PredicateExpander.h)
58
// know how to expand a predicate. For each MCInstPredicate class, there must be
59
// an "expand" method available in the PredicateExpander interface.
60
//
61
// For example, a `CheckOpcode` predicate is expanded using method
62
// `PredicateExpander::expandCheckOpcode()`.
63
//
64
// New MCInstPredicate classes must be added to this file. For each new class
65
// XYZ, an "expandXYZ" method must be added to the PredicateExpander.
66
//
67
//===----------------------------------------------------------------------===//
68
 
69
// Forward declarations.
70
class Instruction;
71
class SchedMachineModel;
72
 
73
// A generic machine instruction predicate.
74
class MCInstPredicate;
75
 
76
class MCTrue  : MCInstPredicate;   // A predicate that always evaluates to True.
77
class MCFalse : MCInstPredicate;   // A predicate that always evaluates to False.
78
def TruePred  : MCTrue;
79
def FalsePred : MCFalse;
80
 
81
// A predicate used to negate the outcome of another predicate.
82
// It allows to easily express "set difference" operations. For example, it
83
// makes it easy to describe a check that tests if an opcode is not part of a
84
// set of opcodes.
85
class CheckNot<MCInstPredicate P> : MCInstPredicate {
86
  MCInstPredicate Pred = P;
87
}
88
 
89
// This class is used as a building block to define predicates on instruction
90
// operands. It is used to reference a specific machine operand.
91
class MCOperandPredicate<int Index> : MCInstPredicate {
92
  int OpIndex = Index;
93
}
94
 
95
// Return true if machine operand at position `Index` is a register operand.
96
class CheckIsRegOperand<int Index> : MCOperandPredicate<Index>;
97
 
98
// Return true if machine operand at position `Index` is an immediate operand.
99
class CheckIsImmOperand<int Index> : MCOperandPredicate<Index>;
100
 
101
// Check if machine operands at index `First` and index `Second` both reference
102
// the same register.
103
class CheckSameRegOperand<int First, int Second> : MCInstPredicate {
104
  int FirstIndex = First;
105
  int SecondIndex = Second;
106
}
107
 
108
// Base class for checks on register/immediate operands.
109
// It allows users to define checks like:
110
//    MyFunction(MI->getOperand(Index).getImm()) == Val;
111
//
112
// In the example above, `MyFunction` is a function that takes as input an
113
// immediate operand value, and returns another value. Field `FunctionMapper` is
114
// the name of the function to call on the operand value.
115
class CheckOperandBase<int Index, string Fn = ""> : MCOperandPredicate<Index> {
116
  string FunctionMapper = Fn;
117
}
118
 
119
// Check that the machine register operand at position `Index` references
120
// register R. This predicate assumes that we already checked that the machine
121
// operand at position `Index` is a register operand.
122
class CheckRegOperand<int Index, Register R> : CheckOperandBase<Index> {
123
  Register Reg = R;
124
}
125
 
126
// Check if register operand at index `Index` is the invalid register.
127
class CheckInvalidRegOperand<int Index> : CheckOperandBase<Index>;
128
 
129
// Return true if machine operand at position `Index` is a valid
130
// register operand.
131
class CheckValidRegOperand<int Index> :
132
  CheckNot<CheckInvalidRegOperand<Index>>;
133
 
134
// Check that the operand at position `Index` is immediate `Imm`.
135
// If field `FunctionMapper` is a non-empty string, then function
136
// `FunctionMapper` is applied to the operand value, and the return value is then
137
// compared against `Imm`.
138
class CheckImmOperand<int Index, int Imm> : CheckOperandBase<Index> {
139
  int ImmVal = Imm;
140
}
141
 
142
// Similar to CheckImmOperand, however the immediate is not a literal number.
143
// This is useful when we want to compare the value of an operand against an
144
// enum value, and we know the actual integer value of that enum.
145
class CheckImmOperand_s<int Index, string Value> : CheckOperandBase<Index> {
146
  string ImmVal = Value;
147
}
148
 
149
// Expands to a call to `FunctionMapper` if field `FunctionMapper` is set.
150
// Otherwise, it expands to a CheckNot<CheckInvalidRegOperand<Index>>.
151
class CheckRegOperandSimple<int Index> : CheckOperandBase<Index>;
152
 
153
// Expands to a call to `FunctionMapper` if field `FunctionMapper` is set.
154
// Otherwise, it simply evaluates to TruePred.
155
class CheckImmOperandSimple<int Index> : CheckOperandBase<Index>;
156
 
157
// Check that the operand at position `Index` is immediate value zero.
158
class CheckZeroOperand<int Index> : CheckImmOperand<Index, 0>;
159
 
160
// Check that the instruction has exactly `Num` operands.
161
class CheckNumOperands<int Num> : MCInstPredicate {
162
  int NumOps = Num;
163
}
164
 
165
// Check that the instruction opcode is one of the opcodes in set `Opcodes`.
166
// This is a simple set membership query. The easier way to check if an opcode
167
// is not a member of the set is by using a `CheckNot<CheckOpcode<[...]>>`
168
// sequence.
169
class CheckOpcode<list<Instruction> Opcodes> : MCInstPredicate {
170
  list<Instruction> ValidOpcodes = Opcodes;
171
}
172
 
173
// Check that the instruction opcode is a pseudo opcode member of the set
174
// `Opcodes`.  This check is always expanded to "false" if we are generating
175
// code for MCInst.
176
class CheckPseudo<list<Instruction> Opcodes> : CheckOpcode<Opcodes>;
177
 
178
// A non-portable predicate. Only to use as a last resort when a block of code
179
// cannot possibly be converted in a declarative way using other MCInstPredicate
180
// classes. This check is always expanded to "false" when generating code for
181
// MCInst.
182
class CheckNonPortable<string Code> : MCInstPredicate {
183
  string CodeBlock = Code;
184
}
185
 
186
// A sequence of predicates. It is used as the base class for CheckAll, and
187
// CheckAny. It allows to describe compositions of predicates.
188
class CheckPredicateSequence<list<MCInstPredicate> Preds> : MCInstPredicate {
189
  list<MCInstPredicate> Predicates = Preds;
190
}
191
 
192
// Check that all of the predicates in `Preds` evaluate to true.
193
class CheckAll<list<MCInstPredicate> Sequence>
194
    : CheckPredicateSequence<Sequence>;
195
 
196
// Check that at least one of the predicates in `Preds` evaluates to true.
197
class CheckAny<list<MCInstPredicate> Sequence>
198
    : CheckPredicateSequence<Sequence>;
199
 
200
 
201
// Used to expand the body of a function predicate. See the definition of
202
// TIIPredicate below.
203
class MCStatement;
204
 
205
// Expands to a return statement. The return expression is a boolean expression
206
// described by a MCInstPredicate.
207
class MCReturnStatement<MCInstPredicate predicate> : MCStatement {
208
  MCInstPredicate Pred = predicate;
209
}
210
 
211
// Used to automatically construct cases of a switch statement where the switch
212
// variable is an instruction opcode. There is a 'case' for every opcode in the
213
// `opcodes` list, and each case is associated with MCStatement `caseStmt`.
214
class MCOpcodeSwitchCase<list<Instruction> opcodes, MCStatement caseStmt> {
215
  list<Instruction> Opcodes = opcodes;
216
  MCStatement CaseStmt = caseStmt;
217
}
218
 
219
// Expands to a switch statement. The switch variable is an instruction opcode.
220
// The auto-generated switch is populated by a number of cases based on the
221
// `cases` list in input. A default case is automatically generated, and it
222
// evaluates to `default`.
223
class MCOpcodeSwitchStatement<list<MCOpcodeSwitchCase> cases,
224
                              MCStatement default> : MCStatement {
225
  list<MCOpcodeSwitchCase> Cases = cases;
226
  MCStatement DefaultCase = default;
227
}
228
 
229
// Base class for function predicates.
230
class FunctionPredicateBase<string name, MCStatement body> {
231
  string FunctionName = name;
232
  MCStatement Body = body;
233
}
234
 
235
// Check that a call to method `Name` in class "XXXInstrInfo" (where XXX is
236
// the name of a target) returns true.
237
//
238
// TIIPredicate definitions are used to model calls to the target-specific
239
// InstrInfo. A TIIPredicate is treated specially by the InstrInfoEmitter
240
// tablegen backend, which will use it to automatically generate a definition in
241
// the target specific `InstrInfo` class.
242
//
243
// There cannot be multiple TIIPredicate definitions with the same name for the
244
// same target.
245
class TIIPredicate<string Name, MCStatement body>
246
    : FunctionPredicateBase<Name, body>, MCInstPredicate;
247
 
248
// A function predicate that takes as input a machine instruction, and returns
249
// a boolean value.
250
//
251
// This predicate is expanded into a function call by the PredicateExpander.
252
// In particular, the PredicateExpander would either expand this predicate into
253
// a call to `MCInstFn`, or into a call to`MachineInstrFn` depending on whether
254
// it is lowering predicates for MCInst or MachineInstr.
255
//
256
// In this context, `MCInstFn` and `MachineInstrFn` are both function names.
257
class CheckFunctionPredicate<string MCInstFn, string MachineInstrFn> : MCInstPredicate {
258
  string MCInstFnName = MCInstFn;
259
  string MachineInstrFnName = MachineInstrFn;
260
}
261
 
262
// Similar to CheckFunctionPredicate. However it assumes that MachineInstrFn is
263
// a method in TargetInstrInfo, and MCInstrFn takes an extra pointer to
264
// MCInstrInfo.
265
//
266
// It Expands to:
267
//  - TIIPointer->MachineInstrFn(MI)
268
//  - MCInstrFn(MI, MCII);
269
class CheckFunctionPredicateWithTII<string MCInstFn, string MachineInstrFn, string
270
TIIPointer = "TII"> : MCInstPredicate {
271
  string MCInstFnName = MCInstFn;
272
  string TIIPtrName = TIIPointer;
273
  string MachineInstrFnName = MachineInstrFn;
274
}
275
 
276
// Used to classify machine instructions based on a machine instruction
277
// predicate.
278
//
279
// Let IC be an InstructionEquivalenceClass definition, and MI a machine
280
// instruction.  We say that MI belongs to the equivalence class described by IC
281
// if and only if the following two conditions are met:
282
//  a) MI's opcode is in the `opcodes` set, and
283
//  b) `Predicate` evaluates to true when applied to MI.
284
//
285
// Instances of this class can be used by processor scheduling models to
286
// describe instructions that have a property in common.  For example,
287
// InstructionEquivalenceClass definitions can be used to identify the set of
288
// dependency breaking instructions for a processor model.
289
//
290
// An (optional) list of operand indices can be used to further describe
291
// properties that apply to instruction operands. For example, it can be used to
292
// identify register uses of a dependency breaking instructions that are not in
293
// a RAW dependency.
294
class InstructionEquivalenceClass<list<Instruction> opcodes,
295
                                  MCInstPredicate pred,
296
                                  list<int> operands = []> {
297
  list<Instruction> Opcodes = opcodes;
298
  MCInstPredicate Predicate = pred;
299
  list<int> OperandIndices = operands;
300
}
301
 
302
// Used by processor models to describe dependency breaking instructions.
303
//
304
// This is mainly an alias for InstructionEquivalenceClass.  Input operand
305
// `BrokenDeps` identifies the set of "broken dependencies". There is one bit
306
// per each implicit and explicit input operand.  An empty set of broken
307
// dependencies means: "explicit input register operands are independent."
308
class DepBreakingClass<list<Instruction> opcodes, MCInstPredicate pred,
309
                       list<int> BrokenDeps = []>
310
    : InstructionEquivalenceClass<opcodes, pred, BrokenDeps>;
311
 
312
// A function descriptor used to describe the signature of a predicate methods
313
// which will be expanded by the STIPredicateExpander into a tablegen'd
314
// XXXGenSubtargetInfo class member definition (here, XXX is a target name).
315
//
316
// It describes the signature of a TargetSubtarget hook, as well as a few extra
317
// properties. Examples of extra properties are:
318
//  - The default return value for the auto-generate function hook.
319
//  - A list of subtarget hooks (Delegates) that are called from this function.
320
//
321
class STIPredicateDecl<string name, MCInstPredicate default = FalsePred,
322
                       bit overrides = true, bit expandForMC = true,
323
                       bit updatesOpcodeMask = false,
324
                       list<STIPredicateDecl> delegates = []> {
325
  string Name = name;
326
 
327
  MCInstPredicate DefaultReturnValue = default;
328
 
329
  // True if this method is declared as virtual in class TargetSubtargetInfo.
330
  bit OverridesBaseClassMember = overrides;
331
 
332
  // True if we need an equivalent predicate function in the MC layer.
333
  bit ExpandForMC = expandForMC;
334
 
335
  // True if the autogenerated method has a extra in/out APInt param used as a
336
  // mask of operands.
337
  bit UpdatesOpcodeMask = updatesOpcodeMask;
338
 
339
  // A list of STIPredicates used by this definition to delegate part of the
340
  // computation. For example, STIPredicateFunction `isDependencyBreaking()`
341
  // delegates to `isZeroIdiom()` part of its computation.
342
  list<STIPredicateDecl> Delegates = delegates;
343
}
344
 
345
// A predicate function definition member of class `XXXGenSubtargetInfo`.
346
//
347
// If `Declaration.ExpandForMC` is true, then SubtargetEmitter
348
// will also expand another definition of this method that accepts a MCInst.
349
class STIPredicate<STIPredicateDecl declaration,
350
                   list<InstructionEquivalenceClass> classes> {
351
  STIPredicateDecl Declaration = declaration;
352
  list<InstructionEquivalenceClass> Classes = classes;
353
  SchedMachineModel SchedModel = ?;
354
}
355
 
356
// Convenience classes and definitions used by processor scheduling models to
357
// describe dependency breaking instructions and move elimination candidates.
358
let UpdatesOpcodeMask = true in {
359
 
360
def IsZeroIdiomDecl : STIPredicateDecl<"isZeroIdiom">;
361
 
362
let Delegates = [IsZeroIdiomDecl] in
363
def IsDepBreakingDecl : STIPredicateDecl<"isDependencyBreaking">;
364
 
365
} // UpdatesOpcodeMask
366
 
367
def IsOptimizableRegisterMoveDecl
368
    : STIPredicateDecl<"isOptimizableRegisterMove">;
369
 
370
class IsZeroIdiomFunction<list<DepBreakingClass> classes>
371
    : STIPredicate<IsZeroIdiomDecl, classes>;
372
 
373
class IsDepBreakingFunction<list<DepBreakingClass> classes>
374
    : STIPredicate<IsDepBreakingDecl, classes>;
375
 
376
class IsOptimizableRegisterMove<list<InstructionEquivalenceClass> classes>
377
    : STIPredicate<IsOptimizableRegisterMoveDecl, classes>;