Index: src/IceInstX8632.h |
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h |
index db60d68ee53b5f3e7ed8ebeed96e30fab39edbc0..b50199b4f97649865b80f999042a84a59d7e3c49 100644 |
--- a/src/IceInstX8632.h |
+++ b/src/IceInstX8632.h |
@@ -141,6 +141,7 @@ public: |
Br, |
Bsf, |
Bsr, |
+ Bswap, |
Call, |
Cdq, |
Cmov, |
@@ -188,6 +189,7 @@ public: |
Push, |
Pxor, |
Ret, |
+ Rol, |
Sar, |
Sbb, |
Shl, |
@@ -352,6 +354,42 @@ private: |
virtual ~InstX8632Call() {} |
}; |
+// Instructions of the form x := op(x). |
+template <InstX8632::InstKindX8632 K> |
+class InstX8632Inplaceop : public InstX8632 { |
+public: |
+ static InstX8632Inplaceop *create(Cfg *Func, Operand *SrcDest) { |
+ return new (Func->allocate<InstX8632Inplaceop>()) |
+ InstX8632Inplaceop(Func, SrcDest); |
+ } |
+ virtual void emit(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrEmit(); |
+ assert(getSrcSize() == 1); |
+ Str << "\t" << Opcode << "\t"; |
+ getSrc(0)->emit(Func); |
+ Str << "\n"; |
+ } |
+ virtual void dump(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrDump(); |
+ dumpDest(Func); |
+ Str << " = " << Opcode << "." << getDest()->getType() << " "; |
+ dumpSources(Func); |
+ } |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
+ |
+private: |
+ InstX8632Inplaceop(Cfg *Func, Operand *SrcDest) |
+ : InstX8632(Func, K, 1, llvm::dyn_cast<Variable>(SrcDest)) { |
+ addSource(SrcDest); |
+ } |
+ InstX8632Inplaceop(const InstX8632Inplaceop &) LLVM_DELETED_FUNCTION; |
+ InstX8632Inplaceop & |
+ operator=(const InstX8632Inplaceop &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632Inplaceop() {} |
+ static const char *Opcode; |
+}; |
+ |
+// Instructions of the form x := op(y) |
template <InstX8632::InstKindX8632 K> |
class InstX8632Unaryop : public InstX8632 { |
public: |
@@ -506,6 +544,8 @@ private: |
static const char *Opcode; |
}; |
+typedef InstX8632Inplaceop<InstX8632::Bswap> InstX8632Bswap; |
+typedef InstX8632Inplaceop<InstX8632::Neg> InstX8632Neg; |
typedef InstX8632Unaryop<InstX8632::Bsf> InstX8632Bsf; |
typedef InstX8632Unaryop<InstX8632::Bsr> InstX8632Bsr; |
typedef InstX8632Unaryop<InstX8632::Lea> InstX8632Lea; |
@@ -535,6 +575,7 @@ typedef InstX8632Binop<InstX8632::Pmullw> InstX8632Pmullw; |
typedef InstX8632Binop<InstX8632::Pmuludq> InstX8632Pmuludq; |
typedef InstX8632Binop<InstX8632::Divps> InstX8632Divps; |
typedef InstX8632Binop<InstX8632::Divss> InstX8632Divss; |
+typedef InstX8632Binop<InstX8632::Rol, true> InstX8632Rol; |
typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl; |
typedef InstX8632Binop<InstX8632::Psll> InstX8632Psll; |
typedef InstX8632Binop<InstX8632::Shr, true> InstX8632Shr; |
@@ -590,23 +631,6 @@ private: |
virtual ~InstX8632Mul() {} |
}; |
-// Neg instruction - Two's complement negation. |
-class InstX8632Neg : public InstX8632 { |
-public: |
- static InstX8632Neg *create(Cfg *Func, Operand *SrcDest) { |
- return new (Func->allocate<InstX8632Neg>()) InstX8632Neg(Func, SrcDest); |
- } |
- virtual void emit(const Cfg *Func) const; |
- virtual void dump(const Cfg *Func) const; |
- static bool classof(const Inst *Inst) { return isClassof(Inst, Neg); } |
- |
-private: |
- InstX8632Neg(Cfg *Func, Operand *SrcDest); |
- InstX8632Neg(const InstX8632Neg &) LLVM_DELETED_FUNCTION; |
- InstX8632Neg &operator=(const InstX8632Neg &) LLVM_DELETED_FUNCTION; |
- virtual ~InstX8632Neg() {} |
-}; |
- |
// Shld instruction - shift across a pair of operands. TODO: Verify |
// that the validator accepts the shld instruction. |
class InstX8632Shld : public InstX8632 { |