mirror of
https://github.com/libretro/ppsspp.git
synced 2024-12-03 14:40:49 +00:00
Implement vmone/vmzero/vmidt for the x86 jit.
This commit is contained in:
parent
654490566f
commit
d823989330
@ -431,6 +431,11 @@ namespace MIPSComp
|
||||
fpr.ReleaseSpillLocks();
|
||||
}
|
||||
|
||||
void Jit::Comp_VMatrixInit(u32 op)
|
||||
{
|
||||
CONDITIONAL_DISABLE;
|
||||
}
|
||||
|
||||
void Jit::Comp_VDot(u32 op)
|
||||
{
|
||||
// DISABLE;
|
||||
|
@ -192,6 +192,7 @@ public:
|
||||
void Comp_SVQ(u32 op);
|
||||
void Comp_VPFX(u32 op);
|
||||
void Comp_VVectorInit(u32 op);
|
||||
void Comp_VMatrixInit(u32 op);
|
||||
void Comp_VDot(u32 op);
|
||||
void Comp_VecDo3(u32 op);
|
||||
void Comp_VV2Op(u32 op);
|
||||
|
@ -331,8 +331,8 @@ namespace MIPSInt
|
||||
switch ((op >> 16) & 0xF)
|
||||
{
|
||||
case 3: m=idt; break; //identity // vmidt
|
||||
case 6: m=zero; break; // vzero
|
||||
case 7: m=one; break; // vone
|
||||
case 6: m=zero; break; // vmzero
|
||||
case 7: m=one; break; // vmone
|
||||
default:
|
||||
_dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted");
|
||||
return;
|
||||
|
@ -672,12 +672,12 @@ const MIPSInstruction tableVFPUMatrixSet1[16] = //111100 11100 0xxxx (rm x is
|
||||
INSTR("vmmov",&Jit::Comp_Vmmov, Dis_MatrixSet2, Int_Vmmov, IS_VFPU|OUT_EAT_PREFIX),
|
||||
{-2},
|
||||
{-2},
|
||||
INSTR("vmidt",&Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vmidt",&Jit::Comp_VMatrixInit, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX),
|
||||
|
||||
{-2},
|
||||
{-2},
|
||||
INSTR("vmzero", &Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vmone", &Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vmzero", &Jit::Comp_VMatrixInit, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vmone", &Jit::Comp_VMatrixInit, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX),
|
||||
|
||||
{-2},{-2},{-2},{-2},
|
||||
{-2},{-2},{-2},{-2},
|
||||
|
@ -824,6 +824,49 @@ void Jit::Comp_Vmtvc(u32 op) {
|
||||
}
|
||||
}
|
||||
|
||||
void Jit::Comp_VMatrixInit(u32 op) {
|
||||
CONDITIONAL_DISABLE;
|
||||
|
||||
if (js.HasUnknownPrefix())
|
||||
DISABLE;
|
||||
|
||||
MatrixSize sz = GetMtxSize(op);
|
||||
int n = GetMatrixSide(sz);
|
||||
|
||||
u8 dregs[16];
|
||||
GetMatrixRegs(dregs, sz, _VD);
|
||||
|
||||
switch ((op >> 16) & 0xF) {
|
||||
case 3: // vmidt
|
||||
MOVSS(XMM0, M((void *) &zero));
|
||||
MOVSS(XMM1, M((void *) &one));
|
||||
for (int a = 0; a < n; a++) {
|
||||
for (int b = 0; b < n; b++) {
|
||||
MOVSS(fpr.V(dregs[a * 4 + b]), a == b ? XMM1 : XMM0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6: // vmzero
|
||||
MOVSS(XMM0, M((void *) &zero));
|
||||
for (int a = 0; a < n; a++) {
|
||||
for (int b = 0; b < n; b++) {
|
||||
MOVSS(fpr.V(dregs[a * 4 + b]), XMM0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 7: // vmone
|
||||
MOVSS(XMM0, M((void *) &one));
|
||||
for (int a = 0; a < n; a++) {
|
||||
for (int b = 0; b < n; b++) {
|
||||
MOVSS(fpr.V(dregs[a * 4 + b]), XMM0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
fpr.ReleaseSpillLocks();
|
||||
}
|
||||
|
||||
void Jit::Comp_Vmmov(u32 op) {
|
||||
CONDITIONAL_DISABLE;
|
||||
|
||||
|
@ -201,6 +201,7 @@ public:
|
||||
void Comp_SVQ(u32 op);
|
||||
void Comp_VPFX(u32 op);
|
||||
void Comp_VVectorInit(u32 op);
|
||||
void Comp_VMatrixInit(u32 op);
|
||||
void Comp_VDot(u32 op);
|
||||
void Comp_VecDo3(u32 op);
|
||||
void Comp_VV2Op(u32 op);
|
||||
|
Loading…
Reference in New Issue
Block a user