about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-19 19:21:08 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-19 19:21:08 +0200
commita2d580e92639303b90052779c56ba2004f980bc9 (patch)
treeb39f94956da7442e7c271909ee9fadb9206c11dd /src
parent47085bb9c9bde482b7852cd11e86dee3925b3fe5 (diff)
downloadbox64-a2d580e92639303b90052779c56ba2004f980bc9.tar.gz
box64-a2d580e92639303b90052779c56ba2004f980bc9.zip
[ARM64_DYNAREC] Use optimized rcl/rcr emiter for remaining opcodes with 64/65/67 prefixes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c20
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c24
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: