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