From a2d580e92639303b90052779c56ba2004f980bc9 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 19 May 2024 19:21:08 +0200 Subject: [ARM64_DYNAREC] Use optimized rcl/rcr emiter for remaining opcodes with 64/65/67 prefixes --- src/dynarec/arm64/dynarec_arm64_64.c | 20 ++++++-------------- src/dynarec/arm64/dynarec_arm64_67.c | 24 ++++++++++-------------- 2 files changed, 16 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 150010df..8fb4cc56 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -793,27 +793,19 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: INST_NAME("RCL Ed, 1"); - MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET_DF); - MOV32w(x2, 1); + SETFLAGS(X_OF|X_CF, SF_SUBSET); // removed PENDING on purpose GETEDO(x6, 0); - if(wback) {ADDx_REG(x6, x6, wback); wback=x6;} - if(ed!=x1) {MOVxw_REG(x1, ed);} - CALL_(rcl32, ed, x6); - WBACK; + emit_rcl32c(dyn, ninst, rex, ed, 1, x3, x4); + WBACKO(x6); break; case 3: INST_NAME("RCR Ed, 1"); - MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET_DF); - MOV32w(x2, 1); + SETFLAGS(X_OF|X_CF, SF_SUBSET); // removed PENDING on purpose GETEDO(x6, 0); - if(wback) {ADDx_REG(x6, x6, wback); wback=x6;} - if(ed!=x1) {MOVxw_REG(x1, ed);} - CALL_(rcr32, ed, x6); - WBACK; + emit_rcr32c(dyn, ninst, rex, ed, 1, x3, x4); + WBACKO(x6); break; case 4: case 6: diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index e1a3fc4c..5ab9a10e 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -934,25 +934,21 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: INST_NAME("RCL Ed, Ib"); - MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET_DF); - GETED32W(x4, x1, 1); - u8 = F8; - MOV32w(x2, u8); - CALL_(rex.w?((void*)rcl64):((void*)rcl32), ed, x4); - WBACK; + SETFLAGS(X_OF|X_CF, SF_SUBSET); // removed PENDING on purpose + GETED32(1); + u8 = (F8)&(rex.w?0x3f:0x1f); + emit_rcl32c(dyn, ninst, rex, ed, u8, x3, x4); + if(u8) { WBACK; } break; case 3: INST_NAME("RCR Ed, Ib"); - MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET_DF); - GETED32W(x4, x1, 1); - u8 = F8; - MOV32w(x2, u8); - CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4); - WBACK; + SETFLAGS(X_OF|X_CF, SF_SUBSET); // removed PENDING on purpose + GETED32(1); + u8 = (F8)&(rex.w?0x3f:0x1f); + emit_rcr32c(dyn, ninst, rex, ed, u8, x3, x4); + if(u8) { WBACK; } break; case 4: case 6: -- cgit 1.4.1