DAGISelMatcherEmitter.cpp revision e39650a805425ffdbd79692c7d1bad80f7332dae
1da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===- DAGISelMatcherEmitter.cpp - Matcher Emitter ------------------------===//
2da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
3da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//                     The LLVM Compiler Infrastructure
4da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
5da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file is distributed under the University of Illinois Open Source
6da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// License. See LICENSE.TXT for details.
7da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
8da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===//
9da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
10da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file contains code to generate C++ code a matcher.
11da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
12da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===//
13da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "DAGISelMatcher.h"
15da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "CodeGenDAGPatterns.h"
16da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/ADT/SmallString.h"
17da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/Casting.h"
18da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/FormattedStream.h"
19da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm;
20da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnernamespace {
22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerenum {
23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  CommentIndent = 25
24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
25da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
26da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
27da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitMatcherAndChildren(const MatcherNode *N,
28da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner                                       formatted_raw_ostream &FOS,
29da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner                                       unsigned Indent);
30da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
31da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// ClassifyInt - Classify an integer by size, return '1','2','4','8' if this
32da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// fits in 1, 2, 4, or 8 sign extended bytes.
33da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic char ClassifyInt(int64_t Val) {
34da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  if (Val == int8_t(Val))  return '1';
35da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  if (Val == int16_t(Val)) return '2';
36da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  if (Val == int32_t(Val)) return '4';
37da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  return '8';
38da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
39da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
40da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitInt - Emit the specified integer, returning the number of bytes emitted.
41da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitInt(int64_t Val, formatted_raw_ostream &OS) {
42da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned BytesEmitted = 1;
43da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << (int)(unsigned char)Val << ", ";
44da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  if (Val == int8_t(Val)) {
45da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "\n";
46da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return BytesEmitted;
47da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
48da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
49da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << (int)(unsigned char)(Val >> 8) << ", ";
50da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  ++BytesEmitted;
51da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
52da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  if (Val != int16_t(Val)) {
53da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << (int)(unsigned char)(Val >> 16) << ','
54da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner       << (int)(unsigned char)(Val >> 24) << ',';
55da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    BytesEmitted += 2;
56da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
57da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    if (Val != int32_t(Val)) {
58da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      OS << (int)(unsigned char)(Val >> 32) << ','
59da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner         << (int)(unsigned char)(Val >> 40) << ','
60da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner         << (int)(unsigned char)(Val >> 48) << ','
61da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner         << (int)(unsigned char)(Val >> 56) << ',';
62da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      BytesEmitted += 4;
63da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    }
64da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
65da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
66da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.PadToColumn(CommentIndent) << "// " << Val << '\n';
67da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  return BytesEmitted;
68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
70da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitMatcherOpcodes - Emit bytes for the specified matcher and return
71da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the number of bytes emitted.
72da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitMatcher(const MatcherNode *N, formatted_raw_ostream &OS,
73da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner                            unsigned Indent) {
74da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.PadToColumn(Indent*2);
75da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
76da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  switch (N->getKind()) {
77da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::Push: assert(0 && "Should be handled by caller");
78da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::EmitNode:
79da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_Emit, /*XXX*/";
80da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS.PadToColumn(CommentIndent) << "// Src: "
81da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      << *cast<EmitNodeMatcherNode>(N)->getPattern().getSrcPattern() << '\n';
82da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS.PadToColumn(CommentIndent) << "// Dst: "
83da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      << *cast<EmitNodeMatcherNode>(N)->getPattern().getDstPattern() << '\n';
84da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
85da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::Record:
86da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_Record,\n";
87da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
88da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::MoveChild:
89da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_MoveChild, "
90da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner       << cast<MoveChildMatcherNode>(N)->getChildNo() << ",\n";
91da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
92da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::MoveParent:
94da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_MoveParent,\n";
95da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
96da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
97da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckSame:
98da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckSame, "
99da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner       << cast<CheckSameMatcherNode>(N)->getMatchNumber() << ",\n";
100da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
101da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
102da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckPatternPredicate:
103da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckPatternPredicate, /*XXX*/0,";
104da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS.PadToColumn(CommentIndent) << "// "
105da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      << cast<CheckPatternPredicateMatcherNode>(N)->getPredicate() << '\n';
106da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
107da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckPredicate:
109da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckPredicate, /*XXX*/0,";
110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS.PadToColumn(CommentIndent) << "// "
111da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      << cast<CheckPredicateMatcherNode>(N)->getPredicateName() << '\n';
112da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
113da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
114da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckOpcode:
115da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckOpcode, "
116da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner       << cast<CheckOpcodeMatcherNode>(N)->getOpcodeName() << ",\n";
117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
118da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckType:
120da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckType, "
121da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner       << getEnumName(cast<CheckTypeMatcherNode>(N)->getType()) << ",\n";
122da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
123da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
124da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckInteger: {
125da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    int64_t Val = cast<CheckIntegerMatcherNode>(N)->getValue();
126da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckInteger" << ClassifyInt(Val) << ", ";
127da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return EmitInt(Val, OS)+1;
128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
129da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckCondCode:
130da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckCondCode, ISD::"
131da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner       << cast<CheckCondCodeMatcherNode>(N)->getCondCodeName() << ",\n";
132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
133da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
134da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckValueType:
135da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckValueType, MVT::"
136da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner       << cast<CheckValueTypeMatcherNode>(N)->getTypeName() << ",\n";
137da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
138da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckComplexPat:
140da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckComplexPat, 0/*XXX*/,\n";
141da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
142da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
143da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckAndImm: {
144da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    int64_t Val = cast<CheckAndImmMatcherNode>(N)->getValue();
145da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckAndImm" << ClassifyInt(Val) << ", ";
146da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return EmitInt(Val, OS)+1;
147da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
148da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
149da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  case MatcherNode::CheckOrImm: {
150da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    int64_t Val = cast<CheckOrImmMatcherNode>(N)->getValue();
151da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckOrImm" << ClassifyInt(Val) << ", ";
152da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return EmitInt(Val, OS)+1;
153da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
154e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner  case MatcherNode::CheckProfitableToFold:
155e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    OS << "OPC_IsProfitableToFold,\n";
156e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    return 1;
157e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner  case MatcherNode::CheckLegalToFold:
158e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    OS << "OPC_IsLegalToFold,\n";
159e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    return 1;
160da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
161da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  assert(0 && "Unreachable");
162da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  return 0;
163da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
164da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
165da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitMatcherAndChildren - Emit the bytes for the specified matcher subtree.
166da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitMatcherAndChildren(const MatcherNode *N,
167da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner                                       formatted_raw_ostream &OS,
168da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner                                       unsigned Indent) {
169da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned Size = 0;
170da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  while (1) {
171da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    // Push is a special case since it is binary.
172da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    if (const PushMatcherNode *PMN = dyn_cast<PushMatcherNode>(N)) {
173da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      // We need to encode the child and the offset of the failure code before
174da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      // emitting either of them.  Handle this by buffering the output into a
175da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      // string while we get the size.
176da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      SmallString<128> TmpBuf;
177da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      unsigned ChildSize;
178da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      {
179da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner        raw_svector_ostream OS(TmpBuf);
180da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner        formatted_raw_ostream FOS(OS);
181da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner        ChildSize =
182da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner          EmitMatcherAndChildren(cast<PushMatcherNode>(N)->getChild(), FOS,
183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner                                 Indent+1);
184da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      }
185da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
186da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      if (ChildSize > 255) {
187da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner        errs() <<
188da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner          "Tblgen internal error: can't handle predicate this complex yet\n";
189da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner        exit(1);
190da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      }
191da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
192da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      OS.PadToColumn(Indent*2);
193da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      OS << "OPC_Push, " << ChildSize << ",\n";
194da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      OS << TmpBuf.str();
195da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
196da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      Size += 2 + ChildSize;
197da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
198da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      N = PMN->getFailure();
199da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      continue;
200da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    }
201da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
202da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    Size += EmitMatcher(N, OS, Indent);
203da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
204da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    // If there are children of this node, iterate to them, otherwise we're
205da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    // done.
206da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    if (const MatcherNodeWithChild *MNWC = dyn_cast<MatcherNodeWithChild>(N))
207da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      N = MNWC->getChild();
208da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    else
209da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner      return Size;
210da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
211da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
212da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
213da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid llvm::EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &O) {
214da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  formatted_raw_ostream OS(O);
215da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
216da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "// The main instruction selector code.\n";
217da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "SDNode *SelectCode2(SDNode *N) {\n";
218da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
219da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "  static const unsigned char MatcherTable[] = {\n";
220da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned TotalSize = EmitMatcherAndChildren(Matcher, OS, 2);
221da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "    0\n  }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
222da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "  return SelectCodeCommon(N, MatcherTable, sizeof(MatcherTable));\n}\n";
223da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
224