DAGISelMatcherEmitter.cpp revision e39650a805425ffdbd79692c7d1bad80f7332dae
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" 16da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/ADT/SmallString.h" 17da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/Casting.h" 18da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/FormattedStream.h" 19da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm; 20da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnernamespace { 22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerenum { 23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner CommentIndent = 25 24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 25da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 26da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 27da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitMatcherAndChildren(const MatcherNode *N, 28da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner formatted_raw_ostream &FOS, 29da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned Indent); 30da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 31da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// ClassifyInt - Classify an integer by size, return '1','2','4','8' if this 32da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// fits in 1, 2, 4, or 8 sign extended bytes. 33da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic char ClassifyInt(int64_t Val) { 34da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (Val == int8_t(Val)) return '1'; 35da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (Val == int16_t(Val)) return '2'; 36da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (Val == int32_t(Val)) return '4'; 37da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return '8'; 38da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 39da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 40da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitInt - Emit the specified integer, returning the number of bytes emitted. 41da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitInt(int64_t Val, formatted_raw_ostream &OS) { 42da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned BytesEmitted = 1; 43da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << (int)(unsigned char)Val << ", "; 44da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (Val == int8_t(Val)) { 45da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "\n"; 46da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return BytesEmitted; 47da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 48da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 49da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << (int)(unsigned char)(Val >> 8) << ", "; 50da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner ++BytesEmitted; 51da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 52da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (Val != int16_t(Val)) { 53da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << (int)(unsigned char)(Val >> 16) << ',' 54da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << (int)(unsigned char)(Val >> 24) << ','; 55da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner BytesEmitted += 2; 56da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 57da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (Val != int32_t(Val)) { 58da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << (int)(unsigned char)(Val >> 32) << ',' 59da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << (int)(unsigned char)(Val >> 40) << ',' 60da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << (int)(unsigned char)(Val >> 48) << ',' 61da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << (int)(unsigned char)(Val >> 56) << ','; 62da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner BytesEmitted += 4; 63da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 64da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 65da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 66da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(CommentIndent) << "// " << Val << '\n'; 67da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return BytesEmitted; 68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 70da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitMatcherOpcodes - Emit bytes for the specified matcher and return 71da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the number of bytes emitted. 72da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitMatcher(const MatcherNode *N, formatted_raw_ostream &OS, 73da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned Indent) { 74da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(Indent*2); 75da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 76da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner switch (N->getKind()) { 77da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::Push: assert(0 && "Should be handled by caller"); 78da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::EmitNode: 79da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_Emit, /*XXX*/"; 80da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(CommentIndent) << "// Src: " 81da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << *cast<EmitNodeMatcherNode>(N)->getPattern().getSrcPattern() << '\n'; 82da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(CommentIndent) << "// Dst: " 83da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << *cast<EmitNodeMatcherNode>(N)->getPattern().getDstPattern() << '\n'; 84da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 1; 85da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::Record: 86da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_Record,\n"; 87da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 1; 88da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::MoveChild: 89da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_MoveChild, " 90da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << cast<MoveChildMatcherNode>(N)->getChildNo() << ",\n"; 91da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 92da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::MoveParent: 94da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_MoveParent,\n"; 95da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 1; 96da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 97da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckSame: 98da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckSame, " 99da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << cast<CheckSameMatcherNode>(N)->getMatchNumber() << ",\n"; 100da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 101da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 102da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckPatternPredicate: 103da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckPatternPredicate, /*XXX*/0,"; 104da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(CommentIndent) << "// " 105da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << cast<CheckPatternPredicateMatcherNode>(N)->getPredicate() << '\n'; 106da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 107da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckPredicate: 109da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckPredicate, /*XXX*/0,"; 110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(CommentIndent) << "// " 111da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << cast<CheckPredicateMatcherNode>(N)->getPredicateName() << '\n'; 112da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 113da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 114da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckOpcode: 115da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckOpcode, " 116da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << cast<CheckOpcodeMatcherNode>(N)->getOpcodeName() << ",\n"; 117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 118da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckType: 120da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckType, " 121da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << getEnumName(cast<CheckTypeMatcherNode>(N)->getType()) << ",\n"; 122da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 123da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 124da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckInteger: { 125da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t Val = cast<CheckIntegerMatcherNode>(N)->getValue(); 126da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckInteger" << ClassifyInt(Val) << ", "; 127da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return EmitInt(Val, OS)+1; 128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 129da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckCondCode: 130da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckCondCode, ISD::" 131da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << cast<CheckCondCodeMatcherNode>(N)->getCondCodeName() << ",\n"; 132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 133da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 134da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckValueType: 135da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckValueType, MVT::" 136da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner << cast<CheckValueTypeMatcherNode>(N)->getTypeName() << ",\n"; 137da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 138da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckComplexPat: 140da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckComplexPat, 0/*XXX*/,\n"; 141da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 2; 142da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 143da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckAndImm: { 144da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t Val = cast<CheckAndImmMatcherNode>(N)->getValue(); 145da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckAndImm" << ClassifyInt(Val) << ", "; 146da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return EmitInt(Val, OS)+1; 147da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 148da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 149da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner case MatcherNode::CheckOrImm: { 150da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t Val = cast<CheckOrImmMatcherNode>(N)->getValue(); 151da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_CheckOrImm" << ClassifyInt(Val) << ", "; 152da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return EmitInt(Val, OS)+1; 153da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 154e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner case MatcherNode::CheckProfitableToFold: 155e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner OS << "OPC_IsProfitableToFold,\n"; 156e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner return 1; 157e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner case MatcherNode::CheckLegalToFold: 158e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner OS << "OPC_IsLegalToFold,\n"; 159e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner return 1; 160da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 161da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner assert(0 && "Unreachable"); 162da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return 0; 163da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 164da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 165da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// EmitMatcherAndChildren - Emit the bytes for the specified matcher subtree. 166da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerstatic unsigned EmitMatcherAndChildren(const MatcherNode *N, 167da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner formatted_raw_ostream &OS, 168da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned Indent) { 169da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned Size = 0; 170da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner while (1) { 171da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner // Push is a special case since it is binary. 172da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (const PushMatcherNode *PMN = dyn_cast<PushMatcherNode>(N)) { 173da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner // We need to encode the child and the offset of the failure code before 174da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner // emitting either of them. Handle this by buffering the output into a 175da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner // string while we get the size. 176da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner SmallString<128> TmpBuf; 177da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned ChildSize; 178da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner { 179da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner raw_svector_ostream OS(TmpBuf); 180da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner formatted_raw_ostream FOS(OS); 181da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner ChildSize = 182da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner EmitMatcherAndChildren(cast<PushMatcherNode>(N)->getChild(), FOS, 183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner Indent+1); 184da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 185da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 186da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (ChildSize > 255) { 187da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner errs() << 188da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner "Tblgen internal error: can't handle predicate this complex yet\n"; 189da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner exit(1); 190da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 191da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 192da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.PadToColumn(Indent*2); 193da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "OPC_Push, " << ChildSize << ",\n"; 194da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << TmpBuf.str(); 195da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 196da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner Size += 2 + ChildSize; 197da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 198da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner N = PMN->getFailure(); 199da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner continue; 200da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 201da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 202da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner Size += EmitMatcher(N, OS, Indent); 203da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 204da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner // If there are children of this node, iterate to them, otherwise we're 205da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner // done. 206da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner if (const MatcherNodeWithChild *MNWC = dyn_cast<MatcherNodeWithChild>(N)) 207da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner N = MNWC->getChild(); 208da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner else 209da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return Size; 210da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 211da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 212da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 213da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid llvm::EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &O) { 214da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner formatted_raw_ostream OS(O); 215da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 216da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "// The main instruction selector code.\n"; 217da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << "SDNode *SelectCode2(SDNode *N) {\n"; 218da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 219da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << " static const unsigned char MatcherTable[] = {\n"; 220da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned TotalSize = EmitMatcherAndChildren(Matcher, OS, 2); 221da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << " 0\n }; // Total Array size is " << (TotalSize+1) << " bytes\n\n"; 222da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS << " return SelectCodeCommon(N, MatcherTable, sizeof(MatcherTable));\n}\n"; 223da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 224