mirror of
https://github.com/ptitSeb/box64.git
synced 2025-05-09 00:21:32 +08:00
[INTERP] Small change to various (V)MOVNT* opcodes, forbidding reg -> reg form
This commit is contained in:
parent
926e4b2da8
commit
af555abb6f
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user