diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-01-23 16:23:49 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-23 09:23:49 +0100 |
| commit | 2367e7df504dadd495abe095bd167cce67afb713 (patch) | |
| tree | 913d93bc94a70d284e7d90797c7e939ec12dfeeb /src | |
| parent | 2ca85a49761c38f1b36068fe4104e62c5c42b67b (diff) | |
| download | box64-2367e7df504dadd495abe095bd167cce67afb713.tar.gz box64-2367e7df504dadd495abe095bd167cce67afb713.zip | |
[DYNAREC_RV64] Enable basic simple wrapper optimization (#1215)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 24 |
2 files changed, 19 insertions, 23 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 1a468389..fa074293 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -347,14 +347,13 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int MESSAGE(LOG_DUMP, "Native Call to %s\n", GetNativeName(GetNativeFnc(ip))); x87_forget(dyn, ninst, x3, x4, 0); sse_purge07cache(dyn, ninst, x3); - // disabling isSimpleWrapper because all signed value less than 64bits needs to be sign extended - // and return value needs to be cleanned up - tmp = 0;//isSimpleWrapper(*(wrapper_t*)(addr)); + // Partially support isSimpleWrapper + tmp = isSimpleWrapper(*(wrapper_t*)(addr)); if(isRetX87Wrapper(*(wrapper_t*)(addr))) // return value will be on the stack, so the stack depth needs to be updated x87_purgecache(dyn, ninst, 0, x3, x1, x4); - if(tmp<0 || tmp>1) - tmp=0; //TODO: removed when FP is in place + if (tmp < 0 || tmp > 1) + tmp = 0; // TODO: removed when FP is in place if((box64_log<2 && !cycle_log) && tmp) { //GETIP(ip+3+8+8); // read the 0xCC call_n(dyn, ninst, *(void**)(addr+8), tmp); @@ -825,13 +824,12 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int // calling a native function sse_purge07cache(dyn, ninst, x3); if((box64_log<2 && !cycle_log) && dyn->insts[ninst].natcall) { - // disabling isSimpleWrapper because all signed value less than 64bits needs to be sign extended - // and return value needs to be cleanned up - tmp=0;//isSimpleWrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2)); - if(tmp>1 || tmp<0) - tmp=0; // float paramters not ready! + // Partially support isSimpleWrapper + tmp = isSimpleWrapper(*(wrapper_t*)(dyn->insts[ninst].natcall + 2)); } else tmp=0; + if (tmp < 0 || tmp > 1) + tmp = 0; // TODO: removed when FP is in place if(dyn->insts[ninst].natcall && isRetX87Wrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2))) // return value will be on the stack, so the stack depth needs to be updated x87_purgecache(dyn, ninst, 0, x3, x1, x4); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 9a12f1e4..f3badafb 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -746,26 +746,24 @@ void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w) // RDI, RSI, RDX, RCX, R8, R9 are used for function call SUBI(xSP, xSP, 16); SD(xEmu, xSP, 0); - SD(xRIP, xSP, 8); // ARM64 stack needs to be 16byte aligned + SD(xRIP, xSP, 8); // RV64 stack needs to be 16byte aligned STORE_REG(R12); STORE_REG(R13); STORE_REG(R14); STORE_REG(R15); + /* // float and double args - if(abs(w)>1) { - /*MESSAGE(LOG_DUMP, "Getting %d XMM args\n", abs(w)-1); - for(int i=0; i<abs(w)-1; ++i) { - sse_get_reg(dyn, ninst, x6, i, w); - }*/ - MESSAGE(LOG_DUMP, "Warning XMM args not ready\n"); - } - if(w<0) { - /* + if (abs(w) > 1) { + MESSAGE(LOG_DUMP, "Getting %d XMM args\n", abs(w) - 1); + for (int i = 0; i < abs(w) - 1; ++i) { + sse_get_reg(dyn, ninst, x6, i, 0); + } + } + if (w < 0) { MESSAGE(LOG_DUMP, "Return in XMM0\n"); - sse_get_reg_empty(dyn, ninst, x6, 0); - */ - MESSAGE(LOG_DUMP, "Warning return in XMM args not ready\n"); + sse_get_reg_empty(dyn, ninst, x6, 0, 0); } + */ // prepare regs for native call MV(A0, xRDI); MV(A1, xRSI); |