DAGISelMatcherEmitter.cpp revision 5c7fc88b5534007c4a2e7b062b0d33fc060e75d6
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"
205c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin#include "llvm/Support/CommandLine.h"
21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/FormattedStream.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 {
35050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  StringMap<unsigned> NodePredicateMap, PatternPredicateMap;
36050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  std::vector<std::string> NodePredicates, PatternPredicates;
37e609a513f3c072bba28412c681465332a2822d9aChris Lattner
38e609a513f3c072bba28412c681465332a2822d9aChris Lattner  DenseMap<const ComplexPattern*, unsigned> ComplexPatternMap;
39e609a513f3c072bba28412c681465332a2822d9aChris Lattner  std::vector<const ComplexPattern*> ComplexPatterns;
408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  DenseMap<Record*, unsigned> NodeXFormMap;
434d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  std::vector<Record*> NodeXForms;
448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  // Per opcode frequence count.
4609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  std::vector<unsigned> Histogram;
47e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerpublic:
48984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner  MatcherTableEmitter() {}
49e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
50b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  unsigned EmitMatcherList(const Matcher *N, unsigned Indent,
518fbad244bd436163296d81d4f182750e000fd16dChris Lattner                           unsigned StartIdx, formatted_raw_ostream &OS);
52050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
534d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  void EmitPredicateFunctions(const CodeGenDAGPatterns &CGP,
544d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                              formatted_raw_ostream &OS);
5509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
5609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  void EmitHistogram(formatted_raw_ostream &OS);
57e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerprivate:
58d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
59984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner                       formatted_raw_ostream &OS);
60050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
61050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  unsigned getNodePredicate(StringRef PredName) {
62050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    unsigned &Entry = NodePredicateMap[PredName];
63050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    if (Entry == 0) {
64050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      NodePredicates.push_back(PredName.str());
65050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      Entry = NodePredicates.size();
66050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    }
67050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    return Entry-1;
68050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
69050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  unsigned getPatternPredicate(StringRef PredName) {
70050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    unsigned &Entry = PatternPredicateMap[PredName];
71050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    if (Entry == 0) {
72050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      PatternPredicates.push_back(PredName.str());
73050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner      Entry = PatternPredicates.size();
74050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    }
75050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    return Entry-1;
76050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
77e609a513f3c072bba28412c681465332a2822d9aChris Lattner
78e609a513f3c072bba28412c681465332a2822d9aChris Lattner  unsigned getComplexPat(const ComplexPattern &P) {
79e609a513f3c072bba28412c681465332a2822d9aChris Lattner    unsigned &Entry = ComplexPatternMap[&P];
80e609a513f3c072bba28412c681465332a2822d9aChris Lattner    if (Entry == 0) {
81e609a513f3c072bba28412c681465332a2822d9aChris Lattner      ComplexPatterns.push_back(&P);
82e609a513f3c072bba28412c681465332a2822d9aChris Lattner      Entry = ComplexPatterns.size();
83e609a513f3c072bba28412c681465332a2822d9aChris Lattner    }
84e609a513f3c072bba28412c681465332a2822d9aChris Lattner    return Entry-1;
85e609a513f3c072bba28412c681465332a2822d9aChris Lattner  }
868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNodeXFormID(Record *Rec) {
888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    unsigned &Entry = NodeXFormMap[Rec];
898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (Entry == 0) {
908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      NodeXForms.push_back(Rec);
918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      Entry = NodeXForms.size();
928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    }
938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return Entry-1;
948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
958e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
96e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner};
97e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner} // end anonymous namespace.
98e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
99d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattnerstatic unsigned GetVBRSize(unsigned Val) {
100d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  if (Val <= 127) return 1;
101d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
102d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned NumBytes = 0;
103d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  while (Val >= 128) {
104d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Val >>= 7;
105d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    ++NumBytes;
106d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
107d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  return NumBytes+1;
108d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner}
109d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
1105007e1e43541114f3737939234104b085fbe4acaChris Lattner/// EmitVBRValue - Emit the specified value as a VBR, returning the number of
1115007e1e43541114f3737939234104b085fbe4acaChris Lattner/// bytes emitted.
1125310654dc56c64b726bba7da82d568137ec81bbcChris Lattnerstatic uint64_t EmitVBRValue(uint64_t Val, raw_ostream &OS) {
1135007e1e43541114f3737939234104b085fbe4acaChris Lattner  if (Val <= 127) {
1145007e1e43541114f3737939234104b085fbe4acaChris Lattner    OS << Val << ", ";
1155007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 1;
1165007e1e43541114f3737939234104b085fbe4acaChris Lattner  }
1175007e1e43541114f3737939234104b085fbe4acaChris Lattner
1185310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  uint64_t InVal = Val;
1195007e1e43541114f3737939234104b085fbe4acaChris Lattner  unsigned NumBytes = 0;
120860d4a787f28f5f31e0c172e2ab80f5ab93cbf9bChris Lattner  while (Val >= 128) {
1215007e1e43541114f3737939234104b085fbe4acaChris Lattner    OS << (Val&127) << "|128,";
1225007e1e43541114f3737939234104b085fbe4acaChris Lattner    Val >>= 7;
1235007e1e43541114f3737939234104b085fbe4acaChris Lattner    ++NumBytes;
1245007e1e43541114f3737939234104b085fbe4acaChris Lattner  }
1255c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  OS << Val;
1265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  if (!OmitComments)
1275c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << "/*" << InVal << "*/";
1285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  OS << ", ";
1295007e1e43541114f3737939234104b085fbe4acaChris Lattner  return NumBytes+1;
1305007e1e43541114f3737939234104b085fbe4acaChris Lattner}
1315007e1e43541114f3737939234104b085fbe4acaChris Lattner
132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitMatcherOpcodes - Emit bytes for the specified matcher and return
133da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the number of bytes emitted.
134e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter::
135d6c84720df0b63e34081e0c7890f3074d8b110b9Chris LattnerEmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
136d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner            formatted_raw_ostream &OS) {
137da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.PadToColumn(Indent*2);
138da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  switch (N->getKind()) {
140d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  case Matcher::Scope: {
141d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    const ScopeMatcher *SM = cast<ScopeMatcher>(N);
142d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    assert(SM->getNext() == 0 && "Shouldn't have next after scope");
143d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
144d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    unsigned StartIdx = CurrentIdx;
145d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
146d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    // Emit all of the children.
147d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) {
148d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      if (i == 0) {
149d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        OS << "OPC_Scope, ";
150d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        ++CurrentIdx;
1515c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      } else  {
1525c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (!OmitComments) {
1535c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS << "/*" << CurrentIdx << "*/";
1545c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(Indent*2) << "/*Scope*/ ";
1555c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        } else
1565c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(Indent*2);
157d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      }
158d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
159d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // We need to encode the child and the offset of the failure code before
160d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // emitting either of them.  Handle this by buffering the output into a
161d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // string while we get the size.  Unfortunately, the offset of the
162d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // children depends on the VBR size of the child, so for large children we
163d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      // have to iterate a bit.
164d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      SmallString<128> TmpBuf;
165d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      unsigned ChildSize = 0;
166d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      unsigned VBRSize = 0;
167d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      do {
168d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        VBRSize = GetVBRSize(ChildSize);
169d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
170d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        TmpBuf.clear();
171d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        raw_svector_ostream OS(TmpBuf);
172d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner        formatted_raw_ostream FOS(OS);
173eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        ChildSize = EmitMatcherList(SM->getChild(i), Indent+1,
174eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner                                    CurrentIdx+VBRSize, FOS);
175d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      } while (GetVBRSize(ChildSize) != VBRSize);
176d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
177d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      assert(ChildSize != 0 && "Should not have a zero-sized child!");
178d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
179d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      CurrentIdx += EmitVBRValue(ChildSize, OS);
1805c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments) {
1815c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "/*->" << CurrentIdx+ChildSize << "*/";
1825a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner
1835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (i == 0)
1845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(CommentIndent) << "// " << SM->getNumChildren()
1855c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin            << " children in Scope";
1865c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
1875a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner
188d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      OS << '\n' << TmpBuf.str();
189d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner      CurrentIdx += ChildSize;
190d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    }
191d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
192d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    // Emit a zero as a sentinel indicating end of 'Scope'.
1935c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
1945c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*" << CurrentIdx << "*/";
1955c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2) << "0, ";
1965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
1975c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*End of Scope*/";
1985c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
199d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    return CurrentIdx - StartIdx + 1;
200d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
201d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
202b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordNode:
203845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "OPC_RecordNode,";
2045c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2055c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// #"
2065c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordMatcher>(N)->getResultNo() << " = "
2075c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordMatcher>(N)->getWhatFor();
2085c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
209da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
21019b5a7590b784f19875b9880ea8838c393431656Chris Lattner
211b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordChild:
212b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    OS << "OPC_RecordChild" << cast<RecordChildMatcher>(N)->getChildNo()
21319b5a7590b784f19875b9880ea8838c393431656Chris Lattner       << ',';
2145c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2155c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// #"
2165c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordChildMatcher>(N)->getResultNo() << " = "
2175c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << cast<RecordChildMatcher>(N)->getWhatFor();
2185c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
21919b5a7590b784f19875b9880ea8838c393431656Chris Lattner    return 1;
2208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
221b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::RecordMemRef:
2228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_RecordMemRef,\n";
2238e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 1;
2248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
225b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CaptureFlagInput:
2268e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_CaptureFlagInput,\n";
2278e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 1;
2288e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
229b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MoveChild:
230b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    OS << "OPC_MoveChild, " << cast<MoveChildMatcher>(N)->getChildNo() << ",\n";
231da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
232da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
233b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MoveParent:
234da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_MoveParent,\n";
235da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 1;
236da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
237b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckSame:
238da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckSame, "
239b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n";
240da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
241da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
242b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckPatternPredicate: {
243b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    StringRef Pred = cast<CheckPatternPredicateMatcher>(N)->getPredicate();
244050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS << "OPC_CheckPatternPredicate, " << getPatternPredicate(Pred) << ',';
2455c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2465c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// " << Pred;
2475c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
248da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
249050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
250b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckPredicate: {
251b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    StringRef Pred = cast<CheckPredicateMatcher>(N)->getPredicateName();
252050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner    OS << "OPC_CheckPredicate, " << getNodePredicate(Pred) << ',';
2535c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2545c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// " << Pred;
2555c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
256da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
257050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  }
258050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
259b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckOpcode:
260da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckOpcode, "
261a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner       << cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << ",\n";
262da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
263da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
264eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  case Matcher::SwitchOpcode: {
265eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    unsigned StartIdx = CurrentIdx;
266eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    const SwitchOpcodeMatcher *SOM = cast<SwitchOpcodeMatcher>(N);
2675c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << "OPC_SwitchOpcode ";
2685c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
2695c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*" << SOM->getNumCases() << " cases */";
2705c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
271eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
272eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
273eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // For each case we emit the size, then the opcode, then the matcher.
274eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    for (unsigned i = 0, e = SOM->getNumCases(); i != e; ++i) {
275eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // We need to encode the opcode and the offset of the case code before
276eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // emitting the case code.  Handle this by buffering the output into a
277eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // string while we get the size.  Unfortunately, the offset of the
278eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // children depends on the VBR size of the child, so for large children we
279eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // have to iterate a bit.
280eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      SmallString<128> TmpBuf;
281eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned ChildSize = 0;
282eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned VBRSize = 0;
283eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      do {
284eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        VBRSize = GetVBRSize(ChildSize);
285eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
286eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        TmpBuf.clear();
287eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        raw_svector_ostream OS(TmpBuf);
288eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        formatted_raw_ostream FOS(OS);
289eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        ChildSize = EmitMatcherList(SOM->getCaseMatcher(i),
290eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner                                    Indent+1, CurrentIdx+VBRSize+1, FOS);
291eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      } while (GetVBRSize(ChildSize) != VBRSize);
292eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
293eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      assert(ChildSize != 0 && "Should not have a zero-sized child!");
294eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
2955c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (i != 0) {
2965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2);
2975c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (!OmitComments)
2985c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin         OS << "/*SwitchOpcode*/ ";
2995c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
300eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
301eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // Emit the VBR.
302eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += EmitVBRValue(ChildSize, OS);
303eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
304eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      OS << " " << SOM->getCaseOpcode(i).getEnumName() << ",";
3055c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
3065c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "// ->" << CurrentIdx+ChildSize+1;
3075c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
308eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      ++CurrentIdx;
309eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      OS << TmpBuf.str();
310eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += ChildSize;
311eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    }
312eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
313eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Emit the final zero to terminate the switch.
3145c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2) << "0, ";
3155c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
3165c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "// EndSwitchOpcode";
317eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
318eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return CurrentIdx-StartIdx;
319eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
320eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
321fa342faef9d1c89de356ed83a6c6529ed3e87610Chris Lattner case Matcher::CheckType:
322da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckType, "
323b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
324da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
325b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckChildType:
32623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    OS << "OPC_CheckChild"
327b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
328b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
32923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    return 2;
33023cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
3315310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  case Matcher::CheckInteger:
3325310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckInteger, ";
3335310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS);
334b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckCondCode:
335da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckCondCode, ISD::"
336b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
337da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
338da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
339b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckValueType:
340da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckValueType, MVT::"
341b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n";
342da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
343da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
344b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckComplexPat: {
3455be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner    const ComplexPattern &Pattern =
346b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      cast<CheckComplexPatMatcher>(N)->getPattern();
3475be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner    OS << "OPC_CheckComplexPat, " << getComplexPat(Pattern) << ',';
3485c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
3495c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc();
3505c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << ": " << Pattern.getNumOperands() << " operands";
3515c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (Pattern.hasProperty(SDNPHasChain))
3525c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << " + chain result and input";
3535c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
354781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner    OS << '\n';
355da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
3565be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner  }
357da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
3585310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  case Matcher::CheckAndImm:
3595310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckAndImm, ";
3605310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS);
361da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
3625310654dc56c64b726bba7da82d568137ec81bbcChris Lattner  case Matcher::CheckOrImm:
3635310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckOrImm, ";
3645310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS);
3655310654dc56c64b726bba7da82d568137ec81bbcChris Lattner
366b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckFoldableChainNode:
36721390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner    OS << "OPC_CheckFoldableChainNode,\n";
368e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    return 1;
369b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckChainCompatible:
3709a747f1305e76025df2323a03b805a284f2cde77Chris Lattner    OS << "OPC_CheckChainCompatible, "
371b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckChainCompatibleMatcher>(N)->getPreviousOp() << ",\n";
3729a747f1305e76025df2323a03b805a284f2cde77Chris Lattner    return 2;
373845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
374b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitInteger: {
375b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
3765310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
377b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
3785310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    return 2+EmitVBRValue(Val, OS);
379906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner  }
380b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitStringInteger: {
381b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
3828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    // These should always fit into one byte.
3835310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
384b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      << getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", "
3858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      << Val << ",\n";
3868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
3878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
388906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner
389b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitRegister:
390906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner    OS << "OPC_EmitRegister, "
391b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<EmitRegisterMatcher>(N)->getVT()) << ", ";
392b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    if (Record *R = cast<EmitRegisterMatcher>(N)->getReg())
393906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner      OS << getQualifiedName(R) << ",\n";
3945c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    else {
3955c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "0 ";
3965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
3975c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "/*zero_reg*/";
3985c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << ",\n";
3995c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
400906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner    return 3;
4018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
402b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitConvertToTarget:
4038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitConvertToTarget, "
404b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n";
4058e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2;
4068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
407b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitMergeInputChains: {
408b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitMergeInputChainsMatcher *MN =
409b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      cast<EmitMergeInputChainsMatcher>(N);
4108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", ";
4118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i)
4128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << MN->getNode(i) << ", ";
4138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << '\n';
4148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2+MN->getNumNodes();
4158e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
416b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitCopyToReg:
4178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitCopyToReg, "
418b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", "
419b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg())
4208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << ",\n";
4218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
422b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitNodeXForm: {
423b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N);
4248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", "
4258e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << XF->getSlot() << ',';
4265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
4275c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// "<<XF->getNodeXForm()->getName();
4285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS <<'\n';
4298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
4308e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
4318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
432e86097af5598e44727875f00e492d43c978239beChris Lattner  case Matcher::EmitNode:
4339a21500edc485a2c383a03fba429943f031c1398Chris Lattner  case Matcher::MorphNodeTo: {
434e86097af5598e44727875f00e492d43c978239beChris Lattner    const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N);
4359a21500edc485a2c383a03fba429943f031c1398Chris Lattner    OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo");
436e86097af5598e44727875f00e492d43c978239beChris Lattner    OS << ", TARGET_OPCODE(" << EN->getOpcodeName() << "), 0";
4378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasChain())   OS << "|OPFL_Chain";
439ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner    if (EN->hasInFlag())  OS << "|OPFL_FlagInput";
440ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner    if (EN->hasOutFlag()) OS << "|OPFL_FlagOutput";
4418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasMemRefs()) OS << "|OPFL_MemRefs";
4428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->getNumFixedArityOperands() != -1)
4438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands();
4448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ",\n";
4458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4465c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2+4) << EN->getNumVTs();
4475c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
4485c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*#VTs*/";
4495c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
4508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i)
4518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << getEnumName(EN->getVT(i)) << ", ";
4528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4535c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << EN->getNumOperands();
4545c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
4555c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*#Ops*/";
4565c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
4575007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumOperandBytes = 0;
4585007e1e43541114f3737939234104b085fbe4acaChris Lattner    for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i) {
4595007e1e43541114f3737939234104b085fbe4acaChris Lattner      // We emit the operand numbers in VBR encoded format, in case the number
4605007e1e43541114f3737939234104b085fbe4acaChris Lattner      // is too large to represent with a byte.
4615007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS);
4625007e1e43541114f3737939234104b085fbe4acaChris Lattner    }
4636281cda6737bcda0e924318ddcce28392001691eChris Lattner
4645c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
4655c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      // Print the result #'s for EmitNode.
4665c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) {
4675c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (unsigned NumResults = EN->getNumVTs()) {
4685c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(CommentIndent) << "// Results = ";
4695c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          unsigned First = E->getFirstResultSlot();
4705c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          for (unsigned i = 0; i != NumResults; ++i)
4715c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin            OS << "#" << First+i << " ";
4725c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        }
4736281cda6737bcda0e924318ddcce28392001691eChris Lattner      }
4745c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
4755c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin
4765c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) {
4775c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2) << "// Src: "
4785c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          << *SNT->getPattern().getSrcPattern() << '\n';
4795c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2) << "// Dst: "
4805c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          << *SNT->getPattern().getDstPattern() << '\n';
4815c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
4825c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    } else
4835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
484c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner
4855007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 6+EN->getNumVTs()+NumOperandBytes;
4868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
487b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MarkFlagResults: {
488b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const MarkFlagResultsMatcher *CFR = cast<MarkFlagResultsMatcher>(N);
48902f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    OS << "OPC_MarkFlagResults, " << CFR->getNumNodes() << ", ";
49002f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    unsigned NumOperandBytes = 0;
49102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i)
49202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner      NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS);
49302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    OS << '\n';
49402f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    return 2+NumOperandBytes;
49502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  }
496b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CompleteMatch: {
497b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N);
49877f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", ";
4995007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumResultBytes = 0;
50077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i)
5015007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumResultBytes += EmitVBRValue(CM->getResult(i), OS);
50277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << '\n';
5035c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
5045c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(Indent*2) << "// Src: "
5055c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << *CM->getPattern().getSrcPattern() << '\n';
5065c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(Indent*2) << "// Dst: "
5075c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << *CM->getPattern().getDstPattern();
5085c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
5095c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
5105007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 2 + NumResultBytes;
511da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
51277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  }
513da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  assert(0 && "Unreachable");
514da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  return 0;
515da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
516da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
517bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner/// EmitMatcherList - Emit the bytes for the specified matcher subtree.
518e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter::
519b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris LattnerEmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
520984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner                formatted_raw_ostream &OS) {
521da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned Size = 0;
5228ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  while (N) {
52309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    if (unsigned(N->getKind()) >= Histogram.size())
52409b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      Histogram.resize(N->getKind()+1);
52509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    Histogram[N->getKind()]++;
5265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
5275c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*" << CurrentIdx << "*/";
528d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS);
5298fbad244bd436163296d81d4f182750e000fd16dChris Lattner    Size += MatcherSize;
5308fbad244bd436163296d81d4f182750e000fd16dChris Lattner    CurrentIdx += MatcherSize;
531da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
532bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    // If there are other nodes in this list, iterate to them, otherwise we're
533da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    // done.
534bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    N = N->getNext();
535da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
5368ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  return Size;
537da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
538da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
5394d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid MatcherTableEmitter::EmitPredicateFunctions(const CodeGenDAGPatterns &CGP,
5404d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                                                 formatted_raw_ostream &OS) {
541b49985a8499e18675db7e9baf920d6ef4e2b65cfChris Lattner  // FIXME: Don't build off the DAGISelEmitter's predicates, emit them directly
542b49985a8499e18675db7e9baf920d6ef4e2b65cfChris Lattner  // here into the case stmts.
543b49985a8499e18675db7e9baf920d6ef4e2b65cfChris Lattner
544e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit pattern predicates.
545d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!PatternPredicates.empty()) {
546d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n";
547d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
548d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
549d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
550d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ": return "  << PatternPredicates[i] << ";\n";
551d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
552d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
553d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
5544d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
555e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit Node predicates.
5564d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  // FIXME: Annoyingly, these are stored by name, which we never even emit. Yay?
5574d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  StringMap<TreePattern*> PFsByName;
5584d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5594d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
5604d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner       I != E; ++I)
5614d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    PFsByName[I->first->getName()] = I->second;
5624d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
563d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodePredicates.empty()) {
5644d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    OS << "bool CheckNodePredicate(SDNode *Node, unsigned PredNo) const {\n";
565d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
566d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
5674d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i) {
5684d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      // FIXME: Storing this by name is horrible.
5694d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      TreePattern *P =PFsByName[NodePredicates[i].substr(strlen("Predicate_"))];
5704d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      assert(P && "Unknown name?");
5714d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5724d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      // Emit the predicate code corresponding to this pattern.
5734d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string Code = P->getRecord()->getValueAsCode("Predicate");
5744d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      assert(!Code.empty() && "No code in this predicate");
5754d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << "  case " << i << ": { // " << NodePredicates[i] << '\n';
5764d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string ClassName;
5774d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (P->getOnlyTree()->isLeaf())
5784d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        ClassName = "SDNode";
5794d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
5804d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        ClassName =
5814d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner          CGP.getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName();
5824d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (ClassName == "SDNode")
5834d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    SDNode *N = Node;\n";
5844d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
5854d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    " << ClassName << "*N = cast<" << ClassName << ">(Node);\n";
5864d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << Code << "\n  }\n";
5874d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
588d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
589d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
590d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
591e609a513f3c072bba28412c681465332a2822d9aChris Lattner
592e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit CompletePattern matchers.
5938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
594d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!ComplexPatterns.empty()) {
595d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n";
596d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "      unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n";
597d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PatternNo) {\n";
598d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid pattern # in table?\");\n";
599d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
600d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      const ComplexPattern &P = *ComplexPatterns[i];
601d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      unsigned NumOps = P.getNumOperands();
6028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
603d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      if (P.hasProperty(SDNPHasChain))
604d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        ++NumOps;  // Get the chained node too.
605d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
606d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ":\n";
607d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "    Result.resize(Result.size()+" << NumOps << ");\n";
608d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "    return "  << P.getSelectFunc();
6098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
610d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      // FIXME: Temporary hack until old isel dies.
611d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      if (P.hasProperty(SDNPHasChain))
612d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        OS << "XXX";
613d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
614d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "(Root, N";
615d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      for (unsigned i = 0; i != NumOps; ++i)
616d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        OS << ", Result[Result.size()-" << (NumOps-i) << ']';
617d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << ");\n";
618d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    }
619d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
620d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
621e609a513f3c072bba28412c681465332a2822d9aChris Lattner  }
6228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
6234d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // Emit SDNodeXForm handlers.
6258e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
626d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodeXForms.empty()) {
627d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
628d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (XFormNo) {\n";
629d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid xform # in table?\");\n";
630d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
631d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    // FIXME: The node xform could take SDValue's instead of SDNode*'s.
6324d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) {
6334d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const CodeGenDAGPatterns::NodeXForm &Entry =
6344d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        CGP.getSDNodeTransform(NodeXForms[i]);
6354d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6364d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      Record *SDNode = Entry.first;
6374d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const std::string &Code = Entry.second;
6384d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6395c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "  case " << i << ": {  ";
6405c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
6415c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "// " << NodeXForms[i]->getName();
6425c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
6434d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6444d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName();
6454d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (ClassName == "SDNode")
6464d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    SDNode *N = V.getNode();\n";
6474d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
6484d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    " << ClassName << " *N = cast<" << ClassName
6494d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner           << ">(V.getNode());\n";
6504d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << Code << "\n  }\n";
6514d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
652d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
653d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
654d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
655050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner}
656050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
65709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattnervoid MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) {
6585c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  if (OmitComments)
6595c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    return;
66009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << "  // Opcode Histogram:\n";
66109b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  for (unsigned i = 0, e = Histogram.size(); i != e; ++i) {
66209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    OS << "  // #";
663b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    switch ((Matcher::KindTy)i) {
664b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::Scope: OS << "OPC_Scope"; break;
665b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
666b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
667b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
668b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CaptureFlagInput: OS << "OPC_CaptureFlagInput"; break;
669b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveChild: OS << "OPC_MoveChild"; break;
670b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveParent: OS << "OPC_MoveParent"; break;
671b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckSame: OS << "OPC_CheckSame"; break;
672b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPatternPredicate:
67309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckPatternPredicate"; break;
674b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPredicate: OS << "OPC_CheckPredicate"; break;
675b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOpcode: OS << "OPC_CheckOpcode"; break;
676eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    case Matcher::SwitchOpcode: OS << "OPC_SwitchOpcode"; break;
677b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckType: OS << "OPC_CheckType"; break;
678b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckChildType: OS << "OPC_CheckChildType"; break;
679b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckInteger: OS << "OPC_CheckInteger"; break;
680b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckCondCode: OS << "OPC_CheckCondCode"; break;
681b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckValueType: OS << "OPC_CheckValueType"; break;
682b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckComplexPat: OS << "OPC_CheckComplexPat"; break;
683b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckAndImm: OS << "OPC_CheckAndImm"; break;
684b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOrImm: OS << "OPC_CheckOrImm"; break;
685b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckFoldableChainNode:
68609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckFoldableChainNode"; break;
687499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::CheckChainCompatible: OS << "OPC_CheckChainCompatible"; break;
688b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitInteger: OS << "OPC_EmitInteger"; break;
689b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitStringInteger: OS << "OPC_EmitStringInteger"; break;
690b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitRegister: OS << "OPC_EmitRegister"; break;
691499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitConvertToTarget: OS << "OPC_EmitConvertToTarget"; break;
692499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break;
693b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
694b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
6959a21500edc485a2c383a03fba429943f031c1398Chris Lattner    case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break;
696b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
697b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break;
698b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
69909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    }
70009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
70109b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    OS.PadToColumn(40) << " = " << Histogram[i] << '\n';
70209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  }
70309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << '\n';
70409b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner}
70509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
706050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
7074d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid llvm::EmitMatcherTable(const Matcher *TheMatcher,
7084d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                            const CodeGenDAGPatterns &CGP, raw_ostream &O) {
709da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  formatted_raw_ostream OS(O);
710da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
711da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "// The main instruction selector code.\n";
712c84edb7bdd345db280c908583d55bdf4e670a225Chris Lattner  OS << "SDNode *SelectCode(SDNode *N) {\n";
713da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
714984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner  MatcherTableEmitter MatcherEmitter;
715e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
7168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  // Opcodes are emitted as 2 bytes, TARGET_OPCODE handles this.\n";
7178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  #define TARGET_OPCODE(X) X & 255, unsigned(X) >> 8\n";
718da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "  static const unsigned char MatcherTable[] = {\n";
719b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS);
720da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "    0\n  }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
72109b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
72209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  MatcherEmitter.EmitHistogram(OS);
72309b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
7248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  #undef TARGET_OPCODE\n";
725e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner  OS << "  return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
7265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  OS << '\n';
727050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
728050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  // Next up, emit the function for node and pattern predicates:
7294d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  MatcherEmitter.EmitPredicateFunctions(CGP, OS);
730da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
731