about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-17 10:09:59 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-17 10:09:59 +0200
commit8d199cfc6cd991d386f99e158c52e9e78988b15e (patch)
treef4940c13c457268cc13b99e898805cc49d0aeca1 /src
parentffa58e23f1c846cb1bb072a34d402f8c77bf02c5 (diff)
downloadbox64-8d199cfc6cd991d386f99e158c52e9e78988b15e.tar.gz
box64-8d199cfc6cd991d386f99e158c52e9e78988b15e.zip
[ARM64_DYNAREC] Minor adjustments to a few complex x87 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_db.c11
-rw-r--r--src/dynarec/arm64/dynarec_arm64_df.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.c2
3 files changed, 10 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_db.c b/src/dynarec/arm64/dynarec_arm64_db.c
index d9aa8e31..488d18d4 100644
--- a/src/dynarec/arm64/dynarec_arm64_db.c
+++ b/src/dynarec/arm64/dynarec_arm64_db.c
@@ -271,14 +271,15 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             case 5:
                 INST_NAME("FLD tbyte");
                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
-                if((PK(0)==0xDB && ((PK(1)>>3)&7)==7) || (PK(0)>=0x40 && PK(0)<=0x4f && PK(1)==0xDB && ((PK(2)>>3)&7)==7)) {
+                if((PK(0)==0xDB && ((PK(1)>>3)&7)==7) || (!rex.is32bits && PK(0)>=0x40 && PK(0)<=0x4f && PK(1)==0xDB && ((PK(2)>>3)&7)==7)) {
+                    NOTEST(x5);
                     // the FLD is immediatly followed by an FSTP
                     LDRx_U12(x5, ed, 0);
                     LDRH_U12(x6, ed, 8);
                     // no persistant scratch register, so unrool both instruction here...
                     MESSAGE(LOG_DUMP, "\tHack: FSTP tbyte\n");
                     nextop = F8;    // 0xDB or rex
-                    if(nextop>=0x40 && nextop<=0x4f) {
+                    if(!rex.is32bits && nextop>=0x40 && nextop<=0x4f) {
                         rex.rex = nextop;
                         nextop = F8;    //0xDB
                     } else
@@ -295,8 +296,12 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         if(ed!=x1) {
                             MOVx_REG(x1, ed);
                         }
-                        X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, x3);
+                        X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, 0);
+                        // sync top
+                        s0 = x87_stackcount(dyn, ninst, x3);
                         CALL(native_fld, -1);
+                        // go back with the top & stack counter
+                        x87_unstackcount(dyn, ninst, x3, s0);
                     }
                 }
                 break;
diff --git a/src/dynarec/arm64/dynarec_arm64_df.c b/src/dynarec/arm64/dynarec_arm64_df.c
index a2748071..21828508 100644
--- a/src/dynarec/arm64/dynarec_arm64_df.c
+++ b/src/dynarec/arm64/dynarec_arm64_df.c
@@ -273,7 +273,9 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, x1);
                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                 if(ed!=x1) {MOVx_REG(x1, ed);}
+                s0 = x87_stackcount(dyn, ninst, x3);
                 CALL(fpu_fbld, -1);
+                x87_unstackcount(dyn, ninst, x3, s0);
                 break;
             case 5:
                 INST_NAME("FILD ST0, i64");
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c
index 2d53ce59..cd54c728 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.c
+++ b/src/dynarec/arm64/dynarec_arm64_helper.c
@@ -996,8 +996,6 @@ void x87_do_push_empty(dynarec_arm_t* dyn, int ninst, int s1)
         MESSAGE(LOG_DUMP, "Incoherent x87 stack cache, aborting\n");
         dyn->abort = 1;
     }
-    if(s1)
-        x87_stackcount(dyn, ninst, s1);
 }
 void static internal_x87_dopop(dynarec_arm_t* dyn)
 {