about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-18 18:36:10 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-03-18 18:36:10 +0100
commit01395fc579c2cc310375d51e7ee4c17e78de20d4 (patch)
treed9d0bc91b520682165b5b91d6d13f0bd7a6be5c0 /src
parentbbe15eab7e146cc330a4b83bfc5579e32615af2a (diff)
downloadbox64-01395fc579c2cc310375d51e7ee4c17e78de20d4.tar.gz
box64-01395fc579c2cc310375d51e7ee4c17e78de20d4.zip
[ARM64_DYNAREC] Fixed some special cases for the Double Pop optim (fixed steamwebhelper and all chrome/libcef based apps)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c29
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_helper.h4
-rwxr-xr-xsrc/dynarec/dynarec_native_pass.c1
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h3
4 files changed, 20 insertions, 17 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index d7f87b3f..24eddde4 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -507,15 +507,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     MOVx_REG(x1, gd);
                     gd = x1;
                 }
-                u32 = PK(0);
-                i32 = 1;
-                rex.rex = 0;
-                while(u32>=0x40 && u32<=0x4f) {
+                u32 = 0;
+                i32 = 0;
+                do {
                     rex.rex = u32;
                     u32 = PK(i32);
                     i32++;
-                }
-                if(u32>=0x50 && u32<=0x57 && (dyn->size && dyn->insts[ninst+1].pred_sz==1)) {
+                } while(u32>=0x40 && u32<=0x4f);
+                if(u32>=0x50 && u32<=0x57 && (dyn->size>(ninst+1) && dyn->insts[ninst+1].pred_sz==1)) {
                     // double push!
                     u32= xRAX+(u32&0x07)+(rex.b<<3);
                     MESSAGE(LOG_DUMP, "DOUBLE PUSH\n");
@@ -543,30 +542,26 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 dyn->doublepop = 0;
             else {
                 gd = xRAX+(opcode&0x07)+(rex.b<<3);
-                u32 = PK(0);
-                i32 = 1;
-                rex.rex = 0;
-                while(u32>=0x40 && u32<=0x4f) {
+                u32 = 0;
+                i32 = 0;
+                do {
                     rex.rex = u32;
                     u32 = PK(i32);
                     i32++;
-                }
-                if(u32>=0x58 && u32<=0x5f && (dyn->size && dyn->insts[ninst+1].pred_sz==1)) {
+                } while(u32>=0x40 && u32<=0x4f);
+                if((gd!=xRSP) && u32>=0x58 && u32<=0x5f && (dyn->size>(ninst+1) && dyn->insts[ninst+1].pred_sz==1)) {
                     // double pop!
                     u32= xRAX+(u32&0x07)+(rex.b<<3);
                     MESSAGE(LOG_DUMP, "DOUBLE POP\n");
                     if(gd==u32) {
                         ADDx_U12(xRSP, xRSP, 0x8);
-                        POP1((gd==xRSP)?x1:gd);
+                        POP1(gd);
                     } else {
-                        POP2((gd==xRSP)?x1:gd, (u32==xRSP)?x1:u32);
+                        POP2(gd, (u32==xRSP)?x1:u32);
                         if(u32==xRSP) {
                             MOVx_REG(u32, x1);
                         }
                     }
-                    if(gd == xRSP) {
-                        MOVx_REG(gd, x1);
-                    }
                     dyn->doublepop = 1;
                 } else {
                     if(gd == xRSP) {
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index bd3d3633..2308be43 100755
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -786,6 +786,10 @@
 #define FTABLE64(A, V)
 #endif
 
+#define ARCH_INIT()         \
+    dyn->doublepush = 0;    \
+    dyn->doublepop = 0;
+
 #if STEP < 2
 #define GETIP(A)
 #define GETIP_(A)
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index c07b6102..6694e3ca 100755
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -45,6 +45,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr)
     dyn->forward_size = 0;
     dyn->forward_ninst = 0;
     fpu_reset(dyn);
+    ARCH_INIT();
     int reset_n = -1;
     dyn->last_ip = (dyn->insts && dyn->insts[0].pred_sz)?0:ip;  // RIP is always set at start of block unless there is a predecessor!
     int stopblock = 2+(FindElfAddress(my_context, addr)?0:1); // if block is in elf_memory, it can be extended with bligblocks==2, else it needs 3
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index 5b282715..554847b6 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -388,6 +388,9 @@
 #define TABLE64(A, V)
 #endif
 
+#define ARCH_INIT()
+
+
 #if STEP < 2
 #define GETIP(A)
 #define GETIP_(A)