diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 14:42:21 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 14:42:21 +0200 |
| commit | 890809069ef083a8541f22d8b20cb137a111ccd7 (patch) | |
| tree | a87fa43a5d859ac5738b513c8580e9b526a16156 /src | |
| parent | ca9a6fe01900bbbf9c5c20ed53e3a66d22597115 (diff) | |
| download | box64-890809069ef083a8541f22d8b20cb137a111ccd7.tar.gz box64-890809069ef083a8541f22d8b20cb137a111ccd7.zip | |
[ARM64_DYNAREC] Fixed AVX.F2/F3.0F 5D/5F opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c | 8 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c | 20 |
2 files changed, 10 insertions, 18 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c index 067c324c..fb791452 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c @@ -243,11 +243,11 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, GETEXSD(v1, 0, 0); GETGX_empty_VX(v0, v2); FCMPD(v2, v1); + FCSELD(d1, v2, v1, cLS); if(v0!=v2) { VMOVQ(v0, v2); } - B_NEXT(cLS); //Less than or equal - VMOVeD(v0, 0, v1, 0); // to not erase uper part + VMOVeD(v0, 0, d1, 0); // to not erase uper part YMM0(gd) break; case 0x5E: @@ -270,11 +270,11 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, GETEXSD(v1, 0, 0); GETGX_empty_VX(v0, v2); FCMPD(v2, v1); + FCSELD(d1, v2, v1, cGE); if(v0!=v2) { VMOVQ(v0, v2); } - B_NEXT(cGE); //Greater than or equal - VMOVeD(v0, 0, v1, 0); // to not erase uper part + VMOVeD(v0, 0, d1, 0); // to not erase uper part YMM0(gd) break; diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c index 1f753dc4..47c6391d 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c @@ -304,16 +304,12 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, d1 = fpu_get_scratch(dyn, ninst); GETEXSS(v1, 0, 0); GETGX_empty_VX(v0, v2); + FCMPS(v2, v1); + FCSELS(d1, v2, v1, cLS); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FCMPS(v0, v1); - B_NEXT(cLS); //Less than or equal - VMOVeS(v0, 0, v1, 0); // to not erase uper part + VMOVeS(v0, 0, d1, 0); // to not erase uper part YMM0(gd) break; case 0x5E: @@ -335,16 +331,12 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, d1 = fpu_get_scratch(dyn, ninst); GETEXSS(v1, 0, 0); GETGX_empty_VX(v0, v2); + FCMPS(v2, v1); + FCSELS(d1, v2, v1, cGE); if(v0!=v2) { - if(v0==v1) { - VMOV(d1, v1); - v1 = d1; - } VMOVQ(v0, v2); } - FCMPS(v0, v1); - B_NEXT(cGE); //Greater than or equal - VMOVeS(v0, 0, v1, 0); // to not erase uper part + VMOVeS(v0, 0, d1, 0); // to not erase uper part YMM0(gd) break; |