diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-06 20:34:02 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-06 20:34:02 +0200 |
| commit | 1f23848e2590916aa54d902903328efeadf60106 (patch) | |
| tree | 2c242a6043babefc08c22a16b9f61f39cb0fdf27 /src | |
| parent | db1c033c7c1bce2451c018bde8a2f56e04bc82e5 (diff) | |
| download | box64-1f23848e2590916aa54d902903328efeadf60106.tar.gz box64-1f23848e2590916aa54d902903328efeadf60106.zip | |
[DYNAREC] Small optimisation on handling of relative addressing
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.c | 18 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.h | 4 |
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; \ } |