diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_native_pass.c | 2 | ||||
| -rw-r--r-- | src/emu/modrm.h | 20 | ||||
| -rwxr-xr-x | src/emu/x64run.c | 10 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 6 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 2 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 4 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 4 |
7 files changed, 35 insertions, 13 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 02b55774..d0211197 100755 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -213,7 +213,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) if(ok<0) {ok = 0; need_epilog=1;} ++ninst; #if STEP == 0 - if(ok && !isJumpTableDefault64((void*)addr) && (box64_dynarec_bigblock<2)) + if(ok && ((!isJumpTableDefault64((void*)addr) && (box64_dynarec_bigblock<2)) || (addr>=box64_nodynarec_start && addr<box64_nodynarec_end))) #else if(ok && (ninst==dyn->size)) #endif diff --git a/src/emu/modrm.h b/src/emu/modrm.h index 01f83e1f..d3ccd18c 100644 --- a/src/emu/modrm.h +++ b/src/emu/modrm.h @@ -11,9 +11,11 @@ #ifdef DYNAREC #define STEP if(step) return 0; #define STEP2 if(step) {R_RIP = addr; return 0;} +#define STEP3 if(*step) *(step)++; #else #define STEP #define STEP2 +#define STEP3 #endif #define GETED(D) oped=GetEd(emu, &addr, rex, nextop, D) @@ -48,7 +50,7 @@ #define MODREG ((nextop&0xC0)==0xC0) -#define GOCOND(BASE, PREFIX, COND, NOTCOND) \ +#define GOCOND(BASE, PREFIX, COND, NOTCOND, POST)\ case BASE+0x0: \ PREFIX \ if(ACCESS_FLAG(F_OF)) { \ @@ -56,6 +58,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x1: \ PREFIX \ @@ -64,6 +67,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x2: \ PREFIX \ @@ -72,6 +76,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x3: \ PREFIX \ @@ -80,6 +85,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x4: \ PREFIX \ @@ -88,6 +94,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x5: \ PREFIX \ @@ -96,6 +103,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x6: \ PREFIX \ @@ -104,6 +112,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x7: \ PREFIX \ @@ -112,6 +121,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x8: \ PREFIX \ @@ -120,6 +130,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0x9: \ PREFIX \ @@ -128,6 +139,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0xA: \ PREFIX \ @@ -136,6 +148,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0xB: \ PREFIX \ @@ -144,6 +157,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0xC: \ PREFIX \ @@ -152,6 +166,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0xD: \ PREFIX \ @@ -160,6 +175,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0xE: \ PREFIX \ @@ -168,6 +184,7 @@ } else { \ NOTCOND \ } \ + POST \ break; \ case BASE+0xF: \ PREFIX \ @@ -176,4 +193,5 @@ } else { \ NOTCOND \ } \ + POST \ break; diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 944d790c..de48070a 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -135,10 +135,11 @@ x64emurun: case 0x0F: /* More instructions */ switch(rep) { case 1: - if(!(addr = RunF20F(emu, rex, addr))) { + if(!(addr = RunF20F(emu, rex, addr, &step))) { unimp = 1; goto fini; } + if(step==2) STEP2; break; case 2: if(!(addr = RunF30F(emu, rex, addr))) { @@ -147,10 +148,11 @@ x64emurun: } break; default: - if(!(addr = Run0F(emu, rex, addr))) { + if(!(addr = Run0F(emu, rex, addr, &step))) { unimp = 1; goto fini; } + if(step==2) STEP2; break; } if(emu->quit) { @@ -330,7 +332,7 @@ x64emurun: GOCOND(0x70 , tmp8s = F8S; CHECK_FLAGS(emu); , addr += tmp8s; - , + ,,STEP2 ) /* Jxx Ib */ case 0x80: /* GRP Eb,Ib */ @@ -1270,7 +1272,7 @@ x64emurun: addr += tmp8s; STEP2 break; - case 0xE3: /* JECXZ */ + case 0xE3: /* JRCXZ */ tmp8s = F8S; if(!R_RCX) addr += tmp8s; diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index a07c2030..a75ffc26 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -28,7 +28,7 @@ #include "modrm.h" -uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr) +uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) { uint8_t opcode; uint8_t nextop; @@ -343,6 +343,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr) CHECK_FLAGS(emu); , if(rex.w) {GD->q[0] = ED->q[0]; } else {GD->q[0] = ED->dword[0];} , if(!rex.w) GD->dword[1] = 0; + , ) /* 0x40 -> 0x4F CMOVxx Gd,Ed */ // conditional move, no sign case 0x50: /* MOVMSKPS Gd, Ex */ @@ -749,13 +750,14 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr) GOCOND(0x80 , tmp32s = F32S; CHECK_FLAGS(emu); , addr += tmp32s; - , + ,,STEP3 ) /* 0x80 -> 0x8F Jxx */ GOCOND(0x90 , nextop = F8; CHECK_FLAGS(emu); GETEB(0); , EB->byte[0]=1; , EB->byte[0]=0; + , ) /* 0x90 -> 0x9F SETxx Eb */ case 0xA2: /* CPUID */ diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index a82be1d8..f182e34f 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -829,7 +829,7 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) GETEW(0); GETGW; , if(rex.w) GW->q[0] = EW->q[0]; else GW->word[0] = EW->word[0]; - , + ,, ) /* 0x40 -> 0x4F CMOVxx Gw,Ew */ // conditional move, no sign case 0x50: /* MOVMSKPD Gd, Ex */ diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index b3aea763..9288593b 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -64,7 +64,7 @@ void UpdateFlags(x64emu_t *emu); #define CHECK_FLAGS(emu) if(emu->df) UpdateFlags(emu) #define RESET_FLAGS(emu) emu->df = d_none -uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr); +uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step); uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr); uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr); uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr); @@ -85,7 +85,7 @@ uintptr_t RunDD(x64emu_t *emu, rex_t rex, uintptr_t addr); uintptr_t RunDE(x64emu_t *emu, rex_t rex, uintptr_t addr); uintptr_t RunDF(x64emu_t *emu, rex_t rex, uintptr_t addr); uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr); -uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr); +uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step); uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr); void x64Syscall(x64emu_t *emu); diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c index db2500cd..18eea952 100644 --- a/src/emu/x64runf20f.c +++ b/src/emu/x64runf20f.c @@ -22,7 +22,7 @@ #include "modrm.h" -uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr) +uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) { uint8_t opcode; uint8_t nextop; @@ -257,7 +257,7 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr) GOCOND(0x80 , tmp32s = F32S; CHECK_FLAGS(emu); , addr += tmp32s; - , + ,,STEP3 ) /* 0x80 -> 0x8F Jxx */ case 0xC2: /* CMPSD Gx, Ex, Ib */ |