xref: /llvm-project/llvm/utils/TableGen/Common/PredicateExpander.h (revision c92137e474d504159bd9d51f125c8a9ba9141109)
1fa3d789dSPierre van Houtryve //===--------------------- PredicateExpander.h ----------------------------===//
2fa3d789dSPierre van Houtryve //
3fa3d789dSPierre van Houtryve // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fa3d789dSPierre van Houtryve // See https://llvm.org/LICENSE.txt for license information.
5fa3d789dSPierre van Houtryve // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fa3d789dSPierre van Houtryve //
7fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===//
8fa3d789dSPierre van Houtryve /// \file
9fa3d789dSPierre van Houtryve /// Functionalities used by the Tablegen backends to expand machine predicates.
10fa3d789dSPierre van Houtryve ///
11fa3d789dSPierre van Houtryve /// See file llvm/Target/TargetInstrPredicate.td for a full list and description
12fa3d789dSPierre van Houtryve /// of all the supported MCInstPredicate classes.
13fa3d789dSPierre van Houtryve //
14fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===//
15fa3d789dSPierre van Houtryve 
168a61bfcfSRahul Joshi #ifndef LLVM_UTILS_TABLEGEN_COMMON_PREDICATEEXPANDER_H
178a61bfcfSRahul Joshi #define LLVM_UTILS_TABLEGEN_COMMON_PREDICATEEXPANDER_H
18fa3d789dSPierre van Houtryve 
192b01452cSRahul Joshi #include "llvm/ADT/ArrayRef.h"
20fa3d789dSPierre van Houtryve #include "llvm/ADT/StringRef.h"
21*c92137e4SRahul Joshi #include "llvm/Support/raw_ostream.h"
22fa3d789dSPierre van Houtryve 
23fa3d789dSPierre van Houtryve namespace llvm {
24fa3d789dSPierre van Houtryve 
25fa3d789dSPierre van Houtryve class Record;
26fa3d789dSPierre van Houtryve 
27fa3d789dSPierre van Houtryve class PredicateExpander {
28fa3d789dSPierre van Houtryve   bool EmitCallsByRef;
29fa3d789dSPierre van Houtryve   bool NegatePredicate;
30fa3d789dSPierre van Houtryve   bool ExpandForMC;
31fa3d789dSPierre van Houtryve   StringRef TargetName;
32fa3d789dSPierre van Houtryve 
33fa3d789dSPierre van Houtryve   PredicateExpander(const PredicateExpander &) = delete;
34fa3d789dSPierre van Houtryve   PredicateExpander &operator=(const PredicateExpander &) = delete;
35fa3d789dSPierre van Houtryve 
36*c92137e4SRahul Joshi protected:
37*c92137e4SRahul Joshi   indent Indent;
38*c92137e4SRahul Joshi 
39fa3d789dSPierre van Houtryve public:
40*c92137e4SRahul Joshi   explicit PredicateExpander(StringRef Target, unsigned Indent = 1)
41fa3d789dSPierre van Houtryve       : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
42*c92137e4SRahul Joshi         TargetName(Target), Indent(Indent, 2) {}
43fa3d789dSPierre van Houtryve   bool isByRef() const { return EmitCallsByRef; }
44fa3d789dSPierre van Houtryve   bool shouldNegate() const { return NegatePredicate; }
45fa3d789dSPierre van Houtryve   bool shouldExpandForMC() const { return ExpandForMC; }
46*c92137e4SRahul Joshi   indent &getIndent() { return Indent; }
47fa3d789dSPierre van Houtryve   StringRef getTargetName() const { return TargetName; }
48fa3d789dSPierre van Houtryve 
49fa3d789dSPierre van Houtryve   void setByRef(bool Value) { EmitCallsByRef = Value; }
50fa3d789dSPierre van Houtryve   void flipNegatePredicate() { NegatePredicate = !NegatePredicate; }
51fa3d789dSPierre van Houtryve   void setNegatePredicate(bool Value) { NegatePredicate = Value; }
52fa3d789dSPierre van Houtryve   void setExpandForMC(bool Value) { ExpandForMC = Value; }
53fa3d789dSPierre van Houtryve 
54fa3d789dSPierre van Houtryve   void expandTrue(raw_ostream &OS);
55fa3d789dSPierre van Houtryve   void expandFalse(raw_ostream &OS);
56fa3d789dSPierre van Houtryve   void expandCheckImmOperand(raw_ostream &OS, int OpIndex, int ImmVal,
57fa3d789dSPierre van Houtryve                              StringRef FunctionMapper);
58fa3d789dSPierre van Houtryve   void expandCheckImmOperand(raw_ostream &OS, int OpIndex, StringRef ImmVal,
59fa3d789dSPierre van Houtryve                              StringRef FunctionMapperer);
60fa3d789dSPierre van Houtryve   void expandCheckImmOperandSimple(raw_ostream &OS, int OpIndex,
61fa3d789dSPierre van Houtryve                                    StringRef FunctionMapper);
62fa3d789dSPierre van Houtryve   void expandCheckImmOperandLT(raw_ostream &OS, int OpIndex, int ImmVal,
63fa3d789dSPierre van Houtryve                                StringRef FunctionMapper);
64fa3d789dSPierre van Houtryve   void expandCheckImmOperandGT(raw_ostream &OS, int OpIndex, int ImmVal,
65fa3d789dSPierre van Houtryve                                StringRef FunctionMapper);
66fa3d789dSPierre van Houtryve   void expandCheckRegOperand(raw_ostream &OS, int OpIndex, const Record *Reg,
67fa3d789dSPierre van Houtryve                              StringRef FunctionMapper);
68fa3d789dSPierre van Houtryve   void expandCheckRegOperandSimple(raw_ostream &OS, int OpIndex,
69fa3d789dSPierre van Houtryve                                    StringRef FunctionMapper);
70fa3d789dSPierre van Houtryve   void expandCheckSameRegOperand(raw_ostream &OS, int First, int Second);
71fa3d789dSPierre van Houtryve   void expandCheckNumOperands(raw_ostream &OS, int NumOps);
72fa3d789dSPierre van Houtryve   void expandCheckOpcode(raw_ostream &OS, const Record *Inst);
73fa3d789dSPierre van Houtryve 
742b01452cSRahul Joshi   void expandCheckPseudo(raw_ostream &OS, ArrayRef<const Record *> Opcodes);
752b01452cSRahul Joshi   void expandCheckOpcode(raw_ostream &OS, ArrayRef<const Record *> Opcodes);
762b01452cSRahul Joshi   void expandPredicateSequence(raw_ostream &OS,
772b01452cSRahul Joshi                                ArrayRef<const Record *> Sequence,
78fa3d789dSPierre van Houtryve                                bool IsCheckAll);
79fa3d789dSPierre van Houtryve   void expandTIIFunctionCall(raw_ostream &OS, StringRef MethodName);
80fa3d789dSPierre van Houtryve   void expandCheckIsRegOperand(raw_ostream &OS, int OpIndex);
81fa3d789dSPierre van Houtryve   void expandCheckIsVRegOperand(raw_ostream &OS, int OpIndex);
82fa3d789dSPierre van Houtryve   void expandCheckIsImmOperand(raw_ostream &OS, int OpIndex);
83fa3d789dSPierre van Houtryve   void expandCheckInvalidRegOperand(raw_ostream &OS, int OpIndex);
84fa3d789dSPierre van Houtryve   void expandCheckFunctionPredicate(raw_ostream &OS, StringRef MCInstFn,
85fa3d789dSPierre van Houtryve                                     StringRef MachineInstrFn);
86fa3d789dSPierre van Houtryve   void expandCheckFunctionPredicateWithTII(raw_ostream &OS, StringRef MCInstFn,
87fa3d789dSPierre van Houtryve                                            StringRef MachineInstrFn,
88fa3d789dSPierre van Houtryve                                            StringRef TIIPtr);
89fa3d789dSPierre van Houtryve   void expandCheckNonPortable(raw_ostream &OS, StringRef CodeBlock);
90fa3d789dSPierre van Houtryve   void expandPredicate(raw_ostream &OS, const Record *Rec);
91fa3d789dSPierre van Houtryve   void expandReturnStatement(raw_ostream &OS, const Record *Rec);
92fa3d789dSPierre van Houtryve   void expandOpcodeSwitchCase(raw_ostream &OS, const Record *Rec);
932b01452cSRahul Joshi   void expandOpcodeSwitchStatement(raw_ostream &OS,
942b01452cSRahul Joshi                                    ArrayRef<const Record *> Cases,
95fa3d789dSPierre van Houtryve                                    const Record *Default);
96fa3d789dSPierre van Houtryve   void expandStatement(raw_ostream &OS, const Record *Rec);
97fa3d789dSPierre van Houtryve };
98fa3d789dSPierre van Houtryve 
99fa3d789dSPierre van Houtryve // Forward declarations.
100fa3d789dSPierre van Houtryve class STIPredicateFunction;
101fa3d789dSPierre van Houtryve class OpcodeGroup;
102fa3d789dSPierre van Houtryve 
103fa3d789dSPierre van Houtryve class STIPredicateExpander : public PredicateExpander {
104fa3d789dSPierre van Houtryve   StringRef ClassPrefix;
105fa3d789dSPierre van Houtryve   bool ExpandDefinition;
106fa3d789dSPierre van Houtryve 
107fa3d789dSPierre van Houtryve   STIPredicateExpander(const PredicateExpander &) = delete;
108fa3d789dSPierre van Houtryve   STIPredicateExpander &operator=(const PredicateExpander &) = delete;
109fa3d789dSPierre van Houtryve 
110fa3d789dSPierre van Houtryve   void expandHeader(raw_ostream &OS, const STIPredicateFunction &Fn);
111fa3d789dSPierre van Houtryve   void expandPrologue(raw_ostream &OS, const STIPredicateFunction &Fn);
112fa3d789dSPierre van Houtryve   void expandOpcodeGroup(raw_ostream &OS, const OpcodeGroup &Group,
113fa3d789dSPierre van Houtryve                          bool ShouldUpdateOpcodeMask);
114fa3d789dSPierre van Houtryve   void expandBody(raw_ostream &OS, const STIPredicateFunction &Fn);
115fa3d789dSPierre van Houtryve   void expandEpilogue(raw_ostream &OS, const STIPredicateFunction &Fn);
116fa3d789dSPierre van Houtryve 
117fa3d789dSPierre van Houtryve public:
118*c92137e4SRahul Joshi   explicit STIPredicateExpander(StringRef Target, unsigned Indent = 1)
119*c92137e4SRahul Joshi       : PredicateExpander(Target, Indent), ExpandDefinition(false) {}
120fa3d789dSPierre van Houtryve 
121fa3d789dSPierre van Houtryve   bool shouldExpandDefinition() const { return ExpandDefinition; }
122fa3d789dSPierre van Houtryve   StringRef getClassPrefix() const { return ClassPrefix; }
123fa3d789dSPierre van Houtryve   void setClassPrefix(StringRef S) { ClassPrefix = S; }
124fa3d789dSPierre van Houtryve   void setExpandDefinition(bool Value) { ExpandDefinition = Value; }
125fa3d789dSPierre van Houtryve 
126fa3d789dSPierre van Houtryve   void expandSTIPredicate(raw_ostream &OS, const STIPredicateFunction &Fn);
127fa3d789dSPierre van Houtryve };
128fa3d789dSPierre van Houtryve 
129fa3d789dSPierre van Houtryve } // namespace llvm
130fa3d789dSPierre van Houtryve 
1318a61bfcfSRahul Joshi #endif // LLVM_UTILS_TABLEGEN_COMMON_PREDICATEEXPANDER_H
132