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//
105759b9b8be05293e848308f01c6eeff70d2ce15dEric Christopher// This file contains code to generate C++ code for a matcher.
11da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
12da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===//
13da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "DAGISelMatcher.h"
15da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "CodeGenDAGPatterns.h"
16e609a513f3c072bba28412c681465332a2822d9aChris Lattner#include "llvm/ADT/DenseMap.h"
17da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/ADT/SmallString.h"
18050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner#include "llvm/ADT/StringMap.h"
195c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin#include "llvm/Support/CommandLine.h"
20da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/FormattedStream.h"
214ffd89fa4d2788611187d1a534d2ed46adf1702cChandler Carruth#include "llvm/TableGen/Record.h"
22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm;
23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerenum {
255be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner  CommentIndent = 30
26da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
27da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin// To reduce generated source code size.
295c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwinstatic cl::opt<bool>
305c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok EdwinOmitComments("omit-comments", cl::desc("Do not generate comments"),
315c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin             cl::init(false));
325c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin
33e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnernamespace {
34e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerclass MatcherTableEmitter {
3548e86dbe29e331357b0df11075b7974009c65f34Chris Lattner  const CodeGenDAGPatterns &CGP;
36543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
37543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  DenseMap<TreePattern *, unsigned> NodePredicateMap;
38543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  std::vector<TreePredicateFn> NodePredicates;
39543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
40543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  StringMap<unsigned> PatternPredicateMap;
41543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  std::vector<std::string> PatternPredicates;
42e609a513f3c072bba28412c681465332a2822d9aChris Lattner
43e609a513f3c072bba28412c681465332a2822d9aChris Lattner  DenseMap<const ComplexPattern*, unsigned> ComplexPatternMap;
44e609a513f3c072bba28412c681465332a2822d9aChris Lattner  std::vector<const ComplexPattern*> ComplexPatterns;
458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  DenseMap<Record*, unsigned> NodeXFormMap;
484d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  std::vector<Record*> NodeXForms;
498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
50e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerpublic:
514a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  MatcherTableEmitter(const CodeGenDAGPatterns &cgp)
524a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach    : CGP(cgp) {}
53e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
54b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  unsigned EmitMatcherList(const Matcher *N, unsigned Indent,
558fbad244bd436163296d81d4f182750e000fd16dChris Lattner                           unsigned StartIdx, formatted_raw_ostream &OS);
569d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
5748e86dbe29e331357b0df11075b7974009c65f34Chris Lattner  void EmitPredicateFunctions(formatted_raw_ostream &OS);
589d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
5957fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner  void EmitHistogram(const Matcher *N, formatted_raw_ostream &OS);
60e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerprivate:
61d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
62984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner                       formatted_raw_ostream &OS);
639d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
64543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  unsigned getNodePredicate(TreePredicateFn Pred) {
65543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner    unsigned &Entry = NodePredicateMap[Pred.getOrigPatFragRecord()];
66050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    if (Entry == 0) {
67543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner      NodePredicates.push_back(Pred);
68050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      Entry = NodePredicates.size();
69050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    }
70050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    return Entry-1;
71050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
72543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
73050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  unsigned getPatternPredicate(StringRef PredName) {
74050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    unsigned &Entry = PatternPredicateMap[PredName];
75050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    if (Entry == 0) {
76050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      PatternPredicates.push_back(PredName.str());
77050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      Entry = PatternPredicates.size();
78050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    }
79050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    return Entry-1;
80050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
81e609a513f3c072bba28412c681465332a2822d9aChris Lattner  unsigned getComplexPat(const ComplexPattern &P) {
82e609a513f3c072bba28412c681465332a2822d9aChris Lattner    unsigned &Entry = ComplexPatternMap[&P];
83e609a513f3c072bba28412c681465332a2822d9aChris Lattner    if (Entry == 0) {
84e609a513f3c072bba28412c681465332a2822d9aChris Lattner      ComplexPatterns.push_back(&P);
85e609a513f3c072bba28412c681465332a2822d9aChris Lattner      Entry = ComplexPatterns.size();
86e609a513f3c072bba28412c681465332a2822d9aChris Lattner    }
87e609a513f3c072bba28412c681465332a2822d9aChris Lattner    return Entry-1;
88e609a513f3c072bba28412c681465332a2822d9aChris Lattner  }
899d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNodeXFormID(Record *Rec) {
918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    unsigned &Entry = NodeXFormMap[Rec];
928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (Entry == 0) {
938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      NodeXForms.push_back(Rec);
948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      Entry = NodeXForms.size();
958e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    }
968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return Entry-1;
978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
989d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
99e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner};
100e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner} // end anonymous namespace.
101e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
102d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattnerstatic unsigned GetVBRSize(unsigned Val) {
103d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  if (Val <= 127) return 1;
1049d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
105d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned NumBytes = 0;
106d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  while (Val >= 128) {
107d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Val >>= 7;
108d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    ++NumBytes;
109d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
110d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  return NumBytes+1;
111d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner}
112d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
1135007e1e43541114f3737939234104b085fbe4acaChris Lattner/// EmitVBRValue - Emit the specified value as a VBR, returning the number of
1145007e1e43541114f3737939234104b085fbe4acaChris Lattner/// bytes emitted.
1155310654dc56c64b726bba7da82d568137ec81bbcChris Lattnerstatic uint64_t EmitVBRValue(uint64_t Val, raw_ostream &OS) {
1165007e1e43541114f3737939234104b085fbe4acaChris Lattner  if (Val <= 127) {
1175007e1e43541114f3737939234104b085fbe4acaChris Lattner    OS << Val << ", ";
1185007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 1;
1195007e1e43541114f3737939234104b085fbe4acaChris Lattner  }
1209d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
1215310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  uint64_t InVal = Val;
1225007e1e43541114f3737939234104b085fbe4acaChris Lattner  unsigned NumBytes = 0;
123860d4a787f28f5f31e0c172e2ab80f5ab93cbf9bChris Lattner  while (Val >= 128) {
1245007e1e43541114f3737939234104b085fbe4acaChris Lattner    OS << (Val&127) << "|128,";
1255007e1e43541114f3737939234104b085fbe4acaChris Lattner    Val >>= 7;
1265007e1e43541114f3737939234104b085fbe4acaChris Lattner    ++NumBytes;
1275007e1e43541114f3737939234104b085fbe4acaChris Lattner  }
1285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  OS << Val;
1295c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  if (!OmitComments)
1305c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << "/*" << InVal << "*/";
1315c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  OS << ", ";
1325007e1e43541114f3737939234104b085fbe4acaChris Lattner  return NumBytes+1;
1335007e1e43541114f3737939234104b085fbe4acaChris Lattner}
1345007e1e43541114f3737939234104b085fbe4acaChris Lattner
135d07c2a5fa1fd3bee45104953714a128cf5e19158Eli Bendersky/// EmitMatcher - Emit bytes for the specified matcher and return
136da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the number of bytes emitted.
137e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter::
138d6c84720df0b63e34081e0c7890f3074d8b110b9Chris LattnerEmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
139d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner            formatted_raw_ostream &OS) {
140da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.PadToColumn(Indent*2);
1419d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
142da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  switch (N->getKind()) {
143d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  case Matcher::Scope: {
144d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    const ScopeMatcher *SM = cast<ScopeMatcher>(N);
145d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    assert(SM->getNext() == 0 && "Shouldn't have next after scope");
1469d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
147d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    unsigned StartIdx = CurrentIdx;
1489d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
149d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    // Emit all of the children.
150d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) {
151d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      if (i == 0) {
152d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        OS << "OPC_Scope, ";
153d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        ++CurrentIdx;
1545c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      } else  {
1555c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (!OmitComments) {
1565c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS << "/*" << CurrentIdx << "*/";
1575c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(Indent*2) << "/*Scope*/ ";
1585c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        } else
1595c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(Indent*2);
160d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      }
161d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
162d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // We need to encode the child and the offset of the failure code before
163d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // emitting either of them.  Handle this by buffering the output into a
164d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // string while we get the size.  Unfortunately, the offset of the
165d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // children depends on the VBR size of the child, so for large children we
166d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // have to iterate a bit.
167d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      SmallString<128> TmpBuf;
168d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      unsigned ChildSize = 0;
169d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      unsigned VBRSize = 0;
170d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      do {
171d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        VBRSize = GetVBRSize(ChildSize);
1729d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
173d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        TmpBuf.clear();
174d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        raw_svector_ostream OS(TmpBuf);
175d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        formatted_raw_ostream FOS(OS);
176eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        ChildSize = EmitMatcherList(SM->getChild(i), Indent+1,
177eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner                                    CurrentIdx+VBRSize, FOS);
178d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      } while (GetVBRSize(ChildSize) != VBRSize);
1799d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
180d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      assert(ChildSize != 0 && "Should not have a zero-sized child!");
1819d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
182d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      CurrentIdx += EmitVBRValue(ChildSize, OS);
1835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments) {
1845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "/*->" << CurrentIdx+ChildSize << "*/";
1859d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
1865c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (i == 0)
1875c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(CommentIndent) << "// " << SM->getNumChildren()
1885c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin            << " children in Scope";
1895c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
1909d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
191d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      OS << '\n' << TmpBuf.str();
192d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      CurrentIdx += ChildSize;
193d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    }
1949d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
195d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    // Emit a zero as a sentinel indicating end of 'Scope'.
1965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
1975c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*" << CurrentIdx << "*/";
1985c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2) << "0, ";
1995c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2005c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*End of Scope*/";
2015c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
202d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    return CurrentIdx - StartIdx + 1;
203d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
2049d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
205b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordNode:
206845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "OPC_RecordNode,";
2075c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2085c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// #"
2095c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordMatcher>(N)->getResultNo() << " = "
2105c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordMatcher>(N)->getWhatFor();
2115c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
212da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
21319b5a7590b784f19875b9880ea8838c393431656Chris Lattner
214b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordChild:
215b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    OS << "OPC_RecordChild" << cast<RecordChildMatcher>(N)->getChildNo()
21619b5a7590b784f19875b9880ea8838c393431656Chris Lattner       << ',';
2175c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2185c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// #"
2195c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordChildMatcher>(N)->getResultNo() << " = "
2205c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordChildMatcher>(N)->getWhatFor();
2215c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
22219b5a7590b784f19875b9880ea8838c393431656Chris Lattner    return 1;
2239d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
224b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordMemRef:
2258e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_RecordMemRef,\n";
2268e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 1;
2279d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
2288950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  case Matcher::CaptureGlueInput:
22929d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    OS << "OPC_CaptureGlueInput,\n";
2308e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 1;
2319d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
232b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MoveChild:
233b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    OS << "OPC_MoveChild, " << cast<MoveChildMatcher>(N)->getChildNo() << ",\n";
234da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
2359d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
236b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MoveParent:
237da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_MoveParent,\n";
238da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
2399d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
240b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckSame:
241da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckSame, "
242b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n";
243da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
244da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
245b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckPatternPredicate: {
246543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner    StringRef Pred =cast<CheckPatternPredicateMatcher>(N)->getPredicate();
247050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS << "OPC_CheckPatternPredicate, " << getPatternPredicate(Pred) << ',';
2485c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2495c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// " << Pred;
2505c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
251da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
252050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
253b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckPredicate: {
254543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner    TreePredicateFn Pred = cast<CheckPredicateMatcher>(N)->getPredicate();
255050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS << "OPC_CheckPredicate, " << getNodePredicate(Pred) << ',';
2565c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
257543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner      OS.PadToColumn(CommentIndent) << "// " << Pred.getFnName();
2585c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
259da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
260050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
261050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
262b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckOpcode:
2632d76c84514216f51526f2be123315f585995d860Jim Grosbach    OS << "OPC_CheckOpcode, TARGET_VAL("
264d5d5a3dcbaa4e7f394ba045e2d7d0ec3aa76f50cChris Lattner       << cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << "),\n";
265d5d5a3dcbaa4e7f394ba045e2d7d0ec3aa76f50cChris Lattner    return 3;
2669d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
267cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  case Matcher::SwitchOpcode:
268cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  case Matcher::SwitchType: {
269eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    unsigned StartIdx = CurrentIdx;
2709d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
271cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    unsigned NumCases;
272cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) {
273cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << "OPC_SwitchOpcode ";
274cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      NumCases = SOM->getNumCases();
275cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    } else {
276cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << "OPC_SwitchType ";
277cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      NumCases = cast<SwitchTypeMatcher>(N)->getNumCases();
278cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    }
279cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
2805c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
281cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << "/*" << NumCases << " cases */";
2825c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
283eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
2849d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
285eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // For each case we emit the size, then the opcode, then the matcher.
286cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    for (unsigned i = 0, e = NumCases; i != e; ++i) {
287cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      const Matcher *Child;
2885d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner      unsigned IdxSize;
2895d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner      if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) {
290cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        Child = SOM->getCaseMatcher(i);
2915d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner        IdxSize = 2;  // size of opcode in table is 2 bytes.
2925d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner      } else {
293cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i);
2945d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner        IdxSize = 1;  // size of type in table is 1 byte.
2955d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner      }
2969d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
297eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // We need to encode the opcode and the offset of the case code before
298eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // emitting the case code.  Handle this by buffering the output into a
299eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // string while we get the size.  Unfortunately, the offset of the
300eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // children depends on the VBR size of the child, so for large children we
301eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // have to iterate a bit.
302eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      SmallString<128> TmpBuf;
303eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned ChildSize = 0;
304eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned VBRSize = 0;
305eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      do {
306eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        VBRSize = GetVBRSize(ChildSize);
3079d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
308eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        TmpBuf.clear();
309eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        raw_svector_ostream OS(TmpBuf);
310eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        formatted_raw_ostream FOS(OS);
3115d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner        ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx+VBRSize+IdxSize,
3125d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner                                    FOS);
313eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      } while (GetVBRSize(ChildSize) != VBRSize);
3149d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
315eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      assert(ChildSize != 0 && "Should not have a zero-sized child!");
3169d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
3175c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (i != 0) {
3185c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2);
3195c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (!OmitComments)
320cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        OS << (isa<SwitchOpcodeMatcher>(N) ?
321cfe2eab7446dedc471592fe702fefef783383171Chris Lattner                   "/*SwitchOpcode*/ " : "/*SwitchType*/ ");
3225c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
3239d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
324eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // Emit the VBR.
325eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += EmitVBRValue(ChildSize, OS);
3269d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
327cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << ' ';
3285d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner      if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N))
3292d76c84514216f51526f2be123315f585995d860Jim Grosbach        OS << "TARGET_VAL(" << SOM->getCaseOpcode(i).getEnumName() << "),";
3305d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner      else
331d5d5a3dcbaa4e7f394ba045e2d7d0ec3aa76f50cChris Lattner        OS << getEnumName(cast<SwitchTypeMatcher>(N)->getCaseType(i)) << ',';
3325d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner
3335d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner      CurrentIdx += IdxSize;
3345d3569e93ce31052a55d6e64b7153d055d60d8e8Chris Lattner
3355c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
336d5d5a3dcbaa4e7f394ba045e2d7d0ec3aa76f50cChris Lattner        OS << "// ->" << CurrentIdx+ChildSize;
3375c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
338eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      OS << TmpBuf.str();
339eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += ChildSize;
340eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    }
341eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
342eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Emit the final zero to terminate the switch.
3435c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2) << "0, ";
3445c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
345cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << (isa<SwitchOpcodeMatcher>(N) ?
346cfe2eab7446dedc471592fe702fefef783383171Chris Lattner             "// EndSwitchOpcode" : "// EndSwitchType");
347cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
3485520ad4dd9e3e726f96cf2c32c2b90f9467ff783Torok Edwin    OS << '\n';
349eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
350eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return CurrentIdx-StartIdx;
351eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
352eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
353fa342faef9d1c89de356ed83a6c6529ed3e87610Chris Lattner case Matcher::CheckType:
354084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    assert(cast<CheckTypeMatcher>(N)->getResNo() == 0 &&
355084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner           "FIXME: Add support for CheckType of resno != 0");
356da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckType, "
357b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
358da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
3599d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
360b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckChildType:
36123cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    OS << "OPC_CheckChild"
362b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
363b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
36423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    return 2;
3659d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
36638fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  case Matcher::CheckInteger: {
3675310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckInteger, ";
36838fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes=1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS);
36938fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
37038fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
37138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  }
372b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckCondCode:
373da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckCondCode, ISD::"
374b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
375da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
3769d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
377b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckValueType:
378da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckValueType, MVT::"
379b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n";
380da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
381da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
382b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckComplexPat: {
38357bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner    const CheckComplexPatMatcher *CCPM = cast<CheckComplexPatMatcher>(N);
38457bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner    const ComplexPattern &Pattern = CCPM->getPattern();
38557bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner    OS << "OPC_CheckComplexPat, /*CP*/" << getComplexPat(Pattern) << ", /*#*/"
38657bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner       << CCPM->getMatchNumber() << ',';
3879d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
3885c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
3895c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc();
39057bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner      OS << ":$" << CCPM->getName();
391d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner      for (unsigned i = 0, e = Pattern.getNumOperands(); i != e; ++i)
39257bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner        OS << " #" << CCPM->getFirstResult()+i;
3939d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
3945c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (Pattern.hasProperty(SDNPHasChain))
395d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner        OS << " + chain result";
3965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
397781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner    OS << '\n';
39857bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner    return 3;
3995be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner  }
4009d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
40138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  case Matcher::CheckAndImm: {
4025310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckAndImm, ";
40338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes=1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS);
40438fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
40538fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
40638fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  }
407da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
40838fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  case Matcher::CheckOrImm: {
4095310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckOrImm, ";
41038fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes = 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS);
41138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
41238fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
41338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  }
4149d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
415b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckFoldableChainNode:
41621390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner    OS << "OPC_CheckFoldableChainNode,\n";
417e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    return 1;
4189d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
419b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitInteger: {
420b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
4215310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
422b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
42338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes = 2+EmitVBRValue(Val, OS);
42438fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
42538fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
426906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner  }
427b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitStringInteger: {
428b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
4298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    // These should always fit into one byte.
4305310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
431b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      << getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", "
4328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      << Val << ",\n";
4338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
4348e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
4359d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
4364a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  case Matcher::EmitRegister: {
4374a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach    const EmitRegisterMatcher *Matcher = cast<EmitRegisterMatcher>(N);
4384a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach    const CodeGenRegister *Reg = Matcher->getReg();
4394a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach    // If the enum value of the register is larger than one byte can handle,
4404a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach    // use EmitRegister2.
4414a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach    if (Reg && Reg->EnumValue > 255) {
4424a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach      OS << "OPC_EmitRegister2, " << getEnumName(Matcher->getVT()) << ", ";
4434a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach      OS << "TARGET_VAL(" << getQualifiedName(Reg->TheDef) << "),\n";
4442d76c84514216f51526f2be123315f585995d860Jim Grosbach      return 4;
4452d76c84514216f51526f2be123315f585995d860Jim Grosbach    } else {
4464a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach      OS << "OPC_EmitRegister, " << getEnumName(Matcher->getVT()) << ", ";
4474a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach      if (Reg) {
4484a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach        OS << getQualifiedName(Reg->TheDef) << ",\n";
4494a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach      } else {
4502d76c84514216f51526f2be123315f585995d860Jim Grosbach        OS << "0 ";
4512d76c84514216f51526f2be123315f585995d860Jim Grosbach        if (!OmitComments)
4522d76c84514216f51526f2be123315f585995d860Jim Grosbach          OS << "/*zero_reg*/";
4532d76c84514216f51526f2be123315f585995d860Jim Grosbach        OS << ",\n";
4542d76c84514216f51526f2be123315f585995d860Jim Grosbach      }
4552d76c84514216f51526f2be123315f585995d860Jim Grosbach      return 3;
4565c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
4574a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  }
4589d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
459b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitConvertToTarget:
4608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitConvertToTarget, "
461b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n";
4628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2;
4639d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
464b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitMergeInputChains: {
465b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitMergeInputChainsMatcher *MN =
466b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      cast<EmitMergeInputChainsMatcher>(N);
4679d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
468aa4e3391c8814c6ce0bbc530ea4d5905414b2763Chris Lattner    // Handle the specialized forms OPC_EmitMergeInputChains1_0 and 1_1.
469aa4e3391c8814c6ce0bbc530ea4d5905414b2763Chris Lattner    if (MN->getNumNodes() == 1 && MN->getNode(0) < 2) {
470aa4e3391c8814c6ce0bbc530ea4d5905414b2763Chris Lattner      OS << "OPC_EmitMergeInputChains1_" << MN->getNode(0) << ",\n";
471aa4e3391c8814c6ce0bbc530ea4d5905414b2763Chris Lattner      return 1;
472aa4e3391c8814c6ce0bbc530ea4d5905414b2763Chris Lattner    }
4739d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
4748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", ";
4758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i)
4768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << MN->getNode(i) << ", ";
4778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << '\n';
4788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2+MN->getNumNodes();
4798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
480b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitCopyToReg:
4818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitCopyToReg, "
482b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", "
483b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg())
4848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << ",\n";
4858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
486b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitNodeXForm: {
487b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N);
4888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", "
4898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << XF->getSlot() << ',';
4905c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
4915c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// "<<XF->getNodeXForm()->getName();
4925c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS <<'\n';
4938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
4948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
4959d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
496e86097af5598e44727875f00e492d43c978239beChris Lattner  case Matcher::EmitNode:
4979a21500edc485a2c383a03fba429943f031c1398Chris Lattner  case Matcher::MorphNodeTo: {
498e86097af5598e44727875f00e492d43c978239beChris Lattner    const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N);
4999a21500edc485a2c383a03fba429943f031c1398Chris Lattner    OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo");
5002d76c84514216f51526f2be123315f585995d860Jim Grosbach    OS << ", TARGET_VAL(" << EN->getOpcodeName() << "), 0";
5019d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
5028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasChain())   OS << "|OPFL_Chain";
503a4359be0328a91971c486b06892c742de1fa0f2bChris Lattner    if (EN->hasInFlag())  OS << "|OPFL_GlueInput";
504a4359be0328a91971c486b06892c742de1fa0f2bChris Lattner    if (EN->hasOutFlag()) OS << "|OPFL_GlueOutput";
5058e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasMemRefs()) OS << "|OPFL_MemRefs";
5068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->getNumFixedArityOperands() != -1)
5078e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands();
5088e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ",\n";
5099d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
5105c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2+4) << EN->getNumVTs();
5115c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
5125c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*#VTs*/";
5135c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
5148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i)
5158e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << getEnumName(EN->getVT(i)) << ", ";
5168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
5175c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << EN->getNumOperands();
5185c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
5195c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*#Ops*/";
5205c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
5215007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumOperandBytes = 0;
52238fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i)
5235007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS);
5249d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
5255c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
5265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      // Print the result #'s for EmitNode.
5275c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) {
5285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (unsigned NumResults = EN->getNumVTs()) {
529b8d17643a5d4fc62aa420760eea92d0afdf2e46aJim Grosbach          OS.PadToColumn(CommentIndent) << "// Results =";
5305c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          unsigned First = E->getFirstResultSlot();
5315c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          for (unsigned i = 0; i != NumResults; ++i)
532b8d17643a5d4fc62aa420760eea92d0afdf2e46aJim Grosbach            OS << " #" << First+i;
5335c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        }
5346281cda6737bcda0e924318ddcce28392001691eChris Lattner      }
5355c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
5365c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin
5375c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) {
5385c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2) << "// Src: "
5399d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach          << *SNT->getPattern().getSrcPattern() << " - Complexity = "
54048e86dbe29e331357b0df11075b7974009c65f34Chris Lattner          << SNT->getPattern().getPatternComplexity(CGP) << '\n';
5415c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2) << "// Dst: "
5425c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          << *SNT->getPattern().getDstPattern() << '\n';
5435c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
5445c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    } else
5455c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
5469d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
5475007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 6+EN->getNumVTs()+NumOperandBytes;
5488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
5498950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  case Matcher::MarkGlueResults: {
5508950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    const MarkGlueResultsMatcher *CFR = cast<MarkGlueResultsMatcher>(N);
55129d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    OS << "OPC_MarkGlueResults, " << CFR->getNumNodes() << ", ";
55202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    unsigned NumOperandBytes = 0;
55302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i)
55402f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner      NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS);
55502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    OS << '\n';
55602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    return 2+NumOperandBytes;
55702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  }
558b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CompleteMatch: {
559b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N);
56077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", ";
5615007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumResultBytes = 0;
56277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i)
5635007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumResultBytes += EmitVBRValue(CM->getResult(i), OS);
56477f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << '\n';
5655c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
5665c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(Indent*2) << "// Src: "
5679d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach        << *CM->getPattern().getSrcPattern() << " - Complexity = "
56848e86dbe29e331357b0df11075b7974009c65f34Chris Lattner        << CM->getPattern().getPatternComplexity(CGP) << '\n';
5695c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(Indent*2) << "// Dst: "
5705c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << *CM->getPattern().getDstPattern();
5715c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
5725c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
5735007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 2 + NumResultBytes;
574da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
57577f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  }
576655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper  llvm_unreachable("Unreachable");
577da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
578da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
579bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner/// EmitMatcherList - Emit the bytes for the specified matcher subtree.
580e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter::
581b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris LattnerEmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
582984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner                formatted_raw_ostream &OS) {
583da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned Size = 0;
5848ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  while (N) {
5855c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
5865c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*" << CurrentIdx << "*/";
587d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS);
5888fbad244bd436163296d81d4f182750e000fd16dChris Lattner    Size += MatcherSize;
5898fbad244bd436163296d81d4f182750e000fd16dChris Lattner    CurrentIdx += MatcherSize;
5909d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
591bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    // If there are other nodes in this list, iterate to them, otherwise we're
592da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    // done.
593bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    N = N->getNext();
594da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
5958ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  return Size;
596da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
597da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
59848e86dbe29e331357b0df11075b7974009c65f34Chris Lattnervoid MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
599e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit pattern predicates.
600d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!PatternPredicates.empty()) {
601af8d66ce9a9ebac0bf5629f3e39e78e57173c386Craig Topper    OS << "virtual bool CheckPatternPredicate(unsigned PredNo) const {\n";
602d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
603655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper    OS << "  default: llvm_unreachable(\"Invalid predicate in table?\");\n";
604d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
605d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ": return "  << PatternPredicates[i] << ";\n";
606d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
607d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
608d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
6099d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
610e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit Node predicates.
6114d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  // FIXME: Annoyingly, these are stored by name, which we never even emit. Yay?
6124d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  StringMap<TreePattern*> PFsByName;
6139d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
6144d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
6154d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner       I != E; ++I)
6164d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    PFsByName[I->first->getName()] = I->second;
6179d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
618d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodePredicates.empty()) {
619af8d66ce9a9ebac0bf5629f3e39e78e57173c386Craig Topper    OS << "virtual bool CheckNodePredicate(SDNode *Node,\n";
620af8d66ce9a9ebac0bf5629f3e39e78e57173c386Craig Topper    OS << "                                unsigned PredNo) const {\n";
621d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
622655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper    OS << "  default: llvm_unreachable(\"Invalid predicate in table?\");\n";
6234d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i) {
6244d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      // Emit the predicate code corresponding to this pattern.
625543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner      TreePredicateFn PredFn = NodePredicates[i];
626543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
627543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner      assert(!PredFn.isAlwaysTrue() && "No code in this predicate");
628543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner      OS << "  case " << i << ": { // " << NodePredicates[i].getFnName() <<'\n';
629543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
630543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner      OS << PredFn.getCodeToRunOnSDNode() << "\n  }\n";
6314d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
632d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
633d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
634d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
6359d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
636e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit CompletePattern matchers.
6378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
638d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!ComplexPatterns.empty()) {
639af8d66ce9a9ebac0bf5629f3e39e78e57173c386Craig Topper    OS << "virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent,\n";
640af8d66ce9a9ebac0bf5629f3e39e78e57173c386Craig Topper    OS << "                                 SDValue N, unsigned PatternNo,\n";
641d847bc20b89679279e75412ddc51dc1d299da942Chris Lattner    OS << "         SmallVectorImpl<std::pair<SDValue, SDNode*> > &Result) {\n";
642f6c4a309844c11fc7483cc5d1c71be22b43acb56Chris Lattner    OS << "  unsigned NextRes = Result.size();\n";
643d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PatternNo) {\n";
644655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper    OS << "  default: llvm_unreachable(\"Invalid pattern # in table?\");\n";
645d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
646d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      const ComplexPattern &P = *ComplexPatterns[i];
647d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      unsigned NumOps = P.getNumOperands();
6488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
649d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      if (P.hasProperty(SDNPHasChain))
650d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        ++NumOps;  // Get the chained node too.
6519d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
652d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ":\n";
653f6c4a309844c11fc7483cc5d1c71be22b43acb56Chris Lattner      OS << "    Result.resize(NextRes+" << NumOps << ");\n";
654d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "    return "  << P.getSelectFunc();
6558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
65652a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner      OS << "(";
65752a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner      // If the complex pattern wants the root of the match, pass it in as the
65852a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner      // first argument.
65952a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner      if (P.hasProperty(SDNPWantRoot))
66052a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner        OS << "Root, ";
6619d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
66278d3af47f532d67611e7d625b505fa832d713a26Chris Lattner      // If the complex pattern wants the parent of the operand being matched,
66378d3af47f532d67611e7d625b505fa832d713a26Chris Lattner      // pass it in as the next argument.
66478d3af47f532d67611e7d625b505fa832d713a26Chris Lattner      if (P.hasProperty(SDNPWantParent))
66578d3af47f532d67611e7d625b505fa832d713a26Chris Lattner        OS << "Parent, ";
6669d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
66752a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner      OS << "N";
668d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      for (unsigned i = 0; i != NumOps; ++i)
669d847bc20b89679279e75412ddc51dc1d299da942Chris Lattner        OS << ", Result[NextRes+" << i << "].first";
670d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << ");\n";
671d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    }
672d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
673d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
674e609a513f3c072bba28412c681465332a2822d9aChris Lattner  }
6759d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
6769d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
6778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // Emit SDNodeXForm handlers.
6788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
679d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodeXForms.empty()) {
680af8d66ce9a9ebac0bf5629f3e39e78e57173c386Craig Topper    OS << "virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
681d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (XFormNo) {\n";
682655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper    OS << "  default: llvm_unreachable(\"Invalid xform # in table?\");\n";
6839d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
684d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    // FIXME: The node xform could take SDValue's instead of SDNode*'s.
6854d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) {
6864d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const CodeGenDAGPatterns::NodeXForm &Entry =
6874d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        CGP.getSDNodeTransform(NodeXForms[i]);
6889d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
6894d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      Record *SDNode = Entry.first;
6904d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const std::string &Code = Entry.second;
6919d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
6925c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "  case " << i << ": {  ";
6935c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
6945c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "// " << NodeXForms[i]->getName();
6955c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
6969d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
6974d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName();
6984d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (ClassName == "SDNode")
6994d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    SDNode *N = V.getNode();\n";
7004d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
7014d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    " << ClassName << " *N = cast<" << ClassName
7024d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner           << ">(V.getNode());\n";
7034d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << Code << "\n  }\n";
7044d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
705d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
706d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
707d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
708050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner}
709050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
71057fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattnerstatic void BuildHistogram(const Matcher *M, std::vector<unsigned> &OpcodeFreq){
71157fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner  for (; M != 0; M = M->getNext()) {
71257fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    // Count this node.
71357fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    if (unsigned(M->getKind()) >= OpcodeFreq.size())
71457fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner      OpcodeFreq.resize(M->getKind()+1);
71557fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    OpcodeFreq[M->getKind()]++;
7169d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
71757fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    // Handle recursive nodes.
71857fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    if (const ScopeMatcher *SM = dyn_cast<ScopeMatcher>(M)) {
71957fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner      for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i)
72057fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner        BuildHistogram(SM->getChild(i), OpcodeFreq);
7219d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach    } else if (const SwitchOpcodeMatcher *SOM =
72257fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner                 dyn_cast<SwitchOpcodeMatcher>(M)) {
72357fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner      for (unsigned i = 0, e = SOM->getNumCases(); i != e; ++i)
72457fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner        BuildHistogram(SOM->getCaseMatcher(i), OpcodeFreq);
72557fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    } else if (const SwitchTypeMatcher *STM = dyn_cast<SwitchTypeMatcher>(M)) {
72657fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner      for (unsigned i = 0, e = STM->getNumCases(); i != e; ++i)
72757fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner        BuildHistogram(STM->getCaseMatcher(i), OpcodeFreq);
72857fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    }
72957fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner  }
73057fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner}
73157fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner
73257fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattnervoid MatcherTableEmitter::EmitHistogram(const Matcher *M,
73357fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner                                        formatted_raw_ostream &OS) {
7345c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  if (OmitComments)
7355c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    return;
7369d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
73757fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner  std::vector<unsigned> OpcodeFreq;
73857fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner  BuildHistogram(M, OpcodeFreq);
7399d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
74009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << "  // Opcode Histogram:\n";
74157fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner  for (unsigned i = 0, e = OpcodeFreq.size(); i != e; ++i) {
74209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    OS << "  // #";
743b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    switch ((Matcher::KindTy)i) {
7449d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach    case Matcher::Scope: OS << "OPC_Scope"; break;
7459d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach    case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
746b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
747b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
74829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    case Matcher::CaptureGlueInput: OS << "OPC_CaptureGlueInput"; break;
749b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveChild: OS << "OPC_MoveChild"; break;
750b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveParent: OS << "OPC_MoveParent"; break;
751b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckSame: OS << "OPC_CheckSame"; break;
752b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPatternPredicate:
75309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckPatternPredicate"; break;
754b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPredicate: OS << "OPC_CheckPredicate"; break;
755b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOpcode: OS << "OPC_CheckOpcode"; break;
756eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    case Matcher::SwitchOpcode: OS << "OPC_SwitchOpcode"; break;
757b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckType: OS << "OPC_CheckType"; break;
758cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    case Matcher::SwitchType: OS << "OPC_SwitchType"; break;
759b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckChildType: OS << "OPC_CheckChildType"; break;
760b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckInteger: OS << "OPC_CheckInteger"; break;
761b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckCondCode: OS << "OPC_CheckCondCode"; break;
762b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckValueType: OS << "OPC_CheckValueType"; break;
763b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckComplexPat: OS << "OPC_CheckComplexPat"; break;
764b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckAndImm: OS << "OPC_CheckAndImm"; break;
765b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOrImm: OS << "OPC_CheckOrImm"; break;
766b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckFoldableChainNode:
76709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckFoldableChainNode"; break;
768b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitInteger: OS << "OPC_EmitInteger"; break;
769b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitStringInteger: OS << "OPC_EmitStringInteger"; break;
770b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitRegister: OS << "OPC_EmitRegister"; break;
771499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitConvertToTarget: OS << "OPC_EmitConvertToTarget"; break;
772499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break;
773b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
774b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
7759a21500edc485a2c383a03fba429943f031c1398Chris Lattner    case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break;
776b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
77729d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner    case Matcher::MarkGlueResults: OS << "OPC_MarkGlueResults"; break;
7789d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach    case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
77909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    }
7809d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
78157fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner    OS.PadToColumn(40) << " = " << OpcodeFreq[i] << '\n';
78209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  }
78309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << '\n';
78409b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner}
78509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
786050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
7874d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid llvm::EmitMatcherTable(const Matcher *TheMatcher,
7882d76c84514216f51526f2be123315f585995d860Jim Grosbach                            const CodeGenDAGPatterns &CGP,
7892d76c84514216f51526f2be123315f585995d860Jim Grosbach                            raw_ostream &O) {
790da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  formatted_raw_ostream OS(O);
7919d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
792da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "// The main instruction selector code.\n";
793c84edb7bdd345db280c908583d55bdf4e670a225Chris Lattner  OS << "SDNode *SelectCode(SDNode *N) {\n";
794da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
7954a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  MatcherTableEmitter MatcherEmitter(CGP);
796e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
7972d76c84514216f51526f2be123315f585995d860Jim Grosbach  OS << "  // Some target values are emitted as 2 bytes, TARGET_VAL handles\n";
7982d76c84514216f51526f2be123315f585995d860Jim Grosbach  OS << "  // this.\n";
7992d76c84514216f51526f2be123315f585995d860Jim Grosbach  OS << "  #define TARGET_VAL(X) X & 255, unsigned(X) >> 8\n";
800da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "  static const unsigned char MatcherTable[] = {\n";
801b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS);
802da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "    0\n  }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
8039d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
80457fcd0361162ebe74d123d1d04a455c2c2b000a9Chris Lattner  MatcherEmitter.EmitHistogram(TheMatcher, OS);
8059d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
8062d76c84514216f51526f2be123315f585995d860Jim Grosbach  OS << "  #undef TARGET_VAL\n";
807e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner  OS << "  return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
8085c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  OS << '\n';
8099d40193d79052fb4ddd0f667f0fe47f07922c72aJim Grosbach
810050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  // Next up, emit the function for node and pattern predicates:
81148e86dbe29e331357b0df11075b7974009c65f34Chris Lattner  MatcherEmitter.EmitPredicateFunctions(OS);
812da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
813