Implement vmin/vmax in x86 jit, slots right into VecDo3

This commit is contained in:
Henrik Rydgard 2013-04-27 20:52:42 +02:00
parent 7375706d2f
commit 1a1c161a0d
6 changed files with 20 additions and 13 deletions

View file

@ -730,10 +730,6 @@ namespace MIPSComp
DISABLE;
}
void Jit::Comp_VMinMax(u32 op) {
DISABLE;
}
void Jit::Comp_VHdp(u32 op) {
DISABLE;
}

View file

@ -200,7 +200,6 @@ public:
void Comp_VHdp(u32 op);
void Comp_VCrs(u32 op);
void Comp_VDet(u32 op);
void Comp_VMinMax(u32 op);
void Comp_Vi2x(u32 op);
void Comp_Vx2i(u32 op);
void Comp_Vf2i(u32 op);

View file

@ -1052,7 +1052,7 @@ namespace MIPSInt
int n = GetNumVectorElements(sz);
if (op & 0x10000)
{
//vbfy2
// vbfy2
d[0] = s[0] + s[2];
d[1] = s[1] + s[3];
d[2] = s[0] - s[2];

View file

@ -502,8 +502,8 @@ const MIPSInstruction tableVFPU3[8] = //011011 xxx
{
INSTR("vcmp",&Jit::Comp_Generic, Dis_Vcmp, Int_Vcmp, IS_VFPU|OUT_EAT_PREFIX),
{-2},
INSTR("vmin",&Jit::Comp_VMinMax, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX),
INSTR("vmax",&Jit::Comp_VMinMax, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX),
INSTR("vmin",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX),
INSTR("vmax",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX),
{-2},
INSTR("vscmp",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vscmp, IS_VFPU|OUT_EAT_PREFIX),
INSTR("vsge",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vsge, IS_VFPU|OUT_EAT_PREFIX),

View file

@ -435,13 +435,27 @@ void Jit::Comp_VecDo3(u32 op) {
}
break;
case 25: //VFPU1
switch ((op >> 23)&7)
switch ((op >> 23) & 7)
{
case 0: // d[i] = s[i] * t[i]; break; //vmul
xmmop = &XEmitter::MULSS;
break;
}
break;
case 27: //VFPU3
switch ((op >> 23) & 3)
{
case 2: // vmin
xmmop = &XEmitter::MINSS;
break;
case 3: // vmax
xmmop = &XEmitter::MAXSS;
break;
}
break;
default:
_dbg_assert_msg_(CPU,0,"invalid VecDo3");
break;
}
if (xmmop == NULL)
@ -484,8 +498,10 @@ void Jit::Comp_VecDo3(u32 op) {
if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i]))
MOVSS(tempxregs[i], fpr.V(sregs[i]));
}
for (int i = 0; i < n; ++i)
(this->*xmmop)(tempxregs[i], fpr.V(tregs[i]));
for (int i = 0; i < n; ++i)
{
if (!fpr.V(dregs[i]).IsSimpleReg(tempxregs[i]))
@ -934,9 +950,6 @@ void Jit::Comp_Vtfm(u32 op) {
fpr.ReleaseSpillLocks();
}
void Jit::Comp_VMinMax(u32 op) {
DISABLE;
}
void Jit::Comp_VHdp(u32 op) {
DISABLE;

View file

@ -210,7 +210,6 @@ public:
void Comp_VHdp(u32 op);
void Comp_VCrs(u32 op);
void Comp_VDet(u32 op);
void Comp_VMinMax(u32 op);
void Comp_Vi2x(u32 op);
void Comp_Vx2i(u32 op);
void Comp_Vf2i(u32 op);