From 10088c6566f4ecb4b1405c977a395fa75d2f72a0 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 19 Mar 2021 16:50:21 +0100 Subject: [DYNAREC] Added 0F 80..8F Jcc Id opcodes (and factorised GOCOND macro) --- src/dynarec/dynarec_arm64_00.c | 90 +----------------------------- src/dynarec/dynarec_arm64_0f.c | 111 ++++++++----------------------------- src/dynarec/dynarec_arm64_helper.h | 90 ++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 176 deletions(-) (limited to 'src') diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 01901c10..0646a630 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -293,94 +293,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } \ } - case 0x70: - INST_NAME("JO ib"); - GO( TSTw_mask(xFlags, 0b010101, 0) - , cEQ, cNE, X_OF) - break; - case 0x71: - INST_NAME("JNO ib"); - GO( TSTw_mask(xFlags, 0b010101, 0) - , cNE, cEQ, X_OF) - break; - case 0x72: - INST_NAME("JC ib"); - GO( TSTw_mask(xFlags, 0, 0) - , cEQ, cNE, X_CF) - break; - case 0x73: - INST_NAME("JNC ib"); - GO( TSTw_mask(xFlags, 0, 0) - , cNE, cEQ, X_CF) - break; - case 0x74: - INST_NAME("JZ ib"); - GO( TSTw_mask(xFlags, 0b011010, 0) - , cEQ, cNE, X_ZF) - break; - case 0x75: - INST_NAME("JNZ ib"); - GO( TSTw_mask(xFlags, 0b011010, 0) - , cNE, cEQ, X_ZF) - break; - case 0x76: - INST_NAME("JBE ib"); - GO( MOV32w(x1, (1<insts) { \ + if(dyn->insts[ninst].x64.jmp_insts==-1) { \ + /* out of the block */ \ + i32 = dyn->insts[ninst+1].address-(dyn->arm_size); \ + Bcond(NO, i32); \ + jump_to_next(dyn, addr+i32_, 0, ninst); \ + } else { \ + /* inside the block */ \ + i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->arm_size); \ + Bcond(YES, i32); \ + } \ + } + + GOCOND(0x80, "J", "Id"); + #undef GO + case 0xBB: INST_NAME("BTC Ed, Gd"); SETFLAGS(X_CF, SF_SET); diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h index 69f48f1a..b7ef4a6a 100755 --- a/src/dynarec/dynarec_arm64_helper.h +++ b/src/dynarec/dynarec_arm64_helper.h @@ -781,4 +781,94 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n #define MAYUSE(A) #endif +#define GOCOND(B, T1, T2) \ + case B+0x0: \ + INST_NAME(T1 "O " T2); \ + GO( TSTw_mask(xFlags, 0b010101, 0) \ + , cEQ, cNE, X_OF) \ + break; \ + case B+0x1: \ + INST_NAME(T1 "NO " T2); \ + GO( TSTw_mask(xFlags, 0b010101, 0) \ + , cNE, cEQ, X_OF) \ + break; \ + case B+0x2: \ + INST_NAME(T1 "C " T2); \ + GO( TSTw_mask(xFlags, 0, 0) \ + , cEQ, cNE, X_CF) \ + break; \ + case B+0x3: \ + INST_NAME(T1 "NC " T2); \ + GO( TSTw_mask(xFlags, 0, 0) \ + , cNE, cEQ, X_CF) \ + break; \ + case B+0x4: \ + INST_NAME(T1 "Z " T2); \ + GO( TSTw_mask(xFlags, 0b011010, 0) \ + , cEQ, cNE, X_ZF) \ + break; \ + case B+0x5: \ + INST_NAME(T1 "NZ " T2); \ + GO( TSTw_mask(xFlags, 0b011010, 0) \ + , cNE, cEQ, X_ZF) \ + break; \ + case B+0x6: \ + INST_NAME(T1 "BE " T2); \ + GO( MOV32w(x1, (1<