about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-15 18:16:16 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-15 18:16:16 +0100
commit8901d1c37da07f274c9525dcdb00971b323588aa (patch)
tree9b35aa332c0f52662da67dc8e66b4420e97b220f /src
parentec9dedd75cd072853550d25ae555b68641ee0312 (diff)
downloadbox64-8901d1c37da07f274c9525dcdb00971b323588aa.tar.gz
box64-8901d1c37da07f274c9525dcdb00971b323588aa.zip
[ARM64_DYNAREC] Optimized F6 /6 /7 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 04573de4..43d0cd52 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -2843,18 +2843,24 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 6:
                     INST_NAME("DIV Eb");
-                    MESSAGE(LOG_DUMP, "Need Optimization\n");
                     SETFLAGS(X_ALL, SF_SET);
                     GETEB(x1, 0);
-                    CALL(div8, -1);
+                    UXTHw(x2, xRAX);
+                    UDIVw(x3, x2, ed);
+                    MSUBw(x4, x3, ed, x2);  // x4 = x2 mod ed (i.e. x2 - x3*ed)
+                    BFIx(xRAX, x3, 0, 8);
+                    BFIx(xRAX, x4, 8, 8);
                     break;
                 case 7:
                     INST_NAME("IDIV Eb");
                     SKIPTEST(x1);
-                    MESSAGE(LOG_DUMP, "Need Optimization\n");
                     SETFLAGS(X_ALL, SF_SET);
-                    GETEB(x1, 0);
-                    CALL(idiv8, -1);
+                    GETSEB(x1, 0);
+                    SXTHw(x2, xRAX);
+                    SDIVw(x3, x2, ed);
+                    MSUBw(x4, x3, ed, x2);  // x4 = x2 mod ed (i.e. x2 - x3*ed)
+                    BFIx(xRAX, x3, 0, 8);
+                    BFIx(xRAX, x4, 8, 8);
                     break;
             }
             break;