about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-18 16:17:20 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-18 16:17:20 +0100
commit0d3e9f21ee1636bf443ceb79df1cf31ec10a4d2e (patch)
tree3153c0a26be12ad66c2476dc42db15a2416b469a /src
parent8c014121567421c83b847c277f7867a228efe9e3 (diff)
downloadbox64-0d3e9f21ee1636bf443ceb79df1cf31ec10a4d2e.tar.gz
box64-0d3e9f21ee1636bf443ceb79df1cf31ec10a4d2e.zip
[DYNAREC] Added 66 0F 1F NOP
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c4
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c2
-rwxr-xr-xsrc/dynarec/dynarec_arm64_66.c69
-rwxr-xr-xsrc/dynarec/dynarec_arm64_660f.c77
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.h32
5 files changed, 167 insertions, 17 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 965b8380..1e13e23c 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -225,6 +225,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             }
             break;
 
+        case 0x66:
+            addr = dynarec64_66(dyn, addr, ip, ninst, rex, ok, need_epilog);
+            break;
+
         #define GO(GETFLAGS, NO, YES, F)    \
             READFLAGS(F);                   \
             i8 = F8S;   \
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index bc2bdd86..62226161 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -25,7 +25,7 @@
 #include "dynarec_arm64_helper.h"

 

 #define GETGX(a)    \

-    gd = (nextop&0x38)>>3+(rex.r<<3);  \

+    gd = ((nextop&0x38)>>3)+(rex.r<<3);  \

     a = sse_get_reg(dyn, ninst, x1, gd)

 #define GETEX(a)    \

     if(MODREG) { \

diff --git a/src/dynarec/dynarec_arm64_66.c b/src/dynarec/dynarec_arm64_66.c
new file mode 100755
index 00000000..3242b169
--- /dev/null
+++ b/src/dynarec/dynarec_arm64_66.c
@@ -0,0 +1,69 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <stddef.h>

+#include <pthread.h>

+#include <errno.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_arm64.h"

+#include "dynarec_arm64_private.h"

+#include "arm64_printer.h"

+

+#include "dynarec_arm64_helper.h"

+#include "dynarec_arm64_functions.h"

+

+

+uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog)

+{

+    uint8_t opcode = F8;

+    uint8_t nextop, u8;

+    uint32_t u32;

+    int32_t i32, j32;

+    int16_t i16;

+    uint16_t u16;

+    uint8_t gd, ed;

+    uint8_t wback, wb1;

+    int fixedaddress;

+    int rep;

+    MAYUSE(u16);

+    MAYUSE(u8);

+    MAYUSE(j32);

+

+    while((opcode==0x2E) || (opcode==0x66))   // ignoring CS: or multiple 0x66

+        opcode = F8;

+

+    while((opcode==0xF2) || (opcode==0xF3)) {

+        rep = opcode-0xF1;

+        opcode = F8;

+    }

+    // REX prefix before the F0 are ignored

+    rex.rex = 0;

+    while(opcode>=0x40 && opcode<=0x4f) {

+        rex.rex = opcode;

+        opcode = F8;

+    }

+

+    switch(opcode) {

+        

+

+                

+        case 0x0F:

+            addr = dynarec64_660F(dyn, addr, ip, ninst, rex, ok, need_epilog);

+            break;

+

+        default:

+            DEFAULT;

+    }

+    return addr;

+}

+

diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c
new file mode 100755
index 00000000..88d38742
--- /dev/null
+++ b/src/dynarec/dynarec_arm64_660f.c
@@ -0,0 +1,77 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <stddef.h>

+#include <pthread.h>

+#include <errno.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_arm64.h"

+#include "dynarec_arm64_private.h"

+#include "arm64_printer.h"

+

+#include "dynarec_arm64_functions.h"

+#include "dynarec_arm64_helper.h"

+

+// Get EX as a quad

+#define GETEX(a)                \

+    if(MODREG) {   \

+        a = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3));  \

+    } else {                    \

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

+        a = fpu_get_scratch_quad(dyn); \

+        VLD1Q_8(a, ed);       \

+    }

+#define GETGX(a)    \

+    gd = ((nextop&0x38)>>3)+(rex.r<<3);  \

+    a = sse_get_reg(dyn, ninst, x1, gd)

+

+uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog)

+{

+    uint8_t opcode = F8;

+    uint8_t nextop, u8;

+    int32_t i32, j32;

+    uint8_t gd, ed;

+    uint8_t wback, wb1;

+    uint8_t eb1, eb2;

+    int v0, v1;

+    int q0, q1;

+    int d0;

+    int s0;

+    int fixedaddress;

+    int parity;

+

+    MAYUSE(d0);

+    MAYUSE(q1);

+    MAYUSE(eb1);

+    MAYUSE(eb2);

+    MAYUSE(j32);

+    #if STEP == 3

+    static const int8_t mask_shift8[] = { -7, -6, -5, -4, -3, -2, -1, 0 };

+    #endif

+

+    switch(opcode) {

+

+

+        case 0x1F:

+            INST_NAME("NOP (multibyte)");

+            nextop = F8;

+            FAKEED;

+            break;

+        

+

+        default:

+            DEFAULT;

+    }

+    return addr;

+}

+

diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h
index 28dfc97e..4449cf47 100755
--- a/src/dynarec/dynarec_arm64_helper.h
+++ b/src/dynarec/dynarec_arm64_helper.h
@@ -740,22 +740,22 @@ void fpu_popcache(dynarec_arm_t* dyn, int ninst, int s1);
 
 uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
 uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
-//uintptr_t dynarec64_FS(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_GS(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_DD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
-//uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, int* ok, int* need_epilog);
+//uintptr_t dynarec64_FS(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_GS(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_DD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
+//uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog);
 
 #if STEP < 2
 #define PASS2(A)