| //===--------------------- PredicateExpander.h ----------------------------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// \file | |
| /// Functionalities used by the Tablegen backends to expand machine predicates. | |
| /// | |
| /// See file llvm/Target/TargetInstrPredicate.td for a full list and description | |
| /// of all the supported MCInstPredicate classes. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H | |
| #define LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/Support/FormattedStream.h" | |
| #include "llvm/TableGen/Record.h" | |
| namespace llvm { | |
| class formatted_raw_ostream; | |
| class PredicateExpander { | |
| bool EmitCallsByRef; | |
| bool NegatePredicate; | |
| bool ExpandForMC; | |
| unsigned IndentLevel; | |
| PredicateExpander(const PredicateExpander &) = delete; | |
| PredicateExpander &operator=(const PredicateExpander &) = delete; | |
| public: | |
| PredicateExpander() | |
| : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false), | |
| IndentLevel(1U) {} | |
| bool isByRef() const { return EmitCallsByRef; } | |
| bool shouldNegate() const { return NegatePredicate; } | |
| bool shouldExpandForMC() const { return ExpandForMC; } | |
| unsigned getIndentLevel() const { return IndentLevel; } | |
| void setByRef(bool Value) { EmitCallsByRef = Value; } | |
| void flipNegatePredicate() { NegatePredicate = !NegatePredicate; } | |
| void setNegatePredicate(bool Value) { NegatePredicate = Value; } | |
| void setExpandForMC(bool Value) { ExpandForMC = Value; } | |
| void increaseIndentLevel() { ++IndentLevel; } | |
| void decreaseIndentLevel() { --IndentLevel; } | |
| void setIndentLevel(unsigned Level) { IndentLevel = Level; } | |
| using RecVec = std::vector<Record *>; | |
| void expandTrue(formatted_raw_ostream &OS); | |
| void expandFalse(formatted_raw_ostream &OS); | |
| void expandCheckImmOperand(formatted_raw_ostream &OS, int OpIndex, | |
| int ImmVal); | |
| void expandCheckImmOperand(formatted_raw_ostream &OS, int OpIndex, | |
| StringRef ImmVal); | |
| void expandCheckRegOperand(formatted_raw_ostream &OS, int OpIndex, | |
| const Record *Reg); | |
| void expandCheckSameRegOperand(formatted_raw_ostream &OS, int First, | |
| int Second); | |
| void expandCheckNumOperands(formatted_raw_ostream &OS, int NumOps); | |
| void expandCheckOpcode(formatted_raw_ostream &OS, const Record *Inst); | |
| void expandCheckPseudo(formatted_raw_ostream &OS, const RecVec &Opcodes); | |
| void expandCheckOpcode(formatted_raw_ostream &OS, const RecVec &Opcodes); | |
| void expandPredicateSequence(formatted_raw_ostream &OS, | |
| const RecVec &Sequence, bool IsCheckAll); | |
| void expandTIIFunctionCall(formatted_raw_ostream &OS, StringRef TargetName, | |
| StringRef MethodName); | |
| void expandCheckIsRegOperand(formatted_raw_ostream &OS, int OpIndex); | |
| void expandCheckIsImmOperand(formatted_raw_ostream &OS, int OpIndex); | |
| void expandCheckInvalidRegOperand(formatted_raw_ostream &OS, int OpIndex); | |
| void expandCheckFunctionPredicate(formatted_raw_ostream &OS, | |
| StringRef MCInstFn, | |
| StringRef MachineInstrFn); | |
| void expandCheckNonPortable(formatted_raw_ostream &OS, StringRef CodeBlock); | |
| void expandPredicate(formatted_raw_ostream &OS, const Record *Rec); | |
| }; | |
| } // namespace llvm | |
| #endif |