Index: src/IceInstARM32.h |
diff --git a/src/IceInstARM32.h b/src/IceInstARM32.h |
index 9e0bb650c54bf5900bacfad9f54ce6c2f539112d..3f5f6bd7461f27084431cee2e81163c9d9b570c9 100644 |
--- a/src/IceInstARM32.h |
+++ b/src/IceInstARM32.h |
@@ -91,7 +91,7 @@ public: |
// general Constant operands like ConstantRelocatable, since a relocatable |
// can potentially take up too many bits. |
static OperandARM32Mem *create(Cfg *Func, Type Ty, Variable *Base, |
- ConstantInteger32 *ImmOffset = nullptr, |
+ ConstantInteger32 *ImmOffset, |
AddrMode Mode = Offset) { |
return new (Func->allocate<OperandARM32Mem>()) |
OperandARM32Mem(Func, Ty, Base, ImmOffset, Mode); |
@@ -277,6 +277,7 @@ public: |
Push, |
Ret, |
Sbc, |
+ Str, |
Sub, |
Umull |
}; |
@@ -763,6 +764,31 @@ private: |
~InstARM32Ret() override {} |
}; |
+// Store instruction. It's important for liveness that there is no Dest |
+// operand (OperandARM32Mem instead of Dest Variable). |
+class InstARM32Str : public InstARM32Pred { |
+ InstARM32Str() = delete; |
+ InstARM32Str(const InstARM32Str &) = delete; |
+ InstARM32Str &operator=(const InstARM32Str &) = delete; |
+ |
+public: |
+ // Value must be a register. |
+ static InstARM32Str *create(Cfg *Func, Variable *Value, OperandARM32Mem *Mem, |
+ CondARM32::Cond Predicate) { |
+ return new (Func->allocate<InstARM32Str>()) |
+ InstARM32Str(Func, Value, Mem, Predicate); |
+ } |
+ void emit(const Cfg *Func) const override; |
+ void emitIAS(const Cfg *Func) const override; |
+ void dump(const Cfg *Func) const override; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Str); } |
+ |
+private: |
+ InstARM32Str(Cfg *Func, Variable *Value, OperandARM32Mem *Mem, |
+ CondARM32::Cond Predicate); |
+ ~InstARM32Str() override {} |
+}; |
+ |
// Unsigned Multiply Long: d.lo, d.hi := x * y |
class InstARM32Umull : public InstARM32Pred { |
InstARM32Umull() = delete; |