Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index d51eeca2f5d7fed75152798f12ce9d506ce756a3..274d02c4cb11f3d6e39f9cd318c3a14fdb5d6d64 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -1067,7 +1067,6 @@ void emitVariableBlendInst(const char *Opcode, const Inst *Inst, |
const Cfg *Func) { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(Inst->getSrcSize() == 3); |
- assert(llvm::isa<Variable>(Inst->getSrc(2))); |
assert(llvm::cast<Variable>(Inst->getSrc(2))->getRegNum() == |
RegX8632::Reg_xmm0); |
Str << "\t" << Opcode << "\t"; |
@@ -1077,6 +1076,17 @@ void emitVariableBlendInst(const char *Opcode, const Inst *Inst, |
Str << "\n"; |
} |
+void |
+emitIASVariableBlendInst(const Inst *Inst, const Cfg *Func, |
+ const x86::AssemblerX86::XmmEmitterRegOp &Emitter) { |
+ assert(Inst->getSrcSize() == 3); |
+ assert(llvm::cast<Variable>(Inst->getSrc(2))->getRegNum() == |
+ RegX8632::Reg_xmm0); |
+ const Variable *Dest = Inst->getDest(); |
+ const Operand *Src = Inst->getSrc(1); |
+ emitIASRegOpTyXMM(Func, Dest->getType(), Dest, Src, Emitter); |
+} |
+ |
} // end anonymous namespace |
template <> void InstX8632Blendvps::emit(const Cfg *Func) const { |
@@ -1085,12 +1095,28 @@ template <> void InstX8632Blendvps::emit(const Cfg *Func) const { |
emitVariableBlendInst(Opcode, this, Func); |
} |
+template <> void InstX8632Blendvps::emitIAS(const Cfg *Func) const { |
+ assert(static_cast<TargetX8632 *>(Func->getTarget())->getInstructionSet() >= |
+ TargetX8632::SSE4_1); |
+ static const x86::AssemblerX86::XmmEmitterRegOp Emitter = { |
+ &x86::AssemblerX86::blendvps, &x86::AssemblerX86::blendvps}; |
+ emitIASVariableBlendInst(this, Func, Emitter); |
+} |
+ |
template <> void InstX8632Pblendvb::emit(const Cfg *Func) const { |
assert(static_cast<TargetX8632 *>(Func->getTarget())->getInstructionSet() >= |
TargetX8632::SSE4_1); |
emitVariableBlendInst(Opcode, this, Func); |
} |
+template <> void InstX8632Pblendvb::emitIAS(const Cfg *Func) const { |
+ assert(static_cast<TargetX8632 *>(Func->getTarget())->getInstructionSet() >= |
+ TargetX8632::SSE4_1); |
+ static const x86::AssemblerX86::XmmEmitterRegOp Emitter = { |
+ &x86::AssemblerX86::pblendvb, &x86::AssemblerX86::pblendvb}; |
+ emitIASVariableBlendInst(this, Func, Emitter); |
+} |
+ |
template <> void InstX8632Imul::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(getSrcSize() == 2); |