diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-30 20:24:34 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-30 20:24:34 +0200 |
| commit | a02283264a50176fbb1f5f2220cbe0591f846bc2 (patch) | |
| tree | 6e640c8a118c9a88e928bb388c924b3544582072 /src | |
| parent | 7a7e9ee9af6af2224b4d519fb17d3f50fd2077f5 (diff) | |
| download | box64-a02283264a50176fbb1f5f2220cbe0591f846bc2.tar.gz box64-a02283264a50176fbb1f5f2220cbe0591f846bc2.zip | |
[ARM64_DYNAREC] Fixed AVX.0F 12/13 opcodes
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 |