about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-22 22:04:28 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-22 22:04:28 +0100
commit98a567e102305e0b50b3330ee04e2ddc11630a8f (patch)
tree6a5f3b400705d45d2d9cf1b23de94666124bd453 /src
parentd6123a87c5728b4849d2789775d9d308bacee65c (diff)
downloadbox64-98a567e102305e0b50b3330ee04e2ddc11630a8f.tar.gz
box64-98a567e102305e0b50b3330ee04e2ddc11630a8f.zip
[DYNAREC] Fixed F2/F3 AE opcode and factorized F2/F3 A6/AE opcodes
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c45
1 files changed, 8 insertions, 37 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 148cbe92..692c55be 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -992,26 +992,11 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xA6:
             switch(rep) {
             case 1:
-                INST_NAME("REPNZ CMPSB");
-                SETFLAGS(X_ALL, SF_SET);
-                GETDIR(x3, 1);
-                CBZx_NEXT(xRCX);
-                MARK;
-                LDRB_U12(x1, xRSI, 0);
-                LDRB_U12(x2, xRDI, 0);
-                ADDx_REG(xRSI, xRSI, x3);
-                ADDx_REG(xRDI, xRDI, x3);
-                SUBx_U12(xRCX, xRCX, 1);
-                CMPSw_REG(x1, x2);
-                Bcond(cEQ, 4+4);
-                CBNZx_MARK(xRCX);
-                emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
-                break;
             case 2:
-                INST_NAME("REPZ CMPSB");
+                if(rep==1) {INST_NAME("REPNZ CMPSB");} else {INST_NAME("REPZ CMPSB");}
                 SETFLAGS(X_ALL, SF_SET);
-                GETDIR(x3, 1);
                 CBZx_NEXT(xRCX);
+                GETDIR(x3, 1);
                 MARK;
                 LDRB_U12(x1, xRSI, 0);
                 LDRB_U12(x2, xRDI, 0);
@@ -1019,7 +1004,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 ADDx_REG(xRDI, xRDI, x3);
                 SUBx_U12(xRCX, xRCX, 1);
                 CMPSw_REG(x1, x2);
-                Bcond(cNE, 4+4);
+                Bcond((rep==1)?cEQ:cNE, 4+4);
                 CBNZx_MARK(xRCX);
                 emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
                 break;
@@ -1055,32 +1040,18 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xAE:
             switch(rep) {
             case 1:
-                INST_NAME("REPNZ SCASB");
-                SETFLAGS(X_ALL, SF_SET);
-                GETDIR(x3, 1);
-                CBZx_NEXT(xRCX);
-                BFIw(x1, xRAX, 0, 8);
-                MARK;
-                LDRB_U12(x2, xRDI, 0);
-                ADDx_REG(xRDI, xRDI, x3);
-                SUBx_U12(xRCX, xRCX, 1);
-                CMPSw_REG(x1, x2);
-                Bcond(cEQ, 4+4);
-                CBNZx_MARK(xRCX);
-                emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
-                break;
             case 2:
-                INST_NAME("REPZ SCASB");
+                if(rep==1) {INST_NAME("REPNZ SCASB");} else {INST_NAME("REPZ SCASB");}
                 SETFLAGS(X_ALL, SF_SET);
-                GETDIR(x3, 1);
                 CBZx_NEXT(xRCX);
-                BFIw(x1, xRAX, 0, 8);
+                GETDIR(x3, 1);
+                UBFXw(x1, xRAX, 0, 8);
                 MARK;
                 LDRB_U12(x2, xRDI, 0);
                 ADDx_REG(xRDI, xRDI, x3);
                 SUBx_U12(xRCX, xRCX, 1);
                 CMPSw_REG(x1, x2);
-                Bcond(cNE, 4+4);
+                Bcond((rep==1)?cEQ:cNE, 4+4);
                 CBNZx_MARK(xRCX);
                 emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
                 break;
@@ -1088,7 +1059,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 INST_NAME("SCASB");
                 SETFLAGS(X_ALL, SF_SET);
                 GETDIR(x3, 1);
-                BFIw(x1, xRAX, 0, 8);
+                UBFXw(x1, xRAX, 0, 8);
                 LDRB_U12(x2, xRDI, 0);
                 ADDx_REG(xRDI, xRDI, x3);
                 emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);