blob: b39452f0fbf7496ca75f1ae37c45aa67e91109ac [file] [log] [blame]
Andrea Di Biagio95140022018-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 Biagio2c6cbc8b2018-08-13 15:13:35 +000021#include "llvm/Support/raw_ostream.h"
Andrea Di Biagio95140022018-05-25 15:55:37 +000022#include "llvm/TableGen/Record.h"
23
24namespace llvm {
25
Andrea Di Biagio2c6cbc8b2018-08-13 15:13:35 +000026class raw_ostream;
Andrea Di Biagio95140022018-05-25 15:55:37 +000027
28class 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
37public:
38 PredicateExpander()
39 : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
40 IndentLevel(1U) {}
41 bool isByRef() const { return EmitCallsByRef; }
42 bool shouldNegate() const { return NegatePredicate; }
43 bool shouldExpandForMC() const { return ExpandForMC; }
44 unsigned getIndentLevel() const { return IndentLevel; }
45
46 void setByRef(bool Value) { EmitCallsByRef = Value; }
47 void flipNegatePredicate() { NegatePredicate = !NegatePredicate; }
48 void setNegatePredicate(bool Value) { NegatePredicate = Value; }
49 void setExpandForMC(bool Value) { ExpandForMC = Value; }
50 void increaseIndentLevel() { ++IndentLevel; }
51 void decreaseIndentLevel() { --IndentLevel; }
52 void setIndentLevel(unsigned Level) { IndentLevel = Level; }
53
54 using RecVec = std::vector<Record *>;
Andrea Di Biagio2c6cbc8b2018-08-13 15:13:35 +000055 void expandTrue(raw_ostream &OS);
56 void expandFalse(raw_ostream &OS);
57 void expandCheckImmOperand(raw_ostream &OS, int OpIndex, int ImmVal);
58 void expandCheckImmOperand(raw_ostream &OS, int OpIndex, StringRef ImmVal);
59 void expandCheckRegOperand(raw_ostream &OS, int OpIndex, const Record *Reg);
60 void expandCheckSameRegOperand(raw_ostream &OS, int First, int Second);
61 void expandCheckNumOperands(raw_ostream &OS, int NumOps);
62 void expandCheckOpcode(raw_ostream &OS, const Record *Inst);
Andrea Di Biagio95140022018-05-25 15:55:37 +000063
Andrea Di Biagio2c6cbc8b2018-08-13 15:13:35 +000064 void expandCheckPseudo(raw_ostream &OS, const RecVec &Opcodes);
65 void expandCheckOpcode(raw_ostream &OS, const RecVec &Opcodes);
66 void expandPredicateSequence(raw_ostream &OS, const RecVec &Sequence,
67 bool IsCheckAll);
68 void expandTIIFunctionCall(raw_ostream &OS, StringRef TargetName,
Andrea Di Biagio95140022018-05-25 15:55:37 +000069 StringRef MethodName);
Andrea Di Biagio2c6cbc8b2018-08-13 15:13:35 +000070 void expandCheckIsRegOperand(raw_ostream &OS, int OpIndex);
71 void expandCheckIsImmOperand(raw_ostream &OS, int OpIndex);
72 void expandCheckInvalidRegOperand(raw_ostream &OS, int OpIndex);
73 void expandCheckFunctionPredicate(raw_ostream &OS, StringRef MCInstFn,
Andrea Di Biagio95140022018-05-25 15:55:37 +000074 StringRef MachineInstrFn);
Andrea Di Biagio2c6cbc8b2018-08-13 15:13:35 +000075 void expandCheckNonPortable(raw_ostream &OS, StringRef CodeBlock);
76 void expandPredicate(raw_ostream &OS, const Record *Rec);
77 void expandReturnStatement(raw_ostream &OS, const Record *Rec);
78 void expandOpcodeSwitchCase(raw_ostream &OS, const Record *Rec);
79 void expandOpcodeSwitchStatement(raw_ostream &OS, const RecVec &Cases,
80 const Record *Default);
81 void expandStatement(raw_ostream &OS, const Record *Rec);
Andrea Di Biagio95140022018-05-25 15:55:37 +000082};
83
84} // namespace llvm
85
86#endif