about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-08-15 14:43:32 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-08-15 14:43:32 +0200
commit53a59f593eef9e1bfe84582ad0a589b5e9aec1c2 (patch)
tree4473c1284553fe37fefca2e4117517cdba0c9e0e /src
parentd6216707351353bb74a6d323da27e7351151243c (diff)
downloadbox64-53a59f593eef9e1bfe84582ad0a589b5e9aec1c2.tar.gz
box64-53a59f593eef9e1bfe84582ad0a589b5e9aec1c2.zip
Fixed AD opcode (for #924, probably other too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/arm64_emitter.h6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c18
2 files changed, 11 insertions, 13 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h
index 8d1c28a6..02ba2097 100644
--- a/src/dynarec/arm64/arm64_emitter.h
+++ b/src/dynarec/arm64/arm64_emitter.h
@@ -490,9 +490,9 @@
 #define CSNEGx(Rd, Rn, Rm, cond)            EMIT(CSNEG_gen(1, Rm, cond, Rn, Rd))
 #define CSNEGw(Rd, Rn, Rm, cond)            EMIT(CSNEG_gen(0, Rm, cond, Rn, Rd))
 #define CSNEGxw(Rd, Rn, Rm, cond)           EMIT(CSNEG_gen(rex.w, Rm, cond, Rn, Rd))
-#define CNEGx(Rd, Rn, cond)                 CSNEGx(Rn, Rn, Rn, invCond(cond))
-#define CNEGw(Rd, Rn, cond)                 CSNEGw(Rn, Rn, Rn, invCond(cond))
-#define CNEGxw(Rd, Rn, cond)                CSNEGxw(Rn, Rn, Rn, invCond(cond))
+#define CNEGx(Rd, Rn, cond)                 CSNEGx(Rn, Rn, Rd, invCond(cond))
+#define CNEGw(Rd, Rn, cond)                 CSNEGw(Rn, Rn, Rd, invCond(cond))
+#define CNEGxw(Rd, Rn, cond)                CSNEGxw(Rn, Rn, Rd, invCond(cond))
 
 // AND / ORR
 #define LOGIC_gen(sf, opc, N, immr, imms, Rn, Rd)  ((sf)<<31 | (opc)<<29 | 0b100100<<23 | (N)<<22 | (immr)<<16 | (imms)<<10 | (Rn)<<5 | Rd)
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 79683a30..5c718b8d 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1552,19 +1552,17 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             } else {
                 INST_NAME("LODSD");
             }
-            LDRxw_U12(xRAX, xRSI, 0);
-            BFIw(x2, xFlags, F_DF, 1);
-            if(rex.w) {
-                MOV32w(x1, 8);
-            } else {
-                MOV32w(x1, 4);
-            }
-            EORxw_REG_LSL(x1, x1, x2, rex.w?63:31);
+            GETDIR(x1, rex.w?8:4);
             if(rep) {
-                MULxw(x1, x1, xRCX);
-                EORw_REG(xRCX, xRCX, xRCX);
+                CBZx_NEXT(xRCX);
+                MARK;
             }
+            LDRxw_U12(xRAX, xRSI, 0);
             ADDx_REG(xRSI, xRSI, x1);
+            if(rep) {
+                ADDx_U12(xRCX, xRCX, 1);
+                CBNZx_MARK(xRCX);
+            }
             break;
         case 0xAE:
             switch(rep) {