1 //===--------------------- PredicateExpander.h ----------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 /// \file
10 /// Functionalities used by the Tablegen backends to expand machine predicates.
11 ///
12 /// See file llvm/Target/TargetInstrPredicate.td for a full list and description
13 /// of all the supported MCInstPredicate classes.
14 //
15 //===----------------------------------------------------------------------===//
16 
17 #ifndef LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H
18 #define LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H
19 
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Support/raw_ostream.h"
22 #include "llvm/TableGen/Record.h"
23 
24 namespace llvm {
25 
26 class raw_ostream;
27 
28 class PredicateExpander {
29   bool EmitCallsByRef;
30   bool NegatePredicate;
31   bool ExpandForMC;
32   unsigned IndentLevel;
33   StringRef TargetName;
34 
35   PredicateExpander(const PredicateExpander &) = delete;
36   PredicateExpander &operator=(const PredicateExpander &) = delete;
37 
38 public:
PredicateExpander(StringRef Target)39   PredicateExpander(StringRef Target)
40       : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
41         IndentLevel(1U), TargetName(Target) {}
isByRef()42   bool isByRef() const { return EmitCallsByRef; }
shouldNegate()43   bool shouldNegate() const { return NegatePredicate; }
shouldExpandForMC()44   bool shouldExpandForMC() const { return ExpandForMC; }
getIndentLevel()45   unsigned getIndentLevel() const { return IndentLevel; }
getTargetName()46   StringRef getTargetName() const { return TargetName; }
47 
setByRef(bool Value)48   void setByRef(bool Value) { EmitCallsByRef = Value; }
flipNegatePredicate()49   void flipNegatePredicate() { NegatePredicate = !NegatePredicate; }
setNegatePredicate(bool Value)50   void setNegatePredicate(bool Value) { NegatePredicate = Value; }
setExpandForMC(bool Value)51   void setExpandForMC(bool Value) { ExpandForMC = Value; }
setIndentLevel(unsigned Level)52   void setIndentLevel(unsigned Level) { IndentLevel = Level; }
increaseIndentLevel()53   void increaseIndentLevel() { ++IndentLevel; }
decreaseIndentLevel()54   void decreaseIndentLevel() { --IndentLevel; }
55 
56   using RecVec = std::vector<Record *>;
57   void expandTrue(raw_ostream &OS);
58   void expandFalse(raw_ostream &OS);
59   void expandCheckImmOperand(raw_ostream &OS, int OpIndex, int ImmVal,
60                              StringRef FunctionMapper);
61   void expandCheckImmOperand(raw_ostream &OS, int OpIndex, StringRef ImmVal,
62                              StringRef FunctionMapperer);
63   void expandCheckImmOperandSimple(raw_ostream &OS, int OpIndex,
64                                    StringRef FunctionMapper);
65   void expandCheckRegOperand(raw_ostream &OS, int OpIndex, const Record *Reg,
66                              StringRef FunctionMapper);
67   void expandCheckRegOperandSimple(raw_ostream &OS, int OpIndex,
68                                    StringRef FunctionMapper);
69   void expandCheckSameRegOperand(raw_ostream &OS, int First, int Second);
70   void expandCheckNumOperands(raw_ostream &OS, int NumOps);
71   void expandCheckOpcode(raw_ostream &OS, const Record *Inst);
72 
73   void expandCheckPseudo(raw_ostream &OS, const RecVec &Opcodes);
74   void expandCheckOpcode(raw_ostream &OS, const RecVec &Opcodes);
75   void expandPredicateSequence(raw_ostream &OS, const RecVec &Sequence,
76                                bool IsCheckAll);
77   void expandTIIFunctionCall(raw_ostream &OS, StringRef MethodName);
78   void expandCheckIsRegOperand(raw_ostream &OS, int OpIndex);
79   void expandCheckIsImmOperand(raw_ostream &OS, int OpIndex);
80   void expandCheckInvalidRegOperand(raw_ostream &OS, int OpIndex);
81   void expandCheckFunctionPredicate(raw_ostream &OS, StringRef MCInstFn,
82                                     StringRef MachineInstrFn);
83   void expandCheckNonPortable(raw_ostream &OS, StringRef CodeBlock);
84   void expandPredicate(raw_ostream &OS, const Record *Rec);
85   void expandReturnStatement(raw_ostream &OS, const Record *Rec);
86   void expandOpcodeSwitchCase(raw_ostream &OS, const Record *Rec);
87   void expandOpcodeSwitchStatement(raw_ostream &OS, const RecVec &Cases,
88                                    const Record *Default);
89   void expandStatement(raw_ostream &OS, const Record *Rec);
90 };
91 
92 // Forward declarations.
93 class STIPredicateFunction;
94 class OpcodeGroup;
95 
96 class STIPredicateExpander : public PredicateExpander {
97   StringRef ClassPrefix;
98   bool ExpandDefinition;
99 
100   STIPredicateExpander(const PredicateExpander &) = delete;
101   STIPredicateExpander &operator=(const PredicateExpander &) = delete;
102 
103   void expandHeader(raw_ostream &OS, const STIPredicateFunction &Fn);
104   void expandPrologue(raw_ostream &OS, const STIPredicateFunction &Fn);
105   void expandOpcodeGroup(raw_ostream &OS, const OpcodeGroup &Group,
106                          bool ShouldUpdateOpcodeMask);
107   void expandBody(raw_ostream &OS, const STIPredicateFunction &Fn);
108   void expandEpilogue(raw_ostream &OS, const STIPredicateFunction &Fn);
109 
110 public:
STIPredicateExpander(StringRef Target)111   STIPredicateExpander(StringRef Target)
112       : PredicateExpander(Target), ClassPrefix(), ExpandDefinition(false) {}
113 
shouldExpandDefinition()114   bool shouldExpandDefinition() const { return ExpandDefinition; }
getClassPrefix()115   StringRef getClassPrefix() const { return ClassPrefix; }
setClassPrefix(StringRef S)116   void setClassPrefix(StringRef S) { ClassPrefix = S; }
setExpandDefinition(bool Value)117   void setExpandDefinition(bool Value) { ExpandDefinition = Value; }
118 
119   void expandSTIPredicate(raw_ostream &OS, const STIPredicateFunction &Fn);
120 };
121 
122 } // namespace llvm
123 
124 #endif
125