about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-03 14:42:21 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-03 14:42:21 +0200
commit890809069ef083a8541f22d8b20cb137a111ccd7 (patch)
treea87fa43a5d859ac5738b513c8580e9b526a16156 /src
parentca9a6fe01900bbbf9c5c20ed53e3a66d22597115 (diff)
downloadbox64-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.c8
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c20
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;