DAGISelMatcherEmitter.cpp revision eb66921adb943ea841e72c8eee4777607c48b70e
1da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===- DAGISelMatcherEmitter.cpp - Matcher Emitter ------------------------===//
2da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
3da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//                     The LLVM Compiler Infrastructure
4da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
5da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file is distributed under the University of Illinois Open Source
6da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// License. See LICENSE.TXT for details.
7da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
8da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===//
9da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
10da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file contains code to generate C++ code a matcher.
11da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
12da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===//
13da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "DAGISelMatcher.h"
15da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "CodeGenDAGPatterns.h"
168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner#include "Record.h"
17e609a513f3c072bba28412c681465332a2822d9aChris Lattner#include "llvm/ADT/DenseMap.h"
18da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/ADT/SmallString.h"
19050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner#include "llvm/ADT/StringMap.h"
20da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/FormattedStream.h"
21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm;
22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerenum {
245be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner  CommentIndent = 30
25da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
26da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
27e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnernamespace {
28e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerclass MatcherTableEmitter {
29050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  StringMap<unsigned> NodePredicateMap, PatternPredicateMap;
30050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  std::vector<std::string> NodePredicates, PatternPredicates;
31e609a513f3c072bba28412c681465332a2822d9aChris Lattner
32e609a513f3c072bba28412c681465332a2822d9aChris Lattner  DenseMap<const ComplexPattern*, unsigned> ComplexPatternMap;
33e609a513f3c072bba28412c681465332a2822d9aChris Lattner  std::vector<const ComplexPattern*> ComplexPatterns;
348e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
358e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  DenseMap<Record*, unsigned> NodeXFormMap;
374d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  std::vector<Record*> NodeXForms;
388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
3909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  // Per opcode frequence count.
4009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  std::vector<unsigned> Histogram;
41e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerpublic:
42984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner  MatcherTableEmitter() {}
43e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
44b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  unsigned EmitMatcherList(const Matcher *N, unsigned Indent,
458fbad244bd436163296d81d4f182750e000fd16dChris Lattner                           unsigned StartIdx, formatted_raw_ostream &OS);
46050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
474d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  void EmitPredicateFunctions(const CodeGenDAGPatterns &CGP,
484d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                              formatted_raw_ostream &OS);
4909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
5009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  void EmitHistogram(formatted_raw_ostream &OS);
51e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerprivate:
52d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
53984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner                       formatted_raw_ostream &OS);
54050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
55050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  unsigned getNodePredicate(StringRef PredName) {
56050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    unsigned &Entry = NodePredicateMap[PredName];
57050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    if (Entry == 0) {
58050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      NodePredicates.push_back(PredName.str());
59050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      Entry = NodePredicates.size();
60050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    }
61050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    return Entry-1;
62050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
63050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  unsigned getPatternPredicate(StringRef PredName) {
64050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    unsigned &Entry = PatternPredicateMap[PredName];
65050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    if (Entry == 0) {
66050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      PatternPredicates.push_back(PredName.str());
67050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      Entry = PatternPredicates.size();
68050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    }
69050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    return Entry-1;
70050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
71e609a513f3c072bba28412c681465332a2822d9aChris Lattner
72e609a513f3c072bba28412c681465332a2822d9aChris Lattner  unsigned getComplexPat(const ComplexPattern &P) {
73e609a513f3c072bba28412c681465332a2822d9aChris Lattner    unsigned &Entry = ComplexPatternMap[&P];
74e609a513f3c072bba28412c681465332a2822d9aChris Lattner    if (Entry == 0) {
75e609a513f3c072bba28412c681465332a2822d9aChris Lattner      ComplexPatterns.push_back(&P);
76e609a513f3c072bba28412c681465332a2822d9aChris Lattner      Entry = ComplexPatterns.size();
77e609a513f3c072bba28412c681465332a2822d9aChris Lattner    }
78e609a513f3c072bba28412c681465332a2822d9aChris Lattner    return Entry-1;
79e609a513f3c072bba28412c681465332a2822d9aChris Lattner  }
808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNodeXFormID(Record *Rec) {
828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    unsigned &Entry = NodeXFormMap[Rec];
838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (Entry == 0) {
848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      NodeXForms.push_back(Rec);
858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      Entry = NodeXForms.size();
868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    }
878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return Entry-1;
888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
90e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner};
91e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner} // end anonymous namespace.
92e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
93d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattnerstatic unsigned GetVBRSize(unsigned Val) {
94d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  if (Val <= 127) return 1;
95d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
96d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned NumBytes = 0;
97d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  while (Val >= 128) {
98d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Val >>= 7;
99d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    ++NumBytes;
100d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
101d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  return NumBytes+1;
102d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner}
103d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
1045007e1e43541114f3737939234104b085fbe4acaChris Lattner/// EmitVBRValue - Emit the specified value as a VBR, returning the number of
1055007e1e43541114f3737939234104b085fbe4acaChris Lattner/// bytes emitted.
1065310654dc56c64b726bba7da82d568137ec81bbcChris Lattnerstatic uint64_t EmitVBRValue(uint64_t Val, raw_ostream &OS) {
1075007e1e43541114f3737939234104b085fbe4acaChris Lattner  if (Val <= 127) {
1085007e1e43541114f3737939234104b085fbe4acaChris Lattner    OS << Val << ", ";
1095007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 1;
1105007e1e43541114f3737939234104b085fbe4acaChris Lattner  }
1115007e1e43541114f3737939234104b085fbe4acaChris Lattner
1125310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  uint64_t InVal = Val;
1135007e1e43541114f3737939234104b085fbe4acaChris Lattner  unsigned NumBytes = 0;
114860d4a787f28f5f31e0c172e2ab80f5ab93cbf9bChris Lattner  while (Val >= 128) {
1155007e1e43541114f3737939234104b085fbe4acaChris Lattner    OS << (Val&127) << "|128,";
1165007e1e43541114f3737939234104b085fbe4acaChris Lattner    Val >>= 7;
1175007e1e43541114f3737939234104b085fbe4acaChris Lattner    ++NumBytes;
1185007e1e43541114f3737939234104b085fbe4acaChris Lattner  }
1195007e1e43541114f3737939234104b085fbe4acaChris Lattner  OS << Val << "/*" << InVal << "*/, ";
1205007e1e43541114f3737939234104b085fbe4acaChris Lattner  return NumBytes+1;
1215007e1e43541114f3737939234104b085fbe4acaChris Lattner}
1225007e1e43541114f3737939234104b085fbe4acaChris Lattner
123da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitMatcherOpcodes - Emit bytes for the specified matcher and return
124da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the number of bytes emitted.
125e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter::
126d6c84720df0b63e34081e0c7890f3074d8b110b9Chris LattnerEmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
127d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner            formatted_raw_ostream &OS) {
128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.PadToColumn(Indent*2);
129da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
130da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  switch (N->getKind()) {
131d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  case Matcher::Scope: {
132d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    const ScopeMatcher *SM = cast<ScopeMatcher>(N);
133d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    assert(SM->getNext() == 0 && "Shouldn't have next after scope");
134d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
135d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    unsigned StartIdx = CurrentIdx;
136d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
137d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    // Emit all of the children.
138d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) {
139d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      if (i == 0) {
140d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        OS << "OPC_Scope, ";
141d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        ++CurrentIdx;
142d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      } else {
143d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        OS << "/*" << CurrentIdx << "*/";
144d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        OS.PadToColumn(Indent*2) << "/*Scope*/ ";
145d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      }
146d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
147d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // We need to encode the child and the offset of the failure code before
148d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // emitting either of them.  Handle this by buffering the output into a
149d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // string while we get the size.  Unfortunately, the offset of the
150d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // children depends on the VBR size of the child, so for large children we
151d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // have to iterate a bit.
152d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      SmallString<128> TmpBuf;
153d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      unsigned ChildSize = 0;
154d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      unsigned VBRSize = 0;
155d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      do {
156d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        VBRSize = GetVBRSize(ChildSize);
157d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
158d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        TmpBuf.clear();
159d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        raw_svector_ostream OS(TmpBuf);
160d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        formatted_raw_ostream FOS(OS);
161eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        ChildSize = EmitMatcherList(SM->getChild(i), Indent+1,
162eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner                                    CurrentIdx+VBRSize, FOS);
163d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      } while (GetVBRSize(ChildSize) != VBRSize);
164d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
165d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      assert(ChildSize != 0 && "Should not have a zero-sized child!");
166d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
167d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      CurrentIdx += EmitVBRValue(ChildSize, OS);
1685a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner      OS << "/*->" << CurrentIdx+ChildSize << "*/";
1695a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner
1705a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner      if (i == 0)
1715a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner        OS.PadToColumn(CommentIndent) << "// " << SM->getNumChildren()
1725a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner          << " children in Scope";
1735a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner
174d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      OS << '\n' << TmpBuf.str();
175d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      CurrentIdx += ChildSize;
176d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    }
177d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
178d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    // Emit a zero as a sentinel indicating end of 'Scope'.
179d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    OS << "/*" << CurrentIdx << "*/";
180d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    OS.PadToColumn(Indent*2) << "0, /*End of Scope*/\n";
181d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    return CurrentIdx - StartIdx + 1;
182d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
183d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
184b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordNode:
185845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "OPC_RecordNode,";
1860cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner    OS.PadToColumn(CommentIndent) << "// #"
1870cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner       << cast<RecordMatcher>(N)->getResultNo() << " = "
188b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<RecordMatcher>(N)->getWhatFor() << '\n';
189da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
19019b5a7590b784f19875b9880ea8838c393431656Chris Lattner
191b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordChild:
192b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    OS << "OPC_RecordChild" << cast<RecordChildMatcher>(N)->getChildNo()
19319b5a7590b784f19875b9880ea8838c393431656Chris Lattner       << ',';
1940cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner    OS.PadToColumn(CommentIndent) << "// #"
1950cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner      << cast<RecordChildMatcher>(N)->getResultNo() << " = "
196b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      << cast<RecordChildMatcher>(N)->getWhatFor() << '\n';
19719b5a7590b784f19875b9880ea8838c393431656Chris Lattner    return 1;
1988e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
199b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordMemRef:
2008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_RecordMemRef,\n";
2018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 1;
2028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
203b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CaptureFlagInput:
2048e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_CaptureFlagInput,\n";
2058e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 1;
2068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
207b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MoveChild:
208b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    OS << "OPC_MoveChild, " << cast<MoveChildMatcher>(N)->getChildNo() << ",\n";
209da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
210da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
211b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MoveParent:
212da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_MoveParent,\n";
213da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
214da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
215b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckSame:
216da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckSame, "
217b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n";
218da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
219da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
220b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckPatternPredicate: {
221b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    StringRef Pred = cast<CheckPatternPredicateMatcher>(N)->getPredicate();
222050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS << "OPC_CheckPatternPredicate, " << getPatternPredicate(Pred) << ',';
223050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS.PadToColumn(CommentIndent) << "// " << Pred << '\n';
224da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
225050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
226b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckPredicate: {
227b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    StringRef Pred = cast<CheckPredicateMatcher>(N)->getPredicateName();
228050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS << "OPC_CheckPredicate, " << getNodePredicate(Pred) << ',';
229050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS.PadToColumn(CommentIndent) << "// " << Pred << '\n';
230da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
231050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
232050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
233b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckOpcode:
234da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckOpcode, "
235a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner       << cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << ",\n";
236da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
237da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
238eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  case Matcher::SwitchOpcode: {
239eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    unsigned StartIdx = CurrentIdx;
240eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    const SwitchOpcodeMatcher *SOM = cast<SwitchOpcodeMatcher>(N);
241eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    OS << "OPC_SwitchOpcode /*" << SOM->getNumCases() << " cases */, ";
242eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
243eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
244eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // For each case we emit the size, then the opcode, then the matcher.
245eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    for (unsigned i = 0, e = SOM->getNumCases(); i != e; ++i) {
246eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // We need to encode the opcode and the offset of the case code before
247eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // emitting the case code.  Handle this by buffering the output into a
248eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // string while we get the size.  Unfortunately, the offset of the
249eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // children depends on the VBR size of the child, so for large children we
250eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // have to iterate a bit.
251eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      SmallString<128> TmpBuf;
252eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned ChildSize = 0;
253eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned VBRSize = 0;
254eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      do {
255eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        VBRSize = GetVBRSize(ChildSize);
256eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
257eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        TmpBuf.clear();
258eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        raw_svector_ostream OS(TmpBuf);
259eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        formatted_raw_ostream FOS(OS);
260eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        ChildSize = EmitMatcherList(SOM->getCaseMatcher(i),
261eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner                                    Indent+1, CurrentIdx+VBRSize+1, FOS);
262eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      } while (GetVBRSize(ChildSize) != VBRSize);
263eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
264eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      assert(ChildSize != 0 && "Should not have a zero-sized child!");
265eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
266eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      if (i != 0)
267eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        OS.PadToColumn(Indent*2) << "/*SwitchOpcode*/ ";
268eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
269eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // Emit the VBR.
270eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += EmitVBRValue(ChildSize, OS);
271eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
272eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      OS << " " << SOM->getCaseOpcode(i).getEnumName() << ",";
273eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      OS << "// ->" << CurrentIdx+ChildSize+1 << '\n';
274eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      ++CurrentIdx;
275eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      OS << TmpBuf.str();
276eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += ChildSize;
277eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    }
278eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
279eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Emit the final zero to terminate the switch.
280eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    OS.PadToColumn(Indent*2) << "0, // EndSwitchOpcode\n";
281eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
282eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return CurrentIdx-StartIdx;
283eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
284eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
285b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckMultiOpcode: {
286b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const CheckMultiOpcodeMatcher *CMO = cast<CheckMultiOpcodeMatcher>(N);
287a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    OS << "OPC_CheckMultiOpcode, " << CMO->getNumOpcodes() << ", ";
288a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    for (unsigned i = 0, e = CMO->getNumOpcodes(); i != e; ++i)
289a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner      OS << CMO->getOpcode(i).getEnumName() << ", ";
29012a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner    OS << '\n';
291a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    return 2 + CMO->getNumOpcodes();
29212a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner  }
29312a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
294b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckType:
295da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckType, "
296b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
297da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
298b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckChildType:
29923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    OS << "OPC_CheckChild"
300b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
301b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
30223cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    return 2;
30323cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
3045310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  case Matcher::CheckInteger:
3055310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckInteger, ";
3065310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS);
307b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckCondCode:
308da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckCondCode, ISD::"
309b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
310da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
311da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
312b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckValueType:
313da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckValueType, MVT::"
314b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n";
315da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
316da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
317b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckComplexPat: {
3185be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner    const ComplexPattern &Pattern =
319b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      cast<CheckComplexPatMatcher>(N)->getPattern();
3205be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner    OS << "OPC_CheckComplexPat, " << getComplexPat(Pattern) << ',';
321781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner    OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc();
322781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner    OS << ": " << Pattern.getNumOperands() << " operands";
323781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner    if (Pattern.hasProperty(SDNPHasChain))
324781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner      OS << " + chain result and input";
325781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner    OS << '\n';
326da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
3275be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner  }
328da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
3295310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  case Matcher::CheckAndImm:
3305310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckAndImm, ";
3315310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS);
332da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
3335310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  case Matcher::CheckOrImm:
3345310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckOrImm, ";
3355310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS);
3365310654dc56c64b726bba7da82d568137ec81bbcChris Lattner
337b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckFoldableChainNode:
33821390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner    OS << "OPC_CheckFoldableChainNode,\n";
339e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    return 1;
340b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckChainCompatible:
3419a747f1305e76025df2323a03b805a284f2cde77Chris Lattner    OS << "OPC_CheckChainCompatible, "
342b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckChainCompatibleMatcher>(N)->getPreviousOp() << ",\n";
3439a747f1305e76025df2323a03b805a284f2cde77Chris Lattner    return 2;
344845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
345b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitInteger: {
346b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
3475310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
348b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
3495310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 2+EmitVBRValue(Val, OS);
350906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner  }
351b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitStringInteger: {
352b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
3538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    // These should always fit into one byte.
3545310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
355b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      << getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", "
3568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      << Val << ",\n";
3578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
3588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
359906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner
360b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitRegister:
361906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner    OS << "OPC_EmitRegister, "
362b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<EmitRegisterMatcher>(N)->getVT()) << ", ";
363b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    if (Record *R = cast<EmitRegisterMatcher>(N)->getReg())
364906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner      OS << getQualifiedName(R) << ",\n";
365906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner    else
366906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner      OS << "0 /*zero_reg*/,\n";
367906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner    return 3;
3688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
369b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitConvertToTarget:
3708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitConvertToTarget, "
371b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n";
3728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2;
3738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
374b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitMergeInputChains: {
375b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitMergeInputChainsMatcher *MN =
376b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      cast<EmitMergeInputChainsMatcher>(N);
3778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", ";
3788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i)
3798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << MN->getNode(i) << ", ";
3808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << '\n';
3818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2+MN->getNumNodes();
3828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
383b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitCopyToReg:
3848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitCopyToReg, "
385b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", "
386b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg())
3878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << ",\n";
3888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
389b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitNodeXForm: {
390b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N);
3918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", "
3928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << XF->getSlot() << ',';
3938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS.PadToColumn(CommentIndent) << "// "<<XF->getNodeXForm()->getName()<<'\n';
3948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
3958e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
3968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
397e86097af5598e44727875f00e492d43c978239beChris Lattner  case Matcher::EmitNode:
3989a21500edc485a2c383a03fba429943f031c1398Chris Lattner  case Matcher::MorphNodeTo: {
399e86097af5598e44727875f00e492d43c978239beChris Lattner    const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N);
4009a21500edc485a2c383a03fba429943f031c1398Chris Lattner    OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo");
401e86097af5598e44727875f00e492d43c978239beChris Lattner    OS << ", TARGET_OPCODE(" << EN->getOpcodeName() << "), 0";
4028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasChain())   OS << "|OPFL_Chain";
404ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner    if (EN->hasInFlag())  OS << "|OPFL_FlagInput";
405ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner    if (EN->hasOutFlag()) OS << "|OPFL_FlagOutput";
4068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasMemRefs()) OS << "|OPFL_MemRefs";
4078e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->getNumFixedArityOperands() != -1)
4088e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands();
4098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ",\n";
4108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS.PadToColumn(Indent*2+4) << EN->getNumVTs() << "/*#VTs*/, ";
4128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i)
4138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << getEnumName(EN->getVT(i)) << ", ";
4148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4158e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << EN->getNumOperands() << "/*#Ops*/, ";
4165007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumOperandBytes = 0;
4175007e1e43541114f3737939234104b085fbe4acaChris Lattner    for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i) {
4185007e1e43541114f3737939234104b085fbe4acaChris Lattner      // We emit the operand numbers in VBR encoded format, in case the number
4195007e1e43541114f3737939234104b085fbe4acaChris Lattner      // is too large to represent with a byte.
4205007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS);
4215007e1e43541114f3737939234104b085fbe4acaChris Lattner    }
4226281cda6737bcda0e924318ddcce28392001691eChris Lattner
4236281cda6737bcda0e924318ddcce28392001691eChris Lattner    // Print the result #'s for EmitNode.
4246281cda6737bcda0e924318ddcce28392001691eChris Lattner    if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) {
425ccd23cc2a49f02acbcdd50128a9022477f7cb6a4Chris Lattner      if (unsigned NumResults = EN->getNumVTs()) {
4266281cda6737bcda0e924318ddcce28392001691eChris Lattner        OS.PadToColumn(CommentIndent) << "// Results = ";
4276281cda6737bcda0e924318ddcce28392001691eChris Lattner        unsigned First = E->getFirstResultSlot();
428c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner        for (unsigned i = 0; i != NumResults; ++i)
4296281cda6737bcda0e924318ddcce28392001691eChris Lattner          OS << "#" << First+i << " ";
4306281cda6737bcda0e924318ddcce28392001691eChris Lattner      }
4316281cda6737bcda0e924318ddcce28392001691eChris Lattner    }
4328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << '\n';
433c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner
4349a21500edc485a2c383a03fba429943f031c1398Chris Lattner    if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) {
435c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      OS.PadToColumn(Indent*2) << "// Src: "
436c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      << *SNT->getPattern().getSrcPattern() << '\n';
437c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      OS.PadToColumn(Indent*2) << "// Dst: "
438c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      << *SNT->getPattern().getDstPattern() << '\n';
439c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner
440c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    }
441c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner
4425007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 6+EN->getNumVTs()+NumOperandBytes;
4438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
444b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MarkFlagResults: {
445b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const MarkFlagResultsMatcher *CFR = cast<MarkFlagResultsMatcher>(N);
44602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    OS << "OPC_MarkFlagResults, " << CFR->getNumNodes() << ", ";
44702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    unsigned NumOperandBytes = 0;
44802f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i)
44902f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner      NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS);
45002f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    OS << '\n';
45102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    return 2+NumOperandBytes;
45202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  }
453b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CompleteMatch: {
454b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N);
45577f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", ";
4565007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumResultBytes = 0;
45777f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i)
4585007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumResultBytes += EmitVBRValue(CM->getResult(i), OS);
45977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << '\n';
46077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS.PadToColumn(Indent*2) << "// Src: "
46177f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner      << *CM->getPattern().getSrcPattern() << '\n';
46277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS.PadToColumn(Indent*2) << "// Dst: "
46377f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner      << *CM->getPattern().getDstPattern() << '\n';
4645007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 2 + NumResultBytes;
465da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
46677f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  }
467da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  assert(0 && "Unreachable");
468da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  return 0;
469da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
470da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
471bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner/// EmitMatcherList - Emit the bytes for the specified matcher subtree.
472e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter::
473b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris LattnerEmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
474984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner                formatted_raw_ostream &OS) {
475da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned Size = 0;
4768ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  while (N) {
47709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    if (unsigned(N->getKind()) >= Histogram.size())
47809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      Histogram.resize(N->getKind()+1);
47909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    Histogram[N->getKind()]++;
48009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
4818fbad244bd436163296d81d4f182750e000fd16dChris Lattner    OS << "/*" << CurrentIdx << "*/";
482d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS);
4838fbad244bd436163296d81d4f182750e000fd16dChris Lattner    Size += MatcherSize;
4848fbad244bd436163296d81d4f182750e000fd16dChris Lattner    CurrentIdx += MatcherSize;
485da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
486bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    // If there are other nodes in this list, iterate to them, otherwise we're
487da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    // done.
488bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    N = N->getNext();
489da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
4908ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  return Size;
491da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
492da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
4934d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid MatcherTableEmitter::EmitPredicateFunctions(const CodeGenDAGPatterns &CGP,
4944d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                                                 formatted_raw_ostream &OS) {
495b49985a8499e18675db7e9baf920d6ef4e2b65cfChris Lattner  // FIXME: Don't build off the DAGISelEmitter's predicates, emit them directly
496b49985a8499e18675db7e9baf920d6ef4e2b65cfChris Lattner  // here into the case stmts.
497b49985a8499e18675db7e9baf920d6ef4e2b65cfChris Lattner
498e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit pattern predicates.
499d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!PatternPredicates.empty()) {
500d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n";
501d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
502d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
503d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
504d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ": return "  << PatternPredicates[i] << ";\n";
505d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
506d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
507d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
5084d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
509e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit Node predicates.
5104d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  // FIXME: Annoyingly, these are stored by name, which we never even emit. Yay?
5114d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  StringMap<TreePattern*> PFsByName;
5124d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5134d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
5144d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner       I != E; ++I)
5154d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    PFsByName[I->first->getName()] = I->second;
5164d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
517d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodePredicates.empty()) {
5184d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    OS << "bool CheckNodePredicate(SDNode *Node, unsigned PredNo) const {\n";
519d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
520d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
5214d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i) {
5224d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      // FIXME: Storing this by name is horrible.
5234d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      TreePattern *P =PFsByName[NodePredicates[i].substr(strlen("Predicate_"))];
5244d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      assert(P && "Unknown name?");
5254d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5264d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      // Emit the predicate code corresponding to this pattern.
5274d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string Code = P->getRecord()->getValueAsCode("Predicate");
5284d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      assert(!Code.empty() && "No code in this predicate");
5294d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << "  case " << i << ": { // " << NodePredicates[i] << '\n';
5304d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string ClassName;
5314d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (P->getOnlyTree()->isLeaf())
5324d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        ClassName = "SDNode";
5334d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
5344d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        ClassName =
5354d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner          CGP.getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName();
5364d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (ClassName == "SDNode")
5374d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    SDNode *N = Node;\n";
5384d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
5394d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    " << ClassName << "*N = cast<" << ClassName << ">(Node);\n";
5404d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << Code << "\n  }\n";
5414d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
542d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
543d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
544d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
545e609a513f3c072bba28412c681465332a2822d9aChris Lattner
546e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit CompletePattern matchers.
5478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
548d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!ComplexPatterns.empty()) {
549d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n";
550d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "      unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n";
551d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PatternNo) {\n";
552d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid pattern # in table?\");\n";
553d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
554d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      const ComplexPattern &P = *ComplexPatterns[i];
555d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      unsigned NumOps = P.getNumOperands();
5568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
557d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      if (P.hasProperty(SDNPHasChain))
558d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        ++NumOps;  // Get the chained node too.
559d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
560d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ":\n";
561d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "    Result.resize(Result.size()+" << NumOps << ");\n";
562d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "    return "  << P.getSelectFunc();
5638e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
564d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      // FIXME: Temporary hack until old isel dies.
565d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      if (P.hasProperty(SDNPHasChain))
566d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        OS << "XXX";
567d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
568d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "(Root, N";
569d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      for (unsigned i = 0; i != NumOps; ++i)
570d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        OS << ", Result[Result.size()-" << (NumOps-i) << ']';
571d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << ");\n";
572d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    }
573d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
574d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
575e609a513f3c072bba28412c681465332a2822d9aChris Lattner  }
5768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
5774d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // Emit SDNodeXForm handlers.
5798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
580d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodeXForms.empty()) {
581d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
582d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (XFormNo) {\n";
583d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid xform # in table?\");\n";
584d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
585d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    // FIXME: The node xform could take SDValue's instead of SDNode*'s.
5864d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) {
5874d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const CodeGenDAGPatterns::NodeXForm &Entry =
5884d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        CGP.getSDNodeTransform(NodeXForms[i]);
5894d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5904d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      Record *SDNode = Entry.first;
5914d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const std::string &Code = Entry.second;
5924d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5934d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << "  case " << i << ": {  // " << NodeXForms[i]->getName() << '\n';
5944d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5954d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName();
5964d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (ClassName == "SDNode")
5974d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    SDNode *N = V.getNode();\n";
5984d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
5994d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    " << ClassName << " *N = cast<" << ClassName
6004d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner           << ">(V.getNode());\n";
6014d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << Code << "\n  }\n";
6024d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
603d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
604d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
605d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
606050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner}
607050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
60809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattnervoid MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) {
60909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << "  // Opcode Histogram:\n";
61009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  for (unsigned i = 0, e = Histogram.size(); i != e; ++i) {
61109b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    OS << "  // #";
612b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    switch ((Matcher::KindTy)i) {
613b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::Scope: OS << "OPC_Scope"; break;
614b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
615b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
616b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
617b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CaptureFlagInput: OS << "OPC_CaptureFlagInput"; break;
618b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveChild: OS << "OPC_MoveChild"; break;
619b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveParent: OS << "OPC_MoveParent"; break;
620b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckSame: OS << "OPC_CheckSame"; break;
621b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPatternPredicate:
62209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckPatternPredicate"; break;
623b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPredicate: OS << "OPC_CheckPredicate"; break;
624b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOpcode: OS << "OPC_CheckOpcode"; break;
625eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    case Matcher::SwitchOpcode: OS << "OPC_SwitchOpcode"; break;
626b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckMultiOpcode: OS << "OPC_CheckMultiOpcode"; break;
627b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckType: OS << "OPC_CheckType"; break;
628b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckChildType: OS << "OPC_CheckChildType"; break;
629b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckInteger: OS << "OPC_CheckInteger"; break;
630b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckCondCode: OS << "OPC_CheckCondCode"; break;
631b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckValueType: OS << "OPC_CheckValueType"; break;
632b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckComplexPat: OS << "OPC_CheckComplexPat"; break;
633b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckAndImm: OS << "OPC_CheckAndImm"; break;
634b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOrImm: OS << "OPC_CheckOrImm"; break;
635b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckFoldableChainNode:
63609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckFoldableChainNode"; break;
637499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::CheckChainCompatible: OS << "OPC_CheckChainCompatible"; break;
638b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitInteger: OS << "OPC_EmitInteger"; break;
639b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitStringInteger: OS << "OPC_EmitStringInteger"; break;
640b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitRegister: OS << "OPC_EmitRegister"; break;
641499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitConvertToTarget: OS << "OPC_EmitConvertToTarget"; break;
642499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break;
643b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
644b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
6459a21500edc485a2c383a03fba429943f031c1398Chris Lattner    case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break;
646b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
647b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break;
648b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
64909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    }
65009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
65109b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    OS.PadToColumn(40) << " = " << Histogram[i] << '\n';
65209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  }
65309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << '\n';
65409b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner}
65509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
656050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
6574d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid llvm::EmitMatcherTable(const Matcher *TheMatcher,
6584d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                            const CodeGenDAGPatterns &CGP, raw_ostream &O) {
659da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  formatted_raw_ostream OS(O);
660da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
661da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "// The main instruction selector code.\n";
662c84edb7bdd345db280c908583d55bdf4e670a225Chris Lattner  OS << "SDNode *SelectCode(SDNode *N) {\n";
663da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
664984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner  MatcherTableEmitter MatcherEmitter;
665e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
6668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  // Opcodes are emitted as 2 bytes, TARGET_OPCODE handles this.\n";
6678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  #define TARGET_OPCODE(X) X & 255, unsigned(X) >> 8\n";
668da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "  static const unsigned char MatcherTable[] = {\n";
669b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS);
670da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "    0\n  }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
67109b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
67209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  MatcherEmitter.EmitHistogram(OS);
67309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
6748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  #undef TARGET_OPCODE\n";
675e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner  OS << "  return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
676050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  OS << "\n";
677050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
678050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  // Next up, emit the function for node and pattern predicates:
6794d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  MatcherEmitter.EmitPredicateFunctions(CGP, OS);
680da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
681