diff options
Diffstat (limited to 'src/dynarec/rv64/dynarec_rv64_functions.c')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c index d366de48..6ce97b8a 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.c +++ b/src/dynarec/rv64/dynarec_rv64_functions.c @@ -402,13 +402,16 @@ void extcacheUnwind(extcache_t* cache) } // add/change bad regs for(int i=0; i<16; ++i) { - if(cache->olds[i].changed) { - cache->extcache[i].t = cache->olds[i].single?EXT_CACHE_SS:EXT_CACHE_SD; - } else if(cache->olds[i].purged) { - cache->extcache[i].n = i; - cache->extcache[i].t = cache->olds[i].single?EXT_CACHE_SS:EXT_CACHE_SD; + if (cache->extcache[i].t == EXT_CACHE_SS || cache->extcache[i].t == EXT_CACHE_SD) { + if (cache->olds[i].changed) { + cache->extcache[i].t = cache->olds[i].single ? EXT_CACHE_SS : EXT_CACHE_SD; + } else if (cache->olds[i].purged) { + cache->extcache[i].n = i; + cache->extcache[i].t = cache->olds[i].single ? EXT_CACHE_SS : EXT_CACHE_SD; + } } } + if(cache->stack_push) { // unpush for(int j=0; j<24; ++j) { @@ -465,14 +468,23 @@ void extcacheUnwind(extcache_t* cache) break; case EXT_CACHE_SS: cache->ssecache[cache->extcache[i].n].reg = EXTREG(i); + cache->ssecache[cache->extcache[i].n].vector = 0; cache->ssecache[cache->extcache[i].n].single = 1; ++cache->fpu_reg; break; case EXT_CACHE_SD: cache->ssecache[cache->extcache[i].n].reg = EXTREG(i); + cache->ssecache[cache->extcache[i].n].vector = 0; cache->ssecache[cache->extcache[i].n].single = 0; ++cache->fpu_reg; break; + case EXT_CACHE_XMMR: + case EXT_CACHE_XMMW: + cache->ssecache[cache->extcache[i].n].reg = i; + cache->ssecache[cache->extcache[i].n].vector = 1; + cache->ssecache[cache->extcache[i].n].write = (cache->extcache[i].t == EXT_CACHE_XMMW) ? 1 : 0; + ++cache->fpu_reg; + break; case EXT_CACHE_ST_F: case EXT_CACHE_ST_D: case EXT_CACHE_ST_I64: @@ -556,6 +568,8 @@ const char* getCacheName(int t, int n) case EXT_CACHE_SS: sprintf(buff, "SS%d", n); break; case EXT_CACHE_SD: sprintf(buff, "SD%d", n); break; case EXT_CACHE_SCR: sprintf(buff, "Scratch"); break; + case EXT_CACHE_XMMW: sprintf(buff, "XMM%d", n); break; + case EXT_CACHE_XMMR: sprintf(buff, "xmm%d", n); break; case EXT_CACHE_NONE: buff[0]='\0'; break; } return buff; @@ -570,6 +584,12 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11" }; + static const char* vnames[] = { + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v8", "v9", "v30", "v31", + }; if(box64_dynarec_dump) { printf_x64_instruction(rex.is32bits?my_context->dec32: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", @@ -607,6 +627,8 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r 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_XMMR: dynarec_log(LOG_NONE, " %s:%s", vnames[EXTREG(ii)], getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_XMMW: dynarec_log(LOG_NONE, " %s:%s", vnames[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; @@ -689,4 +711,4 @@ void fpu_reset_ninst(dynarec_rv64_t* dyn, int ninst) int fpu_is_st_freed(dynarec_rv64_t* dyn, int ninst, int st) { return (dyn->e.tags&(0b11<<(st*2)))?1:0; -} \ No newline at end of file +} |