mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-09 08:21:29 +12:00
SPU: Rewrite BGX
This commit is contained in:
parent
e315b39822
commit
feabe71183
2 changed files with 25 additions and 9 deletions
|
@ -3801,16 +3801,32 @@ void spu_recompiler::CGX(spu_opcode_t op) //nf
|
|||
|
||||
void spu_recompiler::BGX(spu_opcode_t op) //nf
|
||||
{
|
||||
for (u32 i = 0; i < 4; i++) // unrolled loop
|
||||
const XmmLink& vt = XmmGet(op.rt, XmmType::Int);
|
||||
const XmmLink& va = XmmGet(op.ra, XmmType::Int);
|
||||
const XmmLink& vb = XmmGet(op.rb, XmmType::Int);
|
||||
const XmmLink& temp = XmmAlloc();
|
||||
const XmmLink& sign = XmmAlloc();
|
||||
|
||||
c->pslld(vt, 31);
|
||||
|
||||
if (utils::has_avx())
|
||||
{
|
||||
c->bt(SPU_OFF_32(gpr, op.rt, &v128::_u32, i), 0);
|
||||
c->cmc();
|
||||
c->mov(*addr, SPU_OFF_32(gpr, op.rb, &v128::_u32, i));
|
||||
c->sbb(*addr, SPU_OFF_32(gpr, op.ra, &v128::_u32, i));
|
||||
c->setnc(addr->r8());
|
||||
c->movzx(*addr, addr->r8());
|
||||
c->mov(SPU_OFF_32(gpr, op.rt, &v128::_u32, i), *addr);
|
||||
c->vpcmpeqd(temp, vb, va);
|
||||
}
|
||||
else
|
||||
{
|
||||
c->movdqa(temp, vb);
|
||||
c->pcmpeqd(temp, va);
|
||||
}
|
||||
|
||||
c->pand(vt, temp);
|
||||
c->movdqa(sign, XmmConst(_mm_set1_epi32(-0x80000000)));
|
||||
c->pxor(va, sign);
|
||||
c->pxor(vb, sign);
|
||||
c->pcmpgtd(vb, va);
|
||||
c->por(vt, vb);
|
||||
c->psrld(vt, 31);
|
||||
c->movdqa(SPU_OFF_128(gpr, op.rt), vt);
|
||||
}
|
||||
|
||||
void spu_recompiler::MPYHHA(spu_opcode_t op)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue