about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-13 12:53:16 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-13 12:53:16 +0100
commit9daf8d6493cf9d6d98f5dd625c7b1ff466f7c245 (patch)
tree230b5b55ce8b86c408f1acb6e905043c1c6cd08e
parente071406829e5301aab5f53c4a9084aca302bb976 (diff)
parentff85b03e3f7b332555d43f42cee6bdd37aad9c65 (diff)
downloadbox64-9daf8d6493cf9d6d98f5dd625c7b1ff466f7c245.tar.gz
box64-9daf8d6493cf9d6d98f5dd625c7b1ff466f7c245.zip
Merge branch 'main' of https://github.com/ptitSeb/box64
-rw-r--r--CMakeLists.txt1
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_1.c5
-rw-r--r--src/dynarec/rv64/dynarec_rv64_64.c18
-rw-r--r--src/dynarec/rv64/dynarec_rv64_67.c25
-rw-r--r--src/dynarec/rv64/dynarec_rv64_67_32.c59
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h50
7 files changed, 133 insertions, 27 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 95cfbfef..ee13f627 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -711,6 +711,7 @@ if(RV64_DYNAREC)
     #"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_65.c"
     "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66.c"
     "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_67.c"
+    "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_67_32.c"
     "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_d8.c"
     "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_d9.c"
     #"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_da.c"
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 5cc96deb..fe88a71c 100644
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -276,7 +276,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     if(MODREG) {

                         if(rex.rex) {

                             eb1 = xRAX+(nextop&7)+(rex.b<<3);

-                            eb2 = 0;                \

+                            eb2 = 0;

                         } else {

                             ed = (nextop&7);

                             eb1 = xRAX+(ed&3);  // Ax, Cx, Dx or Bx

diff --git a/src/dynarec/rv64/dynarec_rv64_00_1.c b/src/dynarec/rv64/dynarec_rv64_00_1.c
index 54ca28f5..4cc3a66c 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_1.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_1.c
@@ -172,7 +172,10 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             addr = dynarec64_66(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
             break;
         case 0x67:
-            addr = dynarec64_67(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
+            if(rex.is32bits)
+                addr = dynarec64_67_32(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
+            else
+                addr = dynarec64_67(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
             break;
         case 0x68:
             INST_NAME("PUSH Id");
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c
index bc3b2c96..40c6d861 100644
--- a/src/dynarec/rv64/dynarec_rv64_64.c
+++ b/src/dynarec/rv64/dynarec_rv64_64.c
@@ -393,7 +393,23 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 LDxw(gd, x4, fixedaddress);
             }
             break;
-
+        case 0x8E:
+            INST_NAME("MOV Seg,Ew");
+            grab_segdata(dyn, addr, ninst, x4, seg);
+            nextop = F8;
+            u8 = (nextop&0x38) >> 3;
+            if ((nextop&0xC0) == 0xC0) {
+                ed = xRAX+(nextop&7) + (rex.b<<3);
+            } else {
+                SMREAD();
+                addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 0, 0);
+                ADD(x4, wback, x4);
+                LHU(x1, x4, 0);
+                ed = x1;
+            }
+            SH(ed, xEmu, offsetof(x64emu_t, segs[u8]));
+            SW(xZR, xEmu, offsetof(x64emu_t, segs_serial[u8]));
+            break;
         case 0xA1:
             INST_NAME("MOV EAX,FS:Od");
             grab_segdata(dyn, addr, ninst, x4, seg);
diff --git a/src/dynarec/rv64/dynarec_rv64_67.c b/src/dynarec/rv64/dynarec_rv64_67.c
index 5f102742..46fed446 100644
--- a/src/dynarec/rv64/dynarec_rv64_67.c
+++ b/src/dynarec/rv64/dynarec_rv64_67.c
@@ -180,6 +180,31 @@ uintptr_t dynarec64_67(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             DEFAULT;
                     }
                     break;
+                case 0xB6:
+                    INST_NAME("MOVXZ Gd, Eb");
+                    nextop = F8;
+                    GETGD;
+                    if(MODREG) {
+                        if (rex.rex) {
+                            eb1 = xRAX + (nextop & 7) + (rex.b << 3);
+                            eb2 = 0;
+                        } else {
+                            ed = (nextop & 7);
+                            eb1 = xRAX + (ed & 3); // Ax, Cx, Dx or Bx
+                            eb2 = (ed & 4) >> 2;   // L or H
+                        }
+                        if (eb2) {
+                            SRLI(gd, eb1, 8);
+                            ANDI(gd, gd, 0xff);
+                        } else {
+                            ANDI(gd, eb1, 0xff);
+                        }
+                    } else {
+                        SMREAD();
+                        addr = geted32(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0);
+                        LBU(gd, ed, fixedaddress);
+                    }
+                    break;
                 default:
                     DEFAULT;
             }
diff --git a/src/dynarec/rv64/dynarec_rv64_67_32.c b/src/dynarec/rv64/dynarec_rv64_67_32.c
new file mode 100644
index 00000000..aa663d34
--- /dev/null
+++ b/src/dynarec/rv64/dynarec_rv64_67_32.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "box64context.h"
+#include "dynarec.h"
+#include "emu/x64emu_private.h"
+#include "emu/x64run_private.h"
+#include "x64run.h"
+#include "x64emu.h"
+#include "box64stack.h"
+#include "callback.h"
+#include "emu/x64run_private.h"
+#include "x64trace.h"
+#include "dynarec_native.h"
+
+#include "rv64_printer.h"
+#include "dynarec_rv64_private.h"
+#include "dynarec_rv64_helper.h"
+#include "dynarec_rv64_functions.h"
+
+uintptr_t dynarec64_67_32(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
+{
+    (void)ip; (void)need_epilog;
+
+    uint8_t opcode = F8;
+    uint8_t nextop;
+    uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2;
+    int64_t fixedaddress;
+    int unscaled;
+    int8_t  i8;
+    uint8_t u8;
+    int32_t i32;
+    int64_t j64, i64;
+    int cacheupd = 0;
+    int lock;
+    int v0, v1, s0;
+
+    if(!rex.is32bits) {
+        // should do a different file
+        DEFAULT;
+        return addr;
+    }
+
+    rep = 0;
+    while((opcode==0xF2) || (opcode==0xF3)) {
+        rep = opcode-0xF1;
+        opcode = F8;
+    }
+
+    switch(opcode) {
+        default:
+            DEFAULT;
+    }
+    return addr;
+}
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index cc05f141..cf1b29bf 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -1008,32 +1008,33 @@ void* rv64_next(x64emu_t* emu, uintptr_t addr);
 
 #define native_pass STEPNAME(native_pass)
 
-#define dynarec64_00   STEPNAME(dynarec64_00)
-#define dynarec64_00_0 STEPNAME(dynarec64_00_0)
-#define dynarec64_00_1 STEPNAME(dynarec64_00_1)
-#define dynarec64_00_2 STEPNAME(dynarec64_00_2)
-#define dynarec64_00_3 STEPNAME(dynarec64_00_3)
-#define dynarec64_0F   STEPNAME(dynarec64_0F)
-#define dynarec64_64   STEPNAME(dynarec64_64)
-#define dynarec64_65   STEPNAME(dynarec64_65)
-#define dynarec64_66   STEPNAME(dynarec64_66)
-#define dynarec64_67   STEPNAME(dynarec64_67)
-#define dynarec64_D8   STEPNAME(dynarec64_D8)
-#define dynarec64_D9   STEPNAME(dynarec64_D9)
-#define dynarec64_DA   STEPNAME(dynarec64_DA)
-#define dynarec64_DB   STEPNAME(dynarec64_DB)
-#define dynarec64_DC   STEPNAME(dynarec64_DC)
-#define dynarec64_DD   STEPNAME(dynarec64_DD)
-#define dynarec64_DE   STEPNAME(dynarec64_DE)
-#define dynarec64_DF   STEPNAME(dynarec64_DF)
-#define dynarec64_F0   STEPNAME(dynarec64_F0)
-#define dynarec64_660F STEPNAME(dynarec64_660F)
+#define dynarec64_00     STEPNAME(dynarec64_00)
+#define dynarec64_00_0   STEPNAME(dynarec64_00_0)
+#define dynarec64_00_1   STEPNAME(dynarec64_00_1)
+#define dynarec64_00_2   STEPNAME(dynarec64_00_2)
+#define dynarec64_00_3   STEPNAME(dynarec64_00_3)
+#define dynarec64_0F     STEPNAME(dynarec64_0F)
+#define dynarec64_64     STEPNAME(dynarec64_64)
+#define dynarec64_65     STEPNAME(dynarec64_65)
+#define dynarec64_66     STEPNAME(dynarec64_66)
+#define dynarec64_67     STEPNAME(dynarec64_67)
+#define dynarec64_67_32  STEPNAME(dynarec64_67_32)
+#define dynarec64_D8     STEPNAME(dynarec64_D8)
+#define dynarec64_D9     STEPNAME(dynarec64_D9)
+#define dynarec64_DA     STEPNAME(dynarec64_DA)
+#define dynarec64_DB     STEPNAME(dynarec64_DB)
+#define dynarec64_DC     STEPNAME(dynarec64_DC)
+#define dynarec64_DD     STEPNAME(dynarec64_DD)
+#define dynarec64_DE     STEPNAME(dynarec64_DE)
+#define dynarec64_DF     STEPNAME(dynarec64_DF)
+#define dynarec64_F0     STEPNAME(dynarec64_F0)
+#define dynarec64_660F   STEPNAME(dynarec64_660F)
 #define dynarec64_66F20F STEPNAME(dynarec64_66F20F)
 #define dynarec64_66F30F STEPNAME(dynarec64_66F30F)
-#define dynarec64_6664 STEPNAME(dynarec64_6664)
-#define dynarec64_66F0 STEPNAME(dynarec64_66F0)
-#define dynarec64_F20F STEPNAME(dynarec64_F20F)
-#define dynarec64_F30F STEPNAME(dynarec64_F30F)
+#define dynarec64_6664   STEPNAME(dynarec64_6664)
+#define dynarec64_66F0   STEPNAME(dynarec64_66F0)
+#define dynarec64_F20F   STEPNAME(dynarec64_F20F)
+#define dynarec64_F30F   STEPNAME(dynarec64_F30F)
 
 #define geted               STEPNAME(geted)
 #define geted32             STEPNAME(geted32)
@@ -1372,6 +1373,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
 // uintptr_t dynarec64_65(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep,int* ok, int* need_epilog);
 uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);
 uintptr_t dynarec64_67(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);
+uintptr_t dynarec64_67_32(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);
 uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);
 uintptr_t dynarec64_D9(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);
 // uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog);