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