diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-16 15:26:42 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-16 15:26:42 +0000 |
| commit | 5d14667536418889607a97310f966ce3cb32727b (patch) | |
| tree | 419907e9baf39fa988627d95c452bcc48ea3940e /src | |
| parent | ab289f8392233dd832fdea353e8264a58853472f (diff) | |
| download | box64-5d14667536418889607a97310f966ce3cb32727b.tar.gz box64-5d14667536418889607a97310f966ce3cb32727b.zip | |
[RV64_DYNAREC] Added E9/EB JMP opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00.c b/src/dynarec/rv64/dynarec_rv64_00.c index 58811afa..76202092 100644 --- a/src/dynarec/rv64/dynarec_rv64_00.c +++ b/src/dynarec/rv64/dynarec_rv64_00.c @@ -521,6 +521,7 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni DEFAULT; } break; + case 0xE8: INST_NAME("CALL Id"); i32 = F32S; @@ -635,6 +636,34 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; } break; + case 0xE9: + case 0xEB: + BARRIER(BARRIER_MAYBE); + if(opcode==0xE9) { + INST_NAME("JMP Id"); + i32 = F32S; + } else { + INST_NAME("JMP Ib"); + i32 = F8S; + } + JUMP(addr+i32, 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, addr+i32, 0, ninst); + } else { + // inside the block + CacheTransform(dyn, ninst, CHECK_CACHE(), x1, x2, x3); + tmp = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size); + if(tmp==4) { + NOP(); + } else { + B(tmp); + } + } + *need_epilog = 0; + *ok = 0; + break; default: DEFAULT; |