Index: src/IceInstX8632.h |
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h |
index 7e6e19987a4dcda3cab4678143b00adce4d35bb0..54df8695f1ccfd48198e9d45ea961a171de965ea 100644 |
--- a/src/IceInstX8632.h |
+++ b/src/IceInstX8632.h |
@@ -151,7 +151,9 @@ public: |
Imul, |
Label, |
Load, |
+ Mfence, |
Mov, |
+ Movq, |
Movsx, |
Movzx, |
Mul, |
@@ -167,11 +169,13 @@ public: |
Shr, |
Shrd, |
Store, |
+ StoreQ, |
Sub, |
Subss, |
Test, |
Ucomiss, |
UD2, |
+ Xadd, |
Xor |
}; |
static const char *getWidthString(Type Ty); |
@@ -578,6 +582,23 @@ private: |
virtual ~InstX8632Test() {} |
}; |
+// Mfence instruction. |
+class InstX8632Mfence : public InstX8632 { |
+public: |
+ static InstX8632Mfence *create(Cfg *Func) { |
+ return new (Func->allocate<InstX8632Mfence>()) InstX8632Mfence(Func); |
+ } |
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Mfence); } |
+ |
+private: |
+ InstX8632Mfence(Cfg *Func); |
+ InstX8632Mfence(const InstX8632Mfence &) LLVM_DELETED_FUNCTION; |
+ InstX8632Mfence &operator=(const InstX8632Mfence &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632Mfence() {} |
+}; |
+ |
// This is essentially a "mov" instruction with an OperandX8632Mem |
// operand instead of Variable as the destination. It's important |
// for liveness that there is no Dest operand. |
@@ -617,6 +638,45 @@ private: |
virtual ~InstX8632Mov() {} |
}; |
+// This is essentially a "movq" instruction with an OperandX8632Mem |
+// operand instead of Variable as the destination. It's important |
+// for liveness that there is no Dest operand. |
+class InstX8632StoreQ : public InstX8632 { |
+public: |
+ static InstX8632StoreQ *create(Cfg *Func, Operand *Value, OperandX8632 *Mem) { |
+ return new (Func->allocate<InstX8632StoreQ>()) |
+ InstX8632StoreQ(Func, Value, Mem); |
+ } |
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, StoreQ); } |
+ |
+private: |
+ InstX8632StoreQ(Cfg *Func, Operand *Value, OperandX8632 *Mem); |
+ InstX8632StoreQ(const InstX8632StoreQ &) LLVM_DELETED_FUNCTION; |
+ InstX8632StoreQ &operator=(const InstX8632StoreQ &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632StoreQ() {} |
+}; |
+ |
+// Movq - copy between XMM registers, or mem64 and XMM registers. |
+class InstX8632Movq : public InstX8632 { |
+public: |
+ static InstX8632Movq *create(Cfg *Func, Variable *Dest, Operand *Source) { |
+ return new (Func->allocate<InstX8632Movq>()) |
+ InstX8632Movq(Func, Dest, Source); |
+ } |
+ virtual bool isRedundantAssign() const; |
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Movq); } |
+ |
+private: |
+ InstX8632Movq(Cfg *Func, Variable *Dest, Operand *Source); |
+ InstX8632Movq(const InstX8632Movq &) LLVM_DELETED_FUNCTION; |
+ InstX8632Movq &operator=(const InstX8632Movq &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632Movq() {} |
+}; |
+ |
// Movsx - copy from a narrower integer type to a wider integer |
// type, with sign extension. |
class InstX8632Movsx : public InstX8632 { |
@@ -744,6 +804,33 @@ private: |
virtual ~InstX8632Ret() {} |
}; |
+// Exchanging Add instruction. Exchanges the first operand (destination |
+// operand) with the second operand (source operand), then loads the sum |
+// of the two values into the destination operand. The destination may be |
+// a register or memory, while the source must be a register. |
+// |
+// Both the dest and source are updated. The caller should then insert a |
+// FakeDef to reflect the second udpate. |
+class InstX8632Xadd : public InstX8632 { |
+public: |
+ static InstX8632Xadd *create(Cfg *Func, Operand *Dest, Variable *Source, |
+ bool Locked) { |
+ return new (Func->allocate<InstX8632Xadd>()) |
+ InstX8632Xadd(Func, Dest, Source, Locked); |
+ } |
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Xadd); } |
+ |
+private: |
+ bool Locked; |
+ |
+ InstX8632Xadd(Cfg *Func, Operand *Dest, Variable *Source, bool Locked); |
+ InstX8632Xadd(const InstX8632Xadd &) LLVM_DELETED_FUNCTION; |
+ InstX8632Xadd &operator=(const InstX8632Xadd &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632Xadd() {} |
+}; |
+ |
} // end of namespace Ice |
#endif // SUBZERO_SRC_ICEINSTX8632_H |