[INTERP] Small change to various (V)MOVNT* opcodes, forbidding reg -> reg form

This commit is contained in:
ptitSeb 2025-04-24 10:58:23 +02:00
parent 926e4b2da8
commit af555abb6f
6 changed files with 74 additions and 56 deletions

View File

@ -211,10 +211,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
break; break;
case 0x2B: /* MOVNTPD Ex, Gx */ case 0x2B: /* MOVNTPD Ex, Gx */
nextop = F8; nextop = F8;
GETEX(0); if(!MODREG) {
GETGX; GETEX(0);
EX->q[0] = GX->q[0]; GETGX;
EX->q[1] = GX->q[1]; EX->q[0] = GX->q[0];
EX->q[1] = GX->q[1];
}
break; break;
case 0x2C: /* CVTTPD2PI Gm, Ex */ case 0x2C: /* CVTTPD2PI Gm, Ex */
nextop = F8; nextop = F8;
@ -554,10 +556,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
break; break;
case 0x2A: /* MOVNTDQA Gx, Ex */ case 0x2A: /* MOVNTDQA Gx, Ex */
nextop = F8; nextop = F8;
GETEX(0); if(!MODREG) {
GETGX; GETEX(0);
GX->q[0] = EX->q[0]; GETGX;
GX->q[1] = EX->q[1]; GX->q[0] = EX->q[0];
GX->q[1] = EX->q[1];
}
break; break;
case 0x2B: /* PACKUSDW Gx, Ex */ case 0x2B: /* PACKUSDW Gx, Ex */
nextop = F8; nextop = F8;
@ -2454,10 +2458,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
break; break;
case 0xE7: /* MOVNTDQ Ex, Gx */ case 0xE7: /* MOVNTDQ Ex, Gx */
nextop = F8; nextop = F8;
GETEX(0); if(!MODREG) {
GETGX; GETEX(0);
EX->q[0] = GX->q[0]; GETGX;
EX->q[1] = GX->q[1]; EX->q[0] = GX->q[0];
EX->q[1] = GX->q[1];
}
break; break;
case 0xE8: /* PSUBSB Gx,Ex */ case 0xE8: /* PSUBSB Gx,Ex */
nextop = F8; nextop = F8;

View File

@ -207,15 +207,17 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
case 0x2B: /* VMOVNTPS Ex,Gx */ case 0x2B: /* VMOVNTPS Ex,Gx */
nextop = F8; nextop = F8;
GETEX(0); if(!MODREG) {
GETGX; GETEX(0);
EX->q[0] = GX->q[0]; GETGX;
EX->q[1] = GX->q[1]; EX->q[0] = GX->q[0];
if(vex.l) { EX->q[1] = GX->q[1];
GETEY; if(vex.l) {
GETGY; GETEY;
EY->q[0] = GY->q[0]; GETGY;
EY->q[1] = GY->q[1]; EY->q[0] = GY->q[0];
EY->q[1] = GY->q[1];
}
} }
break; break;

View File

@ -187,15 +187,17 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
case 0x2B: /* MOVNTPD Ex, Gx */ case 0x2B: /* MOVNTPD Ex, Gx */
nextop = F8; nextop = F8;
GETEX(0); if(!MODREG) {
GETGX; GETEX(0);
EX->q[0] = GX->q[0]; GETGX;
EX->q[1] = GX->q[1]; EX->q[0] = GX->q[0];
if(vex.l) { EX->q[1] = GX->q[1];
GETGY; if(vex.l) {
GETEY; GETGY;
EY->q[0] = GY->q[0]; GETEY;
EY->q[1] = GY->q[1]; EY->q[0] = GY->q[0];
EY->q[1] = GY->q[1];
}
} }
break; break;
@ -1712,15 +1714,17 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
break; break;
case 0xE7: /* VMOVNTDQ Ex, Gx */ case 0xE7: /* VMOVNTDQ Ex, Gx */
nextop = F8; nextop = F8;
GETEX(0); if(!MODREG) {
GETGX; GETEX(0);
EX->q[0] = GX->q[0]; GETGX;
EX->q[1] = GX->q[1]; EX->q[0] = GX->q[0];
if(vex.l) { EX->q[1] = GX->q[1];
GETEY; if(vex.l) {
GETGY; GETEY;
EY->q[0] = GY->q[0]; GETGY;
EY->q[1] = GY->q[1]; EY->q[0] = GY->q[0];
EY->q[1] = GY->q[1];
}
} }
break; break;
case 0xE8: /* VSUBSB Gx, Vx, Ex */ case 0xE8: /* VSUBSB Gx, Vx, Ex */

View File

@ -777,17 +777,19 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
break; break;
case 0x2A: /* VMOVNTDQA Gx, Ex */ case 0x2A: /* VMOVNTDQA Gx, Ex */
nextop = F8; nextop = F8;
GETEX(0); if(!MODREG) {
GETGX; GETEX(0);
GETGY; GETGX;
GX->q[0] = EX->q[0]; GETGY;
GX->q[1] = EX->q[1]; GX->q[0] = EX->q[0];
if(vex.l) { GX->q[1] = EX->q[1];
GETEY; if(vex.l) {
GY->q[0] = EY->q[0]; GETEY;
GY->q[1] = EY->q[1]; GY->q[0] = EY->q[0];
} else GY->q[1] = EY->q[1];
GY->u128 = 0; } else
GY->u128 = 0;
}
break; break;
case 0x2B: /* VPACKUSDW Gx, Vx, Ex */ case 0x2B: /* VPACKUSDW Gx, Vx, Ex */
nextop = F8; nextop = F8;

View File

@ -90,9 +90,11 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
break; break;
case 0x2B: /* MOVNTSD Ex, Gx */ case 0x2B: /* MOVNTSD Ex, Gx */
nextop = F8; nextop = F8;
GETEX8(0); if(!MODREG) {
GETGX; GETEX8(0);
EX->q[0] = GX->q[0]; GETGX;
EX->q[0] = GX->q[0];
}
break; break;
case 0x2C: /* CVTTSD2SI Gd, Ex */ case 0x2C: /* CVTTSD2SI Gd, Ex */
nextop = F8; nextop = F8;

View File

@ -96,9 +96,11 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
break; break;
case 0x2B: /* MOVNTSS Ex Gx */ case 0x2B: /* MOVNTSS Ex Gx */
nextop = F8; nextop = F8;
GETEX4(0); if(!MODREG) {
GETGX; GETEX4(0);
EX->ud[0] = GX->ud[0]; GETGX;
EX->ud[0] = GX->ud[0];
}
break; break;
case 0x2C: /* CVTTSS2SI Gd, Ex */ case 0x2C: /* CVTTSS2SI Gd, Ex */
nextop = F8; nextop = F8;