Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index d51eeca2f5d7fed75152798f12ce9d506ce756a3..adfd0df05a6dd0961be0481ea68c8cf84bd487d4 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -1077,6 +1077,18 @@ 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::isa<Variable>(Inst->getSrc(2))); |
Jim Stichnoth
2014/10/13 16:07:32
Won't the cast include the isa test?
jvoung (off chromium)
2014/10/13 21:04:00
Done -- yep, removed
|
+ 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 +1097,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); |