about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-06-24 14:25:58 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-06-24 14:25:58 +0200
commit816cbc74f44fd273d09ab4aff69085115e4c588b (patch)
tree0f048b0d4e622cace23a8463e7e547760c7212a2
parente8cd8ca8c029fa38713960072a65f11dbcb5cefb (diff)
downloadbox64-816cbc74f44fd273d09ab4aff69085115e4c588b.tar.gz
box64-816cbc74f44fd273d09ab4aff69085115e4c588b.zip
[ARM64_DYNAREC] Fixed a nasty issue with Double Push / Double Pop optimisation ([32BITS] too)
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 20319c87..aedbe12f 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -530,13 +530,15 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 dyn->doublepush = 0;
             } else {
                 gd = xRAX+(opcode&0x07)+(rex.b<<3);
-                u32 = 0;
-                i32 = 0;
-                do {
-                    rex.rex = u32;
-                    u32 = PK(i32);
-                    i32++;
-                } while(u32>=0x40 && u32<=0x4f);
+                u32 = PK(0);
+                i32 = 1;
+                rex.rex = 0;
+                if(!rex.is32bits)
+                    while(u32>=0x40 && u32<=0x4f) {
+                        rex.rex = u32;
+                        u32 = PK(i32);
+                        i32++;
+                    }
                 if(!box64_dynarec_test && u32>=0x50 && u32<=0x57 && (dyn->size>(ninst+1) && dyn->insts[ninst+1].pred_sz==1) && gd != xRSP) {
                     u32= xRAX+(u32&0x07)+(rex.b<<3);
                     if(u32==xRSP) {
@@ -566,13 +568,15 @@ 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 = 0;
-                i32 = 0;
-                do {
-                    rex.rex = u32;
-                    u32 = PK(i32);
-                    i32++;
-                } while(u32>=0x40 && u32<=0x4f);
+                u32 = PK(0);
+                i32 = 1;
+                rex.rex = 0;
+                if(!rex.is32bits)
+                    while(u32>=0x40 && u32<=0x4f) {
+                        rex.rex = u32;
+                        u32 = PK(i32);
+                        i32++;
+                    }
                 if(!box64_dynarec_test && (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);