diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-14 09:43:54 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-14 09:43:54 +0000 |
| commit | 0d77c7f9a77f51e1283b794f9859b90fc183d1ba (patch) | |
| tree | 7a361afea57c924f7b6145da1fc59ed440b7a8e9 /src | |
| parent | 0037f9eccb94bccc2bdff1ccd09cfe770ba13a75 (diff) | |
| download | box64-0d77c7f9a77f51e1283b794f9859b90fc183d1ba.tar.gz box64-0d77c7f9a77f51e1283b794f9859b90fc183d1ba.zip | |
[RV64_DYNAREC] Small optim on GETEX helper macro
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 16 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 19 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 10 |
3 files changed, 25 insertions, 20 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index 2fb610a8..de6684b0 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -1236,14 +1236,14 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(x1, 0); GETGX(x2); // GX->ud[3] = EX->ud[1]; - LWU(x3, x1, fixedaddress+1*4); - SW(x3, x2, 3*4); + LWU(x3, wback, fixedaddress+1*4); + SW(x3, gback, 3*4); // GX->ud[2] = GX->ud[1]; - LWU(x3, x2, 1*4); - SW(x3, x2, 2*4); + LWU(x3, gback, 1*4); + SW(x3, gback, 2*4); // GX->ud[1] = EX->ud[0]; - LWU(x3, x1, fixedaddress+0*4); - SW(x3, x2, 1*4); + LWU(x3, wback, fixedaddress+0*4); + SW(x3, gback, 1*4); break; case 0x63: INST_NAME("PACKSSWB Gx, Ex"); @@ -2385,8 +2385,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int if(MODREG && gd==(nextop&7)+(rex.b<<3)) { // just zero dest - SD(xZR, x1, 0); - SD(xZR, x1, 8); + SD(xZR, gback, 0); + SD(xZR, gback, 8); } else { GETEX(x2, 0); SSE_LOOP_Q(x3, x4, XOR(x3, x3, x4)); diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c index dade3016..bdb6fc00 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.c +++ b/src/dynarec/rv64/dynarec_rv64_functions.c @@ -486,6 +486,13 @@ const char* getCacheName(int t, int n) void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name) { + static const char* fnames[] = { + "ft0"," ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", + "fs0", "fs1", + "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6", "fa7", + "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", "fs10", "fs11", + "ft8", "ft9", "ft10", "ft11" + }; if(box64_dynarec_dump) { printf_x64_instruction(my_context->dec, &dyn->insts[ninst].x64, name); dynarec_log(LOG_NONE, "%s%p: %d emitted opcodes, inst=%d, barrier=%d state=%d/%d(%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d/%d", @@ -517,12 +524,12 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name) dynarec_log(LOG_NONE, ", last_ip=%p", (void*)dyn->last_ip); for(int ii=0; ii<24; ++ii) { switch(dyn->insts[ninst].e.extcache[ii].t) { - case EXT_CACHE_ST_D: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; - case EXT_CACHE_ST_F: dynarec_log(LOG_NONE, " S%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; - case EXT_CACHE_MM: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; - case EXT_CACHE_SS: dynarec_log(LOG_NONE, " S%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; - case EXT_CACHE_SD: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; - case EXT_CACHE_SCR: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_ST_D: dynarec_log(LOG_NONE, " %s:%s", fnames[EXTREG(ii)], getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_ST_F: dynarec_log(LOG_NONE, " %s:%s", fnames[EXTREG(ii)], getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_MM: dynarec_log(LOG_NONE, " %s:%s", fnames[EXTREG(ii)], getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_SS: dynarec_log(LOG_NONE, " %s:%s", fnames[EXTREG(ii)], getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_SD: dynarec_log(LOG_NONE, " %s:%s", fnames[EXTREG(ii)], getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_SCR: dynarec_log(LOG_NONE, " %s:%s", fnames[EXTREG(ii)], getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; case EXT_CACHE_NONE: default: break; } diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 66e228b6..fefd6986 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -380,9 +380,8 @@ if(MODREG) { \ ed = (nextop&7)+(rex.b<<3); \ sse_forget_reg(dyn, ninst, ed); \ - fixedaddress = 0; \ - ADDI(a, xEmu, offsetof(x64emu_t, xmm[ed])); \ - wback = a; \ + fixedaddress = offsetof(x64emu_t, xmm[ed]); \ + wback = xEmu; \ } else { \ SMREAD(); \ ed=16; \ @@ -400,9 +399,8 @@ if(MODREG) { \ ed = (nextop&7); \ mmx_forget_reg(dyn, ninst, ed); \ - fixedaddress = 0; \ - ADDI(a, xEmu, offsetof(x64emu_t, mmx[ed])); \ - wback = a; \ + fixedaddress = offsetof(x64emu_t, mmx[ed]); \ + wback = xEmu; \ } else { \ SMREAD(); \ ed=8; \ |