diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 13:54:49 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 13:54:49 +0200 |
| commit | ca9a6fe01900bbbf9c5c20ed53e3a66d22597115 (patch) | |
| tree | 8df1b34af2667be2f164f412f121992f04f8e522 /src/dynarec | |
| parent | 94ccae727b87dc7a33f3de47e42abad32e438b90 (diff) | |
| download | box64-ca9a6fe01900bbbf9c5c20ed53e3a66d22597115.tar.gz box64-ca9a6fe01900bbbf9c5c20ed53e3a66d22597115.zip | |
[ARM64_DYNAREC] Empty regs needs to be fetched last (again)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c | 56 |
1 files changed, 14 insertions, 42 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c index 0f3ae177..067c324c 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c @@ -187,16 +187,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, INST_NAME("VADDSD Gx, Vx, Ex"); nextop = F8; d1 = fpu_get_scratch(dyn, ninst); - GETGX_empty_VX(v0, v2); GETEXSD(v1, 0, 0); + GETGX_empty_VX(v0, v2); + FADDD(d1, v2, v1); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FADDD(d1, v0, v1); VMOVeD(v0, 0, d1, 0); YMM0(gd) break; @@ -204,16 +200,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, INST_NAME("VMULSD Gx, Vx, Ex"); nextop = F8; d1 = fpu_get_scratch(dyn, ninst); - GETGX_empty_VX(v0, v2); GETEXSD(v1, 0, 0); + GETGX_empty_VX(v0, v2); + FMULD(d1, v2, v1); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FMULD(d1, v0, v1); VMOVeD(v0, 0, d1, 0); YMM0(gd) break; @@ -221,16 +213,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, INST_NAME("VCVTSD2SS Gx, Vx, Ex"); nextop = F8; d1 = fpu_get_scratch(dyn, ninst); - GETGX_empty_VX(v0, v2); GETEXSD(v1, 0, 0); + GETGX_empty_VX(v0, v2); + FCVT_S_D(d1, v1); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FCVT_S_D(d1, v1); VMOVeS(v0, 0, d1, 0); YMM0(gd) break; @@ -239,16 +227,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, INST_NAME("VSUBSD Gx, Vx, Ex"); nextop = F8; d1 = fpu_get_scratch(dyn, ninst); - GETGX_empty_VX(v0, v2); GETEXSD(v1, 0, 0); + GETGX_empty_VX(v0, v2); + FSUBD(d1, v2, v1); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FSUBD(d1, v0, v1); VMOVeD(v0, 0, d1, 0); YMM0(gd) break; @@ -256,16 +240,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, INST_NAME("VMINSD Gx, Vx, Ex"); nextop = F8; d1 = fpu_get_scratch(dyn, ninst); - GETGX_empty_VX(v0, v2); GETEXSD(v1, 0, 0); + GETGX_empty_VX(v0, v2); + FCMPD(v2, v1); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FCMPD(v0, v1); B_NEXT(cLS); //Less than or equal VMOVeD(v0, 0, v1, 0); // to not erase uper part YMM0(gd) @@ -274,16 +254,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, INST_NAME("VDIVSD Gx, Vx, Ex"); nextop = F8; d1 = fpu_get_scratch(dyn, ninst); - GETGX_empty_VX(v0, v2); GETEXSD(v1, 0, 0); + GETGX_empty_VX(v0, v2); + FDIVD(d1, v2, v1); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FDIVD(d1, v0, v1); VMOVeD(v0, 0, d1, 0); YMM0(gd) break; @@ -291,16 +267,12 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, INST_NAME("VMAXSD Gx, Vx, Ex"); nextop = F8; d1 = fpu_get_scratch(dyn, ninst); - GETGX_empty_VX(v0, v2); GETEXSD(v1, 0, 0); + GETGX_empty_VX(v0, v2); + FCMPD(v2, v1); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FCMPD(v0, v1); B_NEXT(cGE); //Greater than or equal VMOVeD(v0, 0, v1, 0); // to not erase uper part YMM0(gd) |