2010-02-15 16:04:42 +08:00
|
|
|
//===- DAGISelMatcherEmitter.cpp - Matcher Emitter ------------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file contains code to generate C++ code a matcher.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "DAGISelMatcher.h"
|
|
|
|
#include "CodeGenDAGPatterns.h"
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
#include "Record.h"
|
2010-02-17 08:31:50 +08:00
|
|
|
#include "llvm/ADT/DenseMap.h"
|
2010-02-15 16:04:42 +08:00
|
|
|
#include "llvm/ADT/SmallString.h"
|
2010-02-16 15:21:10 +08:00
|
|
|
#include "llvm/ADT/StringMap.h"
|
2010-02-15 16:04:42 +08:00
|
|
|
#include "llvm/Support/FormattedStream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
|
|
|
|
enum {
|
2010-02-17 08:39:26 +08:00
|
|
|
CommentIndent = 30
|
2010-02-15 16:04:42 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/// ClassifyInt - Classify an integer by size, return '1','2','4','8' if this
|
|
|
|
/// fits in 1, 2, 4, or 8 sign extended bytes.
|
|
|
|
static char ClassifyInt(int64_t Val) {
|
|
|
|
if (Val == int8_t(Val)) return '1';
|
|
|
|
if (Val == int16_t(Val)) return '2';
|
|
|
|
if (Val == int32_t(Val)) return '4';
|
|
|
|
return '8';
|
|
|
|
}
|
|
|
|
|
|
|
|
/// EmitInt - Emit the specified integer, returning the number of bytes emitted.
|
|
|
|
static unsigned EmitInt(int64_t Val, formatted_raw_ostream &OS) {
|
|
|
|
unsigned BytesEmitted = 1;
|
|
|
|
OS << (int)(unsigned char)Val << ", ";
|
|
|
|
if (Val == int8_t(Val)) {
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << '\n';
|
2010-02-15 16:04:42 +08:00
|
|
|
return BytesEmitted;
|
|
|
|
}
|
|
|
|
|
|
|
|
OS << (int)(unsigned char)(Val >> 8) << ", ";
|
|
|
|
++BytesEmitted;
|
|
|
|
|
|
|
|
if (Val != int16_t(Val)) {
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << (int)(unsigned char)(Val >> 16) << ", "
|
|
|
|
<< (int)(unsigned char)(Val >> 24) << ", ";
|
2010-02-15 16:04:42 +08:00
|
|
|
BytesEmitted += 2;
|
|
|
|
|
|
|
|
if (Val != int32_t(Val)) {
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << (int)(unsigned char)(Val >> 32) << ", "
|
|
|
|
<< (int)(unsigned char)(Val >> 40) << ", "
|
|
|
|
<< (int)(unsigned char)(Val >> 48) << ", "
|
|
|
|
<< (int)(unsigned char)(Val >> 56) << ", ";
|
2010-02-15 16:04:42 +08:00
|
|
|
BytesEmitted += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS.PadToColumn(CommentIndent) << "// " << Val << " aka 0x";
|
|
|
|
OS.write_hex(Val) << '\n';
|
2010-02-15 16:04:42 +08:00
|
|
|
return BytesEmitted;
|
|
|
|
}
|
|
|
|
|
2010-02-16 14:52:01 +08:00
|
|
|
namespace {
|
|
|
|
class MatcherTableEmitter {
|
2010-02-16 15:21:10 +08:00
|
|
|
StringMap<unsigned> NodePredicateMap, PatternPredicateMap;
|
|
|
|
std::vector<std::string> NodePredicates, PatternPredicates;
|
2010-02-17 08:31:50 +08:00
|
|
|
|
|
|
|
DenseMap<const ComplexPattern*, unsigned> ComplexPatternMap;
|
|
|
|
std::vector<const ComplexPattern*> ComplexPatterns;
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
|
|
|
|
|
|
|
|
DenseMap<Record*, unsigned> NodeXFormMap;
|
|
|
|
std::vector<const Record*> NodeXForms;
|
|
|
|
|
2010-02-25 03:17:12 +08:00
|
|
|
// Per opcode frequence count.
|
|
|
|
std::vector<unsigned> Histogram;
|
2010-02-16 14:52:01 +08:00
|
|
|
public:
|
2010-02-21 14:30:04 +08:00
|
|
|
MatcherTableEmitter() {}
|
2010-02-16 14:52:01 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
unsigned EmitMatcherList(const Matcher *N, unsigned Indent,
|
2010-02-21 15:16:41 +08:00
|
|
|
unsigned StartIdx, formatted_raw_ostream &OS);
|
2010-02-16 15:21:10 +08:00
|
|
|
|
2010-02-21 14:30:04 +08:00
|
|
|
void EmitPredicateFunctions(formatted_raw_ostream &OS);
|
2010-02-25 03:17:12 +08:00
|
|
|
|
|
|
|
void EmitHistogram(formatted_raw_ostream &OS);
|
2010-02-16 14:52:01 +08:00
|
|
|
private:
|
2010-02-25 10:04:40 +08:00
|
|
|
unsigned EmitMatcher(const Matcher *N, unsigned Indent,
|
2010-02-21 14:30:04 +08:00
|
|
|
formatted_raw_ostream &OS);
|
2010-02-16 15:21:10 +08:00
|
|
|
|
|
|
|
unsigned getNodePredicate(StringRef PredName) {
|
|
|
|
unsigned &Entry = NodePredicateMap[PredName];
|
|
|
|
if (Entry == 0) {
|
|
|
|
NodePredicates.push_back(PredName.str());
|
|
|
|
Entry = NodePredicates.size();
|
|
|
|
}
|
|
|
|
return Entry-1;
|
|
|
|
}
|
|
|
|
unsigned getPatternPredicate(StringRef PredName) {
|
|
|
|
unsigned &Entry = PatternPredicateMap[PredName];
|
|
|
|
if (Entry == 0) {
|
|
|
|
PatternPredicates.push_back(PredName.str());
|
|
|
|
Entry = PatternPredicates.size();
|
|
|
|
}
|
|
|
|
return Entry-1;
|
|
|
|
}
|
2010-02-17 08:31:50 +08:00
|
|
|
|
|
|
|
unsigned getComplexPat(const ComplexPattern &P) {
|
|
|
|
unsigned &Entry = ComplexPatternMap[&P];
|
|
|
|
if (Entry == 0) {
|
|
|
|
ComplexPatterns.push_back(&P);
|
|
|
|
Entry = ComplexPatterns.size();
|
|
|
|
}
|
|
|
|
return Entry-1;
|
|
|
|
}
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
|
|
|
|
unsigned getNodeXFormID(Record *Rec) {
|
|
|
|
unsigned &Entry = NodeXFormMap[Rec];
|
|
|
|
if (Entry == 0) {
|
|
|
|
NodeXForms.push_back(Rec);
|
|
|
|
Entry = NodeXForms.size();
|
|
|
|
}
|
|
|
|
return Entry-1;
|
|
|
|
}
|
|
|
|
|
2010-02-16 14:52:01 +08:00
|
|
|
};
|
|
|
|
} // end anonymous namespace.
|
|
|
|
|
2010-02-23 08:59:59 +08:00
|
|
|
/// EmitVBRValue - Emit the specified value as a VBR, returning the number of
|
|
|
|
/// bytes emitted.
|
|
|
|
static unsigned EmitVBRValue(unsigned Val, raw_ostream &OS) {
|
|
|
|
if (Val <= 127) {
|
|
|
|
OS << Val << ", ";
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned InVal = Val;
|
|
|
|
unsigned NumBytes = 0;
|
2010-02-23 09:07:39 +08:00
|
|
|
while (Val >= 128) {
|
2010-02-23 08:59:59 +08:00
|
|
|
OS << (Val&127) << "|128,";
|
|
|
|
Val >>= 7;
|
|
|
|
++NumBytes;
|
|
|
|
}
|
|
|
|
OS << Val << "/*" << InVal << "*/, ";
|
|
|
|
return NumBytes+1;
|
|
|
|
}
|
|
|
|
|
2010-02-15 16:04:42 +08:00
|
|
|
/// EmitMatcherOpcodes - Emit bytes for the specified matcher and return
|
|
|
|
/// the number of bytes emitted.
|
2010-02-16 14:52:01 +08:00
|
|
|
unsigned MatcherTableEmitter::
|
2010-02-25 10:04:40 +08:00
|
|
|
EmitMatcher(const Matcher *N, unsigned Indent, formatted_raw_ostream &OS) {
|
2010-02-15 16:04:42 +08:00
|
|
|
OS.PadToColumn(Indent*2);
|
|
|
|
|
|
|
|
switch (N->getKind()) {
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::Scope: assert(0 && "Should be handled by caller");
|
|
|
|
case Matcher::RecordNode:
|
2010-02-19 06:03:03 +08:00
|
|
|
OS << "OPC_RecordNode,";
|
2010-02-17 09:03:09 +08:00
|
|
|
OS.PadToColumn(CommentIndent) << "// "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<RecordMatcher>(N)->getWhatFor() << '\n';
|
2010-02-15 16:04:42 +08:00
|
|
|
return 1;
|
2010-02-24 15:31:45 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::RecordChild:
|
|
|
|
OS << "OPC_RecordChild" << cast<RecordChildMatcher>(N)->getChildNo()
|
2010-02-24 15:31:45 +08:00
|
|
|
<< ',';
|
|
|
|
OS.PadToColumn(CommentIndent) << "// "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<RecordChildMatcher>(N)->getWhatFor() << '\n';
|
2010-02-24 15:31:45 +08:00
|
|
|
return 1;
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::RecordMemRef:
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << "OPC_RecordMemRef,\n";
|
|
|
|
return 1;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CaptureFlagInput:
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << "OPC_CaptureFlagInput,\n";
|
|
|
|
return 1;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::MoveChild:
|
|
|
|
OS << "OPC_MoveChild, " << cast<MoveChildMatcher>(N)->getChildNo() << ",\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::MoveParent:
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_MoveParent,\n";
|
|
|
|
return 1;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckSame:
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckSame, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckPatternPredicate: {
|
|
|
|
StringRef Pred = cast<CheckPatternPredicateMatcher>(N)->getPredicate();
|
2010-02-16 15:21:10 +08:00
|
|
|
OS << "OPC_CheckPatternPredicate, " << getPatternPredicate(Pred) << ',';
|
|
|
|
OS.PadToColumn(CommentIndent) << "// " << Pred << '\n';
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
2010-02-16 15:21:10 +08:00
|
|
|
}
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckPredicate: {
|
|
|
|
StringRef Pred = cast<CheckPredicateMatcher>(N)->getPredicateName();
|
2010-02-16 15:21:10 +08:00
|
|
|
OS << "OPC_CheckPredicate, " << getNodePredicate(Pred) << ',';
|
|
|
|
OS.PadToColumn(CommentIndent) << "// " << Pred << '\n';
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
2010-02-16 15:21:10 +08:00
|
|
|
}
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckOpcode:
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckOpcode, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<CheckOpcodeMatcher>(N)->getOpcodeName() << ",\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckMultiOpcode: {
|
|
|
|
const CheckMultiOpcodeMatcher *CMO = cast<CheckMultiOpcodeMatcher>(N);
|
2010-02-23 06:30:37 +08:00
|
|
|
OS << "OPC_CheckMultiOpcode, " << CMO->getNumOpcodeNames() << ", ";
|
|
|
|
for (unsigned i = 0, e = CMO->getNumOpcodeNames(); i != e; ++i)
|
|
|
|
OS << CMO->getOpcodeName(i) << ", ";
|
|
|
|
OS << '\n';
|
|
|
|
return 2 + CMO->getNumOpcodeNames();
|
|
|
|
}
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckType:
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckType, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckChildType:
|
2010-02-25 04:15:25 +08:00
|
|
|
OS << "OPC_CheckChild"
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
|
|
|
|
<< getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
|
2010-02-25 04:15:25 +08:00
|
|
|
return 2;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckInteger: {
|
|
|
|
int64_t Val = cast<CheckIntegerMatcher>(N)->getValue();
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckInteger" << ClassifyInt(Val) << ", ";
|
|
|
|
return EmitInt(Val, OS)+1;
|
|
|
|
}
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckCondCode:
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckCondCode, ISD::"
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckValueType:
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckValueType, MVT::"
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckComplexPat: {
|
2010-02-17 08:39:26 +08:00
|
|
|
const ComplexPattern &Pattern =
|
2010-02-25 10:04:40 +08:00
|
|
|
cast<CheckComplexPatMatcher>(N)->getPattern();
|
2010-02-17 08:39:26 +08:00
|
|
|
OS << "OPC_CheckComplexPat, " << getComplexPat(Pattern) << ',';
|
2010-02-17 14:47:35 +08:00
|
|
|
OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc();
|
|
|
|
OS << ": " << Pattern.getNumOperands() << " operands";
|
|
|
|
if (Pattern.hasProperty(SDNPHasChain))
|
|
|
|
OS << " + chain result and input";
|
|
|
|
OS << '\n';
|
2010-02-15 16:04:42 +08:00
|
|
|
return 2;
|
2010-02-17 08:39:26 +08:00
|
|
|
}
|
2010-02-15 16:04:42 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckAndImm: {
|
|
|
|
int64_t Val = cast<CheckAndImmMatcher>(N)->getValue();
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckAndImm" << ClassifyInt(Val) << ", ";
|
|
|
|
return EmitInt(Val, OS)+1;
|
|
|
|
}
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckOrImm: {
|
|
|
|
int64_t Val = cast<CheckOrImmMatcher>(N)->getValue();
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << "OPC_CheckOrImm" << ClassifyInt(Val) << ", ";
|
|
|
|
return EmitInt(Val, OS)+1;
|
|
|
|
}
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckFoldableChainNode:
|
2010-02-17 03:15:55 +08:00
|
|
|
OS << "OPC_CheckFoldableChainNode,\n";
|
2010-02-16 14:10:58 +08:00
|
|
|
return 1;
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckChainCompatible:
|
2010-02-17 14:23:39 +08:00
|
|
|
OS << "OPC_CheckChainCompatible, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<CheckChainCompatibleMatcher>(N)->getPreviousOp() << ",\n";
|
2010-02-17 14:23:39 +08:00
|
|
|
return 2;
|
2010-02-19 06:03:03 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitInteger: {
|
|
|
|
int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
|
2010-02-19 15:49:56 +08:00
|
|
|
OS << "OPC_EmitInteger" << ClassifyInt(Val) << ", "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
|
2010-02-19 15:49:56 +08:00
|
|
|
return EmitInt(Val, OS)+2;
|
|
|
|
}
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitStringInteger: {
|
|
|
|
const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
// These should always fit into one byte.
|
|
|
|
OS << "OPC_EmitInteger1, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", "
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
<< Val << ",\n";
|
|
|
|
return 3;
|
|
|
|
}
|
2010-02-19 15:49:56 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitRegister:
|
2010-02-19 15:49:56 +08:00
|
|
|
OS << "OPC_EmitRegister, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< getEnumName(cast<EmitRegisterMatcher>(N)->getVT()) << ", ";
|
|
|
|
if (Record *R = cast<EmitRegisterMatcher>(N)->getReg())
|
2010-02-19 15:49:56 +08:00
|
|
|
OS << getQualifiedName(R) << ",\n";
|
|
|
|
else
|
|
|
|
OS << "0 /*zero_reg*/,\n";
|
|
|
|
return 3;
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitConvertToTarget:
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << "OPC_EmitConvertToTarget, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n";
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
return 2;
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitMergeInputChains: {
|
|
|
|
const EmitMergeInputChainsMatcher *MN =
|
|
|
|
cast<EmitMergeInputChainsMatcher>(N);
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", ";
|
|
|
|
for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i)
|
|
|
|
OS << MN->getNode(i) << ", ";
|
|
|
|
OS << '\n';
|
|
|
|
return 2+MN->getNumNodes();
|
|
|
|
}
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitCopyToReg:
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << "OPC_EmitCopyToReg, "
|
2010-02-25 10:04:40 +08:00
|
|
|
<< cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", "
|
|
|
|
<< getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg())
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
<< ",\n";
|
|
|
|
return 3;
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitNodeXForm: {
|
|
|
|
const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N);
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", "
|
|
|
|
<< XF->getSlot() << ',';
|
|
|
|
OS.PadToColumn(CommentIndent) << "// "<<XF->getNodeXForm()->getName()<<'\n';
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitNode: {
|
|
|
|
const EmitNodeMatcher *EN = cast<EmitNodeMatcher>(N);
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << "OPC_EmitNode, TARGET_OPCODE(" << EN->getOpcodeName() << "), 0";
|
|
|
|
|
|
|
|
if (EN->hasChain()) OS << "|OPFL_Chain";
|
|
|
|
if (EN->hasFlag()) OS << "|OPFL_Flag";
|
|
|
|
if (EN->hasMemRefs()) OS << "|OPFL_MemRefs";
|
|
|
|
if (EN->getNumFixedArityOperands() != -1)
|
|
|
|
OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands();
|
|
|
|
OS << ",\n";
|
|
|
|
|
|
|
|
OS.PadToColumn(Indent*2+4) << EN->getNumVTs() << "/*#VTs*/, ";
|
|
|
|
for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i)
|
|
|
|
OS << getEnumName(EN->getVT(i)) << ", ";
|
|
|
|
|
|
|
|
OS << EN->getNumOperands() << "/*#Ops*/, ";
|
2010-02-23 08:59:59 +08:00
|
|
|
unsigned NumOperandBytes = 0;
|
|
|
|
for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i) {
|
|
|
|
// We emit the operand numbers in VBR encoded format, in case the number
|
|
|
|
// is too large to represent with a byte.
|
|
|
|
NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS);
|
|
|
|
}
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << '\n';
|
2010-02-23 08:59:59 +08:00
|
|
|
return 6+EN->getNumVTs()+NumOperandBytes;
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
}
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::MarkFlagResults: {
|
|
|
|
const MarkFlagResultsMatcher *CFR = cast<MarkFlagResultsMatcher>(N);
|
2010-02-24 13:33:42 +08:00
|
|
|
OS << "OPC_MarkFlagResults, " << CFR->getNumNodes() << ", ";
|
|
|
|
unsigned NumOperandBytes = 0;
|
|
|
|
for (unsigned i = 0, e = CFR->getNumNodes(); i != e; ++i)
|
|
|
|
NumOperandBytes += EmitVBRValue(CFR->getNode(i), OS);
|
|
|
|
OS << '\n';
|
|
|
|
return 2+NumOperandBytes;
|
|
|
|
}
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CompleteMatch: {
|
|
|
|
const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N);
|
2010-02-21 14:03:07 +08:00
|
|
|
OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", ";
|
2010-02-23 08:59:59 +08:00
|
|
|
unsigned NumResultBytes = 0;
|
2010-02-21 14:03:07 +08:00
|
|
|
for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i)
|
2010-02-23 08:59:59 +08:00
|
|
|
NumResultBytes += EmitVBRValue(CM->getResult(i), OS);
|
2010-02-21 14:03:07 +08:00
|
|
|
OS << '\n';
|
|
|
|
OS.PadToColumn(Indent*2) << "// Src: "
|
|
|
|
<< *CM->getPattern().getSrcPattern() << '\n';
|
|
|
|
OS.PadToColumn(Indent*2) << "// Dst: "
|
|
|
|
<< *CM->getPattern().getDstPattern() << '\n';
|
2010-02-23 08:59:59 +08:00
|
|
|
return 2 + NumResultBytes;
|
2010-02-15 16:04:42 +08:00
|
|
|
}
|
2010-02-21 14:03:07 +08:00
|
|
|
}
|
2010-02-15 16:04:42 +08:00
|
|
|
assert(0 && "Unreachable");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-02-18 10:53:41 +08:00
|
|
|
/// EmitMatcherList - Emit the bytes for the specified matcher subtree.
|
2010-02-16 14:52:01 +08:00
|
|
|
unsigned MatcherTableEmitter::
|
2010-02-25 10:04:40 +08:00
|
|
|
EmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
2010-02-21 14:30:04 +08:00
|
|
|
formatted_raw_ostream &OS) {
|
2010-02-15 16:04:42 +08:00
|
|
|
unsigned Size = 0;
|
2010-02-18 10:49:24 +08:00
|
|
|
while (N) {
|
2010-02-25 03:17:12 +08:00
|
|
|
if (unsigned(N->getKind()) >= Histogram.size())
|
|
|
|
Histogram.resize(N->getKind()+1);
|
|
|
|
Histogram[N->getKind()]++;
|
|
|
|
|
2010-02-25 09:56:48 +08:00
|
|
|
// Scope is a special case since it is binary.
|
2010-02-25 10:04:40 +08:00
|
|
|
if (const ScopeMatcher *SMN = dyn_cast<ScopeMatcher>(N)) {
|
2010-02-15 16:04:42 +08:00
|
|
|
// We need to encode the child and the offset of the failure code before
|
|
|
|
// emitting either of them. Handle this by buffering the output into a
|
|
|
|
// string while we get the size.
|
|
|
|
SmallString<128> TmpBuf;
|
2010-02-18 10:53:41 +08:00
|
|
|
unsigned NextSize;
|
2010-02-15 16:04:42 +08:00
|
|
|
{
|
|
|
|
raw_svector_ostream OS(TmpBuf);
|
|
|
|
formatted_raw_ostream FOS(OS);
|
2010-02-25 10:04:40 +08:00
|
|
|
NextSize = EmitMatcherList(cast<ScopeMatcher>(N)->getCheck(),
|
2010-02-21 15:16:41 +08:00
|
|
|
Indent+1, CurrentIdx+2, FOS);
|
2010-02-15 16:04:42 +08:00
|
|
|
}
|
2010-02-23 07:55:39 +08:00
|
|
|
|
|
|
|
// In the unlikely event that we have something too big to emit with a
|
|
|
|
// one byte offset, regenerate it with a two-byte one.
|
2010-02-18 10:53:41 +08:00
|
|
|
if (NextSize > 255) {
|
2010-02-23 07:55:39 +08:00
|
|
|
TmpBuf.clear();
|
|
|
|
raw_svector_ostream OS(TmpBuf);
|
|
|
|
formatted_raw_ostream FOS(OS);
|
2010-02-25 10:04:40 +08:00
|
|
|
NextSize = EmitMatcherList(cast<ScopeMatcher>(N)->getCheck(),
|
2010-02-23 07:55:39 +08:00
|
|
|
Indent+1, CurrentIdx+3, FOS);
|
|
|
|
if (NextSize > 65535) {
|
|
|
|
errs() <<
|
|
|
|
"Tblgen internal error: can't handle pattern this complex yet\n";
|
|
|
|
exit(1);
|
|
|
|
}
|
2010-02-15 16:04:42 +08:00
|
|
|
}
|
|
|
|
|
2010-02-21 15:16:41 +08:00
|
|
|
OS << "/*" << CurrentIdx << "*/";
|
2010-02-15 16:04:42 +08:00
|
|
|
OS.PadToColumn(Indent*2);
|
2010-02-23 07:55:39 +08:00
|
|
|
|
|
|
|
if (NextSize < 256)
|
2010-02-25 09:56:48 +08:00
|
|
|
OS << "OPC_Scope, " << NextSize << ",\n";
|
2010-02-23 07:55:39 +08:00
|
|
|
else
|
2010-02-25 09:56:48 +08:00
|
|
|
OS << "OPC_Scope2, " << (NextSize&255) << ", " << (NextSize>>8) <<",\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << TmpBuf.str();
|
|
|
|
|
2010-02-21 15:16:41 +08:00
|
|
|
Size += 2+NextSize;
|
|
|
|
CurrentIdx += 2+NextSize;
|
2010-02-25 09:56:48 +08:00
|
|
|
N = SMN->getNext();
|
2010-02-15 16:04:42 +08:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2010-02-21 15:16:41 +08:00
|
|
|
OS << "/*" << CurrentIdx << "*/";
|
|
|
|
unsigned MatcherSize = EmitMatcher(N, Indent, OS);
|
|
|
|
Size += MatcherSize;
|
|
|
|
CurrentIdx += MatcherSize;
|
2010-02-15 16:04:42 +08:00
|
|
|
|
2010-02-18 10:53:41 +08:00
|
|
|
// If there are other nodes in this list, iterate to them, otherwise we're
|
2010-02-15 16:04:42 +08:00
|
|
|
// done.
|
2010-02-18 10:53:41 +08:00
|
|
|
N = N->getNext();
|
2010-02-15 16:04:42 +08:00
|
|
|
}
|
2010-02-18 10:49:24 +08:00
|
|
|
return Size;
|
2010-02-15 16:04:42 +08:00
|
|
|
}
|
|
|
|
|
2010-02-21 14:30:04 +08:00
|
|
|
void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
2010-02-18 14:47:49 +08:00
|
|
|
// FIXME: Don't build off the DAGISelEmitter's predicates, emit them directly
|
|
|
|
// here into the case stmts.
|
|
|
|
|
2010-02-17 08:31:50 +08:00
|
|
|
// Emit pattern predicates.
|
2010-02-16 15:21:10 +08:00
|
|
|
OS << "bool CheckPatternPredicate(unsigned PredNo) const {\n";
|
|
|
|
OS << " switch (PredNo) {\n";
|
|
|
|
OS << " default: assert(0 && \"Invalid predicate in table?\");\n";
|
|
|
|
for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i)
|
|
|
|
OS << " case " << i << ": return " << PatternPredicates[i] << ";\n";
|
|
|
|
OS << " }\n";
|
|
|
|
OS << "}\n\n";
|
|
|
|
|
2010-02-17 08:31:50 +08:00
|
|
|
// Emit Node predicates.
|
2010-02-16 15:21:10 +08:00
|
|
|
OS << "bool CheckNodePredicate(SDNode *N, unsigned PredNo) const {\n";
|
|
|
|
OS << " switch (PredNo) {\n";
|
|
|
|
OS << " default: assert(0 && \"Invalid predicate in table?\");\n";
|
|
|
|
for (unsigned i = 0, e = NodePredicates.size(); i != e; ++i)
|
|
|
|
OS << " case " << i << ": return " << NodePredicates[i] << "(N);\n";
|
|
|
|
OS << " }\n";
|
|
|
|
OS << "}\n\n";
|
2010-02-17 08:31:50 +08:00
|
|
|
|
|
|
|
// Emit CompletePattern matchers.
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
// FIXME: This should be const.
|
2010-02-17 08:31:50 +08:00
|
|
|
OS << "bool CheckComplexPattern(SDNode *Root, SDValue N,\n";
|
|
|
|
OS << " unsigned PatternNo, SmallVectorImpl<SDValue> &Result) {\n";
|
|
|
|
OS << " switch (PatternNo) {\n";
|
|
|
|
OS << " default: assert(0 && \"Invalid pattern # in table?\");\n";
|
|
|
|
for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) {
|
|
|
|
const ComplexPattern &P = *ComplexPatterns[i];
|
|
|
|
unsigned NumOps = P.getNumOperands();
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
|
2010-02-17 08:31:50 +08:00
|
|
|
if (P.hasProperty(SDNPHasChain))
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
++NumOps; // Get the chained node too.
|
|
|
|
|
2010-02-17 08:31:50 +08:00
|
|
|
OS << " case " << i << ":\n";
|
|
|
|
OS << " Result.resize(Result.size()+" << NumOps << ");\n";
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << " return " << P.getSelectFunc();
|
|
|
|
|
|
|
|
// FIXME: Temporary hack until old isel dies.
|
|
|
|
if (P.hasProperty(SDNPHasChain))
|
|
|
|
OS << "XXX";
|
|
|
|
|
|
|
|
OS << "(Root, N";
|
2010-02-17 08:31:50 +08:00
|
|
|
for (unsigned i = 0; i != NumOps; ++i)
|
|
|
|
OS << ", Result[Result.size()-" << (NumOps-i) << ']';
|
|
|
|
OS << ");\n";
|
|
|
|
}
|
|
|
|
OS << " }\n";
|
|
|
|
OS << "}\n\n";
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
|
|
|
|
// Emit SDNodeXForm handlers.
|
|
|
|
// FIXME: This should be const.
|
|
|
|
OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
|
|
|
|
OS << " switch (XFormNo) {\n";
|
|
|
|
OS << " default: assert(0 && \"Invalid xform # in table?\");\n";
|
|
|
|
|
|
|
|
// FIXME: The node xform could take SDValue's instead of SDNode*'s.
|
|
|
|
for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i)
|
|
|
|
OS << " case " << i << ": return Transform_" << NodeXForms[i]->getName()
|
|
|
|
<< "(V.getNode());\n";
|
|
|
|
OS << " }\n";
|
|
|
|
OS << "}\n\n";
|
2010-02-16 15:21:10 +08:00
|
|
|
}
|
|
|
|
|
2010-02-25 03:17:12 +08:00
|
|
|
void MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) {
|
|
|
|
OS << " // Opcode Histogram:\n";
|
|
|
|
for (unsigned i = 0, e = Histogram.size(); i != e; ++i) {
|
|
|
|
OS << " // #";
|
2010-02-25 10:04:40 +08:00
|
|
|
switch ((Matcher::KindTy)i) {
|
|
|
|
case Matcher::Scope: OS << "OPC_Scope"; break;
|
|
|
|
case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
|
|
|
|
case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
|
|
|
|
case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
|
|
|
|
case Matcher::CaptureFlagInput: OS << "OPC_CaptureFlagInput"; break;
|
|
|
|
case Matcher::MoveChild: OS << "OPC_MoveChild"; break;
|
|
|
|
case Matcher::MoveParent: OS << "OPC_MoveParent"; break;
|
|
|
|
case Matcher::CheckSame: OS << "OPC_CheckSame"; break;
|
|
|
|
case Matcher::CheckPatternPredicate:
|
2010-02-25 03:17:12 +08:00
|
|
|
OS << "OPC_CheckPatternPredicate"; break;
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::CheckPredicate: OS << "OPC_CheckPredicate"; break;
|
|
|
|
case Matcher::CheckOpcode: OS << "OPC_CheckOpcode"; break;
|
|
|
|
case Matcher::CheckMultiOpcode: OS << "OPC_CheckMultiOpcode"; break;
|
|
|
|
case Matcher::CheckType: OS << "OPC_CheckType"; break;
|
|
|
|
case Matcher::CheckChildType: OS << "OPC_CheckChildType"; break;
|
|
|
|
case Matcher::CheckInteger: OS << "OPC_CheckInteger"; break;
|
|
|
|
case Matcher::CheckCondCode: OS << "OPC_CheckCondCode"; break;
|
|
|
|
case Matcher::CheckValueType: OS << "OPC_CheckValueType"; break;
|
|
|
|
case Matcher::CheckComplexPat: OS << "OPC_CheckComplexPat"; break;
|
|
|
|
case Matcher::CheckAndImm: OS << "OPC_CheckAndImm"; break;
|
|
|
|
case Matcher::CheckOrImm: OS << "OPC_CheckOrImm"; break;
|
|
|
|
case Matcher::CheckFoldableChainNode:
|
2010-02-25 03:17:12 +08:00
|
|
|
OS << "OPC_CheckFoldableChainNode"; break;
|
2010-02-25 10:09:00 +08:00
|
|
|
case Matcher::CheckChainCompatible: OS << "OPC_CheckChainCompatible"; break;
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitInteger: OS << "OPC_EmitInteger"; break;
|
|
|
|
case Matcher::EmitStringInteger: OS << "OPC_EmitStringInteger"; break;
|
|
|
|
case Matcher::EmitRegister: OS << "OPC_EmitRegister"; break;
|
2010-02-25 10:09:00 +08:00
|
|
|
case Matcher::EmitConvertToTarget: OS << "OPC_EmitConvertToTarget"; break;
|
|
|
|
case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break;
|
2010-02-25 10:04:40 +08:00
|
|
|
case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
|
|
|
|
case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
|
|
|
|
case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
|
|
|
|
case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break;
|
|
|
|
case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
|
2010-02-25 03:17:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
OS.PadToColumn(40) << " = " << Histogram[i] << '\n';
|
|
|
|
}
|
|
|
|
OS << '\n';
|
|
|
|
}
|
|
|
|
|
2010-02-16 15:21:10 +08:00
|
|
|
|
2010-02-25 10:04:40 +08:00
|
|
|
void llvm::EmitMatcherTable(const Matcher *TheMatcher, raw_ostream &O) {
|
2010-02-15 16:04:42 +08:00
|
|
|
formatted_raw_ostream OS(O);
|
|
|
|
|
|
|
|
OS << "// The main instruction selector code.\n";
|
2010-02-24 15:35:09 +08:00
|
|
|
OS << "SDNode *SelectCode(SDNode *N) {\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
|
2010-02-21 14:30:04 +08:00
|
|
|
MatcherTableEmitter MatcherEmitter;
|
2010-02-16 14:52:01 +08:00
|
|
|
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << " // Opcodes are emitted as 2 bytes, TARGET_OPCODE handles this.\n";
|
|
|
|
OS << " #define TARGET_OPCODE(X) X & 255, unsigned(X) >> 8\n";
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << " static const unsigned char MatcherTable[] = {\n";
|
2010-02-25 10:04:40 +08:00
|
|
|
unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS);
|
2010-02-15 16:04:42 +08:00
|
|
|
OS << " 0\n }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
|
2010-02-25 03:17:12 +08:00
|
|
|
|
|
|
|
MatcherEmitter.EmitHistogram(OS);
|
|
|
|
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
llvm-svn: 96716
2010-02-21 11:22:59 +08:00
|
|
|
OS << " #undef TARGET_OPCODE\n";
|
2010-02-16 14:52:01 +08:00
|
|
|
OS << " return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
|
2010-02-16 15:21:10 +08:00
|
|
|
OS << "\n";
|
|
|
|
|
|
|
|
// Next up, emit the function for node and pattern predicates:
|
2010-02-21 14:30:04 +08:00
|
|
|
MatcherEmitter.EmitPredicateFunctions(OS);
|
2010-02-15 16:04:42 +08:00
|
|
|
}
|