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