diff options
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c | 52 | ||||
| -rw-r--r-- | src/emu/x64runavx660f3a.c | 1 |
2 files changed, 52 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c index 6a90792f..c27310b6 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c @@ -107,6 +107,58 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } else YMM0(gd); break; + case 0x15: + INST_NAME("VPEXTRW Ed, Gx, imm8"); + nextop = F8; + GETGX(v0, 0); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 1); + ed = x1; + } + u8 = F8; + VMOVHto(ed, v0, u8&7); + if(!MODREG) + STH(ed, wback, fixedaddress); + break; + case 0x16: + INST_NAME("VPEXTRD/Q Ed, Gx, imm8"); + nextop = F8; + GETGX(v0, 0); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 1); + ed = x1; + } + u8 = F8; + if(rex.w) { + VMOVQDto(ed, v0, u8&1); + } else { + VMOVSto(ed, v0, u8&3); + } + if(!MODREG) + STxw(ed, wback, fixedaddress); + break; + case 0x17: + INST_NAME("VEXTRACTPS Ed, Gx, imm8"); + nextop = F8; + GETGX(v0, 0); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1); + ed = x1; + } + u8 = F8; + VMOVSto(ed, v0, u8&3); + if(!MODREG) + STW(ed, wback, fixedaddress); + break; case 0x18: INST_NAME("VINSERTF128 Gx, Vx, Ex, imm8"); nextop = F8; diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c index 2b112c4d..defe9147 100644 --- a/src/emu/x64runavx660f3a.c +++ b/src/emu/x64runavx660f3a.c @@ -509,7 +509,6 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) ED->dword[0] = GX->ud[tmp8u&3]; } break; - case 0x17: // VEXTRACTPS ED, GX, u8 nextop = F8; GETED(1); |