diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-13 16:07:57 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-13 16:07:57 +0000 |
| commit | adceb9eabbd6396054461761a01bbc1999505419 (patch) | |
| tree | fa83cf9f42522695bcdf17be253aa3e049a847a6 /src | |
| parent | 19a06a875530571167c6915864b7c64b59ade34f (diff) | |
| download | box64-adceb9eabbd6396054461761a01bbc1999505419.tar.gz box64-adceb9eabbd6396054461761a01bbc1999505419.zip | |
[RV64_DYNAREC] Some small optim to geted
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 06fdb095..7ad82bee 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -47,10 +47,17 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if (sib_reg!=4) { if(tmp && ((tmp<-2048) || (tmp>2047) || !i12)) { MOV64x(scratch, tmp); - SLLI(ret, xRAX+sib_reg, (sib>>6)); - ADD(ret, ret, scratch); + if((sib>>6)) { + SLLI(ret, xRAX+sib_reg, (sib>>6)); + ADD(ret, ret, scratch); + } else { + ADD(ret, xRAX+sib_reg, scratch); + } } else { - SLLI(ret, xRAX+sib_reg, (sib>>6)); + if(sib>>6) { + SLLI(ret, xRAX+sib_reg, (sib>>6)); + } else + ret = xRAX+sib_reg; *fixaddress = tmp; } } else { @@ -62,8 +69,12 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, } } else { if (sib_reg!=4) { - SLLI(scratch, xRAX+sib_reg, (sib>>6)); - ADD(ret, xRAX+(sib&0x7)+(rex.b<<3), scratch); + if(sib>>6) { + SLLI(scratch, xRAX+sib_reg, (sib>>6)); + ADD(ret, xRAX+(sib&0x7)+(rex.b<<3), scratch); + } else { + ADD(ret, xRAX+(sib&0x7)+(rex.b<<3), xRAX+sib_reg); + } } else { ret = xRAX+(sib&0x7)+(rex.b<<3); } @@ -107,8 +118,12 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, *fixaddress = i64; if((nextop&7)==4) { if (sib_reg!=4) { - SLLI(scratch, xRAX+sib_reg, (sib>>6)); - ADD(ret, xRAX+(sib&0x07)+(rex.b<<3), scratch); + if(sib>>6) { + SLLI(scratch, xRAX+sib_reg, (sib>>6)); + ADD(ret, xRAX+(sib&0x07)+(rex.b<<3), scratch); + } else { + ADD(ret, xRAX+(sib&0x07)+(rex.b<<3), xRAX+sib_reg); + } } else { ret = xRAX+(sib&0x07)+(rex.b<<3); } @@ -118,8 +133,12 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if(i64>=-2048 && i64<=2047) { if((nextop&7)==4) { if (sib_reg!=4) { - SLLI(scratch, xRAX+sib_reg, (sib>>6)); - ADD(scratch, xRAX+(sib&0x07)+(rex.b<<3), scratch); + if(sib>>6) { + SLLI(scratch, xRAX+sib_reg, (sib>>6)); + ADD(scratch, xRAX+(sib&0x07)+(rex.b<<3), scratch); + } else { + ADD(scratch, xRAX+(sib&0x07)+(rex.b<<3), xRAX+sib_reg); + } } else { scratch = xRAX+(sib&0x07)+(rex.b<<3); } @@ -131,8 +150,12 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if((nextop&7)==4) { if (sib_reg!=4) { ADD(scratch, scratch, xRAX+(sib&0x07)+(rex.b<<3)); - SLLI(ret, xRAX+sib_reg, (sib>>6)); - ADD(ret, scratch, ret); + if(sib>>6) { + SLLI(ret, xRAX+sib_reg, (sib>>6)); + ADD(ret, scratch, ret); + } else { + ADD(ret, scratch, xRAX+sib_reg); + } } else { PASS3(int tmp = xRAX+(sib&0x07)+(rex.b<<3)); ADD(ret, tmp, scratch); |