diff options
Diffstat (limited to 'src/emu/x64runavx660f.c')
| -rw-r--r-- | src/emu/x64runavx660f.c | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/src/emu/x64runavx660f.c b/src/emu/x64runavx660f.c index 195d950b..0e440eff 100644 --- a/src/emu/x64runavx660f.c +++ b/src/emu/x64runavx660f.c @@ -61,7 +61,7 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) switch(opcode) { - case 0x10: /* MOVUPD Gx, Ex */ + case 0x10: /* VMOVUPD Gx, Ex */ nextop = F8; GETEX(0); GETGX; @@ -73,7 +73,7 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) } else GY->u128 = 0; break; - case 0x11: /* MOVUPD Ex, Gx */ + case 0x11: /* VMOVUPD Ex, Gx */ nextop = F8; GETEX(0); GETGX; @@ -82,23 +82,30 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETEY; GETGY; memcpy(EY, GY, 16); // unaligned... + } else if(MODREG) { + GETEY; + EY->u128 = 0; } break; case 0x12: /* VMOVLPD Gx, Vx, Eq */ nextop = F8; - GETE8(0); - GETGX; - GETVX; - GETGY; - GX->q[0] = ED->q[0]; - GX->q[1] = VX->q[1]; - GY->u128 = 0; + if(!MODREG) { + GETE8(0); + GETGX; + GETVX; + GETGY; + GX->q[0] = ED->q[0]; + GX->q[1] = VX->q[1]; + GY->u128 = 0; + } break; case 0x13: /* VMOVLPD Eq, Gx */ nextop = F8; - GETE8(0); - GETGX; - ED->q[0] = GX->q[0]; + if(!MODREG) { + GETE8(0); + GETGX; + ED->q[0] = GX->q[0]; + } break; case 0x14: /* VUNPCKLPD Gx, Vx, Ex */ nextop = F8; @@ -128,19 +135,23 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) break; case 0x16: /* VMOVHPD Gx, Vx, Ed */ nextop = F8; - GETE8(0); - GETGX; - GETVX; - GX->q[1] = ED->q[0]; - GX->q[0] = VX->q[0]; - GETGY; - GY->u128 = 0; + if(!MODREG) { + GETE8(0); + GETGX; + GETVX; + GX->q[1] = ED->q[0]; + GX->q[0] = VX->q[0]; + GETGY; + GY->u128 = 0; + } break; case 0x17: /* VMOVHPD Ed, Gx */ nextop = F8; - GETE8(0); - GETGX; - ED->q[0] = GX->q[1]; + if(!MODREG) { + GETE8(0); + GETGX; + ED->q[0] = GX->q[1]; + } break; case 0x28: /* VMOVAPD Gx, Ex */ @@ -833,7 +844,7 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETEY; GY->q[0] = EY->q[0]; GY->q[1] = EY->q[1]; - } else + } else GY->u128 = 0; break; case 0x70: /* VPSHUFD Gx,Ex,Ib */ @@ -1196,7 +1207,10 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETEY; EY->q[0] = GY->q[0]; EY->q[1] = GY->q[1]; - } // no upper raz? + } else if(MODREG) { + GETEY; + EY->u128 = 0; + } break; case 0xC2: /* VCMPPD Gx, Vx, Ex, Ib */ |