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/FormattedStream.h"
22 #include "llvm/TableGen/Record.h"
23 
24 namespace llvm {
25 
26 class formatted_raw_ostream;
27 
28 class PredicateExpander {
29   bool EmitCallsByRef;
30   bool NegatePredicate;
31   bool ExpandForMC;
32   unsigned IndentLevel;
33 
34   PredicateExpander(const PredicateExpander &) = delete;
35   PredicateExpander &operator=(const PredicateExpander &) = delete;
36 
37 public:
PredicateExpander()38   PredicateExpander()
39       : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
40         IndentLevel(1U) {}
isByRef()41   bool isByRef() const { return EmitCallsByRef; }
shouldNegate()42   bool shouldNegate() const { return NegatePredicate; }
shouldExpandForMC()43   bool shouldExpandForMC() const { return ExpandForMC; }
getIndentLevel()44   unsigned getIndentLevel() const { return IndentLevel; }
45 
setByRef(bool Value)46   void setByRef(bool Value) { EmitCallsByRef = Value; }
flipNegatePredicate()47   void flipNegatePredicate() { NegatePredicate = !NegatePredicate; }
setNegatePredicate(bool Value)48   void setNegatePredicate(bool Value) { NegatePredicate = Value; }
setExpandForMC(bool Value)49   void setExpandForMC(bool Value) { ExpandForMC = Value; }
increaseIndentLevel()50   void increaseIndentLevel() { ++IndentLevel; }
decreaseIndentLevel()51   void decreaseIndentLevel() { --IndentLevel; }
setIndentLevel(unsigned Level)52   void setIndentLevel(unsigned Level) { IndentLevel = Level; }
53 
54   using RecVec = std::vector<Record *>;
55   void expandTrue(formatted_raw_ostream &OS);
56   void expandFalse(formatted_raw_ostream &OS);
57   void expandCheckImmOperand(formatted_raw_ostream &OS, int OpIndex,
58                              int ImmVal);
59   void expandCheckImmOperand(formatted_raw_ostream &OS, int OpIndex,
60                              StringRef ImmVal);
61   void expandCheckRegOperand(formatted_raw_ostream &OS, int OpIndex,
62                              const Record *Reg);
63   void expandCheckSameRegOperand(formatted_raw_ostream &OS, int First,
64                                  int Second);
65   void expandCheckNumOperands(formatted_raw_ostream &OS, int NumOps);
66   void expandCheckOpcode(formatted_raw_ostream &OS, const Record *Inst);
67 
68   void expandCheckPseudo(formatted_raw_ostream &OS, const RecVec &Opcodes);
69   void expandCheckOpcode(formatted_raw_ostream &OS, const RecVec &Opcodes);
70   void expandPredicateSequence(formatted_raw_ostream &OS,
71                                const RecVec &Sequence, bool IsCheckAll);
72   void expandTIIFunctionCall(formatted_raw_ostream &OS, StringRef TargetName,
73                              StringRef MethodName);
74   void expandCheckIsRegOperand(formatted_raw_ostream &OS, int OpIndex);
75   void expandCheckIsImmOperand(formatted_raw_ostream &OS, int OpIndex);
76   void expandCheckInvalidRegOperand(formatted_raw_ostream &OS, int OpIndex);
77   void expandCheckFunctionPredicate(formatted_raw_ostream &OS,
78                                     StringRef MCInstFn,
79                                     StringRef MachineInstrFn);
80   void expandCheckNonPortable(formatted_raw_ostream &OS, StringRef CodeBlock);
81   void expandPredicate(formatted_raw_ostream &OS, const Record *Rec);
82 };
83 
84 } // namespace llvm
85 
86 #endif
87