DAGISelMatcherEmitter.cpp revision d1aca7c8b4ea45fbee18fc18a21ed963175dd7bc
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
264cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  case Matcher::SwitchOpcode:
265cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  case Matcher::SwitchType: {
266eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    unsigned StartIdx = CurrentIdx;
267cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
268cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    unsigned NumCases;
269cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) {
270cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << "OPC_SwitchOpcode ";
271cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      NumCases = SOM->getNumCases();
272cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    } else {
273cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << "OPC_SwitchType ";
274cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      NumCases = cast<SwitchTypeMatcher>(N)->getNumCases();
275cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    }
276cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
2775c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
278cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << "/*" << NumCases << " cases */";
2795c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
280eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
281eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
282eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // For each case we emit the size, then the opcode, then the matcher.
283cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    for (unsigned i = 0, e = NumCases; i != e; ++i) {
284cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      const Matcher *Child;
285cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N))
286cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        Child = SOM->getCaseMatcher(i);
287cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      else
288cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i);
289cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
290eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // We need to encode the opcode and the offset of the case code before
291eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // emitting the case code.  Handle this by buffering the output into a
292eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // string while we get the size.  Unfortunately, the offset of the
293eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // children depends on the VBR size of the child, so for large children we
294eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // have to iterate a bit.
295eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      SmallString<128> TmpBuf;
296eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned ChildSize = 0;
297eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      unsigned VBRSize = 0;
298eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      do {
299eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        VBRSize = GetVBRSize(ChildSize);
300eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
301eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        TmpBuf.clear();
302eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        raw_svector_ostream OS(TmpBuf);
303eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner        formatted_raw_ostream FOS(OS);
304cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx+VBRSize+1, FOS);
305eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      } while (GetVBRSize(ChildSize) != VBRSize);
306eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
307eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      assert(ChildSize != 0 && "Should not have a zero-sized child!");
308eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
3095c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (i != 0) {
3105c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2);
3115c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (!OmitComments)
312cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        OS << (isa<SwitchOpcodeMatcher>(N) ?
313cfe2eab7446dedc471592fe702fefef783383171Chris Lattner                   "/*SwitchOpcode*/ " : "/*SwitchType*/ ");
3145c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
315eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
316eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      // Emit the VBR.
317eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += EmitVBRValue(ChildSize, OS);
318eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
319cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << ' ';
320cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N))
321cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        OS << SOM->getCaseOpcode(i).getEnumName();
322cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      else
323cfe2eab7446dedc471592fe702fefef783383171Chris Lattner        OS << getEnumName(cast<SwitchTypeMatcher>(N)->getCaseType(i));
324cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << ',';
325cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
3265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
3275c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "// ->" << CurrentIdx+ChildSize+1;
3285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
329eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      ++CurrentIdx;
330eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      OS << TmpBuf.str();
331eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner      CurrentIdx += ChildSize;
332eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    }
333eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
334eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Emit the final zero to terminate the switch.
3355c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2) << "0, ";
3365c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
337cfe2eab7446dedc471592fe702fefef783383171Chris Lattner      OS << (isa<SwitchOpcodeMatcher>(N) ?
338cfe2eab7446dedc471592fe702fefef783383171Chris Lattner             "// EndSwitchOpcode" : "// EndSwitchType");
339cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
3405520ad4dd9e3e726f96cf2c32c2b90f9467ff783Torok Edwin    OS << '\n';
341eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    ++CurrentIdx;
342eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return CurrentIdx-StartIdx;
343eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
344eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
345fa342faef9d1c89de356ed83a6c6529ed3e87610Chris Lattner case Matcher::CheckType:
346da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckType, "
347b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
348da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
349cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
350b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckChildType:
35123cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    OS << "OPC_CheckChild"
352b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
353b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
35423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    return 2;
35523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
35638fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  case Matcher::CheckInteger: {
3575310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckInteger, ";
35838fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes=1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS);
35938fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
36038fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
36138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  }
362b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckCondCode:
363da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckCondCode, ISD::"
364b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
365da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
366da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
367b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckValueType:
368da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    OS << "OPC_CheckValueType, MVT::"
369b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n";
370da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
371da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
372b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckComplexPat: {
3735be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner    const ComplexPattern &Pattern =
374b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      cast<CheckComplexPatMatcher>(N)->getPattern();
3755be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner    OS << "OPC_CheckComplexPat, " << getComplexPat(Pattern) << ',';
3765c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
3775c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc();
378d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner      OS << ':';
379d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner      for (unsigned i = 0, e = Pattern.getNumOperands(); i != e; ++i)
380d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner        OS << " #" << cast<CheckComplexPatMatcher>(N)->getFirstResult()+i;
381d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner
3825c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (Pattern.hasProperty(SDNPHasChain))
383d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner        OS << " + chain result";
3845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
385781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner    OS << '\n';
386da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return 2;
3875be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner  }
388da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
38938fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  case Matcher::CheckAndImm: {
3905310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckAndImm, ";
39138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes=1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS);
39238fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
39338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
39438fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  }
395da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
39638fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  case Matcher::CheckOrImm: {
3975310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_CheckOrImm, ";
39838fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes = 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS);
39938fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
40038fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
40138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner  }
4025310654dc56c64b726bba7da82d568137ec81bbcChris Lattner
403b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CheckFoldableChainNode:
40421390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner    OS << "OPC_CheckFoldableChainNode,\n";
405e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    return 1;
406845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
407b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitInteger: {
408b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
4095310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
410b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
41138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    unsigned Bytes = 2+EmitVBRValue(Val, OS);
41238fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    OS << '\n';
41338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    return Bytes;
414906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner  }
415b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitStringInteger: {
416b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
4178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    // These should always fit into one byte.
4185310654dc56c64b726bba7da82d568137ec81bbcChris Lattner    OS << "OPC_EmitInteger, "
419b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      << getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", "
4208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      << Val << ",\n";
4218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
4228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
423906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner
424b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitRegister:
425906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner    OS << "OPC_EmitRegister, "
426b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getEnumName(cast<EmitRegisterMatcher>(N)->getVT()) << ", ";
427b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    if (Record *R = cast<EmitRegisterMatcher>(N)->getReg())
428906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner      OS << getQualifiedName(R) << ",\n";
4295c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    else {
4305c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "0 ";
4315c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
4325c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "/*zero_reg*/";
4335c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << ",\n";
4345c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
435906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner    return 3;
4368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
437b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitConvertToTarget:
4388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitConvertToTarget, "
439b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n";
4408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2;
4418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
442b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitMergeInputChains: {
443b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitMergeInputChainsMatcher *MN =
444b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner      cast<EmitMergeInputChainsMatcher>(N);
4458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", ";
4468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i)
4478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << MN->getNode(i) << ", ";
4488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << '\n';
4498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 2+MN->getNumNodes();
4508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
451b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitCopyToReg:
4528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitCopyToReg, "
453b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", "
454b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner       << getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg())
4558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << ",\n";
4568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
457b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::EmitNodeXForm: {
458b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N);
4598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", "
4608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner       << XF->getSlot() << ',';
4615c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
4625c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(CommentIndent) << "// "<<XF->getNodeXForm()->getName();
4635c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS <<'\n';
4648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return 3;
4658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
4668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
467e86097af5598e44727875f00e492d43c978239beChris Lattner  case Matcher::EmitNode:
4689a21500edc485a2c383a03fba429943f031c1398Chris Lattner  case Matcher::MorphNodeTo: {
469e86097af5598e44727875f00e492d43c978239beChris Lattner    const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N);
4709a21500edc485a2c383a03fba429943f031c1398Chris Lattner    OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo");
471e86097af5598e44727875f00e492d43c978239beChris Lattner    OS << ", TARGET_OPCODE(" << EN->getOpcodeName() << "), 0";
4728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasChain())   OS << "|OPFL_Chain";
474ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner    if (EN->hasInFlag())  OS << "|OPFL_FlagInput";
475ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner    if (EN->hasOutFlag()) OS << "|OPFL_FlagOutput";
4768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->hasMemRefs()) OS << "|OPFL_MemRefs";
4778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    if (EN->getNumFixedArityOperands() != -1)
4788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands();
4798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ",\n";
4808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4815c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS.PadToColumn(Indent*2+4) << EN->getNumVTs();
4825c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
4835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*#VTs*/";
4845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
4858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i)
4868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      OS << getEnumName(EN->getVT(i)) << ", ";
4878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
4885c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << EN->getNumOperands();
4895c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
4905c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*#Ops*/";
4915c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << ", ";
4925007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumOperandBytes = 0;
49338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner    for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i)
4945007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS);
4956281cda6737bcda0e924318ddcce28392001691eChris Lattner
4965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
4975c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      // Print the result #'s for EmitNode.
4985c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) {
4995c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        if (unsigned NumResults = EN->getNumVTs()) {
5005c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          OS.PadToColumn(CommentIndent) << "// Results = ";
5015c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          unsigned First = E->getFirstResultSlot();
5025c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          for (unsigned i = 0; i != NumResults; ++i)
5035c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin            OS << "#" << First+i << " ";
5045c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        }
5056281cda6737bcda0e924318ddcce28392001691eChris Lattner      }
5065c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
5075c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin
5085c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) {
5095c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2) << "// Src: "
5105c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          << *SNT->getPattern().getSrcPattern() << '\n';
5115c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS.PadToColumn(Indent*2) << "// Dst: "
5125c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin          << *SNT->getPattern().getDstPattern() << '\n';
5135c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      }
5145c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    } else
5155c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
516c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner
5175007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 6+EN->getNumVTs()+NumOperandBytes;
5188e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
519b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::MarkFlagResults: {
520b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const MarkFlagResultsMatcher *CFR = cast<MarkFlagResultsMatcher>(N);
52102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    OS << "OPC_MarkFlagResults, " << CFR->getNumNodes() << ", ";
52202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    unsigned NumOperandBytes = 0;
52302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i)
52402f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner      NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS);
52502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    OS << '\n';
52602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    return 2+NumOperandBytes;
52702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  }
528b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  case Matcher::CompleteMatch: {
529b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N);
53077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", ";
5315007e1e43541114f3737939234104b085fbe4acaChris Lattner    unsigned NumResultBytes = 0;
53277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i)
5335007e1e43541114f3737939234104b085fbe4acaChris Lattner      NumResultBytes += EmitVBRValue(CM->getResult(i), OS);
53477f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    OS << '\n';
5355c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments) {
5365c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(Indent*2) << "// Src: "
5375c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << *CM->getPattern().getSrcPattern() << '\n';
5385c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS.PadToColumn(Indent*2) << "// Dst: "
5395c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        << *CM->getPattern().getDstPattern();
5405c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    }
5415c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    OS << '\n';
5425007e1e43541114f3737939234104b085fbe4acaChris Lattner    return 2 + NumResultBytes;
543da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
54477f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  }
545da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  assert(0 && "Unreachable");
546da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  return 0;
547da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
548da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
549bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner/// EmitMatcherList - Emit the bytes for the specified matcher subtree.
550e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter::
551b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris LattnerEmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
552984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner                formatted_raw_ostream &OS) {
553da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned Size = 0;
5548ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  while (N) {
55509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    if (unsigned(N->getKind()) >= Histogram.size())
55609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      Histogram.resize(N->getKind()+1);
55709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    Histogram[N->getKind()]++;
5585c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    if (!OmitComments)
5595c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "/*" << CurrentIdx << "*/";
560d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS);
5618fbad244bd436163296d81d4f182750e000fd16dChris Lattner    Size += MatcherSize;
5628fbad244bd436163296d81d4f182750e000fd16dChris Lattner    CurrentIdx += MatcherSize;
563da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
564bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    // If there are other nodes in this list, iterate to them, otherwise we're
565da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    // done.
566bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    N = N->getNext();
567da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
5688ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner  return Size;
569da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
570da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
5714d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid MatcherTableEmitter::EmitPredicateFunctions(const CodeGenDAGPatterns &CGP,
5724d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                                                 formatted_raw_ostream &OS) {
573e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit pattern predicates.
574d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!PatternPredicates.empty()) {
575d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n";
576d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
577d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
578d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
579d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ": return "  << PatternPredicates[i] << ";\n";
580d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
581d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
582d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
5834d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
584e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit Node predicates.
5854d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  // FIXME: Annoyingly, these are stored by name, which we never even emit. Yay?
5864d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  StringMap<TreePattern*> PFsByName;
5874d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
5884d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
5894d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner       I != E; ++I)
5904d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    PFsByName[I->first->getName()] = I->second;
5914d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
592d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodePredicates.empty()) {
5934d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    OS << "bool CheckNodePredicate(SDNode *Node, unsigned PredNo) const {\n";
594d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PredNo) {\n";
595d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid predicate in table?\");\n";
5964d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i) {
5974d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      // FIXME: Storing this by name is horrible.
5984d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      TreePattern *P =PFsByName[NodePredicates[i].substr(strlen("Predicate_"))];
5994d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      assert(P && "Unknown name?");
6004d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6014d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      // Emit the predicate code corresponding to this pattern.
6024d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string Code = P->getRecord()->getValueAsCode("Predicate");
6034d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      assert(!Code.empty() && "No code in this predicate");
6044d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << "  case " << i << ": { // " << NodePredicates[i] << '\n';
6054d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string ClassName;
6064d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (P->getOnlyTree()->isLeaf())
6074d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        ClassName = "SDNode";
6084d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
6094d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        ClassName =
6104d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner          CGP.getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName();
6114d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (ClassName == "SDNode")
6124d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    SDNode *N = Node;\n";
6134d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
6144d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    " << ClassName << "*N = cast<" << ClassName << ">(Node);\n";
6154d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << Code << "\n  }\n";
6164d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
617d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
618d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
619d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
620e609a513f3c072bba28412c681465332a2822d9aChris Lattner
621e609a513f3c072bba28412c681465332a2822d9aChris Lattner  // Emit CompletePattern matchers.
6228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
623d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!ComplexPatterns.empty()) {
624d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n";
625d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "      unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n";
626d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (PatternNo) {\n";
627d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid pattern # in table?\");\n";
628d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
629d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      const ComplexPattern &P = *ComplexPatterns[i];
630d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      unsigned NumOps = P.getNumOperands();
6318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
632d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      if (P.hasProperty(SDNPHasChain))
633d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        ++NumOps;  // Get the chained node too.
634d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
635d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "  case " << i << ":\n";
636d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "    Result.resize(Result.size()+" << NumOps << ");\n";
637d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "    return "  << P.getSelectFunc();
6388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
639d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << "(Root, N";
640d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      for (unsigned i = 0; i != NumOps; ++i)
641d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner        OS << ", Result[Result.size()-" << (NumOps-i) << ']';
642d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner      OS << ");\n";
643d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    }
644d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
645d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
646e609a513f3c072bba28412c681465332a2822d9aChris Lattner  }
6478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
6484d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // Emit SDNodeXForm handlers.
6508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  // FIXME: This should be const.
651d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  if (!NodeXForms.empty()) {
652d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
653d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  switch (XFormNo) {\n";
654d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  default: assert(0 && \"Invalid xform # in table?\");\n";
655d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner
656d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    // FIXME: The node xform could take SDValue's instead of SDNode*'s.
6574d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) {
6584d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const CodeGenDAGPatterns::NodeXForm &Entry =
6594d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        CGP.getSDNodeTransform(NodeXForms[i]);
6604d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6614d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      Record *SDNode = Entry.first;
6624d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      const std::string &Code = Entry.second;
6634d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6645c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << "  case " << i << ": {  ";
6655c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      if (!OmitComments)
6665c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin        OS << "// " << NodeXForms[i]->getName();
6675c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin      OS << '\n';
6684d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner
6694d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName();
6704d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      if (ClassName == "SDNode")
6714d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    SDNode *N = V.getNode();\n";
6724d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      else
6734d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner        OS << "    " << ClassName << " *N = cast<" << ClassName
6744d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner           << ">(V.getNode());\n";
6754d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner      OS << Code << "\n  }\n";
6764d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner    }
677d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "  }\n";
678d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner    OS << "}\n\n";
679d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner  }
680050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner}
681050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
68209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattnervoid MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) {
6835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  if (OmitComments)
6845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin    return;
68509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << "  // Opcode Histogram:\n";
68609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  for (unsigned i = 0, e = Histogram.size(); i != e; ++i) {
68709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    OS << "  // #";
688b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    switch ((Matcher::KindTy)i) {
689b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::Scope: OS << "OPC_Scope"; break;
690b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
691b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
692b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
693b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CaptureFlagInput: OS << "OPC_CaptureFlagInput"; break;
694b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveChild: OS << "OPC_MoveChild"; break;
695b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MoveParent: OS << "OPC_MoveParent"; break;
696b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckSame: OS << "OPC_CheckSame"; break;
697b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPatternPredicate:
69809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckPatternPredicate"; break;
699b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckPredicate: OS << "OPC_CheckPredicate"; break;
700b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOpcode: OS << "OPC_CheckOpcode"; break;
701eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    case Matcher::SwitchOpcode: OS << "OPC_SwitchOpcode"; break;
702b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckType: OS << "OPC_CheckType"; break;
703cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    case Matcher::SwitchType: OS << "OPC_SwitchType"; break;
704b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckChildType: OS << "OPC_CheckChildType"; break;
705b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckInteger: OS << "OPC_CheckInteger"; break;
706b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckCondCode: OS << "OPC_CheckCondCode"; break;
707b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckValueType: OS << "OPC_CheckValueType"; break;
708b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckComplexPat: OS << "OPC_CheckComplexPat"; break;
709b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckAndImm: OS << "OPC_CheckAndImm"; break;
710b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckOrImm: OS << "OPC_CheckOrImm"; break;
711b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CheckFoldableChainNode:
71209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner      OS << "OPC_CheckFoldableChainNode"; break;
713b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitInteger: OS << "OPC_EmitInteger"; break;
714b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitStringInteger: OS << "OPC_EmitStringInteger"; break;
715b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitRegister: OS << "OPC_EmitRegister"; break;
716499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitConvertToTarget: OS << "OPC_EmitConvertToTarget"; break;
717499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner    case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break;
718b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
719b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
7209a21500edc485a2c383a03fba429943f031c1398Chris Lattner    case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break;
721b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
722b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break;
723b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
72409b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    }
72509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
72609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner    OS.PadToColumn(40) << " = " << Histogram[i] << '\n';
72709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  }
72809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  OS << '\n';
72909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner}
73009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
731050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
7324d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid llvm::EmitMatcherTable(const Matcher *TheMatcher,
7334d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner                            const CodeGenDAGPatterns &CGP, raw_ostream &O) {
734da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  formatted_raw_ostream OS(O);
735da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
736da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "// The main instruction selector code.\n";
737c84edb7bdd345db280c908583d55bdf4e670a225Chris Lattner  OS << "SDNode *SelectCode(SDNode *N) {\n";
738da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
739984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner  MatcherTableEmitter MatcherEmitter;
740e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner
7418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  // Opcodes are emitted as 2 bytes, TARGET_OPCODE handles this.\n";
7428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  #define TARGET_OPCODE(X) X & 255, unsigned(X) >> 8\n";
743da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "  static const unsigned char MatcherTable[] = {\n";
744b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS);
745da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS << "    0\n  }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
74609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
74709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner  MatcherEmitter.EmitHistogram(OS);
74809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner
7498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << "  #undef TARGET_OPCODE\n";
750e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner  OS << "  return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
7515c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin  OS << '\n';
752050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner
753050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner  // Next up, emit the function for node and pattern predicates:
7544d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner  MatcherEmitter.EmitPredicateFunctions(CGP, OS);
755da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
756