diff options
Diffstat (limited to 'src/dynarec/dynarec_native_pass.c')
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 1e8ba3aa..8ce3540b 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -1,7 +1,6 @@ #include <stdio.h> #include <stdlib.h> #include <stddef.h> -#include <pthread.h> #include <errno.h> #include <string.h> @@ -27,7 +26,7 @@ #error No STEP defined #endif -uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) +uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits) { int ok = 1; int ninst = 0; @@ -47,7 +46,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) fpu_reset(dyn); ARCH_INIT(); int reset_n = -1; - dyn->last_ip = (dyn->insts && dyn->insts[0].pred_sz)?0:ip; // RIP is always set at start of block unless there is a predecessor! + dyn->last_ip = (alternate || (dyn->insts && dyn->insts[0].pred_sz))?0:ip; // RIP is always set at start of block unless there is a predecessor! int stopblock = 2+(FindElfAddress(my_context, addr)?0:1); // if block is in elf_memory, it can be extended with bligblocks==2, else it needs 3 // ok, go now INIT; @@ -118,11 +117,13 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) pk = PK(0); } rex.rex = 0; - while(pk>=0x40 && pk<=0x4f) { - rex.rex = pk; - ++addr; - pk = PK(0); - } + rex.is32bits = is32bits; + if(!rex.is32bits) + while(pk>=0x40 && pk<=0x4f) { + rex.rex = pk; + ++addr; + pk = PK(0); + } addr = dynarec64_00(dyn, addr, ip, ninst, rex, rep, &ok, &need_epilog); |