diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64_emitter.h | 6 | ||||
| -rwxr-xr-x | src/dynarec/arm64_printer.c | 4 | ||||
| -rwxr-xr-x | src/dynarec/dynablock.c | 4 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 31 | ||||
| -rwxr-xr-x | src/include/debug.h | 2 |
5 files changed, 41 insertions, 6 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h index d67361e5..28dfa452 100755 --- a/src/dynarec/arm64_emitter.h +++ b/src/dynarec/arm64_emitter.h @@ -227,9 +227,9 @@ #define LDRSHx_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b01, 0b01, 0b10, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt)) #define LDRSHw_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b01, 0b01, 0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt)) #define LDRSHxw_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b01, 0b01, rex.w?0b10:0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt)) -#define LDRSBx_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b00, 0b01, 0b10, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt)) -#define LDRSBw_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b00, 0b01, 0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt)) -#define LDRSBxw_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b00, 0b01, rex.w?0b10:0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt)) +#define LDRSBx_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b00, 0b01, 0b10, ((uint32_t)(imm12>>0))&0xfff, Rn, Rt)) +#define LDRSBw_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b00, 0b01, 0b11, ((uint32_t)(imm12>>0))&0xfff, Rn, Rt)) +#define LDRSBxw_U12(Rt, Rn, imm12) EMIT(LDRSH_gen(0b00, 0b01, rex.w?0b10:0b11, ((uint32_t)(imm12>>0))&0xfff, Rn, Rt)) #define LDR_PC_gen(opc, imm19, Rt) ((opc)<<30 | 0b011<<27 | (imm19)<<5 | (Rt)) #define LDRx_literal(Rt, imm19) EMIT(LDR_PC_gen(0b01, ((imm19)>>2)&0x7FFFF, Rt)) diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c index 13fe743a..14255e48 100755 --- a/src/dynarec/arm64_printer.c +++ b/src/dynarec/arm64_printer.c @@ -278,9 +278,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) if(isMask(opcode, "001110011xiiiiiiiiiiiinnnnnttttt", &a)) { int offset = imm<<1; if(!offset) - snprintf(buff, sizeof(buff), "LDRSB %s, [%s]", a.x?Xt[Rt]:Wt[Rt], XtSp[Rn]); + snprintf(buff, sizeof(buff), "LDRSB %s, [%s]", a.x?Wt[Rt]:Xt[Rt], XtSp[Rn]); else - snprintf(buff, sizeof(buff), "LDRSB %s, [%s, #%d]", a.x?Xt[Rt]:Wt[Rt], XtSp[Rn], offset); + snprintf(buff, sizeof(buff), "LDRSB %s, [%s, #%d]", a.x?Wt[Rt]:Xt[Rt], XtSp[Rn], offset); return buff; } diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index e92b7f0b..79a07027 100755 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -323,8 +323,10 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t if(!created) return block; // existing block... + #if 0 if(box64_dynarec_dump) pthread_mutex_lock(&my_context->mutex_dyndump); + #endif // fill the block block->x64_addr = (void*)addr; if(!FillBlock64(block, filladdr)) { @@ -336,8 +338,10 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t free(block); block = NULL; } + #if 0 if(box64_dynarec_dump) pthread_mutex_unlock(&my_context->mutex_dyndump); + #endif // check size if(block && block->x64_size) { int blocksz = block->x64_size; diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c index 29298506..08eaedeb 100755 --- a/src/dynarec/dynarec_arm64_0f.c +++ b/src/dynarec/dynarec_arm64_0f.c @@ -543,6 +543,37 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin BFIw(xFlags, x1, F_ZF, 1); SET_DFNONE(x1); break; + case 0xBE: + INST_NAME("MOVSX Gd, Eb"); + nextop = F8; + GETGD; + if(MODREG) { + if(rex.rex) { + wback = xRAX+(nextop&7)+(rex.b<<3); + wb2 = 0; + } else { + wback = (nextop&7); + wb2 = (wback>>2)*8; + wback = xRAX+(wback&3); + } + SBFXxw(gd, wback, wb2, 8); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, 0xfff, 0, rex, 0, 0); + LDRSBxw_U12(gd, ed, fixedaddress); + } + break; + case 0xBF: + INST_NAME("MOVSX Gd, Ew"); + nextop = F8; + GETGD; + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + SXTHxw(gd, ed); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, 0xfff<<1, 1, rex, 0, 0); + LDRSHxw_U12(gd, ed, fixedaddress); + } + break; default: DEFAULT; diff --git a/src/include/debug.h b/src/include/debug.h index 61071b48..0f2de170 100755 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -37,7 +37,7 @@ extern FILE* ftrace; #define printf_log(L, ...) do {if(L<=box64_log) {fprintf(ftrace, __VA_ARGS__); fflush(ftrace);}} while(0) -#define dynarec_log(L, ...) do {if(L<=box64_dynarec_log) {fprintf(ftrace, __VA_ARGS__); /*fflush(ftrace);*/}} while(0) +#define dynarec_log(L, ...) do {if(L<=box64_dynarec_log) {fprintf(ftrace, __VA_ARGS__); fflush(ftrace);}} while(0) #define EXPORT __attribute__((visibility("default"))) #ifdef BUILD_DYNAMIC |