about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-23 16:31:53 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-23 16:32:04 +0200
commit604ab2252658e85791bfd3d5a04f546b554f23c3 (patch)
tree281ee1bd7b09f6e06ac4f70f566aac55c70179a0 /src
parent85d09df9382d2ce581f89e9fee2e7d862e21e891 (diff)
downloadbox64-604ab2252658e85791bfd3d5a04f546b554f23c3.tar.gz
box64-604ab2252658e85791bfd3d5a04f546b554f23c3.zip
[ARM64_DYNAREC] Added 66 D9 /6 and 66 DD /4 /6 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c49
-rw-r--r--src/dynarec/dynarec_native_functions.c27
-rw-r--r--src/dynarec/dynarec_native_functions.h2
3 files changed, 76 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index df5bcb32..15ce091b 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -13,6 +13,7 @@
 #include "box64stack.h"

 #include "callback.h"

 #include "emu/x64run_private.h"

+#include "emu/x87emu_private.h"

 #include "x64trace.h"

 #include "dynarec_native.h"

 #include "custommem.h"

@@ -1244,6 +1245,54 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;

             }

             break;

+        

+        case 0xD9:

+            nextop = F8;

+            if(MODREG) {

+                DEFAULT;

+            } else

+                switch((nextop>>3)&7) {

+                    case 6:

+                        INST_NAME("FNSTENV Ed");

+                        MESSAGE(LOG_DUMP, "Need Optimization\n");

+                        fpu_purgecache(dyn, ninst, 0, x1, x2, x3); // maybe only x87, not SSE?

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=x1) {MOVx_REG(x1, ed);}

+                        MOV32w(x2, 1);

+                        CALL(fpu_savenv, -1);

+                        break;

+                    default:

+                        DEFAULT;

+            }

+            break;

+

+        case 0xDD:

+            nextop = F8;

+            if(MODREG) {

+                DEFAULT;

+            } else

+                switch((nextop>>3)&7) {

+                    case 4:

+                        INST_NAME("FRSTOR Ed");

+                        MESSAGE(LOG_DUMP, "Need Optimization\n");

+                        fpu_purgecache(dyn, ninst, 0, x1, x2, x3);

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=x1) {MOVx_REG(x1, ed);}

+                        CALL(native_frstor16, -1);

+                        break;

+                    case 6:

+                        INST_NAME("FNSAVE Ed");

+                        MESSAGE(LOG_DUMP, "Need Optimization\n");

+                        fpu_purgecache(dyn, ninst, 0, x1, x2, x3);

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=x1) {MOVx_REG(x1, ed);}

+                        CALL(native_fsave16, -1);

+                        CALL(reset_fpu, -1);

+                        break;

+                    default:

+                        DEFAULT;

+            }

+            break;

 

         case 0xF0:

             return dynarec64_66F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);

diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c
index 07dad6bf..1cb2834d 100644
--- a/src/dynarec/dynarec_native_functions.c
+++ b/src/dynarec/dynarec_native_functions.c
@@ -204,7 +204,18 @@ void native_fsave(x64emu_t* emu, uint8_t* ed)
     uint8_t* p = ed;
     p += 28;
     for (int i=0; i<8; ++i) {
-        LD2D(p, &ST(i).d);
+        LD2D(p, &emu->x87[7-i].d);
+        p+=10;
+    }
+}
+void native_fsave16(x64emu_t* emu, uint8_t* ed)
+{
+    fpu_savenv(emu, (char*)ed, 1);
+
+    uint8_t* p = ed;
+    p += 14;
+    for (int i=0; i<8; ++i) {
+        LD2D(p, &emu->x87[7-i].d);
         p+=10;
     }
 }
@@ -215,7 +226,19 @@ void native_frstor(x64emu_t* emu, uint8_t* ed)
     uint8_t* p = ed;
     p += 28;
     for (int i=0; i<8; ++i) {
-        D2LD(&ST(i).d, p);
+        D2LD(&emu->x87[7-i].d, p);
+        p+=10;
+    }
+
+}
+void native_frstor16(x64emu_t* emu, uint8_t* ed)
+{
+    fpu_loadenv(emu, (char*)ed, 1);
+
+    uint8_t* p = ed;
+    p += 14;
+    for (int i=0; i<8; ++i) {
+        D2LD(&emu->x87[7-i].d, p);
         p+=10;
     }
 
diff --git a/src/dynarec/dynarec_native_functions.h b/src/dynarec/dynarec_native_functions.h
index 6e7fc46d..533dfeeb 100644
--- a/src/dynarec/dynarec_native_functions.h
+++ b/src/dynarec/dynarec_native_functions.h
@@ -30,7 +30,9 @@ void native_fistp64(x64emu_t* emu, int64_t* ed);
 void native_fistt64(x64emu_t* emu, int64_t* ed);
 void native_fld(x64emu_t* emu, uint8_t* ed);
 void native_fsave(x64emu_t* emu, uint8_t* ed);
+void native_fsave16(x64emu_t* emu, uint8_t* ed);
 void native_frstor(x64emu_t* emu, uint8_t* ed);
+void native_frstor16(x64emu_t* emu, uint8_t* ed);
 void native_fprem1(x64emu_t* emu);
 
 void native_aesd(x64emu_t* emu, int xmm);