about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c12
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c12
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.h3
3 files changed, 21 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 07b724e1..8f452ca9 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -3383,9 +3383,15 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 2:
                     INST_NAME("NOT Eb");
-                    GETEB(x1, 0);
-                    MVNw_REG(x1, x1);
-                    EBBACK;
+                    if(MODREG) {
+                        CALCEB();
+                        int mask = convert_bitmask_x(0xff<<wb2);
+                        EORx_mask(wback, wback, (mask>>12)&1, mask&0x3F, (mask>>6)&0x3F);
+                    } else {
+                        GETEB(x1, 0);
+                        MVNw_REG(x1, x1);
+                        EBBACK;
+                    }
                     break;
                 case 3:
                     INST_NAME("NEG Eb");
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index b1d66f1c..288691a3 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -1347,9 +1347,15 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;

                 case 2:

                     INST_NAME("NOT Ew");

-                    GETEW(x1, 0);

-                    MVNw_REG(ed, ed);

-                    EWBACK;

+                    if(MODREG) {

+                        CALCEW();

+                        int mask = convert_bitmask_x(0xffff);

+                        EORx_mask(wback, wback, (mask>>12)&1, mask&0x3F, (mask>>6)&0x3F);

+                    } else {

+                        GETEW(x1, 0);

+                        MVNw_REG(ed, ed);

+                        EWBACK;

+                    }

                     break;

                 case 3:

                     INST_NAME("NEG Ew");

diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index 403f1535..2da90d59 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -258,6 +258,9 @@
         ed = i;                                                                                                                 \
         wb1 = 1;                                                                                                                \
     }
+//Compute wback for MDREG only, no fetching
+#define CALCEW()                                                                                                                \
+    wback = TO_NAT((nextop & 7) + (rex.b << 3));                                                                                \
 //GETEW will use i for ed, and can use r3 for wback.
 #define GETEW(i, D)                                                                                                              \
     if (MODREG) {                                                                                                                \