diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-04-24 10:58:23 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-04-24 10:58:23 +0200 |
| commit | af555abb6f16ece1ee8f3571979923d885b1194c (patch) | |
| tree | 266319f31bd87e2cffef1d71076dd7623bd31e28 /src | |
| parent | 926e4b2da82d2da28484f2e8da6d30f30e702205 (diff) | |
| download | box64-af555abb6f16ece1ee8f3571979923d885b1194c.tar.gz box64-af555abb6f16ece1ee8f3571979923d885b1194c.zip | |
[INTERP] Small change to various (V)MOVNT* opcodes, forbidding reg -> reg form
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run660f.c | 30 | ||||
| -rw-r--r-- | src/emu/x64runavx0f.c | 20 | ||||
| -rw-r--r-- | src/emu/x64runavx660f.c | 40 | ||||
| -rw-r--r-- | src/emu/x64runavx660f38.c | 24 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 8 | ||||
| -rw-r--r-- | src/emu/x64runf30f.c | 8 |
6 files changed, 74 insertions, 56 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index b16a276e..001a9aa4 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -211,10 +211,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) break; case 0x2B: /* MOVNTPD Ex, Gx */ nextop = F8; - GETEX(0); - GETGX; - EX->q[0] = GX->q[0]; - EX->q[1] = GX->q[1]; + if(!MODREG) { + GETEX(0); + GETGX; + EX->q[0] = GX->q[0]; + EX->q[1] = GX->q[1]; + } break; case 0x2C: /* CVTTPD2PI Gm, Ex */ nextop = F8; @@ -554,10 +556,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) break; case 0x2A: /* MOVNTDQA Gx, Ex */ nextop = F8; - GETEX(0); - GETGX; - GX->q[0] = EX->q[0]; - GX->q[1] = EX->q[1]; + if(!MODREG) { + GETEX(0); + GETGX; + GX->q[0] = EX->q[0]; + GX->q[1] = EX->q[1]; + } break; case 0x2B: /* PACKUSDW Gx, Ex */ nextop = F8; @@ -2454,10 +2458,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) break; case 0xE7: /* MOVNTDQ Ex, Gx */ nextop = F8; - GETEX(0); - GETGX; - EX->q[0] = GX->q[0]; - EX->q[1] = GX->q[1]; + if(!MODREG) { + GETEX(0); + GETGX; + EX->q[0] = GX->q[0]; + EX->q[1] = GX->q[1]; + } break; case 0xE8: /* PSUBSB Gx,Ex */ nextop = F8; diff --git a/src/emu/x64runavx0f.c b/src/emu/x64runavx0f.c index 8509f270..934bed34 100644 --- a/src/emu/x64runavx0f.c +++ b/src/emu/x64runavx0f.c @@ -207,15 +207,17 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0x2B: /* VMOVNTPS Ex,Gx */ nextop = F8; - GETEX(0); - GETGX; - EX->q[0] = GX->q[0]; - EX->q[1] = GX->q[1]; - if(vex.l) { - GETEY; - GETGY; - EY->q[0] = GY->q[0]; - EY->q[1] = GY->q[1]; + if(!MODREG) { + GETEX(0); + GETGX; + EX->q[0] = GX->q[0]; + EX->q[1] = GX->q[1]; + if(vex.l) { + GETEY; + GETGY; + EY->q[0] = GY->q[0]; + EY->q[1] = GY->q[1]; + } } break; diff --git a/src/emu/x64runavx660f.c b/src/emu/x64runavx660f.c index 0e440eff..e17fe8b2 100644 --- a/src/emu/x64runavx660f.c +++ b/src/emu/x64runavx660f.c @@ -187,15 +187,17 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0x2B: /* MOVNTPD Ex, Gx */ nextop = F8; - GETEX(0); - GETGX; - EX->q[0] = GX->q[0]; - EX->q[1] = GX->q[1]; - if(vex.l) { - GETGY; - GETEY; - EY->q[0] = GY->q[0]; - EY->q[1] = GY->q[1]; + if(!MODREG) { + GETEX(0); + GETGX; + EX->q[0] = GX->q[0]; + EX->q[1] = GX->q[1]; + if(vex.l) { + GETGY; + GETEY; + EY->q[0] = GY->q[0]; + EY->q[1] = GY->q[1]; + } } break; @@ -1712,15 +1714,17 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) break; case 0xE7: /* VMOVNTDQ Ex, Gx */ nextop = F8; - GETEX(0); - GETGX; - EX->q[0] = GX->q[0]; - EX->q[1] = GX->q[1]; - if(vex.l) { - GETEY; - GETGY; - EY->q[0] = GY->q[0]; - EY->q[1] = GY->q[1]; + if(!MODREG) { + GETEX(0); + GETGX; + EX->q[0] = GX->q[0]; + EX->q[1] = GX->q[1]; + if(vex.l) { + GETEY; + GETGY; + EY->q[0] = GY->q[0]; + EY->q[1] = GY->q[1]; + } } break; case 0xE8: /* VSUBSB Gx, Vx, Ex */ diff --git a/src/emu/x64runavx660f38.c b/src/emu/x64runavx660f38.c index fdde1d6c..fc2442ab 100644 --- a/src/emu/x64runavx660f38.c +++ b/src/emu/x64runavx660f38.c @@ -777,17 +777,19 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) break; case 0x2A: /* VMOVNTDQA Gx, Ex */ nextop = F8; - GETEX(0); - GETGX; - GETGY; - GX->q[0] = EX->q[0]; - GX->q[1] = EX->q[1]; - if(vex.l) { - GETEY; - GY->q[0] = EY->q[0]; - GY->q[1] = EY->q[1]; - } else - GY->u128 = 0; + if(!MODREG) { + GETEX(0); + GETGX; + GETGY; + GX->q[0] = EX->q[0]; + GX->q[1] = EX->q[1]; + if(vex.l) { + GETEY; + GY->q[0] = EY->q[0]; + GY->q[1] = EY->q[1]; + } else + GY->u128 = 0; + } break; case 0x2B: /* VPACKUSDW Gx, Vx, Ex */ nextop = F8; diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c index d8b3a373..93bc5e09 100644 --- a/src/emu/x64runf20f.c +++ b/src/emu/x64runf20f.c @@ -90,9 +90,11 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) break; case 0x2B: /* MOVNTSD Ex, Gx */ nextop = F8; - GETEX8(0); - GETGX; - EX->q[0] = GX->q[0]; + if(!MODREG) { + GETEX8(0); + GETGX; + EX->q[0] = GX->q[0]; + } break; case 0x2C: /* CVTTSD2SI Gd, Ex */ nextop = F8; diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c index 6a0652ee..38ef2ad4 100644 --- a/src/emu/x64runf30f.c +++ b/src/emu/x64runf30f.c @@ -96,9 +96,11 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr) break; case 0x2B: /* MOVNTSS Ex Gx */ nextop = F8; - GETEX4(0); - GETGX; - EX->ud[0] = GX->ud[0]; + if(!MODREG) { + GETEX4(0); + GETGX; + EX->ud[0] = GX->ud[0]; + } break; case 0x2C: /* CVTTSS2SI Gd, Ex */ nextop = F8; |