Index: src/IceInstX8632.h |
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h |
index 25beb6dd93d58dc138109010c1830c3aab27bc05..ffddd7da230675b915176f2e3637208fa53d788f 100644 |
--- a/src/IceInstX8632.h |
+++ b/src/IceInstX8632.h |
@@ -165,7 +165,14 @@ public: |
Mulss, |
Neg, |
Or, |
+ Padd, |
+ Pand, |
+ Pmullw, |
+ Pmuludq, |
Pop, |
+ Por, |
+ Pshufd, |
+ Psub, |
Push, |
Pxor, |
Ret, |
@@ -175,6 +182,7 @@ public: |
Shld, |
Shr, |
Shrd, |
+ Shufps, |
Sqrtss, |
Store, |
StoreQ, |
@@ -443,17 +451,23 @@ typedef InstX8632Binop<InstX8632::Add> InstX8632Add; |
typedef InstX8632Binop<InstX8632::Addps> InstX8632Addps; |
typedef InstX8632Binop<InstX8632::Adc> InstX8632Adc; |
typedef InstX8632Binop<InstX8632::Addss> InstX8632Addss; |
+typedef InstX8632Binop<InstX8632::Padd> InstX8632Padd; |
typedef InstX8632Binop<InstX8632::Sub> InstX8632Sub; |
typedef InstX8632Binop<InstX8632::Subps> InstX8632Subps; |
typedef InstX8632Binop<InstX8632::Subss> InstX8632Subss; |
typedef InstX8632Binop<InstX8632::Sbb> InstX8632Sbb; |
+typedef InstX8632Binop<InstX8632::Psub> InstX8632Psub; |
typedef InstX8632Binop<InstX8632::And> InstX8632And; |
+typedef InstX8632Binop<InstX8632::Pand> InstX8632Pand; |
typedef InstX8632Binop<InstX8632::Or> InstX8632Or; |
+typedef InstX8632Binop<InstX8632::Por> InstX8632Por; |
typedef InstX8632Binop<InstX8632::Xor> InstX8632Xor; |
typedef InstX8632Binop<InstX8632::Pxor> InstX8632Pxor; |
typedef InstX8632Binop<InstX8632::Imul> InstX8632Imul; |
typedef InstX8632Binop<InstX8632::Mulps> InstX8632Mulps; |
typedef InstX8632Binop<InstX8632::Mulss> InstX8632Mulss; |
+typedef InstX8632Binop<InstX8632::Pmullw> InstX8632Pmullw; |
+typedef InstX8632Binop<InstX8632::Pmuludq> InstX8632Pmuludq; |
typedef InstX8632Binop<InstX8632::Divps> InstX8632Divps; |
typedef InstX8632Binop<InstX8632::Divss> InstX8632Divss; |
typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl; |
@@ -928,6 +942,27 @@ private: |
virtual ~InstX8632Push() {} |
}; |
+// Pshufd - shuffle a vector of doublewords |
+class InstX8632Pshufd : public InstX8632 { |
+public: |
+ static InstX8632Pshufd *create(Cfg *Func, Variable *Dest, Operand *Source1, |
+ Operand *Source2) { |
+ return new (Func->allocate<InstX8632Pshufd>()) |
+ InstX8632Pshufd(Func, Dest, Source1, Source2); |
+ } |
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Pshufd); } |
+ |
+private: |
+ InstX8632Pshufd(Cfg *Func, Variable *Dest, Operand *Source1, |
+ Operand *Source2); |
+ InstX8632Pshufd(const InstX8632Pshufd &) LLVM_DELETED_FUNCTION; |
+ InstX8632Pshufd &operator=(const InstX8632Pshufd &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632Pshufd() {} |
+ static const char *Opcode; |
+}; |
+ |
// Ret instruction. Currently only supports the "ret" version that |
// does not pop arguments. This instruction takes a Source operand |
// (for non-void returning functions) for liveness analysis, though |
@@ -948,6 +983,27 @@ private: |
virtual ~InstX8632Ret() {} |
}; |
+// Shufps - select from two vectors of floating point values |
+class InstX8632Shufps : public InstX8632 { |
+public: |
+ static InstX8632Shufps *create(Cfg *Func, Variable *Dest, Operand *Source1, |
+ Operand *Source2) { |
+ return new (Func->allocate<InstX8632Shufps>()) |
+ InstX8632Shufps(Func, Dest, Source1, Source2); |
+ } |
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Shufps); } |
+ |
+private: |
+ InstX8632Shufps(Cfg *Func, Variable *Dest, Operand *Source1, |
+ Operand *Source2); |
+ InstX8632Shufps(const InstX8632Shufps &) LLVM_DELETED_FUNCTION; |
+ InstX8632Shufps &operator=(const InstX8632Shufps &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632Shufps() {} |
+ static const char *Opcode; |
+}; |
+ |
// Sqrtss - Scalar sqrt of a float or double. |
class InstX8632Sqrtss : public InstX8632 { |
public: |