blob: fdefe460a05a15e6eba8f8a15d392bc9736c0df2 [file] [log] [blame]
Chris Lattnerda272d12010-02-15 08:04:42 +00001//===- 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"
Chris Lattner845c0422010-02-18 22:03:03 +000013#include "Record.h"
Chris Lattnerda272d12010-02-15 08:04:42 +000014#include "llvm/Support/raw_ostream.h"
15using namespace llvm;
16
17void MatcherNode::dump() const {
18 print(errs());
19}
20
21void EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
22 OS.indent(indent) << "EmitNode: Src = " << *Pattern.getSrcPattern() << "\n";
23 OS.indent(indent) << "EmitNode: Dst = " << *Pattern.getDstPattern() << "\n";
24}
25
Chris Lattnerbd8227f2010-02-18 02:53:41 +000026void MatcherNode::printNext(raw_ostream &OS, unsigned indent) const {
27 if (Next)
28 return Next->print(OS, indent);
29 OS.indent(indent) << "<null next field>\n";
Chris Lattnerda272d12010-02-15 08:04:42 +000030}
31
32
33void PushMatcherNode::print(raw_ostream &OS, unsigned indent) const {
34 OS.indent(indent) << "Push\n";
Chris Lattnerbd8227f2010-02-18 02:53:41 +000035 printNext(OS, indent+2);
Chris Lattnerda272d12010-02-15 08:04:42 +000036 Failure->print(OS, indent);
37}
38
39void RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
40 OS.indent(indent) << "Record\n";
Chris Lattnerbd8227f2010-02-18 02:53:41 +000041 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000042}
43
44void MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
45 OS.indent(indent) << "MoveChild " << ChildNo << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000046 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000047}
48
49void MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
50 OS.indent(indent) << "MoveParent\n";
Chris Lattnerbd8227f2010-02-18 02:53:41 +000051 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000052}
53
54void CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
55 OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000056 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000057}
58
59void CheckPatternPredicateMatcherNode::
60print(raw_ostream &OS, unsigned indent) const {
61 OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000062 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000063}
64
65void CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
66 OS.indent(indent) << "CheckPredicate " << PredName << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000067 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000068}
69
70void CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
71 OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000072 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000073}
74
75void CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
76 OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000077 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000078}
79
80void CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
81 OS.indent(indent) << "CheckInteger " << Value << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000082 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000083}
84
85void CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
86 OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000087 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000088}
89
90void CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
91 OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000092 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000093}
94
95void CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
96 OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +000097 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +000098}
99
100void CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
101 OS.indent(indent) << "CheckAndImm " << Value << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +0000102 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +0000103}
104
105void CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
106 OS.indent(indent) << "CheckOrImm " << Value << '\n';
Chris Lattnerbd8227f2010-02-18 02:53:41 +0000107 printNext(OS, indent);
Chris Lattnerda272d12010-02-15 08:04:42 +0000108}
109
Chris Lattner21390d72010-02-16 19:15:55 +0000110void CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
111 unsigned indent) const {
112 OS.indent(indent) << "CheckFoldableChainNode\n";
Chris Lattnerbd8227f2010-02-18 02:53:41 +0000113 printNext(OS, indent);
Chris Lattnere39650a2010-02-16 06:10:58 +0000114}
Chris Lattner9a747f12010-02-17 06:23:39 +0000115
116void CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
117 unsigned indent) const {
118 OS.indent(indent) << "CheckChainCompatibleMatcherNode " << PreviousOp << "\n";
Chris Lattnerbd8227f2010-02-18 02:53:41 +0000119 printNext(OS, indent);
Chris Lattner9a747f12010-02-17 06:23:39 +0000120}
Chris Lattner845c0422010-02-18 22:03:03 +0000121
122void EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
123 OS.indent(indent) << "EmitIntegerMatcherNode " << Val << " VT=" << VT << '\n';
124 printNext(OS, indent);
125}
126
127void EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
128 OS.indent(indent) << "EmitRegisterMatcherNode ";
129 if (Reg)
130 OS << Reg->getName();
131 else
132 OS << "zero_reg";
133 OS << " VT=" << VT << '\n';
134 printNext(OS, indent);
135}
136