diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 8 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 9ba035fe..0e4dee33 100755 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1903,7 +1903,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin sse_purge07cache(dyn, ninst, x3); tmp = isSimpleWrapper(*(wrapper_t*)(addr)); if(isRetX87Wrapper(*(wrapper_t*)(addr))) - x87_do_push_empty(dyn, ninst, x3); + // return value will be on the stack, so the stack depth needs to be updated + x87_purgecache(dyn, ninst, 0, x3, x1, x4); if((box64_log<2 && !cycle_log) && tmp) { //GETIP(ip+3+8+8); // read the 0xCC call_n(dyn, ninst, *(void**)(addr+8), tmp); @@ -2397,10 +2398,11 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin sse_purge07cache(dyn, ninst, x3); if((box64_log<2 && !cycle_log) && dyn->insts[ninst].natcall) { tmp=isSimpleWrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2)); - if(isRetX87Wrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2))) - x87_do_push_empty(dyn, ninst, x3); } else tmp=0; + 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); if((box64_log<2 && !cycle_log) && dyn->insts[ninst].natcall && tmp) { //GETIP(ip+3+8+8); // read the 0xCC call_n(dyn, ninst, *(void**)(dyn->insts[ninst].natcall+2+8), tmp); diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index ad4e932e..2be53fc8 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -309,7 +309,8 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int // and return value needs to be cleanned up tmp = 0;//isSimpleWrapper(*(wrapper_t*)(addr)); if(isRetX87Wrapper(*(wrapper_t*)(addr))) - x87_do_push_empty(dyn, ninst, x3); + // 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((box64_log<2 && !cycle_log) && tmp) { @@ -658,10 +659,11 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int tmp=0;//isSimpleWrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2)); if(tmp>1 || tmp<0) tmp=0; // float paramters not ready! - if(isRetX87Wrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2))) - x87_do_push_empty(dyn, ninst, x3); } else tmp=0; + 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); if((box64_log<2 && !cycle_log) && dyn->insts[ninst].natcall && tmp) { //GETIP(ip+3+8+8); // read the 0xCC call_n(dyn, ninst, *(void**)(dyn->insts[ninst].natcall+2+8), tmp); |