Begin making more use of the FastISelEmitter class.
authorDan Gohman <gohman@apple.com>
Thu, 21 Aug 2008 00:19:05 +0000 (00:19 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 21 Aug 2008 00:19:05 +0000 (00:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55093 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/FastISel.h
utils/TableGen/FastISelEmitter.cpp
utils/TableGen/FastISelEmitter.h

index a019b8e5fda1fc4605ebb8ad1e036c7b0c0c094e..cdca6aad9f5cf924ecf40467cb29cf7db7f60304 100644 (file)
@@ -120,6 +120,8 @@ protected:
                            unsigned Op0, unsigned Op1);
 
 private:
+  unsigned createResultReg(const TargetRegisterClass *RC);
+
   bool SelectBinaryOp(Instruction *I, ISD::NodeType ISDOpcode,
                       DenseMap<const Value*, unsigned> &ValueMap);
 
index 44426643591db28e7a6315e7961787902acfd37b..77a39ea44e9901b5108140b40e2dfbee1bc77c86 100644 (file)
@@ -150,24 +150,15 @@ static std::string getLegalCName(std::string OpName) {
 
 void FastISelEmitter::run(std::ostream &OS) {
   EmitSourceFileHeader("\"Fast\" Instruction Selector for the " +
-                       CGP.getTargetInfo().getName() + " target", OS);
-  
-  const CodeGenTarget &Target = CGP.getTargetInfo();
-  
-  // Get the namespace to insert instructions into.  Make sure not to pick up
-  // "TargetInstrInfo" by accidentally getting the namespace off the PHI
-  // instruction or something.
-  std::string InstNS = Target.getInstNamespace();
+                       Target.getName() + " target", OS);
 
+  OS << "#include \"llvm/CodeGen/FastISel.h\"\n";
+  OS << "\n";
   OS << "namespace llvm {\n";
-  OS << "namespace " << InstNS << " {\n";
-  OS << "class FastISel;\n";
-  OS << "}\n";
-  OS << "}\n";
+  OS << "\n";
+  OS << "namespace " << InstNS.substr(0, InstNS.size() - 2) << " {\n";
   OS << "\n";
   
-  if (!InstNS.empty()) InstNS += "::";
-
   typedef std::map<MVT::SimpleValueType, InstructionMemo> TypeMap;
   typedef std::map<std::string, TypeMap> OpcodeTypeMap;
   typedef std::map<OperandsSignature, OpcodeTypeMap> OperandsOpcodeTypeMap;
@@ -245,13 +236,8 @@ void FastISelEmitter::run(std::ostream &OS) {
     }
   }
 
-  OS << "#include \"llvm/CodeGen/FastISel.h\"\n";
-  OS << "\n";
-  OS << "namespace llvm {\n";
-  OS << "\n";
-
   // Declare the target FastISel class.
-  OS << "class " << InstNS << "FastISel : public llvm::FastISel {\n";
+  OS << "class FastISel : public llvm::FastISel {\n";
   for (OperandsOpcodeTypeMap::const_iterator OI = SimplePatterns.begin(),
        OE = SimplePatterns.end(); OI != OE; ++OI) {
     const OperandsSignature &Operands = OI->first;
@@ -294,9 +280,8 @@ void FastISelEmitter::run(std::ostream &OS) {
   OS << "\n";
 
   // Define the target FastISel creation function.
-  OS << "llvm::FastISel *" << InstNS
-     << "createFastISel(MachineFunction &mf) {\n";
-  OS << "  return new " << InstNS << "FastISel(mf);\n";
+  OS << "llvm::FastISel *createFastISel(MachineFunction &mf) {\n";
+  OS << "  return new FastISel(mf);\n";
   OS << "}\n";
   OS << "\n";
 
@@ -320,7 +305,7 @@ void FastISelEmitter::run(std::ostream &OS) {
         MVT::SimpleValueType VT = TI->first;
         const InstructionMemo &Memo = TI->second;
   
-        OS << "unsigned " << InstNS << "FastISel::FastEmit_"
+        OS << "unsigned FastISel::FastEmit_"
            << getLegalCName(Opcode)
            << "_" << getLegalCName(getName(VT)) << "(";
         Operands.PrintParameters(OS);
@@ -338,7 +323,7 @@ void FastISelEmitter::run(std::ostream &OS) {
       }
 
       // Emit one function for the opcode that demultiplexes based on the type.
-      OS << "unsigned " << InstNS << "FastISel::FastEmit_"
+      OS << "unsigned FastISel::FastEmit_"
          << getLegalCName(Opcode) << "(MVT::SimpleValueType VT";
       if (!Operands.empty())
         OS << ", ";
@@ -362,7 +347,7 @@ void FastISelEmitter::run(std::ostream &OS) {
 
     // Emit one function for the operand signature that demultiplexes based
     // on opcode and type.
-    OS << "unsigned " << InstNS << "FastISel::FastEmit_";
+    OS << "unsigned FastISel::FastEmit_";
     Operands.PrintManglingSuffix(OS);
     OS << "(MVT::SimpleValueType VT, ISD::NodeType Opcode";
     if (!Operands.empty())
@@ -387,5 +372,16 @@ void FastISelEmitter::run(std::ostream &OS) {
     OS << "\n";
   }
 
-  OS << "}\n";
+  OS << "} // namespace X86\n";
+  OS << "\n";
+  OS << "} // namespace llvm\n";
+}
+
+FastISelEmitter::FastISelEmitter(RecordKeeper &R)
+  : Records(R),
+    CGP(R),
+    Target(CGP.getTargetInfo()),
+    InstNS(Target.getInstNamespace() + "::") {
+
+  assert(InstNS.size() > 2 && "Can't determine target-specific namespace!");
 }
index df6a0e655cce5807e2e5670bb7176327e6ec955f..da8aa16dbf67ed5694354c79f87ba7f9fed81611 100644 (file)
 
 namespace llvm {
 
+class CodeGenTarget;
+
 /// FastISelEmitter - The top-level class which coordinates construction
 /// and emission of the instruction selector.
 ///
 class FastISelEmitter : public TableGenBackend {
   RecordKeeper &Records;
   CodeGenDAGPatterns CGP;
+  const CodeGenTarget &Target;
+  const std::string InstNS;
 public:
-  explicit FastISelEmitter(RecordKeeper &R) : Records(R), CGP(R) {}
+  explicit FastISelEmitter(RecordKeeper &R);
 
   // run - Output the isel, returning true on failure.
   void run(std::ostream &OS);