blob: 0f3ee6867e658880e07ec28c2fc4a3f3fa3d15c3 [file] [log] [blame]
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +00001//===--------------------- 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"
Andrea Di Biagio87972c42018-08-13 15:13:35 +000021#include "llvm/Support/raw_ostream.h"
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000022#include "llvm/TableGen/Record.h"
23
24namespace llvm {
25
Andrea Di Biagio87972c42018-08-13 15:13:35 +000026class raw_ostream;
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000027
28class PredicateExpander {
29 bool EmitCallsByRef;
30 bool NegatePredicate;
31 bool ExpandForMC;
32 unsigned IndentLevel;
Andrea Di Biagioe9759dd2018-08-14 18:36:54 +000033 StringRef TargetName;
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000034
35 PredicateExpander(const PredicateExpander &) = delete;
36 PredicateExpander &operator=(const PredicateExpander &) = delete;
37
38public:
Andrea Di Biagioe9759dd2018-08-14 18:36:54 +000039 PredicateExpander(StringRef Target)
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000040 : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
Andrea Di Biagioe9759dd2018-08-14 18:36:54 +000041 IndentLevel(1U), TargetName(Target) {}
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000042 bool isByRef() const { return EmitCallsByRef; }
43 bool shouldNegate() const { return NegatePredicate; }
44 bool shouldExpandForMC() const { return ExpandForMC; }
45 unsigned getIndentLevel() const { return IndentLevel; }
Andrea Di Biagioa9c15c12018-09-19 15:57:45 +000046 StringRef getTargetName() const { return TargetName; }
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000047
48 void setByRef(bool Value) { EmitCallsByRef = Value; }
49 void flipNegatePredicate() { NegatePredicate = !NegatePredicate; }
50 void setNegatePredicate(bool Value) { NegatePredicate = Value; }
51 void setExpandForMC(bool Value) { ExpandForMC = Value; }
Andrea Di Biagioa9c15c12018-09-19 15:57:45 +000052 void setIndentLevel(unsigned Level) { IndentLevel = Level; }
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000053 void increaseIndentLevel() { ++IndentLevel; }
54 void decreaseIndentLevel() { --IndentLevel; }
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000055
56 using RecVec = std::vector<Record *>;
Andrea Di Biagio87972c42018-08-13 15:13:35 +000057 void expandTrue(raw_ostream &OS);
58 void expandFalse(raw_ostream &OS);
Andrea Di Biagiocf7570b2018-10-31 12:28:05 +000059 void expandCheckImmOperand(raw_ostream &OS, int OpIndex, int ImmVal,
60 StringRef FunctionMapper);
61 void expandCheckImmOperand(raw_ostream &OS, int OpIndex, StringRef ImmVal,
62 StringRef FunctionMapperer);
63 void expandCheckImmOperandSimple(raw_ostream &OS, int OpIndex,
64 StringRef FunctionMapper);
65 void expandCheckRegOperand(raw_ostream &OS, int OpIndex, const Record *Reg,
66 StringRef FunctionMapper);
67 void expandCheckRegOperandSimple(raw_ostream &OS, int OpIndex,
68 StringRef FunctionMapper);
Andrea Di Biagio87972c42018-08-13 15:13:35 +000069 void expandCheckSameRegOperand(raw_ostream &OS, int First, int Second);
70 void expandCheckNumOperands(raw_ostream &OS, int NumOps);
71 void expandCheckOpcode(raw_ostream &OS, const Record *Inst);
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000072
Andrea Di Biagio87972c42018-08-13 15:13:35 +000073 void expandCheckPseudo(raw_ostream &OS, const RecVec &Opcodes);
74 void expandCheckOpcode(raw_ostream &OS, const RecVec &Opcodes);
75 void expandPredicateSequence(raw_ostream &OS, const RecVec &Sequence,
76 bool IsCheckAll);
Andrea Di Biagioe9759dd2018-08-14 18:36:54 +000077 void expandTIIFunctionCall(raw_ostream &OS, StringRef MethodName);
Andrea Di Biagio87972c42018-08-13 15:13:35 +000078 void expandCheckIsRegOperand(raw_ostream &OS, int OpIndex);
79 void expandCheckIsImmOperand(raw_ostream &OS, int OpIndex);
80 void expandCheckInvalidRegOperand(raw_ostream &OS, int OpIndex);
81 void expandCheckFunctionPredicate(raw_ostream &OS, StringRef MCInstFn,
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000082 StringRef MachineInstrFn);
Andrea Di Biagio87972c42018-08-13 15:13:35 +000083 void expandCheckNonPortable(raw_ostream &OS, StringRef CodeBlock);
84 void expandPredicate(raw_ostream &OS, const Record *Rec);
85 void expandReturnStatement(raw_ostream &OS, const Record *Rec);
86 void expandOpcodeSwitchCase(raw_ostream &OS, const Record *Rec);
87 void expandOpcodeSwitchStatement(raw_ostream &OS, const RecVec &Cases,
88 const Record *Default);
89 void expandStatement(raw_ostream &OS, const Record *Rec);
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +000090};
91
Andrea Di Biagioa9c15c12018-09-19 15:57:45 +000092// Forward declarations.
93class STIPredicateFunction;
94class OpcodeGroup;
95
96class STIPredicateExpander : public PredicateExpander {
97 StringRef ClassPrefix;
98 bool ExpandDefinition;
99
100 STIPredicateExpander(const PredicateExpander &) = delete;
101 STIPredicateExpander &operator=(const PredicateExpander &) = delete;
102
103 void expandHeader(raw_ostream &OS, const STIPredicateFunction &Fn);
104 void expandPrologue(raw_ostream &OS, const STIPredicateFunction &Fn);
105 void expandOpcodeGroup(raw_ostream &OS, const OpcodeGroup &Group,
106 bool ShouldUpdateOpcodeMask);
107 void expandBody(raw_ostream &OS, const STIPredicateFunction &Fn);
108 void expandEpilogue(raw_ostream &OS, const STIPredicateFunction &Fn);
109
110public:
111 STIPredicateExpander(StringRef Target)
112 : PredicateExpander(Target), ClassPrefix(), ExpandDefinition(false) {}
113
114 bool shouldExpandDefinition() const { return ExpandDefinition; }
115 StringRef getClassPrefix() const { return ClassPrefix; }
116 void setClassPrefix(StringRef S) { ClassPrefix = S; }
117 void setExpandDefinition(bool Value) { ExpandDefinition = Value; }
118
119 void expandSTIPredicate(raw_ostream &OS, const STIPredicateFunction &Fn);
120};
121
Andrea Di Biagioe68d92b2018-05-25 15:55:37 +0000122} // namespace llvm
123
124#endif