diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-18 21:18:12 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-18 21:18:12 +0000 |
| commit | 59ada379e2c3cfb0ade2bba2592661f3612ce70b (patch) | |
| tree | dab81f1222e75e96a9365d584fd743987f1ae10d /src | |
| parent | 52715c92207da1e96e5eb973027e458479fd6968 (diff) | |
| download | box64-59ada379e2c3cfb0ade2bba2592661f3612ce70b.tar.gz box64-59ada379e2c3cfb0ade2bba2592661f3612ce70b.zip | |
[RV64_DYNAREC] Small optim on last_ip
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_native_pass.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 16 |
2 files changed, 14 insertions, 4 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 6694e3ca..c76c8020 100755 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -74,7 +74,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) } } reset_n = -1; - } else if(ninst && (dyn->insts[ninst].pred_sz!=1 || dyn->insts[ninst].pred[0]!=ninst-1)) + } else if(ninst && (dyn->insts[ninst].pred_sz>1 || (dyn->insts[ninst].pred_sz==1 && dyn->insts[ninst].pred[0]!=ninst-1))) dyn->last_ip = 0; // reset IP if some jump are comming here fpu_propagate_stack(dyn, ninst); NEW_INST; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index ca0628fe..41343cf2 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -82,18 +82,28 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, } } else if((nextop&7)==5) { int64_t tmp = F32S64; - if(i12 && (tmp>=-2048) && (tmp<=2047)) { + int64_t adj = dyn->last_ip?((addr+delta)-dyn->last_ip):0; + if(i12 && adj && (tmp+adj>=-2048) && (tmp+adj<=2047)) { + ret = xRIP; + *fixaddress = tmp+adj; + } else if(i12 && (tmp>=-2048) && (tmp<=2047)) { GETIP(addr+delta); ret = xRIP; *fixaddress = tmp; + } else if(adj && (tmp+adj>=-2048) && (tmp+adj<=2047)) { + ADDI(ret, xRIP, tmp+adj); } else if((tmp>=-2048) && (tmp<=2047)) { GETIP(addr+delta); ADDI(ret, xRIP, tmp); } else if(tmp+addr+delta<0x100000000LL) { MOV64x(ret, tmp+addr+delta); } else { - MOV64x(ret, tmp); - GETIP(addr+delta); + if(adj) { + MOV64x(ret, tmp+adj); + } else { + MOV64x(ret, tmp); + GETIP(addr+delta); + } ADD(ret, ret, xRIP); } switch(lock) { |