diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-01 09:34:54 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-01 09:34:54 +0200 |
| commit | 89ca436e916ba54b41e64a2adc2135ec86e7d85b (patch) | |
| tree | 1c0c3dd9ab21aab5919d55e9d218ffa525313a07 /src | |
| parent | d5356bee99b01f8e4771f84f0abb1b69433bba5f (diff) | |
| download | box64-89ca436e916ba54b41e64a2adc2135ec86e7d85b.tar.gz box64-89ca436e916ba54b41e64a2adc2135ec86e7d85b.zip | |
[DYNAREC] Some fine-tunning to cosim
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 20 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_helper.h | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 4 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 4 | ||||
| -rwxr-xr-x | src/main.c | 1 |
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"); } } |