Chromium Code Reviews| 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); |