diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67_avx.c | 21 | ||||
| -rw-r--r-- | src/emu/x64run67avx.c | 20 |
2 files changed, 39 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67_avx.c b/src/dynarec/arm64/dynarec_arm64_67_avx.c index 1e1e5926..4c3f147f 100644 --- a/src/dynarec/arm64/dynarec_arm64_67_avx.c +++ b/src/dynarec/arm64/dynarec_arm64_67_avx.c @@ -103,6 +103,27 @@ uintptr_t dynarec64_67_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int } } + else if((vex.m==VEX_M_0F) && (vex.p==VEX_P_66)) { + switch(opcode) { + case 0xD6: + INST_NAME("VMOVQ Ex, Gx"); + nextop = F8; + GETG; + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); + if(MODREG) { + v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7)+(rex.b<<3)); + VMOV(v1, v0); + YMM0((nextop&7)+(rex.b<<3)); + } else { + addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xfff<<3, 7, rex, NULL, 0, 0); + VSTR64_U12(v0, ed, fixedaddress); + } + break; + + default: + DEFAULT; + } + } else {DEFAULT;} if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing)) { diff --git a/src/emu/x64run67avx.c b/src/emu/x64run67avx.c index c19a22f7..bfc99e9c 100644 --- a/src/emu/x64run67avx.c +++ b/src/emu/x64run67avx.c @@ -76,7 +76,7 @@ uintptr_t Run67AVX(x64emu_t *emu, vex_t vex, uintptr_t addr) rex_t rex = vex.rex; - if( (vex.m==VEX_M_0F38) && (vex.p==VEX_P_F2)) + if( (vex.m==VEX_M_0F38) && (vex.p==VEX_P_F2)) { switch(opcode) { case 0xF6: /* MULX Gd, Vd, Ed (,RDX) */ @@ -97,7 +97,23 @@ uintptr_t Run67AVX(x64emu_t *emu, vex_t vex, uintptr_t addr) default: addr = 0; } - else addr = 0; + } else if ((vex.m==VEX_M_0F) && (vex.p==VEX_P_66)) { + switch(opcode) { + case 0xD6: /* VMOVQ Ex, Gx */ + nextop = F8; + GETEX32(0); + GETGX; + EX->q[0] = GX->q[0]; + if(MODREG) { + EX->q[1] = 0; + GETEY; + EY->u128 = 0; + } + break; + + default: addr = 0; + } + } else addr = 0; if(!addr) printf_log(LOG_INFO, "Unimplemented 67 AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode); |