about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-13 23:26:35 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-03-13 23:26:35 +0100
commit602142dc4511ea4fef4f2e496464ddcd9c33c87b (patch)
tree6a6bae21305323da34c09b6562427bedf2ec373d
parenta4b6e9985895ea31a23090d396425ed2ce8220a3 (diff)
downloadbox64-602142dc4511ea4fef4f2e496464ddcd9c33c87b.tar.gz
box64-602142dc4511ea4fef4f2e496464ddcd9c33c87b.zip
[ARM64_DYNAREC] Small optim when putting 0 in a memory location
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 5385916d..e56f3572 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1711,10 +1711,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 MOV32w(x3, u8);
                 BFIx(eb1, x3, eb2*8, 8);
             } else {                    // mem <= u8
-                addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff, 0, rex, &lock, 0, 1);
+                addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, &unscaled, 0xfff, 0, rex, &lock, 0, 1);
                 u8 = F8;
-                MOV32w(x3, u8);
-                STB(x3, ed, fixedaddress);
+                if(u8) {
+                    MOV32w(x3, u8);
+                    ed = x3;
+                } else 
+                    ed = xZR;
+                STB(ed, wback, fixedaddress);
                 SMWRITELOCK(lock);
             }
             break;
@@ -1726,10 +1730,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 ed = xRAX+(nextop&7)+(rex.b<<3);
                 MOV64xw(ed, i64);
             } else {                    // mem <= i32
-                addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, &lock, 0, 4);
+                addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, &lock, 0, 4);
                 i64 = F32S;
-                MOV64xw(x3, i64);
-                STxw(x3, ed, fixedaddress);
+                if(i64) {
+                    MOV64xw(x3, i64);
+                    ed = x3;
+                } else
+                    ed = xZR;
+                STxw(ed, wback, fixedaddress);
                 SMWRITELOCK(lock);
             }
             break;