1 //===--------------------- PredicateExpander.h ----------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 /// Functionalities used by the Tablegen backends to expand machine predicates.
11 /// See file llvm/Target/TargetInstrPredicate.td for a full list and description
12 /// of all the supported MCInstPredicate classes.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H
17 #define LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H
19 #include "llvm/ADT/StringRef.h"
27 class PredicateExpander
{
34 PredicateExpander(const PredicateExpander
&) = delete;
35 PredicateExpander
&operator=(const PredicateExpander
&) = delete;
38 PredicateExpander(StringRef Target
)
39 : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
40 IndentLevel(1U), TargetName(Target
) {}
41 bool isByRef() const { return EmitCallsByRef
; }
42 bool shouldNegate() const { return NegatePredicate
; }
43 bool shouldExpandForMC() const { return ExpandForMC
; }
44 unsigned getIndentLevel() const { return IndentLevel
; }
45 StringRef
getTargetName() const { return TargetName
; }
47 void setByRef(bool Value
) { EmitCallsByRef
= Value
; }
48 void flipNegatePredicate() { NegatePredicate
= !NegatePredicate
; }
49 void setNegatePredicate(bool Value
) { NegatePredicate
= Value
; }
50 void setExpandForMC(bool Value
) { ExpandForMC
= Value
; }
51 void setIndentLevel(unsigned Level
) { IndentLevel
= Level
; }
52 void increaseIndentLevel() { ++IndentLevel
; }
53 void decreaseIndentLevel() { --IndentLevel
; }
55 using RecVec
= std::vector
<Record
*>;
56 void expandTrue(raw_ostream
&OS
);
57 void expandFalse(raw_ostream
&OS
);
58 void expandCheckImmOperand(raw_ostream
&OS
, int OpIndex
, int ImmVal
,
59 StringRef FunctionMapper
);
60 void expandCheckImmOperand(raw_ostream
&OS
, int OpIndex
, StringRef ImmVal
,
61 StringRef FunctionMapperer
);
62 void expandCheckImmOperandSimple(raw_ostream
&OS
, int OpIndex
,
63 StringRef FunctionMapper
);
64 void expandCheckImmOperandLT(raw_ostream
&OS
, int OpIndex
, int ImmVal
,
65 StringRef FunctionMapper
);
66 void expandCheckImmOperandGT(raw_ostream
&OS
, int OpIndex
, int ImmVal
,
67 StringRef FunctionMapper
);
68 void expandCheckRegOperand(raw_ostream
&OS
, int OpIndex
, const Record
*Reg
,
69 StringRef FunctionMapper
);
70 void expandCheckRegOperandSimple(raw_ostream
&OS
, int OpIndex
,
71 StringRef FunctionMapper
);
72 void expandCheckSameRegOperand(raw_ostream
&OS
, int First
, int Second
);
73 void expandCheckNumOperands(raw_ostream
&OS
, int NumOps
);
74 void expandCheckOpcode(raw_ostream
&OS
, const Record
*Inst
);
76 void expandCheckPseudo(raw_ostream
&OS
, const RecVec
&Opcodes
);
77 void expandCheckOpcode(raw_ostream
&OS
, const RecVec
&Opcodes
);
78 void expandPredicateSequence(raw_ostream
&OS
, const RecVec
&Sequence
,
80 void expandTIIFunctionCall(raw_ostream
&OS
, StringRef MethodName
);
81 void expandCheckIsRegOperand(raw_ostream
&OS
, int OpIndex
);
82 void expandCheckIsVRegOperand(raw_ostream
&OS
, int OpIndex
);
83 void expandCheckIsImmOperand(raw_ostream
&OS
, int OpIndex
);
84 void expandCheckInvalidRegOperand(raw_ostream
&OS
, int OpIndex
);
85 void expandCheckFunctionPredicate(raw_ostream
&OS
, StringRef MCInstFn
,
86 StringRef MachineInstrFn
);
87 void expandCheckFunctionPredicateWithTII(raw_ostream
&OS
, StringRef MCInstFn
,
88 StringRef MachineInstrFn
,
90 void expandCheckNonPortable(raw_ostream
&OS
, StringRef CodeBlock
);
91 void expandPredicate(raw_ostream
&OS
, const Record
*Rec
);
92 void expandReturnStatement(raw_ostream
&OS
, const Record
*Rec
);
93 void expandOpcodeSwitchCase(raw_ostream
&OS
, const Record
*Rec
);
94 void expandOpcodeSwitchStatement(raw_ostream
&OS
, const RecVec
&Cases
,
95 const Record
*Default
);
96 void expandStatement(raw_ostream
&OS
, const Record
*Rec
);
99 // Forward declarations.
100 class STIPredicateFunction
;
103 class STIPredicateExpander
: public PredicateExpander
{
104 StringRef ClassPrefix
;
105 bool ExpandDefinition
;
107 STIPredicateExpander(const PredicateExpander
&) = delete;
108 STIPredicateExpander
&operator=(const PredicateExpander
&) = delete;
110 void expandHeader(raw_ostream
&OS
, const STIPredicateFunction
&Fn
);
111 void expandPrologue(raw_ostream
&OS
, const STIPredicateFunction
&Fn
);
112 void expandOpcodeGroup(raw_ostream
&OS
, const OpcodeGroup
&Group
,
113 bool ShouldUpdateOpcodeMask
);
114 void expandBody(raw_ostream
&OS
, const STIPredicateFunction
&Fn
);
115 void expandEpilogue(raw_ostream
&OS
, const STIPredicateFunction
&Fn
);
118 STIPredicateExpander(StringRef Target
)
119 : PredicateExpander(Target
), ExpandDefinition(false) {}
121 bool shouldExpandDefinition() const { return ExpandDefinition
; }
122 StringRef
getClassPrefix() const { return ClassPrefix
; }
123 void setClassPrefix(StringRef S
) { ClassPrefix
= S
; }
124 void setExpandDefinition(bool Value
) { ExpandDefinition
= Value
; }
126 void expandSTIPredicate(raw_ostream
&OS
, const STIPredicateFunction
&Fn
);