contract movechild+checktype into a new checkchild node, shrinking the
[oota-llvm.git] / utils / TableGen / DAGISelMatcher.cpp
1 //===- DAGISelMatcher.cpp - Representation of DAG pattern matcher ---------===//
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
10 #include "DAGISelMatcher.h"
11 #include "CodeGenDAGPatterns.h"
12 #include "CodeGenTarget.h"
13 #include "Record.h"
14 #include "llvm/Support/raw_ostream.h"
15 using namespace llvm;
16
17 void MatcherNode::dump() const {
18   print(errs());
19 }
20
21 void MatcherNode::printNext(raw_ostream &OS, unsigned indent) const {
22   if (Next)
23     return Next->print(OS, indent);
24 }
25
26
27 void PushMatcherNode::print(raw_ostream &OS, unsigned indent) const {
28   OS.indent(indent) << "Push\n";
29   printNext(OS, indent+2);
30   Failure->print(OS, indent);
31 }
32
33 void RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
34   OS.indent(indent) << "Record\n";
35   printNext(OS, indent);
36 }
37
38 void RecordChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
39   OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
40   printNext(OS, indent);
41 }
42
43 void RecordMemRefMatcherNode::print(raw_ostream &OS, unsigned indent) const {
44   OS.indent(indent) << "RecordMemRef\n";
45   printNext(OS, indent);
46 }
47
48 void CaptureFlagInputMatcherNode::print(raw_ostream &OS, unsigned indent) const{
49   OS.indent(indent) << "CaptureFlagInput\n";
50   printNext(OS, indent);
51 }
52
53 void MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
54   OS.indent(indent) << "MoveChild " << ChildNo << '\n';
55   printNext(OS, indent);
56 }
57
58 void MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
59   OS.indent(indent) << "MoveParent\n";
60   printNext(OS, indent);
61 }
62
63 void CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
64   OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
65   printNext(OS, indent);
66 }
67
68 void CheckPatternPredicateMatcherNode::
69 print(raw_ostream &OS, unsigned indent) const {
70   OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
71   printNext(OS, indent);
72 }
73
74 void CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
75   OS.indent(indent) << "CheckPredicate " << PredName << '\n';
76   printNext(OS, indent);
77 }
78
79 void CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
80   OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
81   printNext(OS, indent);
82 }
83
84 void CheckMultiOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
85   OS.indent(indent) << "CheckMultiOpcode <todo args>\n";
86   printNext(OS, indent);
87 }
88
89 void CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
90   OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
91   printNext(OS, indent);
92 }
93
94 void CheckChildTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
95   OS.indent(indent) << "CheckChildType " << ChildNo << " "
96     << getEnumName(Type) << '\n';
97   printNext(OS, indent);
98 }
99
100
101 void CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
102   OS.indent(indent) << "CheckInteger " << Value << '\n';
103   printNext(OS, indent);
104 }
105
106 void CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
107   OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
108   printNext(OS, indent);
109 }
110
111 void CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
112   OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
113   printNext(OS, indent);
114 }
115
116 void CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
117   OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
118   printNext(OS, indent);
119 }
120
121 void CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
122   OS.indent(indent) << "CheckAndImm " << Value << '\n';
123   printNext(OS, indent);
124 }
125
126 void CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
127   OS.indent(indent) << "CheckOrImm " << Value << '\n';
128   printNext(OS, indent);
129 }
130
131 void CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
132                                               unsigned indent) const {
133   OS.indent(indent) << "CheckFoldableChainNode\n";
134   printNext(OS, indent);
135 }
136
137 void CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
138                                               unsigned indent) const {
139   OS.indent(indent) << "CheckChainCompatible " << PreviousOp << "\n";
140   printNext(OS, indent);
141 }
142
143 void EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
144   OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
145   printNext(OS, indent);
146 }
147
148 void EmitStringIntegerMatcherNode::
149 print(raw_ostream &OS, unsigned indent) const {
150   OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
151   printNext(OS, indent);
152 }
153
154 void EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
155   OS.indent(indent) << "EmitRegister ";
156   if (Reg)
157     OS << Reg->getName();
158   else
159     OS << "zero_reg";
160   OS << " VT=" << VT << '\n';
161   printNext(OS, indent);
162 }
163
164 void EmitConvertToTargetMatcherNode::
165 print(raw_ostream &OS, unsigned indent) const {
166   OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
167   printNext(OS, indent);
168 }
169
170 void EmitMergeInputChainsMatcherNode::
171 print(raw_ostream &OS, unsigned indent) const {
172   OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
173   printNext(OS, indent);
174 }
175
176 void EmitCopyToRegMatcherNode::print(raw_ostream &OS, unsigned indent) const {
177   OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
178   printNext(OS, indent);
179 }
180
181 void EmitNodeXFormMatcherNode::print(raw_ostream &OS, unsigned indent) const {
182   OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
183      << " Slot=" << Slot << '\n';
184   printNext(OS, indent);
185 }
186
187
188 void EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
189   OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> ";
190
191   for (unsigned i = 0, e = VTs.size(); i != e; ++i)
192     OS << ' ' << getEnumName(VTs[i]);
193   OS << '(';
194   for (unsigned i = 0, e = Operands.size(); i != e; ++i)
195     OS << Operands[i] << ' ';
196   OS << ")\n";
197   printNext(OS, indent);
198 }
199
200 void MarkFlagResultsMatcherNode::print(raw_ostream &OS, unsigned indent) const {
201   OS.indent(indent) << "MarkFlagResults <todo: args>\n";
202   printNext(OS, indent);
203 }
204
205 void CompleteMatchMatcherNode::print(raw_ostream &OS, unsigned indent) const {
206   OS.indent(indent) << "CompleteMatch <todo args>\n";
207   OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
208   OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
209   printNext(OS, indent);
210 }
211