aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/MInstBuilder.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/CodeGen/MInstBuilder.h')
-rw-r--r--include/llvm/CodeGen/MInstBuilder.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/MInstBuilder.h b/include/llvm/CodeGen/MInstBuilder.h
new file mode 100644
index 0000000000..6b0ba51fff
--- /dev/null
+++ b/include/llvm/CodeGen/MInstBuilder.h
@@ -0,0 +1,51 @@
+//===-- CodeGen/MInstBuilder.h - Simplify creation of MInstcn's -*- C++ -*-===//
+//
+// This file exposes a function named BuildMInst that is useful for dramatically
+// simplifying how MInstruction's are created. Instead of using code like this:
+//
+// M = new MInstruction(BB, X86::ADDrr32, DestReg);
+// M->addOperand(Arg0Reg, MOperand::Register);
+// M->addOperand(Arg1Reg, MOperand::Register);
+//
+// we can now use code like this:
+//
+// M = BuildMInst(BB, X86::ADDrr8, DestReg).addReg(Arg0Reg).addReg(Arg1Reg);
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_MINSTBUILDER_H
+#define LLVM_CODEGEN_MINSTBUILDER_H
+
+#include "llvm/CodeGen/MInstruction.h"
+
+struct MInstructionBuilder {
+ MInstruction *MI;
+
+ MInstructionBuilder(MInstruction *mi) : MI(mi) {}
+
+ /// Allow automatic conversion to the machine instruction we are working on.
+ ///
+ operator MInstruction*() const { return MI; }
+
+ /// addReg - Add a new register operand...
+ ///
+ MInstructionBuilder &addReg(unsigned RegNo) {
+ MI->addOperand(RegNo, MOperand::Register);
+ return *this;
+ }
+
+};
+
+/// BuildMInst - Builder interface. Specify how to create the initial
+/// instruction itself.
+///
+inline MInstructionBuilder BuildMInst(unsigned Opcode, unsigned DestReg = 0) {
+ return MInstructionBuilder(new MInstruction(Opcode, DestReg));
+}
+
+inline MInstructionBuilder BuildMInst(MBasicBlock *BB, unsigned Opcode,
+ unsigned DestReg = 0) {
+ return MInstructionBuilder(new MInstruction(BB, Opcode, DestReg));
+}
+
+#endif