Index: src/IceInstX8632.h |
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h |
index b57f3bae1bc82d05a42d6265c7bb1beaed5a42d4..8fa4bdb745e641d8f7cfaf3aff3a692d6a79b5ed 100644 |
--- a/src/IceInstX8632.h |
+++ b/src/IceInstX8632.h |
@@ -485,11 +485,12 @@ private: |
// Emit a two-operand (GPR) instruction, where the dest operand is a |
// Variable that's guaranteed to be a register. |
+template <bool VarCanBeByte = true, bool SrcCanBeByte = true> |
void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Dst, |
const Operand *Src, |
const x86::AssemblerX86::GPREmitterRegOp &Emitter); |
-// Instructions of the form x := op(y) |
+// Instructions of the form x := op(y). |
template <InstX8632::InstKindX8632 K> |
class InstX8632UnaryopGPR : public InstX8632 { |
InstX8632UnaryopGPR(const InstX8632UnaryopGPR &) = delete; |
@@ -519,7 +520,7 @@ public: |
void dump(const Cfg *Func) const override { |
Ostream &Str = Func->getContext()->getStrDump(); |
dumpDest(Func); |
- Str << " = " << Opcode << "." << getDest()->getType() << " "; |
+ Str << " = " << Opcode << "." << getSrc(0)->getType() << " "; |
dumpSources(Func); |
} |
static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
@@ -886,6 +887,8 @@ typedef InstX8632UnaryopGPR<InstX8632::Bsr> InstX8632Bsr; |
typedef InstX8632UnaryopGPR<InstX8632::Lea> InstX8632Lea; |
// Cbwdq instruction - wrapper for cbw, cwd, and cdq |
typedef InstX8632UnaryopGPR<InstX8632::Cbwdq> InstX8632Cbwdq; |
+typedef InstX8632UnaryopGPR<InstX8632::Movsx> InstX8632Movsx; |
+typedef InstX8632UnaryopGPR<InstX8632::Movzx> InstX8632Movzx; |
typedef InstX8632UnaryopXmm<InstX8632::Movd> InstX8632Movd; |
typedef InstX8632UnaryopXmm<InstX8632::Sqrtss> InstX8632Sqrtss; |
// Move/assignment instruction - wrapper for mov/movss/movsd. |
@@ -1323,46 +1326,6 @@ private: |
~InstX8632StoreQ() override {} |
}; |
-// Movsx - copy from a narrower integer type to a wider integer |
-// type, with sign extension. |
-class InstX8632Movsx : public InstX8632 { |
- InstX8632Movsx(const InstX8632Movsx &) = delete; |
- InstX8632Movsx &operator=(const InstX8632Movsx &) = delete; |
- |
-public: |
- static InstX8632Movsx *create(Cfg *Func, Variable *Dest, Operand *Source) { |
- return new (Func->allocate<InstX8632Movsx>()) |
- InstX8632Movsx(Func, Dest, Source); |
- } |
- void emit(const Cfg *Func) const override; |
- void dump(const Cfg *Func) const override; |
- static bool classof(const Inst *Inst) { return isClassof(Inst, Movsx); } |
- |
-private: |
- InstX8632Movsx(Cfg *Func, Variable *Dest, Operand *Source); |
- ~InstX8632Movsx() override {} |
-}; |
- |
-// Movzx - copy from a narrower integer type to a wider integer |
-// type, with zero extension. |
-class InstX8632Movzx : public InstX8632 { |
- InstX8632Movzx(const InstX8632Movzx &) = delete; |
- InstX8632Movzx &operator=(const InstX8632Movzx &) = delete; |
- |
-public: |
- static InstX8632Movzx *create(Cfg *Func, Variable *Dest, Operand *Source) { |
- return new (Func->allocate<InstX8632Movzx>()) |
- InstX8632Movzx(Func, Dest, Source); |
- } |
- void emit(const Cfg *Func) const override; |
- void dump(const Cfg *Func) const override; |
- static bool classof(const Inst *Inst) { return isClassof(Inst, Movzx); } |
- |
-private: |
- InstX8632Movzx(Cfg *Func, Variable *Dest, Operand *Source); |
- ~InstX8632Movzx() override {} |
-}; |
- |
// Nop instructions of varying length |
class InstX8632Nop : public InstX8632 { |
InstX8632Nop(const InstX8632Nop &) = delete; |
@@ -1573,6 +1536,8 @@ template <> void InstX8632MovssRegs::emitIAS(const Cfg *Func) const; |
template <> void InstX8632Pblendvb::emitIAS(const Cfg *Func) const; |
template <> void InstX8632Pextr::emitIAS(const Cfg *Func) const; |
template <> void InstX8632Pinsr::emitIAS(const Cfg *Func) const; |
+template <> void InstX8632Movsx::emitIAS(const Cfg *Func) const; |
+template <> void InstX8632Movzx::emitIAS(const Cfg *Func) const; |
template <> void InstX8632Pmull::emitIAS(const Cfg *Func) const; |
template <> void InstX8632Pshufd::emitIAS(const Cfg *Func) const; |
template <> void InstX8632Shufps::emitIAS(const Cfg *Func) const; |