From c6bd721d2ee3aefe782eece531d8023a1743e548 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 19 Feb 2023 17:58:11 +0100 Subject: [DYNAREC] Optimized DB /7 opcode --- src/dynarec/arm64/arm64_emitter.h | 11 ++++++++ src/dynarec/arm64/arm64_printer.c | 6 ++--- src/dynarec/arm64/dynarec_arm64_db.c | 51 ++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h index 9f573f8f..c3d62074 100755 --- a/src/dynarec/arm64/arm64_emitter.h +++ b/src/dynarec/arm64/arm64_emitter.h @@ -266,6 +266,13 @@ #define STRH_U12(Rt, Rn, imm12) EMIT(ST_gen(0b01, 0b01, ((uint32_t)((imm12)>>1))&0xfff, Rn, Rt)) #define STRxw_U12(Rt, Rn, imm12) EMIT(ST_gen((rex.w)?0b11:0b10, 0b01, ((uint32_t)((imm12)>>(2+rex.w)))&0xfff, Rn, Rt)) +#define STU_gen(size, opc, imm9, Rn, Rt) ((size)<<30 | 0b111<<27 | (opc)<<22 | ((imm9)&0x1ff)<<12 | (Rn)<<5 | (Rt)) +#define STURx_I9(Rt, Rn, imm9) EMIT(STU_gen(0b11, 0b00, imm9, Rn, Rt)) +#define STURw_I9(Rt, Rn, imm9) EMIT(STU_gen(0b10, 0b00, imm9, Rn, Rt)) +#define STURxw_I9(Rt, Rn, imm9) EMIT(STU_gen((rex.w)?0b11:0b10, 0b00, imm9, Rn, Rt)) +#define STURH_I9(Rt, Rn, imm9) EMIT(STU_gen(0b01, 0b00, imm9, Rn, Rt)) +#define STURB_I9(Rt, Rn, imm9) EMIT(STU_gen(0b00, 0b00, imm9, Rn, Rt)) + #define STR_REG_gen(size, Rm, option, S, Rn, Rt) ((size)<<30 | 0b111<<27 | 0b00<<22 | 1<<21 | (Rm)<<16 | (option)<<13 | (S)<<12 | (0b10)<<10 | (Rn)<<5 | (Rt)) #define STRx_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(0b11, Rm, 0b011, 0, Rn, Rt)) #define STRx_REG_LSL3(Rt, Rn, Rm) EMIT(STR_REG_gen(0b11, Rm, 0b011, 1, Rn, Rt)) @@ -649,6 +656,10 @@ #define REV16w(Rd, Rn) EMIT(REV_gen(0, 0b01, Rn, Rd)) #define REV16x(Rd, Rn) EMIT(REV_gen(1, 0b01, Rn, Rd)) +// UDF +#define UDF_gen(imm16) ((imm16)&0xffff) +#define UDF(imm16) EMIT(UDF_gen(imm16)) + // MRS #define MRS_gen(L, o0, op1, CRn, CRm, op2, Rt) (0b1101010100<<22 | (L)<<21 | 1<<20 | (o0)<<19 | (op1)<<16 | (CRn)<<12 | (CRm)<<8 | (op2)<<5 | (Rt)) // mrs x0, nzcv : 1101010100 1 1 1 011 0100 0010 000 00000 o0=1(op0=3), op1=0b011(3) CRn=0b0100(4) CRm=0b0010(2) op2=0 diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c index 4bad45d5..e9356773 100755 --- a/src/dynarec/arm64/arm64_printer.c +++ b/src/dynarec/arm64/arm64_printer.c @@ -25,7 +25,7 @@ typedef struct arm64_print_s { uint64_t DecodeBitMasks(int N, int imms, int immr) { - int len = 31-__builtin_clz(N<<6 | ((~imms)&0b111111)); + int len = 31-__builtin_clz((N<<6) | ((~imms)&0b111111)); if(len<1) return 0; int levels = (1<