Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index 0a2d034f9ac941b6aa424e99590fc5e2b3d84043..ab323350e5649774e8ff46e0e47e4a1997c375f8 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -720,6 +720,12 @@ template <> |
const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Pandn::Emitter = { |
&x86::AssemblerX86::pandn, &x86::AssemblerX86::pandn, NULL}; |
template <> |
+const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Pcmpeq::Emitter = { |
+ &x86::AssemblerX86::pcmpeq, &x86::AssemblerX86::pcmpeq, NULL}; |
+template <> |
+const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Pcmpgt::Emitter = { |
+ &x86::AssemblerX86::pcmpgt, &x86::AssemblerX86::pcmpgt, NULL}; |
+template <> |
const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Pmuludq::Emitter = { |
&x86::AssemblerX86::pmuludq, &x86::AssemblerX86::pmuludq, NULL}; |
template <> |
@@ -904,6 +910,30 @@ template <> void InstX8632Imul::emit(const Cfg *Func) const { |
} |
} |
+template <> void InstX8632Imul::emitIAS(const Cfg *Func) const { |
+ assert(getSrcSize() == 2); |
+ const Variable *Var = getDest(); |
+ Type Ty = Var->getType(); |
+ const Operand *Src = getSrc(1); |
+ if (isByteSizedArithType(Ty)) { |
+ // The 8-bit version of imul only allows the form "imul r/m8". |
+ Variable *Src0 = llvm::dyn_cast<Variable>(getSrc(0)); |
+ (void)Src0; |
+ assert(Src0 && Src0->getRegNum() == RegX8632::Reg_eax); |
+ const x86::AssemblerX86::GPREmitterOneOp Emitter = { |
+ &x86::AssemblerX86::imul, &x86::AssemblerX86::imul}; |
+ emitIASOpTyGPR(Func, Ty, getSrc(1), Emitter); |
+ } else { |
+ // We only use imul as a two-address instruction even though |
+ // there is a 3 operand version when one of the operands is a constant. |
+ assert(Var == getSrc(0)); |
+ const x86::AssemblerX86::GPREmitterRegOp Emitter = { |
+ &x86::AssemblerX86::imul, &x86::AssemblerX86::imul, |
+ &x86::AssemblerX86::imul}; |
+ emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter); |
+ } |
+} |
+ |
template <> void InstX8632Cbwdq::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(getSrcSize() == 1); |