about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-06-06 20:34:02 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-06-06 20:34:02 +0200
commit1f23848e2590916aa54d902903328efeadf60106 (patch)
tree2c242a6043babefc08c22a16b9f61f39cb0fdf27 /src
parentdb1c033c7c1bce2451c018bde8a2f56e04bc82e5 (diff)
downloadbox64-1f23848e2590916aa54d902903328efeadf60106.tar.gz
box64-1f23848e2590916aa54d902903328efeadf60106.zip
[DYNAREC] Small optimisation on handling of relative addressing
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.c18
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.h4
2 files changed, 17 insertions, 5 deletions
diff --git a/src/dynarec/dynarec_arm64_helper.c b/src/dynarec/dynarec_arm64_helper.c
index 6fe90924..df87ca2e 100755
--- a/src/dynarec/dynarec_arm64_helper.c
+++ b/src/dynarec/dynarec_arm64_helper.c
@@ -64,9 +64,21 @@ uintptr_t geted(dynarec_arm_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, u
             }
         } else if((nextop&7)==5) {
             uint64_t tmp = F32S64;
-            MOV64x(ret, tmp);
-            GETIP(addr+delta);
-            ADDx_REG(ret, ret, xRIP);
+            if((tmp>=absmin) && (tmp<=absmax) && !(tmp&mask)) {
+                GETIP(addr+delta);
+                ret = xRIP;
+                *fixaddress = tmp;
+            } else if(tmp<0x1000) {
+                GETIP(addr+delta);
+                ADDx_U12(ret, xRIP, tmp);
+            } else if(tmp+addr+delta<0x1000000000000LL) {  // 3 opcodes to load immediate is cheap enough
+                tmp += addr+delta;
+                MOV64x(ret, tmp);
+            } else {
+                MOV64x(ret, tmp);
+                GETIP(addr+delta);
+                ADDx_REG(ret, ret, xRIP);
+            }
         } else {
             ret = xRAX+(nextop&7)+(rex.b<<3);
         }
diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h
index 57b56633..7cbad4c3 100755
--- a/src/dynarec/dynarec_arm64_helper.h
+++ b/src/dynarec/dynarec_arm64_helper.h
@@ -47,7 +47,7 @@
                     ed = xRAX+(nextop&7)+(rex.b<<3);    \
                     wback = 0;                          \
                 } else {                                \
-                    addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<3, 3, rex, 0, D); \
+                    addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<3, 7, rex, 0, D); \
                     LDRx_U12(x1, wback, fixedaddress);  \
                     ed = x1;                            \
                 }
@@ -55,7 +55,7 @@
                     ed = xEAX+(nextop&7)+(rex.b<<3);    \
                     wback = 0;                          \
                 } else {                                \
-                    addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<2, 2, rex, 0, D); \
+                    addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<2, 3, rex, 0, D); \
                     LDRw_U12(x1, wback, fixedaddress);  \
                     ed = x1;                            \
                 }