aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-08-21 00:19:05 +0000
committerDan Gohman <gohman@apple.com>2008-08-21 00:19:05 +0000
commitc7f72de3b4ef21828ea4780f0693bf0acd04e1c5 (patch)
tree462b2fd3ccffd5e898da7dc68bf7199f315d0e68 /utils
parentcb3718832375a581c5ea23f15918f3ea447a446c (diff)
Begin making more use of the FastISelEmitter class.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55093 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/FastISelEmitter.cpp50
-rw-r--r--utils/TableGen/FastISelEmitter.h6
2 files changed, 28 insertions, 28 deletions
diff --git a/utils/TableGen/FastISelEmitter.cpp b/utils/TableGen/FastISelEmitter.cpp
index 4442664359..77a39ea44e 100644
--- a/utils/TableGen/FastISelEmitter.cpp
+++ b/utils/TableGen/FastISelEmitter.cpp
@@ -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!");
}
diff --git a/utils/TableGen/FastISelEmitter.h b/utils/TableGen/FastISelEmitter.h
index df6a0e655c..da8aa16dbf 100644
--- a/utils/TableGen/FastISelEmitter.h
+++ b/utils/TableGen/FastISelEmitter.h
@@ -19,14 +19,18 @@
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);