about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-04-01 09:34:54 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-04-01 09:34:54 +0200
commit89ca436e916ba54b41e64a2adc2135ec86e7d85b (patch)
tree1c0c3dd9ab21aab5919d55e9d218ffa525313a07 /src
parentd5356bee99b01f8e4771f84f0abb1b69433bba5f (diff)
downloadbox64-89ca436e916ba54b41e64a2adc2135ec86e7d85b.tar.gz
box64-89ca436e916ba54b41e64a2adc2135ec86e7d85b.zip
[DYNAREC] Some fine-tunning to cosim
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c20
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_helper.h4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00.c8
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h4
-rwxr-xr-xsrc/emu/x64run_private.h4
-rwxr-xr-xsrc/main.c1
6 files changed, 25 insertions, 16 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 581ced9a..a4e7d6b0 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -500,7 +500,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x57:
             INST_NAME("PUSH reg");
             if(dyn->doublepush) {
-                NOTEST(x1);
+                SKIPTEST(x1);
                 dyn->doublepush = 0;
             } else {
                 gd = xRAX+(opcode&0x07)+(rex.b<<3);
@@ -515,7 +515,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u32 = PK(i32);
                     i32++;
                 } while(u32>=0x40 && u32<=0x4f);
-                if(u32>=0x50 && u32<=0x57 && (dyn->size>(ninst+1) && dyn->insts[ninst+1].pred_sz==1)) {
+                if(!box64_dynarec_test && u32>=0x50 && u32<=0x57 && (dyn->size>(ninst+1) && dyn->insts[ninst+1].pred_sz==1)) {
                     // double push!
                     u32= xRAX+(u32&0x07)+(rex.b<<3);
                     MESSAGE(LOG_DUMP, "DOUBLE PUSH\n");
@@ -525,7 +525,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }
                     PUSH2(gd, u32);
                     dyn->doublepush = 1;
-                    NOTEST(x1);  // disable test for this OP
+                    SKIPTEST(x1);  // disable test for this OP
                 } else {
                     PUSH1(gd);
                 }   
@@ -541,7 +541,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x5F:
             INST_NAME("POP reg");
             if(dyn->doublepop) {
-                NOTEST(x1);
+                SKIPTEST(x1);
                 dyn->doublepop = 0;
             } else {
                 gd = xRAX+(opcode&0x07)+(rex.b<<3);
@@ -552,7 +552,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u32 = PK(i32);
                     i32++;
                 } while(u32>=0x40 && u32<=0x4f);
-                if((gd!=xRSP) && u32>=0x58 && u32<=0x5f && (dyn->size>(ninst+1) && dyn->insts[ninst+1].pred_sz==1)) {
+                if(!box64_dynarec_test && (gd!=xRSP) && u32>=0x58 && u32<=0x5f && (dyn->size>(ninst+1) && dyn->insts[ninst+1].pred_sz==1)) {
                     // double pop!
                     u32= xRAX+(u32&0x07)+(rex.b<<3);
                     MESSAGE(LOG_DUMP, "DOUBLE POP\n");
@@ -566,7 +566,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         }
                     }
                     dyn->doublepop = 1;
-                    NOTEST(x1);  // disable test for this OP
+                    SKIPTEST(x1);  // disable test for this OP
                 } else {
                     if(gd == xRSP) {
                         POP1(x1);
@@ -1749,7 +1749,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 
         case 0xCC:
             SETFLAGS(X_ALL, SF_SET);    // Hack, set all flags (to an unknown state...)
-            NOTEST(x1);
+            SKIPTEST(x1);
             if(PK(0)=='S' && PK(1)=='C') {
                 addr+=2;
                 //BARRIER(BARRIER_FLOAT);
@@ -2215,7 +2215,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }
                     PUSH1(x2);
                     MESSAGE(LOG_DUMP, "Native Call to %s (retn=%d)\n", GetNativeName(GetNativeFnc(dyn->insts[ninst].natcall-1)), dyn->insts[ninst].retn);
-                    NOTEST(x1);    // disable test as this hack dos 2 instructions for 1
+                    SKIPTEST(x1);    // disable test as this hack dos 2 instructions for 1
                     // calling a native function
                     sse_purge07cache(dyn, ninst, x3);
                     if((box64_log<2 && !cycle_log) && dyn->insts[ninst].natcall)
@@ -2398,7 +2398,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 7:
                     INST_NAME("IDIV Eb");
-                    NOTEST(x1);
+                    SKIPTEST(x1);
                     MESSAGE(LOG_DUMP, "Need Optimization\n");
                     SETFLAGS(X_ALL, SF_SET);
                     GETEB(x1, 0);
@@ -2509,7 +2509,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 7:
                     INST_NAME("IDIV Ed");
-                    NOTEST(x1);
+                    SKIPTEST(x1);
                     SETFLAGS(X_ALL, SF_SET);
                     if(!rex.w) {
                         SET_DFNONE(x2)
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index 10d948b2..84346f84 100755
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -1308,6 +1308,10 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
         STRw_U12(xZR, xEmu, offsetof(x64emu_t, test.test)); \
         STRw_U12(xZR, xEmu, offsetof(x64emu_t, test.clean));\
     }
+#define SKIPTEST(s1)                                        \
+    if(box64_dynarec_test) {                                \
+        STRw_U12(xZR, xEmu, offsetof(x64emu_t, test.clean));\
+    }
 #define GOTEST(s1, s2)                                      \
     if(box64_dynarec_test) {                                \
         MOV32w(s2, 1);                                      \
diff --git a/src/dynarec/rv64/dynarec_rv64_00.c b/src/dynarec/rv64/dynarec_rv64_00.c
index 0d024fe5..d0d6b2ec 100644
--- a/src/dynarec/rv64/dynarec_rv64_00.c
+++ b/src/dynarec/rv64/dynarec_rv64_00.c
@@ -1275,7 +1275,7 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
 
         case 0xCC:
             SETFLAGS(X_ALL, SF_SET);    // Hack, set all flags (to an unknown state...)
-            NOTEST(x1);
+            SKIPTEST(x1);
             if(PK(0)=='S' && PK(1)=='C') {
                 addr+=2;
                 BARRIER(BARRIER_FLOAT);
@@ -1476,7 +1476,7 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             switch(tmp) {
                 case 3:
                     SETFLAGS(X_ALL, SF_SET);    // Hack to set flags to "dont'care" state
-                    NOTEST(x1);
+                    SKIPTEST(x1);
                     BARRIER(BARRIER_FULL);
                     //BARRIER_NEXT(BARRIER_FULL);
                     if(dyn->last_ip && (addr-dyn->last_ip<0x1000)) {
@@ -1676,7 +1676,7 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 7:
                     INST_NAME("IDIV Eb");
-                    NOTEST(x1);
+                    SKIPTEST(x1);
                     MESSAGE(LOG_DUMP, "Need Optimization\n");
                     SETFLAGS(X_ALL, SF_SET);
                     GETEB(x1, 0);
@@ -1791,7 +1791,7 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 7:
                     INST_NAME("IDIV Ed");
-                    NOTEST(x1);
+                    SKIPTEST(x1);
                     SETFLAGS(X_ALL, SF_SET);
                     if(!rex.w) {
                         SET_DFNONE()
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index 20d5c0aa..be5931d6 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -1147,6 +1147,10 @@ uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
         SW(xZR, xEmu, offsetof(x64emu_t, test.test));       \
         SW(xZR, xEmu, offsetof(x64emu_t, test.clean));      \
     }
+#define SKIPTEST(s1)                                        \
+    if(box64_dynarec_test) {                                \
+        SW(xZR, xEmu, offsetof(x64emu_t, test.clean));      \
+    }
 #define GOTEST(s1, s2)                                      \
     if(box64_dynarec_test) {                                \
         MOV32w(s2, 1);                                      \
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index d43ea331..68db0670 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -27,8 +27,8 @@ static inline uint64_t Pop(x64emu_t *emu)
 }
 
 #ifdef TEST_INTERPRETER
-#define Push(E, V)  do{R_RSP -=8; test->memsize = 8; *(uint64_t*)test->mem = (V); test->memaddr = R_RSP;}while(0)
-#define Push16(E, V)  do{R_RSP -=2; test->memsize = 2; *(uint16_t*)test->mem = (V); test->memaddr = R_RSP;}while(0)
+#define Push(E, V)  do{E->regs[_SP].q[0] -=8; test->memsize = 8; *(uint64_t*)test->mem = (V); test->memaddr = E->regs[_SP].q[0];}while(0)
+#define Push16(E, V)  do{E->regs[_SP].q[0] -=2; test->memsize = 2; *(uint16_t*)test->mem = (V); test->memaddr = E->regs[_SP].q[0];}while(0)
 #else
 static inline void Push(x64emu_t *emu, uint64_t v)
 {
diff --git a/src/main.c b/src/main.c
index 9d4fc873..3916b4ff 100755
--- a/src/main.c
+++ b/src/main.c
@@ -610,6 +610,7 @@ void LoadLogEnv()
         if(box64_dynarec_test) {
             box64_dynarec_fastnan = 0;
             box64_dynarec_fastround = 0;
+            box64_dynarec_callret = 0;
             printf_log(LOG_INFO, "Dynarec will compare it's execution with the interpreter (super slow, only for testing)\n");
         }
     }