DAGISelMatcherEmitter.cpp revision d1aca7c8b4ea45fbee18fc18a21ed963175dd7bc
1da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===- DAGISelMatcherEmitter.cpp - Matcher Emitter ------------------------===// 2da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// 3da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// The LLVM Compiler Infrastructure 4da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// 5da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file is distributed under the University of Illinois Open Source 6da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// License. See LICENSE.TXT for details. 7da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// 8da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===// 9da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// 10da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file contains code to generate C++ code a matcher. 11da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// 12da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===// 13da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "DAGISelMatcher.h" 15da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "CodeGenDAGPatterns.h" 168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner#include "Record.h" 17e609a513f3c072bba28412c681465332a2822d9aChris Lattner#include "llvm/ADT/DenseMap.h" 18da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/ADT/SmallString.h" 19050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner#include "llvm/ADT/StringMap.h" 205c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin#include "llvm/Support/CommandLine.h" 21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/FormattedStream.h" 22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm; 23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerenum { 255be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner CommentIndent = 30 26da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 27da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin// To reduce generated source code size. 295c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwinstatic cl::opt<bool> 305c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok EdwinOmitComments("omit-comments", cl::desc("Do not generate comments"), 315c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin cl::init(false)); 325c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin 33e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnernamespace { 34e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerclass MatcherTableEmitter { 35050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner StringMap<unsigned> NodePredicateMap, PatternPredicateMap; 36050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner std::vector<std::string> NodePredicates, PatternPredicates; 37e609a513f3c072bba28412c681465332a2822d9aChris Lattner 38e609a513f3c072bba28412c681465332a2822d9aChris Lattner DenseMap<const ComplexPattern*, unsigned> ComplexPatternMap; 39e609a513f3c072bba28412c681465332a2822d9aChris Lattner std::vector<const ComplexPattern*> ComplexPatterns; 408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner DenseMap<Record*, unsigned> NodeXFormMap; 434d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner std::vector<Record*> NodeXForms; 448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 4509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner // Per opcode frequence count. 4609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner std::vector<unsigned> Histogram; 47e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerpublic: 48984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner MatcherTableEmitter() {} 49e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner 50b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner unsigned EmitMatcherList(const Matcher *N, unsigned Indent, 518fbad244bd436163296d81d4f182750e000fd16dChris Lattner unsigned StartIdx, formatted_raw_ostream &OS); 52050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner 534d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner void EmitPredicateFunctions(const CodeGenDAGPatterns &CGP, 544d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner formatted_raw_ostream &OS); 5509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner 5609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner void EmitHistogram(formatted_raw_ostream &OS); 57e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerprivate: 58d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner unsigned EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx, 59984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner formatted_raw_ostream &OS); 60050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner 61050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner unsigned getNodePredicate(StringRef PredName) { 62050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner unsigned &Entry = NodePredicateMap[PredName]; 63050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner if (Entry == 0) { 64050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner NodePredicates.push_back(PredName.str()); 65050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner Entry = NodePredicates.size(); 66050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner } 67050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner return Entry-1; 68050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner } 69050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner unsigned getPatternPredicate(StringRef PredName) { 70050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner unsigned &Entry = PatternPredicateMap[PredName]; 71050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner if (Entry == 0) { 72050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner PatternPredicates.push_back(PredName.str()); 73050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner Entry = PatternPredicates.size(); 74050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner } 75050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner return Entry-1; 76050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner } 77e609a513f3c072bba28412c681465332a2822d9aChris Lattner 78e609a513f3c072bba28412c681465332a2822d9aChris Lattner unsigned getComplexPat(const ComplexPattern &P) { 79e609a513f3c072bba28412c681465332a2822d9aChris Lattner unsigned &Entry = ComplexPatternMap[&P]; 80e609a513f3c072bba28412c681465332a2822d9aChris Lattner if (Entry == 0) { 81e609a513f3c072bba28412c681465332a2822d9aChris Lattner ComplexPatterns.push_back(&P); 82e609a513f3c072bba28412c681465332a2822d9aChris Lattner Entry = ComplexPatterns.size(); 83e609a513f3c072bba28412c681465332a2822d9aChris Lattner } 84e609a513f3c072bba28412c681465332a2822d9aChris Lattner return Entry-1; 85e609a513f3c072bba28412c681465332a2822d9aChris Lattner } 868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getNodeXFormID(Record *Rec) { 888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned &Entry = NodeXFormMap[Rec]; 898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner if (Entry == 0) { 908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner NodeXForms.push_back(Rec); 918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner Entry = NodeXForms.size(); 928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return Entry-1; 948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 958e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 96e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner}; 97e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner} // end anonymous namespace. 98e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner 99d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattnerstatic unsigned GetVBRSize(unsigned Val) { 100d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner if (Val <= 127) return 1; 101d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 102d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner unsigned NumBytes = 0; 103d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner while (Val >= 128) { 104d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner Val >>= 7; 105d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner ++NumBytes; 106d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner } 107d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner return NumBytes+1; 108d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner} 109d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 1105007e1e43541114f3737939234104b085fbe4acaChris Lattner/// EmitVBRValue - Emit the specified value as a VBR, returning the number of 1115007e1e43541114f3737939234104b085fbe4acaChris Lattner/// bytes emitted. 1125310654dc56c64b726bba7da82d568137ec81bbcChris Lattnerstatic uint64_t EmitVBRValue(uint64_t Val, raw_ostream &OS) { 1135007e1e43541114f3737939234104b085fbe4acaChris Lattner if (Val <= 127) { 1145007e1e43541114f3737939234104b085fbe4acaChris Lattner OS << Val << ", "; 1155007e1e43541114f3737939234104b085fbe4acaChris Lattner return 1; 1165007e1e43541114f3737939234104b085fbe4acaChris Lattner } 1175007e1e43541114f3737939234104b085fbe4acaChris Lattner 1185310654dc56c64b726bba7da82d568137ec81bbcChris Lattner uint64_t InVal = Val; 1195007e1e43541114f3737939234104b085fbe4acaChris Lattner unsigned NumBytes = 0; 120860d4a787f28f5f31e0c172e2ab80f5ab93cbf9bChris Lattner while (Val >= 128) { 1215007e1e43541114f3737939234104b085fbe4acaChris Lattner OS << (Val&127) << "|128,"; 1225007e1e43541114f3737939234104b085fbe4acaChris Lattner Val >>= 7; 1235007e1e43541114f3737939234104b085fbe4acaChris Lattner ++NumBytes; 1245007e1e43541114f3737939234104b085fbe4acaChris Lattner } 1255c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << Val; 1265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 1275c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*" << InVal << "*/"; 1285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << ", "; 1295007e1e43541114f3737939234104b085fbe4acaChris Lattner return NumBytes+1; 1305007e1e43541114f3737939234104b085fbe4acaChris Lattner} 1315007e1e43541114f3737939234104b085fbe4acaChris Lattner 132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitMatcherOpcodes - Emit bytes for the specified matcher and return 133da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the number of bytes emitted. 134e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter:: 135d6c84720df0b63e34081e0c7890f3074d8b110b9Chris LattnerEmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx, 136d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner formatted_raw_ostream &OS) { 137da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(Indent*2); 138da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner switch (N->getKind()) { 140d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner case Matcher::Scope: { 141d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner const ScopeMatcher *SM = cast<ScopeMatcher>(N); 142d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner assert(SM->getNext() == 0 && "Shouldn't have next after scope"); 143d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 144d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner unsigned StartIdx = CurrentIdx; 145d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 146d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner // Emit all of the children. 147d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) { 148d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner if (i == 0) { 149d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner OS << "OPC_Scope, "; 150d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner ++CurrentIdx; 1515c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } else { 1525c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) { 1535c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*" << CurrentIdx << "*/"; 1545c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2) << "/*Scope*/ "; 1555c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } else 1565c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2); 157d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner } 158d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 159d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner // We need to encode the child and the offset of the failure code before 160d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner // emitting either of them. Handle this by buffering the output into a 161d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner // string while we get the size. Unfortunately, the offset of the 162d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner // children depends on the VBR size of the child, so for large children we 163d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner // have to iterate a bit. 164d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner SmallString<128> TmpBuf; 165d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner unsigned ChildSize = 0; 166d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner unsigned VBRSize = 0; 167d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner do { 168d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner VBRSize = GetVBRSize(ChildSize); 169d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 170d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner TmpBuf.clear(); 171d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner raw_svector_ostream OS(TmpBuf); 172d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner formatted_raw_ostream FOS(OS); 173eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner ChildSize = EmitMatcherList(SM->getChild(i), Indent+1, 174eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner CurrentIdx+VBRSize, FOS); 175d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner } while (GetVBRSize(ChildSize) != VBRSize); 176d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 177d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner assert(ChildSize != 0 && "Should not have a zero-sized child!"); 178d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 179d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner CurrentIdx += EmitVBRValue(ChildSize, OS); 1805c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) { 1815c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*->" << CurrentIdx+ChildSize << "*/"; 1825a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner 1835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (i == 0) 1845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// " << SM->getNumChildren() 1855c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << " children in Scope"; 1865c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } 1875a56e5c82aec731cac58db5a86276d526f97a6e2Chris Lattner 188d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner OS << '\n' << TmpBuf.str(); 189d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner CurrentIdx += ChildSize; 190d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner } 191d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 192d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner // Emit a zero as a sentinel indicating end of 'Scope'. 1935c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 1945c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*" << CurrentIdx << "*/"; 1955c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2) << "0, "; 1965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 1975c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*End of Scope*/"; 1985c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 199d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner return CurrentIdx - StartIdx + 1; 200d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner } 201d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 202b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::RecordNode: 203845c04273461b2a10754a1455b02916a19ea72aaChris Lattner OS << "OPC_RecordNode,"; 2045c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 2055c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// #" 2065c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << cast<RecordMatcher>(N)->getResultNo() << " = " 2075c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << cast<RecordMatcher>(N)->getWhatFor(); 2085c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 209da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 1; 21019b5a7590b784f19875b9880ea8838c393431656Chris Lattner 211b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::RecordChild: 212b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner OS << "OPC_RecordChild" << cast<RecordChildMatcher>(N)->getChildNo() 21319b5a7590b784f19875b9880ea8838c393431656Chris Lattner << ','; 2145c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 2155c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// #" 2165c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << cast<RecordChildMatcher>(N)->getResultNo() << " = " 2175c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << cast<RecordChildMatcher>(N)->getWhatFor(); 2185c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 21919b5a7590b784f19875b9880ea8838c393431656Chris Lattner return 1; 2208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 221b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::RecordMemRef: 2228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << "OPC_RecordMemRef,\n"; 2238e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return 1; 2248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 225b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CaptureFlagInput: 2268e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << "OPC_CaptureFlagInput,\n"; 2278e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return 1; 2288e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 229b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::MoveChild: 230b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner OS << "OPC_MoveChild, " << cast<MoveChildMatcher>(N)->getChildNo() << ",\n"; 231da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 232da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 233b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::MoveParent: 234da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_MoveParent,\n"; 235da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 1; 236da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 237b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckSame: 238da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckSame, " 239b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n"; 240da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 241da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 242b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckPatternPredicate: { 243b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner StringRef Pred = cast<CheckPatternPredicateMatcher>(N)->getPredicate(); 244050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner OS << "OPC_CheckPatternPredicate, " << getPatternPredicate(Pred) << ','; 2455c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 2465c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// " << Pred; 2475c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 248da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 249050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner } 250b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckPredicate: { 251b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner StringRef Pred = cast<CheckPredicateMatcher>(N)->getPredicateName(); 252050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner OS << "OPC_CheckPredicate, " << getNodePredicate(Pred) << ','; 2535c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 2545c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// " << Pred; 2555c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 256da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 257050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner } 258050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner 259b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckOpcode: 260da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckOpcode, " 261a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner << cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << ",\n"; 262da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 263da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 264cfe2eab7446dedc471592fe702fefef783383171Chris Lattner case Matcher::SwitchOpcode: 265cfe2eab7446dedc471592fe702fefef783383171Chris Lattner case Matcher::SwitchType: { 266eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner unsigned StartIdx = CurrentIdx; 267cfe2eab7446dedc471592fe702fefef783383171Chris Lattner 268cfe2eab7446dedc471592fe702fefef783383171Chris Lattner unsigned NumCases; 269cfe2eab7446dedc471592fe702fefef783383171Chris Lattner if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) { 270cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << "OPC_SwitchOpcode "; 271cfe2eab7446dedc471592fe702fefef783383171Chris Lattner NumCases = SOM->getNumCases(); 272cfe2eab7446dedc471592fe702fefef783383171Chris Lattner } else { 273cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << "OPC_SwitchType "; 274cfe2eab7446dedc471592fe702fefef783383171Chris Lattner NumCases = cast<SwitchTypeMatcher>(N)->getNumCases(); 275cfe2eab7446dedc471592fe702fefef783383171Chris Lattner } 276cfe2eab7446dedc471592fe702fefef783383171Chris Lattner 2775c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 278cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << "/*" << NumCases << " cases */"; 2795c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << ", "; 280eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner ++CurrentIdx; 281eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 282eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // For each case we emit the size, then the opcode, then the matcher. 283cfe2eab7446dedc471592fe702fefef783383171Chris Lattner for (unsigned i = 0, e = NumCases; i != e; ++i) { 284cfe2eab7446dedc471592fe702fefef783383171Chris Lattner const Matcher *Child; 285cfe2eab7446dedc471592fe702fefef783383171Chris Lattner if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) 286cfe2eab7446dedc471592fe702fefef783383171Chris Lattner Child = SOM->getCaseMatcher(i); 287cfe2eab7446dedc471592fe702fefef783383171Chris Lattner else 288cfe2eab7446dedc471592fe702fefef783383171Chris Lattner Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i); 289cfe2eab7446dedc471592fe702fefef783383171Chris Lattner 290eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // We need to encode the opcode and the offset of the case code before 291eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // emitting the case code. Handle this by buffering the output into a 292eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // string while we get the size. Unfortunately, the offset of the 293eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // children depends on the VBR size of the child, so for large children we 294eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // have to iterate a bit. 295eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner SmallString<128> TmpBuf; 296eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner unsigned ChildSize = 0; 297eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner unsigned VBRSize = 0; 298eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner do { 299eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner VBRSize = GetVBRSize(ChildSize); 300eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 301eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner TmpBuf.clear(); 302eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner raw_svector_ostream OS(TmpBuf); 303eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner formatted_raw_ostream FOS(OS); 304cfe2eab7446dedc471592fe702fefef783383171Chris Lattner ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx+VBRSize+1, FOS); 305eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner } while (GetVBRSize(ChildSize) != VBRSize); 306eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 307eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner assert(ChildSize != 0 && "Should not have a zero-sized child!"); 308eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 3095c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (i != 0) { 3105c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2); 3115c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 312cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << (isa<SwitchOpcodeMatcher>(N) ? 313cfe2eab7446dedc471592fe702fefef783383171Chris Lattner "/*SwitchOpcode*/ " : "/*SwitchType*/ "); 3145c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } 315eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 316eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // Emit the VBR. 317eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner CurrentIdx += EmitVBRValue(ChildSize, OS); 318eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 319cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << ' '; 320cfe2eab7446dedc471592fe702fefef783383171Chris Lattner if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) 321cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << SOM->getCaseOpcode(i).getEnumName(); 322cfe2eab7446dedc471592fe702fefef783383171Chris Lattner else 323cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << getEnumName(cast<SwitchTypeMatcher>(N)->getCaseType(i)); 324cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << ','; 325cfe2eab7446dedc471592fe702fefef783383171Chris Lattner 3265c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 3275c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "// ->" << CurrentIdx+ChildSize+1; 3285c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 329eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner ++CurrentIdx; 330eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner OS << TmpBuf.str(); 331eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner CurrentIdx += ChildSize; 332eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner } 333eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 334eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // Emit the final zero to terminate the switch. 3355c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2) << "0, "; 3365c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 337cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS << (isa<SwitchOpcodeMatcher>(N) ? 338cfe2eab7446dedc471592fe702fefef783383171Chris Lattner "// EndSwitchOpcode" : "// EndSwitchType"); 339cfe2eab7446dedc471592fe702fefef783383171Chris Lattner 3405520ad4dd9e3e726f96cf2c32c2b90f9467ff783Torok Edwin OS << '\n'; 341eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner ++CurrentIdx; 342eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner return CurrentIdx-StartIdx; 343eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner } 344eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 345fa342faef9d1c89de356ed83a6c6529ed3e87610Chris Lattner case Matcher::CheckType: 346da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckType, " 347b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n"; 348da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 349cfe2eab7446dedc471592fe702fefef783383171Chris Lattner 350b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckChildType: 35123cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner OS << "OPC_CheckChild" 352b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, " 353b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n"; 35423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner return 2; 35523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner 35638fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner case Matcher::CheckInteger: { 3575310654dc56c64b726bba7da82d568137ec81bbcChris Lattner OS << "OPC_CheckInteger, "; 35838fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner unsigned Bytes=1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS); 35938fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner OS << '\n'; 36038fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner return Bytes; 36138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner } 362b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckCondCode: 363da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckCondCode, ISD::" 364b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n"; 365da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 366da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 367b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckValueType: 368da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckValueType, MVT::" 369b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n"; 370da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 371da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 372b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckComplexPat: { 3735be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner const ComplexPattern &Pattern = 374b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner cast<CheckComplexPatMatcher>(N)->getPattern(); 3755be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner OS << "OPC_CheckComplexPat, " << getComplexPat(Pattern) << ','; 3765c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) { 3775c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc(); 378d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner OS << ':'; 379d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner for (unsigned i = 0, e = Pattern.getNumOperands(); i != e; ++i) 380d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner OS << " #" << cast<CheckComplexPatMatcher>(N)->getFirstResult()+i; 381d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner 3825c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (Pattern.hasProperty(SDNPHasChain)) 383d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner OS << " + chain result"; 3845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } 385781f359c1a7f590c4f8828ad9d542606c3a0ee12Chris Lattner OS << '\n'; 386da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 3875be6e5990b1da82e31f4236d1b392e52637cbe2eChris Lattner } 388da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 38938fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner case Matcher::CheckAndImm: { 3905310654dc56c64b726bba7da82d568137ec81bbcChris Lattner OS << "OPC_CheckAndImm, "; 39138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner unsigned Bytes=1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS); 39238fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner OS << '\n'; 39338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner return Bytes; 39438fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner } 395da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 39638fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner case Matcher::CheckOrImm: { 3975310654dc56c64b726bba7da82d568137ec81bbcChris Lattner OS << "OPC_CheckOrImm, "; 39838fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner unsigned Bytes = 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS); 39938fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner OS << '\n'; 40038fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner return Bytes; 40138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner } 4025310654dc56c64b726bba7da82d568137ec81bbcChris Lattner 403b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckFoldableChainNode: 40421390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner OS << "OPC_CheckFoldableChainNode,\n"; 405e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner return 1; 406845c04273461b2a10754a1455b02916a19ea72aaChris Lattner 407b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitInteger: { 408b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner int64_t Val = cast<EmitIntegerMatcher>(N)->getValue(); 4095310654dc56c64b726bba7da82d568137ec81bbcChris Lattner OS << "OPC_EmitInteger, " 410b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", "; 41138fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner unsigned Bytes = 2+EmitVBRValue(Val, OS); 41238fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner OS << '\n'; 41338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner return Bytes; 414906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner } 415b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitStringInteger: { 416b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue(); 4178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner // These should always fit into one byte. 4185310654dc56c64b726bba7da82d568137ec81bbcChris Lattner OS << "OPC_EmitInteger, " 419b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", " 4208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner << Val << ",\n"; 4218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return 3; 4228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 423906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner 424b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitRegister: 425906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner OS << "OPC_EmitRegister, " 426b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << getEnumName(cast<EmitRegisterMatcher>(N)->getVT()) << ", "; 427b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner if (Record *R = cast<EmitRegisterMatcher>(N)->getReg()) 428906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner OS << getQualifiedName(R) << ",\n"; 4295c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin else { 4305c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "0 "; 4315c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 4325c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*zero_reg*/"; 4335c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << ",\n"; 4345c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } 435906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner return 3; 4368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 437b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitConvertToTarget: 4388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << "OPC_EmitConvertToTarget, " 439b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n"; 4408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return 2; 4418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 442b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitMergeInputChains: { 443b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner const EmitMergeInputChainsMatcher *MN = 444b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner cast<EmitMergeInputChainsMatcher>(N); 4458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", "; 4468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i) 4478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << MN->getNode(i) << ", "; 4488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << '\n'; 4498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return 2+MN->getNumNodes(); 4508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 451b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitCopyToReg: 4528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << "OPC_EmitCopyToReg, " 453b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", " 454b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner << getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg()) 4558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner << ",\n"; 4568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return 3; 457b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitNodeXForm: { 458b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N); 4598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", " 4608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner << XF->getSlot() << ','; 4615c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 4625c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// "<<XF->getNodeXForm()->getName(); 4635c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS <<'\n'; 4648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return 3; 4658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 4668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 467e86097af5598e44727875f00e492d43c978239beChris Lattner case Matcher::EmitNode: 4689a21500edc485a2c383a03fba429943f031c1398Chris Lattner case Matcher::MorphNodeTo: { 469e86097af5598e44727875f00e492d43c978239beChris Lattner const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N); 4709a21500edc485a2c383a03fba429943f031c1398Chris Lattner OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo"); 471e86097af5598e44727875f00e492d43c978239beChris Lattner OS << ", TARGET_OPCODE(" << EN->getOpcodeName() << "), 0"; 4728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 4738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner if (EN->hasChain()) OS << "|OPFL_Chain"; 474ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner if (EN->hasInFlag()) OS << "|OPFL_FlagInput"; 475ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner if (EN->hasOutFlag()) OS << "|OPFL_FlagOutput"; 4768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner if (EN->hasMemRefs()) OS << "|OPFL_MemRefs"; 4778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner if (EN->getNumFixedArityOperands() != -1) 4788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands(); 4798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << ",\n"; 4808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 4815c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2+4) << EN->getNumVTs(); 4825c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 4835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*#VTs*/"; 4845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << ", "; 4858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i) 4868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << getEnumName(EN->getVT(i)) << ", "; 4878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 4885c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << EN->getNumOperands(); 4895c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 4905c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*#Ops*/"; 4915c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << ", "; 4925007e1e43541114f3737939234104b085fbe4acaChris Lattner unsigned NumOperandBytes = 0; 49338fd96731c2e2da872ff5c9a7c71869b5219eaadChris Lattner for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i) 4945007e1e43541114f3737939234104b085fbe4acaChris Lattner NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS); 4956281cda6737bcda0e924318ddcce28392001691eChris Lattner 4965c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) { 4975c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin // Print the result #'s for EmitNode. 4985c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) { 4995c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (unsigned NumResults = EN->getNumVTs()) { 5005c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(CommentIndent) << "// Results = "; 5015c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin unsigned First = E->getFirstResultSlot(); 5025c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin for (unsigned i = 0; i != NumResults; ++i) 5035c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "#" << First+i << " "; 5045c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } 5056281cda6737bcda0e924318ddcce28392001691eChris Lattner } 5065c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 5075c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin 5085c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) { 5095c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2) << "// Src: " 5105c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << *SNT->getPattern().getSrcPattern() << '\n'; 5115c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2) << "// Dst: " 5125c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << *SNT->getPattern().getDstPattern() << '\n'; 5135c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } 5145c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } else 5155c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 516c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner 5175007e1e43541114f3737939234104b085fbe4acaChris Lattner return 6+EN->getNumVTs()+NumOperandBytes; 5188e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 519b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::MarkFlagResults: { 520b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner const MarkFlagResultsMatcher *CFR = cast<MarkFlagResultsMatcher>(N); 52102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner OS << "OPC_MarkFlagResults, " << CFR->getNumNodes() << ", "; 52202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner unsigned NumOperandBytes = 0; 52302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i) 52402f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS); 52502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner OS << '\n'; 52602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner return 2+NumOperandBytes; 52702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner } 528b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CompleteMatch: { 529b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N); 53077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", "; 5315007e1e43541114f3737939234104b085fbe4acaChris Lattner unsigned NumResultBytes = 0; 53277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i) 5335007e1e43541114f3737939234104b085fbe4acaChris Lattner NumResultBytes += EmitVBRValue(CM->getResult(i), OS); 53477f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner OS << '\n'; 5355c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) { 5365c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2) << "// Src: " 5375c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << *CM->getPattern().getSrcPattern() << '\n'; 5385c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS.PadToColumn(Indent*2) << "// Dst: " 5395c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin << *CM->getPattern().getDstPattern(); 5405c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin } 5415c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 5425007e1e43541114f3737939234104b085fbe4acaChris Lattner return 2 + NumResultBytes; 543da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 54477f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner } 545da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner assert(0 && "Unreachable"); 546da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 0; 547da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 548da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 549bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner/// EmitMatcherList - Emit the bytes for the specified matcher subtree. 550e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattnerunsigned MatcherTableEmitter:: 551b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris LattnerEmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx, 552984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner formatted_raw_ostream &OS) { 553da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned Size = 0; 5548ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner while (N) { 55509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner if (unsigned(N->getKind()) >= Histogram.size()) 55609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner Histogram.resize(N->getKind()+1); 55709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner Histogram[N->getKind()]++; 5585c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 5595c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "/*" << CurrentIdx << "*/"; 560d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS); 5618fbad244bd436163296d81d4f182750e000fd16dChris Lattner Size += MatcherSize; 5628fbad244bd436163296d81d4f182750e000fd16dChris Lattner CurrentIdx += MatcherSize; 563da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 564bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner // If there are other nodes in this list, iterate to them, otherwise we're 565da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner // done. 566bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner N = N->getNext(); 567da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 5688ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner return Size; 569da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 570da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 5714d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid MatcherTableEmitter::EmitPredicateFunctions(const CodeGenDAGPatterns &CGP, 5724d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner formatted_raw_ostream &OS) { 573e609a513f3c072bba28412c681465332a2822d9aChris Lattner // Emit pattern predicates. 574d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner if (!PatternPredicates.empty()) { 575d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n"; 576d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " switch (PredNo) {\n"; 577d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " default: assert(0 && \"Invalid predicate in table?\");\n"; 578d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i) 579d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " case " << i << ": return " << PatternPredicates[i] << ";\n"; 580d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " }\n"; 581d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "}\n\n"; 582d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner } 5834d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 584e609a513f3c072bba28412c681465332a2822d9aChris Lattner // Emit Node predicates. 5854d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner // FIXME: Annoyingly, these are stored by name, which we never even emit. Yay? 5864d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner StringMap<TreePattern*> PFsByName; 5874d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 5884d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end(); 5894d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner I != E; ++I) 5904d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner PFsByName[I->first->getName()] = I->second; 5914d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 592d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner if (!NodePredicates.empty()) { 5934d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << "bool CheckNodePredicate(SDNode *Node, unsigned PredNo) const {\n"; 594d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " switch (PredNo) {\n"; 595d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " default: assert(0 && \"Invalid predicate in table?\");\n"; 5964d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i) { 5974d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner // FIXME: Storing this by name is horrible. 5984d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner TreePattern *P =PFsByName[NodePredicates[i].substr(strlen("Predicate_"))]; 5994d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner assert(P && "Unknown name?"); 6004d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 6014d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner // Emit the predicate code corresponding to this pattern. 6024d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner std::string Code = P->getRecord()->getValueAsCode("Predicate"); 6034d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner assert(!Code.empty() && "No code in this predicate"); 6044d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << " case " << i << ": { // " << NodePredicates[i] << '\n'; 6054d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner std::string ClassName; 6064d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner if (P->getOnlyTree()->isLeaf()) 6074d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner ClassName = "SDNode"; 6084d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner else 6094d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner ClassName = 6104d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner CGP.getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName(); 6114d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner if (ClassName == "SDNode") 6124d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << " SDNode *N = Node;\n"; 6134d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner else 6144d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << " " << ClassName << "*N = cast<" << ClassName << ">(Node);\n"; 6154d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << Code << "\n }\n"; 6164d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner } 617d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " }\n"; 618d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "}\n\n"; 619d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner } 620e609a513f3c072bba28412c681465332a2822d9aChris Lattner 621e609a513f3c072bba28412c681465332a2822d9aChris Lattner // Emit CompletePattern matchers. 6228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner // FIXME: This should be const. 623d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner if (!ComplexPatterns.empty()) { 624d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n"; 625d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n"; 626d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " switch (PatternNo) {\n"; 627d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " default: assert(0 && \"Invalid pattern # in table?\");\n"; 628d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) { 629d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner const ComplexPattern &P = *ComplexPatterns[i]; 630d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner unsigned NumOps = P.getNumOperands(); 6318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 632d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner if (P.hasProperty(SDNPHasChain)) 633d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner ++NumOps; // Get the chained node too. 634d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner 635d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " case " << i << ":\n"; 636d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " Result.resize(Result.size()+" << NumOps << ");\n"; 637d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " return " << P.getSelectFunc(); 6388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 639d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "(Root, N"; 640d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner for (unsigned i = 0; i != NumOps; ++i) 641d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << ", Result[Result.size()-" << (NumOps-i) << ']'; 642d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << ");\n"; 643d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner } 644d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " }\n"; 645d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "}\n\n"; 646e609a513f3c072bba28412c681465332a2822d9aChris Lattner } 6478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 6484d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 6498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner // Emit SDNodeXForm handlers. 6508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner // FIXME: This should be const. 651d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner if (!NodeXForms.empty()) { 652d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n"; 653d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " switch (XFormNo) {\n"; 654d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " default: assert(0 && \"Invalid xform # in table?\");\n"; 655d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner 656d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner // FIXME: The node xform could take SDValue's instead of SDNode*'s. 6574d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) { 6584d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner const CodeGenDAGPatterns::NodeXForm &Entry = 6594d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner CGP.getSDNodeTransform(NodeXForms[i]); 6604d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 6614d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner Record *SDNode = Entry.first; 6624d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner const std::string &Code = Entry.second; 6634d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 6645c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << " case " << i << ": { "; 6655c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (!OmitComments) 6665c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << "// " << NodeXForms[i]->getName(); 6675c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 6684d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner 6694d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName(); 6704d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner if (ClassName == "SDNode") 6714d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << " SDNode *N = V.getNode();\n"; 6724d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner else 6734d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << " " << ClassName << " *N = cast<" << ClassName 6744d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner << ">(V.getNode());\n"; 6754d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner OS << Code << "\n }\n"; 6764d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner } 677d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << " }\n"; 678d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner OS << "}\n\n"; 679d20c0bc5698688f69e52dc4d19cedfcd973a7088Chris Lattner } 680050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner} 681050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner 68209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattnervoid MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) { 6835c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin if (OmitComments) 6845c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin return; 68509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner OS << " // Opcode Histogram:\n"; 68609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner for (unsigned i = 0, e = Histogram.size(); i != e; ++i) { 68709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner OS << " // #"; 688b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner switch ((Matcher::KindTy)i) { 689b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::Scope: OS << "OPC_Scope"; break; 690b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::RecordNode: OS << "OPC_RecordNode"; break; 691b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::RecordChild: OS << "OPC_RecordChild"; break; 692b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break; 693b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CaptureFlagInput: OS << "OPC_CaptureFlagInput"; break; 694b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::MoveChild: OS << "OPC_MoveChild"; break; 695b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::MoveParent: OS << "OPC_MoveParent"; break; 696b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckSame: OS << "OPC_CheckSame"; break; 697b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckPatternPredicate: 69809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner OS << "OPC_CheckPatternPredicate"; break; 699b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckPredicate: OS << "OPC_CheckPredicate"; break; 700b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckOpcode: OS << "OPC_CheckOpcode"; break; 701eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner case Matcher::SwitchOpcode: OS << "OPC_SwitchOpcode"; break; 702b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckType: OS << "OPC_CheckType"; break; 703cfe2eab7446dedc471592fe702fefef783383171Chris Lattner case Matcher::SwitchType: OS << "OPC_SwitchType"; break; 704b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckChildType: OS << "OPC_CheckChildType"; break; 705b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckInteger: OS << "OPC_CheckInteger"; break; 706b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckCondCode: OS << "OPC_CheckCondCode"; break; 707b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckValueType: OS << "OPC_CheckValueType"; break; 708b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckComplexPat: OS << "OPC_CheckComplexPat"; break; 709b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckAndImm: OS << "OPC_CheckAndImm"; break; 710b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckOrImm: OS << "OPC_CheckOrImm"; break; 711b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CheckFoldableChainNode: 71209b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner OS << "OPC_CheckFoldableChainNode"; break; 713b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitInteger: OS << "OPC_EmitInteger"; break; 714b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitStringInteger: OS << "OPC_EmitStringInteger"; break; 715b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitRegister: OS << "OPC_EmitRegister"; break; 716499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner case Matcher::EmitConvertToTarget: OS << "OPC_EmitConvertToTarget"; break; 717499622b2b1555173006f478bcd8bb8d7c51782f2Chris Lattner case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break; 718b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break; 719b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitNode: OS << "OPC_EmitNode"; break; 7209a21500edc485a2c383a03fba429943f031c1398Chris Lattner case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break; 721b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break; 722b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break; 723b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break; 72409b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner } 72509b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner 72609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner OS.PadToColumn(40) << " = " << Histogram[i] << '\n'; 72709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner } 72809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner OS << '\n'; 72909b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner} 73009b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner 731050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner 7324d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid llvm::EmitMatcherTable(const Matcher *TheMatcher, 7334d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner const CodeGenDAGPatterns &CGP, raw_ostream &O) { 734da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner formatted_raw_ostream OS(O); 735da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 736da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "// The main instruction selector code.\n"; 737c84edb7bdd345db280c908583d55bdf4e670a225Chris Lattner OS << "SDNode *SelectCode(SDNode *N) {\n"; 738da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 739984e18823e863f2232ccf63f7e84b878dbd55b6fChris Lattner MatcherTableEmitter MatcherEmitter; 740e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner 7418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << " // Opcodes are emitted as 2 bytes, TARGET_OPCODE handles this.\n"; 7428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << " #define TARGET_OPCODE(X) X & 255, unsigned(X) >> 8\n"; 743da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << " static const unsigned char MatcherTable[] = {\n"; 744b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS); 745da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << " 0\n }; // Total Array size is " << (TotalSize+1) << " bytes\n\n"; 74609b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner 74709b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner MatcherEmitter.EmitHistogram(OS); 74809b9f3928ee43fdc5af5ee6f4b5ce6d21db0daeeChris Lattner 7498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << " #undef TARGET_OPCODE\n"; 750e02ea54cfd71dee378ca6b11243710d1760ea7c1Chris Lattner OS << " return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n"; 7515c7fc88b5534007c4a2e7b062b0d33fc060e75d6Torok Edwin OS << '\n'; 752050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner 753050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner // Next up, emit the function for node and pattern predicates: 7544d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattner MatcherEmitter.EmitPredicateFunctions(CGP, OS); 755da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 756