diff options
author | Owen Anderson <resistor@mac.com> | 2008-08-28 18:06:12 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-08-28 18:06:12 +0000 |
commit | 787f100462cb01d3946b0f7edea96ec2e6c8aec3 (patch) | |
tree | e5d43a2e591454d0acf6bf725adc1b2862300fc8 /llvm/utils/TableGen/FastISelEmitter.cpp | |
parent | 3e1888e8bdd6a1b3ff45f2716b28741431fe64e7 (diff) | |
download | bcm5719-llvm-787f100462cb01d3946b0f7edea96ec2e6c8aec3.tar.gz bcm5719-llvm-787f100462cb01d3946b0f7edea96ec2e6c8aec3.zip |
Add support for fast-isel of opcodes that require use of extract_subreg. Because of how extract_subreg is treated, it requires special case handling.
llvm-svn: 55480
Diffstat (limited to 'llvm/utils/TableGen/FastISelEmitter.cpp')
-rw-r--r-- | llvm/utils/TableGen/FastISelEmitter.cpp | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/llvm/utils/TableGen/FastISelEmitter.cpp b/llvm/utils/TableGen/FastISelEmitter.cpp index 967054a1612..305158f4714 100644 --- a/llvm/utils/TableGen/FastISelEmitter.cpp +++ b/llvm/utils/TableGen/FastISelEmitter.cpp @@ -172,6 +172,7 @@ struct OperandsSignature { struct InstructionMemo { std::string Name; const CodeGenRegisterClass *RC; + unsigned char SubRegNo; }; class FastISelMap { @@ -235,12 +236,19 @@ void FastISelMap::CollectPatterns(CodeGenDAGPatterns &CGP) { // For now, ignore instructions where the first operand is not an // output register. - Record *Op0Rec = II.OperandList[0].Rec; - if (!Op0Rec->isSubClassOf("RegisterClass")) - continue; - const CodeGenRegisterClass *DstRC = &Target.getRegisterClass(Op0Rec); - if (!DstRC) - continue; + const CodeGenRegisterClass *DstRC = 0; + unsigned SubRegNo = ~0; + if (Op->getName() != "EXTRACT_SUBREG") { + Record *Op0Rec = II.OperandList[0].Rec; + if (!Op0Rec->isSubClassOf("RegisterClass")) + continue; + DstRC = &Target.getRegisterClass(Op0Rec); + if (!DstRC) + continue; + } else { + SubRegNo = static_cast<IntInit*>( + Dst->getChild(1)->getLeafValue())->getValue(); + } // Inspect the pattern. TreePatternNode *InstPatNode = Pattern.getSrcPattern(); @@ -274,7 +282,8 @@ void FastISelMap::CollectPatterns(CodeGenDAGPatterns &CGP) { // Ok, we found a pattern that we can handle. Remember it. InstructionMemo Memo = { Pattern.getDstPattern()->getOperator()->getName(), - DstRC + DstRC, + SubRegNo }; assert(!SimplePatterns[Operands][OpcodeName][VT][RetVT].count(PredicateCheck) && "Duplicate pattern!"); @@ -410,13 +419,19 @@ void FastISelMap::PrintFunctionDefinitions(std::ostream &OS) { HasPred = true; } OS << " return FastEmitInst_"; - Operands.PrintManglingSuffix(OS); - OS << "(" << InstNS << Memo.Name << ", "; - OS << InstNS << Memo.RC->getName() << "RegisterClass"; - if (!Operands.empty()) - OS << ", "; - Operands.PrintArguments(OS); - OS << ");\n"; + if (Memo.SubRegNo == (unsigned char)~0) { + Operands.PrintManglingSuffix(OS); + OS << "(" << InstNS << Memo.Name << ", "; + OS << InstNS << Memo.RC->getName() << "RegisterClass"; + if (!Operands.empty()) + OS << ", "; + Operands.PrintArguments(OS); + OS << ");\n"; + } else { + OS << "extractsubreg(Op0, "; + OS << (unsigned)Memo.SubRegNo; + OS << ");\n"; + } } // Return 0 if none of the predicates were satisfied. if (HasPred) @@ -482,13 +497,20 @@ void FastISelMap::PrintFunctionDefinitions(std::ostream &OS) { HasPred = true; } OS << " return FastEmitInst_"; - Operands.PrintManglingSuffix(OS); - OS << "(" << InstNS << Memo.Name << ", "; - OS << InstNS << Memo.RC->getName() << "RegisterClass"; - if (!Operands.empty()) - OS << ", "; - Operands.PrintArguments(OS); - OS << ");\n"; + + if (Memo.SubRegNo == (unsigned char)~0) { + Operands.PrintManglingSuffix(OS); + OS << "(" << InstNS << Memo.Name << ", "; + OS << InstNS << Memo.RC->getName() << "RegisterClass"; + if (!Operands.empty()) + OS << ", "; + Operands.PrintArguments(OS); + OS << ");\n"; + } else { + OS << "extractsubreg(Op0, "; + OS << (unsigned)Memo.SubRegNo; + OS << ");\n"; + } } // Return 0 if none of the predicates were satisfied. |