diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_0f.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_0f.c index 9f0e1424..e7ccee1e 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_0f.c @@ -116,27 +116,37 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0x12: nextop = F8; + GETVX(v2, 0); if(MODREG) { - INST_NAME("VMOVHLPS Gx,Ex"); - GETGX(v0, 1); + INST_NAME("VMOVHLPS Gx, Vx, Ex"); v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + GETGX_empty(v0); + if((v0!=v2) && (v0!=v1)) + VMOVQ(v0, v2); VMOVeD(v0, 0, v1, 1); + if((v0!=v2) && (v0==v1)) + VMOVeD(v0, 1, v2, 1); } else { - INST_NAME("VMOVLPS Gx,Ex"); - GETGX(v0, 1); + INST_NAME("VMOVLPS Gx, Vx, Ex"); + GETGX_empty(v0); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + if(v0!=v2) + VMOVQ(v0, v2); VLD1_64(v0, 0, ed); } YMM0(gd); break; case 0x13: nextop = F8; - INST_NAME("VMOVLPS Ex,Gx"); + INST_NAME("VMOVLPS Ex, Vx, Gx"); GETGX(v0, 0); + GETVX(v2, 0); + if(v1!=v2) + VMOVQ(v0, v2); if(MODREG) { v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1); - VMOVeD(v1, 0, v0, 0); + if(v0!=v1) VMOVeD(v1, 0, v0, 0); } else { addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); VST1_64(v0, 0, ed); // better to use VST1 than VSTR_64, to avoid NEON->VFPU transfert I assume |