Index: src/IceInstMIPS32.h |
diff --git a/src/IceInstMIPS32.h b/src/IceInstMIPS32.h |
index 8a2313679862c5a6b5955be0bec0ef3fb795b92c..aa07ba609b56ca4f38c33ac1d7ee1f4579adcaf2 100644 |
--- a/src/IceInstMIPS32.h |
+++ b/src/IceInstMIPS32.h |
@@ -152,6 +152,7 @@ public: |
Srlv, |
Sub, |
Subu, |
+ Sw, |
Xor, |
Xori |
}; |
@@ -307,6 +308,58 @@ private: |
static const char *Opcode; |
}; |
+// InstMIPS32Memory represents instructions which loads/stores data on stack |
John
2016/05/23 13:30:37
not just stack memory, but also globals, right?
|
+// Its format is "OPCODE GPR, OFFSET(BASE GPR)" |
+template <InstMIPS32::InstKindMIPS32 K> |
+class InstMIPS32Memory : public InstMIPS32 { |
+ InstMIPS32Memory() = delete; |
+ InstMIPS32Memory(const InstMIPS32Memory &) = delete; |
+ InstMIPS32Memory &operator=(const InstMIPS32Memory &) = delete; |
+ |
+public: |
+ static InstMIPS32Memory *create(Cfg *Func, Variable *Value, |
+ OperandMIPS32Mem *Mem) { |
+ return new (Func->allocate<InstMIPS32Memory>()) |
+ InstMIPS32Memory(Func, Value, Mem); |
+ } |
+ |
+ void emit(const Cfg *Func) const override { |
+ if (!BuildDefs::dump()) |
+ return; |
+ Ostream &Str = Func->getContext()->getStrEmit(); |
+ assert(getSrcSize() == 2); |
+ Str << "\t" << Opcode << "\t"; |
+ getSrc(0)->emit(Func); |
+ Str << ", "; |
+ getSrc(1)->emit(Func); |
+ } |
+ |
+ void emitIAS(const Cfg *Func) const override { |
+ (void)Func; |
+ llvm_unreachable("Not yet implemented"); |
+ } |
+ |
+ void dump(const Cfg *Func) const override { |
+ if (!BuildDefs::dump()) |
+ return; |
+ Ostream &Str = Func->getContext()->getStrDump(); |
+ Str << "\t" << Opcode << "\t"; |
+ Str << " "; |
+ getSrc(1)->dump(Func); |
+ Str << ", "; |
+ getSrc(0)->dump(Func); |
+ } |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
+ |
+private: |
+ InstMIPS32Memory(Cfg *Func, Variable *Value, OperandMIPS32Mem *Mem) |
+ : InstMIPS32(Func, K, 2, nullptr) { |
+ addSource(Value); |
+ addSource(Mem); |
+ } |
+ static const char *Opcode; |
+}; |
+ |
// InstMIPS32Label represents an intra-block label that is the target of an |
// intra-block branch. The offset between the label and the branch must be fit |
// in the instruction immediate (considered "near"). |
@@ -497,6 +550,7 @@ using InstMIPS32Srl = InstMIPS32Imm16<InstMIPS32::Srl>; |
using InstMIPS32Srlv = InstMIPS32ThreeAddrGPR<InstMIPS32::Srlv>; |
using InstMIPS32Sub = InstMIPS32ThreeAddrGPR<InstMIPS32::Sub>; |
using InstMIPS32Subu = InstMIPS32ThreeAddrGPR<InstMIPS32::Subu>; |
+using InstMIPS32Sw = InstMIPS32Memory<InstMIPS32::Sw>; |
using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>; |
using InstMIPS32Xor = InstMIPS32ThreeAddrGPR<InstMIPS32::Xor>; |
using InstMIPS32Xori = InstMIPS32Imm16<InstMIPS32::Xori>; |