DAGISelMatcherEmitter.cpp revision 48e86dbe29e331357b0df11075b7974009c65f34
1f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul//===- DAGISelMatcherEmitter.cpp - Matcher Emitter ------------------------===//
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//                     The LLVM Compiler Infrastructure
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//
53160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul// This file is distributed under the University of Illinois Open Source
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen// License. See LICENSE.TXT for details.
78d687e7e58a148f3f16573636023e54755372010Brian Paul//
85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen//===----------------------------------------------------------------------===//
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// This file contains code to generate C++ code a matcher.
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//===----------------------------------------------------------------------===//
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "DAGISelMatcher.h"
155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "CodeGenDAGPatterns.h"
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "Record.h"
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "llvm/ADT/DenseMap.h"
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "llvm/ADT/SmallString.h"
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "llvm/ADT/StringMap.h"
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "llvm/Support/CommandLine.h"
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "llvm/Support/FormattedStream.h"
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgusing namespace llvm;
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgenum {
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  CommentIndent = 30
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// To reduce generated source code size.
2936cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paulstatic cl::opt<bool>
3036cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian PaulOmitComments("omit-comments", cl::desc("Do not generate comments"),
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             cl::init(false));
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgnamespace {
34ddf69f247fdb246b99ef6525fcfa6eda7b2e2aa7Brian Paulclass MatcherTableEmitter {
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  const CodeGenDAGPatterns &CGP;
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  StringMap<unsigned> NodePredicateMap, PatternPredicateMap;
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  std::vector<std::string> NodePredicates, PatternPredicates;
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  DenseMap<const ComplexPattern*, unsigned> ComplexPatternMap;
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  std::vector<const ComplexPattern*> ComplexPatterns;
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  DenseMap<Record*, unsigned> NodeXFormMap;
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  std::vector<Record*> NodeXForms;
45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
46426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulpublic:
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  MatcherTableEmitter(const CodeGenDAGPatterns &cgp) : CGP(cgp) {}
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  unsigned EmitMatcherList(const Matcher *N, unsigned Indent,
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                           unsigned StartIdx, formatted_raw_ostream &OS);
513c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul
5271dea349d2be623b7819389428b0d6a124e8d184Brian Paul  void EmitPredicateFunctions(formatted_raw_ostream &OS);
535e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
5471dea349d2be623b7819389428b0d6a124e8d184Brian Paul  void EmitHistogram(const Matcher *N, formatted_raw_ostream &OS);
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgprivate:
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  unsigned EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                       formatted_raw_ostream &OS);
5878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
5978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul  unsigned getNodePredicate(StringRef PredName) {
60a573803ed3fe9ef6489f45bd4c5455b77cb33a43Brian Paul    unsigned &Entry = NodePredicateMap[PredName];
6178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul    if (Entry == 0) {
6278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul      NodePredicates.push_back(PredName.str());
63ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul      Entry = NodePredicates.size();
6478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul    }
6578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul    return Entry-1;
66ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul  }
6778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul  unsigned getPatternPredicate(StringRef PredName) {
6878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul    unsigned &Entry = PatternPredicateMap[PredName];
693160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul    if (Entry == 0) {
7078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul      PatternPredicates.push_back(PredName.str());
7178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul      Entry = PatternPredicates.size();
7278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul    }
7378fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul    return Entry-1;
74e4656003caee346d9c4eb23256d73409271291a7Brian Paul  }
75e4656003caee346d9c4eb23256d73409271291a7Brian Paul
76e4656003caee346d9c4eb23256d73409271291a7Brian Paul  unsigned getComplexPat(const ComplexPattern &P) {
77e4656003caee346d9c4eb23256d73409271291a7Brian Paul    unsigned &Entry = ComplexPatternMap[&P];
78e4656003caee346d9c4eb23256d73409271291a7Brian Paul    if (Entry == 0) {
79e4656003caee346d9c4eb23256d73409271291a7Brian Paul      ComplexPatterns.push_back(&P);
80e4656003caee346d9c4eb23256d73409271291a7Brian Paul      Entry = ComplexPatterns.size();
81e4656003caee346d9c4eb23256d73409271291a7Brian Paul    }
82e4656003caee346d9c4eb23256d73409271291a7Brian Paul    return Entry-1;
83e4656003caee346d9c4eb23256d73409271291a7Brian Paul  }
84e4656003caee346d9c4eb23256d73409271291a7Brian Paul
8578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul  unsigned getNodeXFormID(Record *Rec) {
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned &Entry = NodeXFormMap[Rec];
8743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul    if (Entry == 0) {
88e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paul      NodeXForms.push_back(Rec);
8943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul      Entry = NodeXForms.size();
9043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul    }
9143c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul    return Entry-1;
9243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul  }
9343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
9443c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul};
9543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul} // end anonymous namespace.
9643c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
9743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paulstatic unsigned GetVBRSize(unsigned Val) {
987cf50e137da497a590ec9001a9918972a6246142Brian Paul  if (Val <= 127) return 1;
997cf50e137da497a590ec9001a9918972a6246142Brian Paul
1007cf50e137da497a590ec9001a9918972a6246142Brian Paul  unsigned NumBytes = 0;
1017cf50e137da497a590ec9001a9918972a6246142Brian Paul  while (Val >= 128) {
1027cf50e137da497a590ec9001a9918972a6246142Brian Paul    Val >>= 7;
1037cf50e137da497a590ec9001a9918972a6246142Brian Paul    ++NumBytes;
1047cf50e137da497a590ec9001a9918972a6246142Brian Paul  }
1057cf50e137da497a590ec9001a9918972a6246142Brian Paul  return NumBytes+1;
1067cf50e137da497a590ec9001a9918972a6246142Brian Paul}
1077cf50e137da497a590ec9001a9918972a6246142Brian Paul
1087cf50e137da497a590ec9001a9918972a6246142Brian Paul/// EmitVBRValue - Emit the specified value as a VBR, returning the number of
1097cf50e137da497a590ec9001a9918972a6246142Brian Paul/// bytes emitted.
1107cf50e137da497a590ec9001a9918972a6246142Brian Paulstatic uint64_t EmitVBRValue(uint64_t Val, raw_ostream &OS) {
1117cf50e137da497a590ec9001a9918972a6246142Brian Paul  if (Val <= 127) {
11243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul    OS << Val << ", ";
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 1;
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
1157cf50e137da497a590ec9001a9918972a6246142Brian Paul
1167cf50e137da497a590ec9001a9918972a6246142Brian Paul  uint64_t InVal = Val;
1177cf50e137da497a590ec9001a9918972a6246142Brian Paul  unsigned NumBytes = 0;
1187cf50e137da497a590ec9001a9918972a6246142Brian Paul  while (Val >= 128) {
1197cf50e137da497a590ec9001a9918972a6246142Brian Paul    OS << (Val&127) << "|128,";
1207cf50e137da497a590ec9001a9918972a6246142Brian Paul    Val >>= 7;
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    ++NumBytes;
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << Val;
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  if (!OmitComments)
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "/*" << InVal << "*/";
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << ", ";
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  return NumBytes+1;
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/// EmitMatcherOpcodes - Emit bytes for the specified matcher and return
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/// the number of bytes emitted.
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgunsigned MatcherTableEmitter::
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgEmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            formatted_raw_ostream &OS) {
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS.PadToColumn(Indent*2);
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  switch (N->getKind()) {
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::Scope: {
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    const ScopeMatcher *SM = cast<ScopeMatcher>(N);
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    assert(SM->getNext() == 0 && "Shouldn't have next after scope");
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned StartIdx = CurrentIdx;
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // Emit all of the children.
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) {
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (i == 0) {
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "OPC_Scope, ";
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        ++CurrentIdx;
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      } else  {
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        if (!OmitComments) {
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          OS << "/*" << CurrentIdx << "*/";
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          OS.PadToColumn(Indent*2) << "/*Scope*/ ";
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        } else
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          OS.PadToColumn(Indent*2);
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // We need to encode the child and the offset of the failure code before
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // emitting either of them.  Handle this by buffering the output into a
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // string while we get the size.  Unfortunately, the offset of the
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // children depends on the VBR size of the child, so for large children we
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // have to iterate a bit.
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      SmallString<128> TmpBuf;
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      unsigned ChildSize = 0;
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      unsigned VBRSize = 0;
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      do {
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        VBRSize = GetVBRSize(ChildSize);
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        TmpBuf.clear();
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        raw_svector_ostream OS(TmpBuf);
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        formatted_raw_ostream FOS(OS);
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        ChildSize = EmitMatcherList(SM->getChild(i), Indent+1,
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                    CurrentIdx+VBRSize, FOS);
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      } while (GetVBRSize(ChildSize) != VBRSize);
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      assert(ChildSize != 0 && "Should not have a zero-sized child!");
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      CurrentIdx += EmitVBRValue(ChildSize, OS);
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!OmitComments) {
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "/*->" << CurrentIdx+ChildSize << "*/";
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        if (i == 0)
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          OS.PadToColumn(CommentIndent) << "// " << SM->getNumChildren()
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            << " children in Scope";
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << '\n' << TmpBuf.str();
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      CurrentIdx += ChildSize;
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // Emit a zero as a sentinel indicating end of 'Scope'.
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "/*" << CurrentIdx << "*/";
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS.PadToColumn(Indent*2) << "0, ";
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "/*End of Scope*/";
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return CurrentIdx - StartIdx + 1;
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::RecordNode:
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_RecordNode,";
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS.PadToColumn(CommentIndent) << "// #"
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        << cast<RecordMatcher>(N)->getResultNo() << " = "
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        << cast<RecordMatcher>(N)->getWhatFor();
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 1;
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::RecordChild:
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_RecordChild" << cast<RecordChildMatcher>(N)->getChildNo()
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << ',';
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS.PadToColumn(CommentIndent) << "// #"
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        << cast<RecordChildMatcher>(N)->getResultNo() << " = "
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        << cast<RecordChildMatcher>(N)->getWhatFor();
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 1;
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::RecordMemRef:
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_RecordMemRef,\n";
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 1;
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CaptureFlagInput:
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CaptureFlagInput,\n";
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 1;
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::MoveChild:
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_MoveChild, " << cast<MoveChildMatcher>(N)->getChildNo() << ",\n";
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::MoveParent:
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_MoveParent,\n";
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 1;
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckSame:
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckSame, "
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n";
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckPatternPredicate: {
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    StringRef Pred = cast<CheckPatternPredicateMatcher>(N)->getPredicate();
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckPatternPredicate, " << getPatternPredicate(Pred) << ',';
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS.PadToColumn(CommentIndent) << "// " << Pred;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckPredicate: {
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    StringRef Pred = cast<CheckPredicateMatcher>(N)->getPredicateName();
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckPredicate, " << getNodePredicate(Pred) << ',';
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS.PadToColumn(CommentIndent) << "// " << Pred;
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckOpcode:
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckOpcode, TARGET_OPCODE("
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << "),\n";
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 3;
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::SwitchOpcode:
263b2e460018375f699198073a6167e0ee96ba1d267Brian Paul  case Matcher::SwitchType: {
264b2e460018375f699198073a6167e0ee96ba1d267Brian Paul    unsigned StartIdx = CurrentIdx;
265b2e460018375f699198073a6167e0ee96ba1d267Brian Paul
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned NumCases;
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) {
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "OPC_SwitchOpcode ";
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumCases = SOM->getNumCases();
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    } else {
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "OPC_SwitchType ";
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumCases = cast<SwitchTypeMatcher>(N)->getNumCases();
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
274367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "/*" << NumCases << " cases */";
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << ", ";
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    ++CurrentIdx;
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // For each case we emit the size, then the opcode, then the matcher.
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = NumCases; i != e; ++i) {
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      const Matcher *Child;
283d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      unsigned IdxSize;
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) {
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        Child = SOM->getCaseMatcher(i);
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        IdxSize = 2;  // size of opcode in table is 2 bytes.
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      } else {
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i);
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        IdxSize = 1;  // size of type in table is 1 byte.
290367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      }
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // We need to encode the opcode and the offset of the case code before
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // emitting the case code.  Handle this by buffering the output into a
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // string while we get the size.  Unfortunately, the offset of the
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // children depends on the VBR size of the child, so for large children we
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // have to iterate a bit.
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      SmallString<128> TmpBuf;
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      unsigned ChildSize = 0;
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      unsigned VBRSize = 0;
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      do {
3011832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul        VBRSize = GetVBRSize(ChildSize);
3021832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
3031832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul        TmpBuf.clear();
3041832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul        raw_svector_ostream OS(TmpBuf);
3051832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul        formatted_raw_ostream FOS(OS);
3061832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul        ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx+VBRSize+IdxSize,
3071832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                    FOS);
3081832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      } while (GetVBRSize(ChildSize) != VBRSize);
3091832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
3101832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      assert(ChildSize != 0 && "Should not have a zero-sized child!");
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
312d0247f53aea8fa8677aadc8a00f75c8993be9ebcBrian Paul      if (i != 0) {
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS.PadToColumn(Indent*2);
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        if (!OmitComments)
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << (isa<SwitchOpcodeMatcher>(N) ?
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                   "/*SwitchOpcode*/ " : "/*SwitchType*/ ");
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // Emit the VBR.
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      CurrentIdx += EmitVBRValue(ChildSize, OS);
321d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul
322d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      OS << ' ';
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N))
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "TARGET_OPCODE(" << SOM->getCaseOpcode(i).getEnumName() << "),";
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else
326c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul        OS << getEnumName(cast<SwitchTypeMatcher>(N)->getCaseType(i)) << ',';
327c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul
328c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul      CurrentIdx += IdxSize;
329c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul
330c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul      if (!OmitComments)
331c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul        OS << "// ->" << CurrentIdx+ChildSize;
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << '\n';
333f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      OS << TmpBuf.str();
334f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      CurrentIdx += ChildSize;
335f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul    }
336f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
337f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul    // Emit the final zero to terminate the switch.
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS.PadToColumn(Indent*2) << "0, ";
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << (isa<SwitchOpcodeMatcher>(N) ?
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             "// EndSwitchOpcode" : "// EndSwitchType");
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    ++CurrentIdx;
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return CurrentIdx-StartIdx;
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
348ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul case Matcher::CheckType:
349ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul    assert(cast<CheckTypeMatcher>(N)->getResNo() == 0 &&
350ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul           "FIXME: Add support for CheckType of resno != 0");
351ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul    OS << "OPC_CheckType, "
352ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul       << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckChildType:
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckChild"
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckInteger: {
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckInteger, ";
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned Bytes=1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS);
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return Bytes;
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckCondCode:
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckCondCode, ISD::"
369b2e460018375f699198073a6167e0ee96ba1d267Brian Paul       << cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CheckValueType:
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckValueType, MVT::"
374367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul       << cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n";
3758f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    return 2;
3768f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul
3778f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul  case Matcher::CheckComplexPat: {
3788f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    const CheckComplexPatMatcher *CCPM = cast<CheckComplexPatMatcher>(N);
3798f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    const ComplexPattern &Pattern = CCPM->getPattern();
3808f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    OS << "OPC_CheckComplexPat, /*CP*/" << getComplexPat(Pattern) << ", /*#*/"
3818f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul       << CCPM->getMatchNumber() << ',';
3828f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul
3838f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    if (!OmitComments) {
3848f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc();
3858f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      OS << ":$" << CCPM->getName();
3868f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      for (unsigned i = 0, e = Pattern.getNumOperands(); i != e; ++i)
3878f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul        OS << " #" << CCPM->getFirstResult()+i;
3888f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul
3898f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      if (Pattern.hasProperty(SDNPHasChain))
3908f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul        OS << " + chain result";
3918f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    }
3928f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    OS << '\n';
3938f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    return 3;
3948f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul  }
3958f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul
3968f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul  case Matcher::CheckAndImm: {
3978f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    OS << "OPC_CheckAndImm, ";
3988f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    unsigned Bytes=1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS);
3998f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    OS << '\n';
4008f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    return Bytes;
4018f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul  }
4028f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul
4038f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul  case Matcher::CheckOrImm: {
4048f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    OS << "OPC_CheckOrImm, ";
4058f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    unsigned Bytes = 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS);
4068f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    OS << '\n';
4078f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul    return Bytes;
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
410d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul  case Matcher::CheckFoldableChainNode:
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_CheckFoldableChainNode,\n";
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 1;
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitInteger: {
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_EmitInteger, "
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned Bytes = 2+EmitVBRValue(Val, OS);
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return Bytes;
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitStringInteger: {
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // These should always fit into one byte.
425f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul    OS << "OPC_EmitInteger, "
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      << getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", "
427f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      << Val << ",\n";
428f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul    return 3;
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitRegister:
432f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul    OS << "OPC_EmitRegister, "
433f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul       << getEnumName(cast<EmitRegisterMatcher>(N)->getVT()) << ", ";
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (Record *R = cast<EmitRegisterMatcher>(N)->getReg())
435f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      OS << getQualifiedName(R) << ",\n";
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    else {
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "0 ";
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!OmitComments)
439f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul        OS << "/*zero_reg*/";
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << ",\n";
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 3;
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitConvertToTarget:
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_EmitConvertToTarget, "
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n";
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2;
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitMergeInputChains: {
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    const EmitMergeInputChainsMatcher *MN =
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      cast<EmitMergeInputChainsMatcher>(N);
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // Handle the specialized forms OPC_EmitMergeInputChains1_0 and 1_1.
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (MN->getNumNodes() == 1 && MN->getNode(0) < 2) {
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "OPC_EmitMergeInputChains1_" << MN->getNode(0) << ",\n";
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 1;
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", ";
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i)
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << MN->getNode(i) << ", ";
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2+MN->getNumNodes();
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitCopyToReg:
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_EmitCopyToReg, "
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", "
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg())
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << ",\n";
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 3;
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitNodeXForm: {
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N);
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", "
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       << XF->getSlot() << ',';
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS.PadToColumn(CommentIndent) << "// "<<XF->getNodeXForm()->getName();
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS <<'\n';
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 3;
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::EmitNode:
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::MorphNodeTo: {
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N);
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo");
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << ", TARGET_OPCODE(" << EN->getOpcodeName() << "), 0";
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (EN->hasChain())   OS << "|OPFL_Chain";
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (EN->hasInFlag())  OS << "|OPFL_FlagInput";
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (EN->hasOutFlag()) OS << "|OPFL_FlagOutput";
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (EN->hasMemRefs()) OS << "|OPFL_MemRefs";
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (EN->getNumFixedArityOperands() != -1)
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands();
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << ",\n";
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS.PadToColumn(Indent*2+4) << EN->getNumVTs();
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "/*#VTs*/";
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << ", ";
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i)
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << getEnumName(EN->getVT(i)) << ", ";
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << EN->getNumOperands();
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "/*#Ops*/";
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << ", ";
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned NumOperandBytes = 0;
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i)
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS);
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments) {
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // Print the result #'s for EmitNode.
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) {
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        if (unsigned NumResults = EN->getNumVTs()) {
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          OS.PadToColumn(CommentIndent) << "// Results = ";
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          unsigned First = E->getFirstResultSlot();
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          for (unsigned i = 0; i != NumResults; ++i)
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            OS << "#" << First+i << " ";
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        }
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << '\n';
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) {
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS.PadToColumn(Indent*2) << "// Src: "
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          << *SNT->getPattern().getSrcPattern() << " - Complexity = "
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          << SNT->getPattern().getPatternComplexity(CGP) << '\n';
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS.PadToColumn(Indent*2) << "// Dst: "
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          << *SNT->getPattern().getDstPattern() << '\n';
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    } else
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << '\n';
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 6+EN->getNumVTs()+NumOperandBytes;
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::MarkFlagResults: {
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    const MarkFlagResultsMatcher *CFR = cast<MarkFlagResultsMatcher>(N);
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "OPC_MarkFlagResults, " << CFR->getNumNodes() << ", ";
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned NumOperandBytes = 0;
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i)
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS);
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2+NumOperandBytes;
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  case Matcher::CompleteMatch: {
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N);
54571dea349d2be623b7819389428b0d6a124e8d184Brian Paul    OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", ";
54671dea349d2be623b7819389428b0d6a124e8d184Brian Paul    unsigned NumResultBytes = 0;
54771dea349d2be623b7819389428b0d6a124e8d184Brian Paul    for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i)
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumResultBytes += EmitVBRValue(CM->getResult(i), OS);
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments) {
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS.PadToColumn(Indent*2) << "// Src: "
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        << *CM->getPattern().getSrcPattern() << " - Complexity = "
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        << CM->getPattern().getPatternComplexity(CGP) << '\n';
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS.PadToColumn(Indent*2) << "// Dst: "
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        << *CM->getPattern().getDstPattern();
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << '\n';
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return 2 + NumResultBytes;
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  assert(0 && "Unreachable");
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  return 0;
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/// EmitMatcherList - Emit the bytes for the specified matcher subtree.
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgunsigned MatcherTableEmitter::
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgEmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                formatted_raw_ostream &OS) {
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  unsigned Size = 0;
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  while (N) {
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (!OmitComments)
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "/*" << CurrentIdx << "*/";
573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS);
574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    Size += MatcherSize;
575367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul    CurrentIdx += MatcherSize;
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // If there are other nodes in this list, iterate to them, otherwise we're
578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // done.
579367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul    N = N->getNext();
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  return Size;
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
584367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paulvoid MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
585367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul  // Emit pattern predicates.
586367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul  if (!PatternPredicates.empty()) {
587367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul    OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n";
588367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul    OS << "  switch (PredNo) {\n";
589367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "  case " << i << ": return "  << PatternPredicates[i] << ";\n";
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  }\n";
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "}\n\n";
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  // Emit Node predicates.
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  // FIXME: Annoyingly, these are stored by name, which we never even emit. Yay?
5982ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul  StringMap<TreePattern*> PFsByName;
5992ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul
600d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul  for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       I != E; ++I)
602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    PFsByName[I->first->getName()] = I->second;
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  if (!NodePredicates.empty()) {
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "bool CheckNodePredicate(SDNode *Node, unsigned PredNo) const {\n";
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  switch (PredNo) {\n";
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i) {
609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // FIXME: Storing this by name is horrible.
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      TreePattern *P =PFsByName[NodePredicates[i].substr(strlen("Predicate_"))];
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      assert(P && "Unknown name?");
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      // Emit the predicate code corresponding to this pattern.
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      std::string Code = P->getRecord()->getValueAsCode("Predicate");
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      assert(!Code.empty() && "No code in this predicate");
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "  case " << i << ": { // " << NodePredicates[i] << '\n';
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      std::string ClassName;
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (P->getOnlyTree()->isLeaf())
619db6aa58267cad3f502f03ab80b9deb6b75320a91Brian Paul        ClassName = "SDNode";
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else
621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        ClassName =
622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          CGP.getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName();
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ClassName == "SDNode")
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "    SDNode *N = Node;\n";
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "    " << ClassName << "*N = cast<" << ClassName << ">(Node);\n";
627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << Code << "\n  }\n";
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  }\n";
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "}\n\n";
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  // Emit CompletePattern matchers.
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  // FIXME: This should be const.
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  if (!ComplexPatterns.empty()) {
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n";
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "      unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n";
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  switch (PatternNo) {\n";
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  default: assert(0 && \"Invalid pattern # in table?\");\n";
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      const ComplexPattern &P = *ComplexPatterns[i];
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      unsigned NumOps = P.getNumOperands();
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (P.hasProperty(SDNPHasChain))
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        ++NumOps;  // Get the chained node too.
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "  case " << i << ":\n";
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "    Result.resize(Result.size()+" << NumOps << ");\n";
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "    return "  << P.getSelectFunc();
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "(Root, N";
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (unsigned i = 0; i != NumOps; ++i)
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << ", Result[Result.size()-" << (NumOps-i) << ']';
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << ");\n";
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  }\n";
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "}\n\n";
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  // Emit SDNodeXForm handlers.
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  // FIXME: This should be const.
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  if (!NodeXForms.empty()) {
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  switch (XFormNo) {\n";
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  default: assert(0 && \"Invalid xform # in table?\");\n";
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // FIXME: The node xform could take SDValue's instead of SDNode*'s.
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) {
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      const CodeGenDAGPatterns::NodeXForm &Entry =
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        CGP.getSDNodeTransform(NodeXForms[i]);
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      Record *SDNode = Entry.first;
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      const std::string &Code = Entry.second;
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "  case " << i << ": {  ";
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!OmitComments)
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "// " << NodeXForms[i]->getName();
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << '\n';
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName();
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ClassName == "SDNode")
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "    SDNode *N = V.getNode();\n";
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        OS << "    " << ClassName << " *N = cast<" << ClassName
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           << ">(V.getNode());\n";
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << Code << "\n  }\n";
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  }\n";
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "}\n\n";
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void BuildHistogram(const Matcher *M, std::vector<unsigned> &OpcodeFreq){
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  for (; M != 0; M = M->getNext()) {
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // Count this node.
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (unsigned(M->getKind()) >= OpcodeFreq.size())
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OpcodeFreq.resize(M->getKind()+1);
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OpcodeFreq[M->getKind()]++;
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    // Handle recursive nodes.
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    if (const ScopeMatcher *SM = dyn_cast<ScopeMatcher>(M)) {
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i)
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        BuildHistogram(SM->getChild(i), OpcodeFreq);
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    } else if (const SwitchOpcodeMatcher *SOM =
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 dyn_cast<SwitchOpcodeMatcher>(M)) {
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (unsigned i = 0, e = SOM->getNumCases(); i != e; ++i)
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        BuildHistogram(SOM->getCaseMatcher(i), OpcodeFreq);
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    } else if (const SwitchTypeMatcher *STM = dyn_cast<SwitchTypeMatcher>(M)) {
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (unsigned i = 0, e = STM->getNumCases(); i != e; ++i)
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg        BuildHistogram(STM->getCaseMatcher(i), OpcodeFreq);
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid MatcherTableEmitter::EmitHistogram(const Matcher *M,
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                        formatted_raw_ostream &OS) {
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  if (OmitComments)
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    return;
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  std::vector<unsigned> OpcodeFreq;
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  BuildHistogram(M, OpcodeFreq);
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "  // Opcode Histogram:\n";
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  for (unsigned i = 0, e = OpcodeFreq.size(); i != e; ++i) {
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS << "  // #";
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    switch ((Matcher::KindTy)i) {
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::Scope: OS << "OPC_Scope"; break;
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CaptureFlagInput: OS << "OPC_CaptureFlagInput"; break;
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::MoveChild: OS << "OPC_MoveChild"; break;
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::MoveParent: OS << "OPC_MoveParent"; break;
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckSame: OS << "OPC_CheckSame"; break;
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckPatternPredicate:
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "OPC_CheckPatternPredicate"; break;
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckPredicate: OS << "OPC_CheckPredicate"; break;
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckOpcode: OS << "OPC_CheckOpcode"; break;
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::SwitchOpcode: OS << "OPC_SwitchOpcode"; break;
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckType: OS << "OPC_CheckType"; break;
742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::SwitchType: OS << "OPC_SwitchType"; break;
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckChildType: OS << "OPC_CheckChildType"; break;
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckInteger: OS << "OPC_CheckInteger"; break;
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckCondCode: OS << "OPC_CheckCondCode"; break;
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckValueType: OS << "OPC_CheckValueType"; break;
747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckComplexPat: OS << "OPC_CheckComplexPat"; break;
748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckAndImm: OS << "OPC_CheckAndImm"; break;
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckOrImm: OS << "OPC_CheckOrImm"; break;
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CheckFoldableChainNode:
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OS << "OPC_CheckFoldableChainNode"; break;
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitInteger: OS << "OPC_EmitInteger"; break;
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitStringInteger: OS << "OPC_EmitStringInteger"; break;
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitRegister: OS << "OPC_EmitRegister"; break;
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitConvertToTarget: OS << "OPC_EmitConvertToTarget"; break;
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break;
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break;
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break;
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    }
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    OS.PadToColumn(40) << " = " << OpcodeFreq[i] << '\n';
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  }
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << '\n';
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid llvm::EmitMatcherTable(const Matcher *TheMatcher,
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            const CodeGenDAGPatterns &CGP, raw_ostream &O) {
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  formatted_raw_ostream OS(O);
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "// The main instruction selector code.\n";
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "SDNode *SelectCode(SDNode *N) {\n";
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  MatcherTableEmitter MatcherEmitter(CGP);
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "  // Opcodes are emitted as 2 bytes, TARGET_OPCODE handles this.\n";
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "  #define TARGET_OPCODE(X) X & 255, unsigned(X) >> 8\n";
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "  static const unsigned char MatcherTable[] = {\n";
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS);
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "    0\n  }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
78542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  MatcherEmitter.EmitHistogram(TheMatcher, OS);
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "  #undef TARGET_OPCODE\n";
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << "  return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  OS << '\n';
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  // Next up, emit the function for node and pattern predicates:
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  MatcherEmitter.EmitPredicateFunctions(OS);
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg