about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-03 12:45:33 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-03 12:45:33 +0200
commitac6a45383387789e94337cbf8f336d4c62b13262 (patch)
tree49ce2a0db28a77872977f6b75445e4fe991b6085 /src
parent307915130cb28ee48832d0cd580bd7aaf7cf4ba9 (diff)
downloadbox64-ac6a45383387789e94337cbf8f336d4c62b13262.tar.gz
box64-ac6a45383387789e94337cbf8f336d4c62b13262.zip
[ARM64_DYNAREC] Empty register needs to be fetched last
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c
index ccf8c5f7..1f753dc4 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c
@@ -209,8 +209,8 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VADDSS Gx, Vx, Ex");
             nextop = F8;
             d1 = fpu_get_scratch(dyn, ninst);
-            GETGX_empty_VX(v0, v2);
             GETEXSS(v1, 0, 0);
+            GETGX_empty_VX(v0, v2);
             if(v0!=v2) {
                 if(v0==v1)  {
                     VMOV(d1, v1);
@@ -226,8 +226,8 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VMULSS Gx, Vx, Ex");
             nextop = F8;
             d1 = fpu_get_scratch(dyn, ninst);
-            GETGX_empty_VX(v0, v2);
             GETEXSS(v1, 0, 0);
+            GETGX_empty_VX(v0, v2);
             if(v0!=v2) {
                 if(v0==v1)  {
                     VMOV(d1, v1);
@@ -243,8 +243,8 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VCVTSS2SD Gx, Vx, Ex");
             nextop = F8;
             d1 = fpu_get_scratch(dyn, ninst);
-            GETGX_empty_VX(v0, v2);
             GETEXSS(v1, 0, 0);
+            GETGX_empty_VX(v0, v2);
             if(v0!=v2) {
                 if(v0==v1)  {
                     VMOV(d1, v1);
@@ -289,16 +289,12 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VSUBSS Gx, Vx, Ex");
             nextop = F8;
             d1 = fpu_get_scratch(dyn, ninst);
-            GETGX_empty_VX(v0, v2);
             GETEXSS(v1, 0, 0);
+            GETGX_empty_VX(v0, v2);
+            FSUBS(d1, v2, v1);
             if(v0!=v2) {
-                if(v0==v1)  {
-                    VMOV(d1, v1);
-                    v1 = d1;
-                }
                 VMOVQ(v0, v2);
             }
-            FSUBS(d1, v0, v1);
             VMOVeS(v0, 0, d1, 0);
             YMM0(gd)
             break;
@@ -306,8 +302,8 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VMINSS Gx, Vx, Ex");
             nextop = F8;
             d1 = fpu_get_scratch(dyn, ninst);
-            GETGX_empty_VX(v0, v2);
             GETEXSS(v1, 0, 0);
+            GETGX_empty_VX(v0, v2);
             if(v0!=v2) {
                 if(v0==v1)  {
                     VMOV(d1, v1);
@@ -324,16 +320,12 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VDIVSS Gx, Vx, Ex");
             nextop = F8;
             d1 = fpu_get_scratch(dyn, ninst);
-            GETGX_empty_VX(v0, v2);
             GETEXSS(v1, 0, 0);
+            GETGX_empty_VX(v0, v2);
+            FDIVS(d1, v2, v1);
             if(v0!=v2) {
-                if(v0==v1)  {
-                    VMOV(d1, v1);
-                    v1 = d1;
-                }
                 VMOVQ(v0, v2);
             }
-            FDIVS(d1, v0, v1);
             VMOVeS(v0, 0, d1, 0);
             YMM0(gd)
             break;
@@ -341,8 +333,8 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VMAXSS Gx, Vx, Ex");
             nextop = F8;
             d1 = fpu_get_scratch(dyn, ninst);
-            GETGX_empty_VX(v0, v2);
             GETEXSS(v1, 0, 0);
+            GETGX_empty_VX(v0, v2);
             if(v0!=v2) {
                 if(v0==v1)  {
                     VMOV(d1, v1);