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