diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-19 19:21:08 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-19 19:21:08 +0200 |
| commit | a2d580e92639303b90052779c56ba2004f980bc9 (patch) | |
| tree | b39f94956da7442e7c271909ee9fadb9206c11dd | |
| parent | 47085bb9c9bde482b7852cd11e86dee3925b3fe5 (diff) | |
| download | box64-a2d580e92639303b90052779c56ba2004f980bc9.tar.gz box64-a2d580e92639303b90052779c56ba2004f980bc9.zip | |
[ARM64_DYNAREC] Use optimized rcl/rcr emiter for remaining opcodes with 64/65/67 prefixes
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 20 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 24 |
2 files changed, 16 insertions, 28 deletions
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: |