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