about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-22 18:05:03 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-22 18:05:03 +0200
commitdc2d54edf26dc266e4787b30fa796a4db1339936 (patch)
treec8c9a6eb3d7058fa7b65219d29998444b3f59462 /src/dynarec
parentd39c55454182d689ee923e19e1c52a187daaa8ae (diff)
downloadbox64-dc2d54edf26dc266e4787b30fa796a4db1339936.tar.gz
box64-dc2d54edf26dc266e4787b30fa796a4db1339936.zip
Added 66 F2/F3 A4 opcode ({DYNAREC] too)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c29
-rw-r--r--src/dynarec/la64/dynarec_la64_66.c32
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c32
3 files changed, 91 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 15ce091b..3dc765df 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -758,7 +758,34 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             STRH_U12(xRAX, x1, 0);

             SMWRITELOCK(lock);

             break;

-

+        case 0xA4:

+            SMREAD();

+            if(rep) {

+                INST_NAME("REP MOVSB");

+                CBZx_NEXT(xRCX);

+                TBNZ_MARK2(xFlags, F_DF);

+                MARK;   // Part with DF==0

+                LDRB_S9_postindex(x1, xRSI, 1);

+                STRB_S9_postindex(x1, xRDI, 1);

+                SUBx_U12(xRCX, xRCX, 1);

+                CBNZx_MARK(xRCX);

+                B_NEXT_nocond;

+                MARK2;  // Part with DF==1

+                LDRB_S9_postindex(x1, xRSI, -1);

+                STRB_S9_postindex(x1, xRDI, -1);

+                SUBx_U12(xRCX, xRCX, 1);

+                CBNZx_MARK2(xRCX);

+                // done

+            } else {

+                INST_NAME("MOVSB");

+                GETDIR(x3, 1);

+                LDRB_U12(x1, xRSI, 0);

+                STRB_U12(x1, xRDI, 0);

+                ADDx_REG(xRSI, xRSI, x3);

+                ADDx_REG(xRDI, xRDI, x3);

+            }

+            SMWRITE();

+            break;

         case 0xA5:

             SMREAD();

             if(rep) {

diff --git a/src/dynarec/la64/dynarec_la64_66.c b/src/dynarec/la64/dynarec_la64_66.c
index 5130a3b0..3c32462d 100644
--- a/src/dynarec/la64/dynarec_la64_66.c
+++ b/src/dynarec/la64/dynarec_la64_66.c
@@ -413,6 +413,38 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 BSTRINS_D(gd, x2, 15, 0);
             }
             break;
+
+        case 0xA4:
+            if (rep) {
+                INST_NAME("REP MOVSB");
+                CBZ_NEXT(xRCX);
+                ANDI(x1, xFlags, 1 << F_DF);
+                BNEZ_MARK2(x1);
+                MARK; // Part with DF==0
+                LD_BU(x1, xRSI, 0);
+                ST_B(x1, xRDI, 0);
+                ADDI_D(xRSI, xRSI, 1);
+                ADDI_D(xRDI, xRDI, 1);
+                ADDI_D(xRCX, xRCX, -1);
+                BNEZ_MARK(xRCX);
+                B_NEXT_nocond;
+                MARK2; // Part with DF==1
+                LD_BU(x1, xRSI, 0);
+                ST_B(x1, xRDI, 0);
+                ADDI_D(xRSI, xRSI, -1);
+                ADDI_D(xRDI, xRDI, -1);
+                ADDI_D(xRCX, xRCX, -1);
+                BNEZ_MARK2(xRCX);
+                // done
+            } else {
+                INST_NAME("MOVSB");
+                GETDIR(x3, x1, 1);
+                LD_BU(x1, xRSI, 0);
+                ST_B(x1, xRDI, 0);
+                ADD_D(xRSI, xRSI, x3);
+                ADD_D(xRDI, xRDI, x3);
+            }
+            break;
         case 0xA5:
             if (rep) {
                 INST_NAME("REP MOVSW");
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c
index ba57b57d..0f0f31d0 100644
--- a/src/dynarec/rv64/dynarec_rv64_66.c
+++ b/src/dynarec/rv64/dynarec_rv64_66.c
@@ -717,7 +717,37 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             SH(xRAX, x1, 0);
             SMWRITELOCK(lock);
             break;
-
+        case 0xA4:
+            if(rep) {
+                INST_NAME("REP MOVSB");
+                CBZ_NEXT(xRCX);
+                ANDI(x1, xFlags, 1<<F_DF);
+                BNEZ_MARK2(x1);
+                MARK;   // Part with DF==0
+                LBU(x1, xRSI, 0);
+                SB(x1, xRDI, 0);
+                ADDI(xRSI, xRSI, 1);
+                ADDI(xRDI, xRDI, 1);
+                SUBI(xRCX, xRCX, 1);
+                BNEZ_MARK(xRCX);
+                B_NEXT_nocond;
+                MARK2;  // Part with DF==1
+                LBU(x1, xRSI, 0);
+                SB(x1, xRDI, 0);
+                SUBI(xRSI, xRSI, 1);
+                SUBI(xRDI, xRDI, 1);
+                SUBI(xRCX, xRCX, 1);
+                BNEZ_MARK2(xRCX);
+                // done
+            } else {
+                INST_NAME("MOVSB");
+                GETDIR(x3, x1, 1);
+                LBU(x1, xRSI, 0);
+                SB(x1, xRDI, 0);
+                ADD(xRSI, xRSI, x3);
+                ADD(xRDI, xRDI, x3);
+            }
+            break;
         case 0xA5:
             if(rep) {
                 INST_NAME("REP MOVSW");