diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 29 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_helper.h | 4 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_native_pass.c | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 3 |
4 files changed, 20 insertions, 17 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index d7f87b3f..24eddde4 100755 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -507,15 +507,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MOVx_REG(x1, gd); gd = x1; } - u32 = PK(0); - i32 = 1; - rex.rex = 0; - while(u32>=0x40 && u32<=0x4f) { + u32 = 0; + i32 = 0; + do { rex.rex = u32; u32 = PK(i32); i32++; - } - if(u32>=0x50 && u32<=0x57 && (dyn->size && dyn->insts[ninst+1].pred_sz==1)) { + } while(u32>=0x40 && u32<=0x4f); + if(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"); @@ -543,30 +542,26 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin dyn->doublepop = 0; else { gd = xRAX+(opcode&0x07)+(rex.b<<3); - u32 = PK(0); - i32 = 1; - rex.rex = 0; - while(u32>=0x40 && u32<=0x4f) { + u32 = 0; + i32 = 0; + do { rex.rex = u32; u32 = PK(i32); i32++; - } - if(u32>=0x58 && u32<=0x5f && (dyn->size && dyn->insts[ninst+1].pred_sz==1)) { + } while(u32>=0x40 && u32<=0x4f); + if((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"); if(gd==u32) { ADDx_U12(xRSP, xRSP, 0x8); - POP1((gd==xRSP)?x1:gd); + POP1(gd); } else { - POP2((gd==xRSP)?x1:gd, (u32==xRSP)?x1:u32); + POP2(gd, (u32==xRSP)?x1:u32); if(u32==xRSP) { MOVx_REG(u32, x1); } } - if(gd == xRSP) { - MOVx_REG(gd, x1); - } dyn->doublepop = 1; } else { if(gd == xRSP) { diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index bd3d3633..2308be43 100755 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -786,6 +786,10 @@ #define FTABLE64(A, V) #endif +#define ARCH_INIT() \ + dyn->doublepush = 0; \ + dyn->doublepop = 0; + #if STEP < 2 #define GETIP(A) #define GETIP_(A) diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index c07b6102..6694e3ca 100755 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -45,6 +45,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) dyn->forward_size = 0; dyn->forward_ninst = 0; 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! 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 diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 5b282715..554847b6 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -388,6 +388,9 @@ #define TABLE64(A, V) #endif +#define ARCH_INIT() + + #if STEP < 2 #define GETIP(A) #define GETIP_(A) |