diff options
Diffstat (limited to 'src/dynarec/rv64/dynarec_rv64_00_3.c')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 24a42951..3288a73a 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -862,7 +862,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int #endif } #if STEP < 2 - if(!rex.is32bits && isNativeCall(dyn, addr+i32, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn)) + if(!rex.is32bits && isNativeCall(dyn, addr+i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn)) tmp = dyn->insts[ninst].pass2choice = 3; else tmp = dyn->insts[ninst].pass2choice = 0; @@ -969,7 +969,11 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int *ok = 0; *need_epilog = 0; } - jump_to_next(dyn, addr+i32, 0, ninst, rex.is32bits); + if(rex.is32bits) + j64 = (uint32_t)(addr+i32); + else + j64 = addr+i32; + jump_to_next(dyn, j64, 0, ninst, rex.is32bits); break; } break; @@ -983,11 +987,15 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("JMP Ib"); i32 = F8S; } - JUMP((uintptr_t)getAlternate((void*)(addr+i32)), 0); + if(rex.is32bits) + j64 = (uint32_t)(addr+i32); + else + j64 = addr+i32; + JUMP((uintptr_t)getAlternate((void*)j64), 0); if(dyn->insts[ninst].x64.jmp_insts==-1) { // out of the block fpu_purgecache(dyn, ninst, 1, x1, x2, x3); - jump_to_next(dyn, (uintptr_t)getAlternate((void*)(addr+i32)), 0, ninst, rex.is32bits); + jump_to_next(dyn, (uintptr_t)getAlternate((void*)j64), 0, ninst, rex.is32bits); } else { // inside the block CacheTransform(dyn, ninst, CHECK_CACHE(), x1, x2, x3); |