about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-30 16:59:38 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-30 16:59:38 +0100
commita26c108464896336c4bd0b780f2bca3de26d7df5 (patch)
tree27d308dd18dec72199bee734bceb84c8c680d712 /src
parent2971e9729c3b2ef61ea9568d76ce7064f5c36cac (diff)
downloadbox64-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.c37
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) {