diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-30 16:59:38 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-30 16:59:38 +0100 |
| commit | a26c108464896336c4bd0b780f2bca3de26d7df5 (patch) | |
| tree | 27d308dd18dec72199bee734bceb84c8c680d712 /src | |
| parent | 2971e9729c3b2ef61ea9568d76ce7064f5c36cac (diff) | |
| download | box64-a26c108464896336c4bd0b780f2bca3de26d7df5.tar.gz box64-a26c108464896336c4bd0b780f2bca3de26d7df5.zip | |
[ARM64_DYNAREC] Added F2 0F 80..8F opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f20f.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f20f.c b/src/dynarec/arm64/dynarec_arm64_f20f.c index 4b03143c..551e25e7 100644 --- a/src/dynarec/arm64/dynarec_arm64_f20f.c +++ b/src/dynarec/arm64/dynarec_arm64_f20f.c @@ -31,6 +31,8 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n uint8_t wback, wb1, wb2; uint8_t u8; uint64_t u64, j64; + int32_t i32, i32_; + int cacheupd = 0; int v0, v1; int q0; int d0, d1; @@ -413,6 +415,41 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VFSUBQS(v0, d0, v0); break; + #define GO(GETFLAGS, NO, YES, F) \ + READFLAGS(F); \ + i32_ = F32S; \ + if(rex.is32bits) \ + j64 = (uint32_t)(addr+i32_); \ + else \ + j64 = addr+i32_; \ + BARRIER(BARRIER_MAYBE); \ + JUMP(j64, 1); \ + GETFLAGS; \ + if(dyn->insts[ninst].x64.jmp_insts==-1 || \ + CHECK_CACHE()) { \ + /* out of the block */ \ + i32 = dyn->insts[ninst].epilog-(dyn->native_size); \ + Bcond(NO, i32); \ + if(dyn->insts[ninst].x64.jmp_insts==-1) { \ + if(!(dyn->insts[ninst].x64.barrier&BARRIER_FLOAT)) \ + fpu_purgecache(dyn, ninst, 1, x1, x2, x3); \ + jump_to_next(dyn, j64, 0, ninst, rex.is32bits); \ + } else { \ + CacheTransform(dyn, ninst, cacheupd, x1, x2, x3); \ + i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size); \ + SKIP_SEVL(i32); \ + B(i32); \ + } \ + } else { \ + /* inside the block */ \ + i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size); \ + SKIP_SEVL(i32); \ + Bcond(YES, i32); \ + } + + GOCOND(0x80, "J", "Id"); + #undef GO + case 0xAE: nextop = F8; switch((nextop>>3)&7) { |