summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-08-26 01:22:59 +0000
committerOwen Anderson <resistor@mac.com>2008-08-26 01:22:59 +0000
commitabb1f1688172cf6f3c5bc539841da76053f23533 (patch)
treede461cdf2ad750908c90bd353f2644aff6f662f1 /utils
parentb09c25ebf00d874633cfcbc1874bd7b4d38271b8 (diff)
downloadllvm-abb1f1688172cf6f3c5bc539841da76053f23533.tar.gz
llvm-abb1f1688172cf6f3c5bc539841da76053f23533.tar.bz2
llvm-abb1f1688172cf6f3c5bc539841da76053f23533.tar.xz
Throw the switch to allow FastISel to emit instructions whose return types different from their inputs. Next step: adding lowering pattens in FastISel that actually use these newly available opcodes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55349 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/FastISelEmitter.cpp25
1 files changed, 16 insertions, 9 deletions
diff --git a/utils/TableGen/FastISelEmitter.cpp b/utils/TableGen/FastISelEmitter.cpp
index 78644315e9..c9978e5311 100644
--- a/utils/TableGen/FastISelEmitter.cpp
+++ b/utils/TableGen/FastISelEmitter.cpp
@@ -62,14 +62,15 @@ struct OperandsSignature {
///
bool initialize(TreePatternNode *InstPatNode,
const CodeGenTarget &Target,
- MVT::SimpleValueType VT,
- const CodeGenRegisterClass *DstRC) {
+ MVT::SimpleValueType VT) {
if (!InstPatNode->isLeaf() &&
InstPatNode->getOperator()->getName() == "imm") {
Operands.push_back("i");
return true;
}
+ const CodeGenRegisterClass *DstRC = 0;
+
for (unsigned i = 0, e = InstPatNode->getNumChildren(); i != e; ++i) {
TreePatternNode *Op = InstPatNode->getChild(i);
// For now, filter out any operand with a predicate.
@@ -105,8 +106,11 @@ struct OperandsSignature {
if (!RC)
return false;
// For now, all the operands must have the same register class.
- if (DstRC != RC)
- return false;
+ if (DstRC) {
+ if (DstRC != RC)
+ return false;
+ } else
+ DstRC = RC;
Operands.push_back("r");
}
return true;
@@ -220,7 +224,10 @@ void FastISelEmitter::run(std::ostream &OS) {
Record *InstPatOp = InstPatNode->getOperator();
std::string OpcodeName = getOpcodeName(InstPatOp, CGP);
- MVT::SimpleValueType VT = InstPatNode->getTypeNum(0);
+ MVT::SimpleValueType RetVT = InstPatNode->getTypeNum(0);
+ MVT::SimpleValueType VT = RetVT;
+ if (InstPatNode->getNumChildren())
+ VT = InstPatNode->getChild(0)->getTypeNum(0);
// For now, filter out instructions which just set a register to
// an Operand or an immediate, like MOV32ri.
@@ -233,7 +240,7 @@ void FastISelEmitter::run(std::ostream &OS) {
// Check all the operands.
OperandsSignature Operands;
- if (!Operands.initialize(InstPatNode, Target, VT, DstRC))
+ if (!Operands.initialize(InstPatNode, Target, VT))
continue;
// Get the predicate that guards this pattern.
@@ -244,9 +251,9 @@ void FastISelEmitter::run(std::ostream &OS) {
Pattern.getDstPattern()->getOperator()->getName(),
DstRC
};
- assert(!SimplePatterns[Operands][OpcodeName][VT][VT].count(PredicateCheck) &&
+ assert(!SimplePatterns[Operands][OpcodeName][VT][RetVT].count(PredicateCheck) &&
"Duplicate pattern!");
- SimplePatterns[Operands][OpcodeName][VT][VT][PredicateCheck] = Memo;
+ SimplePatterns[Operands][OpcodeName][VT][RetVT][PredicateCheck] = Memo;
}
// Declare the target FastISel class.
@@ -398,7 +405,7 @@ void FastISelEmitter::run(std::ostream &OS) {
// Emit one function for the type that demultiplexes on return type.
OS << "unsigned FastISel::FastEmit_"
<< getLegalCName(Opcode) << "_"
- << getLegalCName(getName(VT));
+ << getLegalCName(getName(VT)) << "_";
Operands.PrintManglingSuffix(OS);
OS << "(MVT::SimpleValueType RetVT";
if (!Operands.empty())