diff options
author | Dan Gohman <gohman@apple.com> | 2008-08-26 21:21:20 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-08-26 21:21:20 +0000 |
commit | 72d63af3f76250f198910f0f69cb4ccffd4c14a6 (patch) | |
tree | cf3bf9267d9cbc62c6cae88ff2553dad5bffcbd0 /utils/TableGen/FastISelEmitter.cpp | |
parent | 80bc6e2243b7ae99da42bf2e61df4ebccf8d8821 (diff) | |
download | llvm-72d63af3f76250f198910f0f69cb4ccffd4c14a6.tar.gz llvm-72d63af3f76250f198910f0f69cb4ccffd4c14a6.tar.bz2 llvm-72d63af3f76250f198910f0f69cb4ccffd4c14a6.tar.xz |
Refactor a bunch of FastISelEmitter code into a helper class, and
put each major step in a separate function. This makes the high
level sequence of events easier to follow.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55385 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/FastISelEmitter.cpp')
-rw-r--r-- | utils/TableGen/FastISelEmitter.cpp | 90 |
1 files changed, 63 insertions, 27 deletions
diff --git a/utils/TableGen/FastISelEmitter.cpp b/utils/TableGen/FastISelEmitter.cpp index 20b39c6089..219b8f3973 100644 --- a/utils/TableGen/FastISelEmitter.cpp +++ b/utils/TableGen/FastISelEmitter.cpp @@ -161,6 +161,25 @@ struct InstructionMemo { const CodeGenRegisterClass *RC; }; +class FastISelMap { + typedef std::map<std::string, InstructionMemo> PredMap; + typedef std::map<MVT::SimpleValueType, PredMap> RetPredMap; + typedef std::map<MVT::SimpleValueType, RetPredMap> TypeRetPredMap; + typedef std::map<std::string, TypeRetPredMap> OpcodeTypeRetPredMap; + typedef std::map<OperandsSignature, OpcodeTypeRetPredMap> OperandsOpcodeTypeRetPredMap; + + OperandsOpcodeTypeRetPredMap SimplePatterns; + + std::string InstNS; + +public: + explicit FastISelMap(std::string InstNS); + + void CollectPatterns(CodeGenDAGPatterns &CGP); + void PrintClass(std::ostream &OS); + void PrintFunctionDefinitions(std::ostream &OS); +}; + } static std::string getOpcodeName(Record *Op, CodeGenDAGPatterns &CGP) { @@ -174,23 +193,16 @@ static std::string getLegalCName(std::string OpName) { return OpName; } -void FastISelEmitter::run(std::ostream &OS) { - EmitSourceFileHeader("\"Fast\" Instruction Selector for the " + - Target.getName() + " target", OS); +FastISelMap::FastISelMap(std::string instns) + : InstNS(instns) { +} - OS << "#include \"llvm/CodeGen/FastISel.h\"\n"; - OS << "\n"; - OS << "namespace llvm {\n"; - OS << "\n"; - OS << "namespace " << InstNS.substr(0, InstNS.size() - 2) << " {\n"; - OS << "\n"; - - typedef std::map<std::string, InstructionMemo> PredMap; - typedef std::map<MVT::SimpleValueType, PredMap> RetPredMap; - typedef std::map<MVT::SimpleValueType, RetPredMap> TypeRetPredMap; - typedef std::map<std::string, TypeRetPredMap> OpcodeTypeRetPredMap; - typedef std::map<OperandsSignature, OpcodeTypeRetPredMap> OperandsOpcodeTypeRetPredMap; - OperandsOpcodeTypeRetPredMap SimplePatterns; +void FastISelMap::CollectPatterns(CodeGenDAGPatterns &CGP) { + const CodeGenTarget &Target = CGP.getTargetInfo(); + + // Determine the target's namespace name. + InstNS = Target.getInstNamespace() + "::"; + assert(InstNS.size() > 2 && "Can't determine target-specific namespace!"); // Scan through all the patterns and record the simple ones. for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), @@ -255,7 +267,9 @@ void FastISelEmitter::run(std::ostream &OS) { "Duplicate pattern!"); SimplePatterns[Operands][OpcodeName][VT][RetVT][PredicateCheck] = Memo; } +} +void FastISelMap::PrintClass(std::ostream &OS) { // Declare the target FastISel class. OS << "class FastISel : public llvm::FastISel {\n"; for (OperandsOpcodeTypeRetPredMap::const_iterator OI = SimplePatterns.begin(), @@ -328,13 +342,9 @@ void FastISelEmitter::run(std::ostream &OS) { << "Subtarget>()) {}\n"; OS << "};\n"; OS << "\n"; +} - // Define the target FastISel creation function. - OS << "llvm::FastISel *createFastISel(MachineFunction &mf) {\n"; - OS << " return new FastISel(mf);\n"; - OS << "}\n"; - OS << "\n"; - +void FastISelMap::PrintFunctionDefinitions(std::ostream &OS) { // Now emit code for all the patterns that we collected. for (OperandsOpcodeTypeRetPredMap::const_iterator OI = SimplePatterns.begin(), OE = SimplePatterns.end(); OI != OE; ++OI) { @@ -536,6 +546,35 @@ void FastISelEmitter::run(std::ostream &OS) { OS << "}\n"; OS << "\n"; } +} + +void FastISelEmitter::run(std::ostream &OS) { + const CodeGenTarget &Target = CGP.getTargetInfo(); + + // Determine the target's namespace name. + std::string InstNS = Target.getInstNamespace() + "::"; + assert(InstNS.size() > 2 && "Can't determine target-specific namespace!"); + + EmitSourceFileHeader("\"Fast\" Instruction Selector for the " + + Target.getName() + " target", OS); + + OS << "#include \"llvm/CodeGen/FastISel.h\"\n"; + OS << "\n"; + OS << "namespace llvm {\n"; + OS << "\n"; + OS << "namespace " << InstNS.substr(0, InstNS.size() - 2) << " {\n"; + OS << "\n"; + + FastISelMap F(InstNS); + F.CollectPatterns(CGP); + F.PrintClass(OS); + F.PrintFunctionDefinitions(OS); + + // Define the target FastISel creation function. + OS << "llvm::FastISel *createFastISel(MachineFunction &mf) {\n"; + OS << " return new FastISel(mf);\n"; + OS << "}\n"; + OS << "\n"; OS << "} // namespace X86\n"; OS << "\n"; @@ -544,9 +583,6 @@ void FastISelEmitter::run(std::ostream &OS) { FastISelEmitter::FastISelEmitter(RecordKeeper &R) : Records(R), - CGP(R), - Target(CGP.getTargetInfo()), - InstNS(Target.getInstNamespace() + "::") { - - assert(InstNS.size() > 2 && "Can't determine target-specific namespace!"); + CGP(R) { } + |