about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-24 15:28:21 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-24 15:28:21 +0100
commit73b17d4add139ecb590781042f55c98331aced5b (patch)
tree9a5b2da931bb7ff3edd08d98ba43fc34fc1f2403 /src
parent93fa5323c56f00a99388fbdbba273b58aa1923fe (diff)
downloadbox64-73b17d4add139ecb590781042f55c98331aced5b.tar.gz
box64-73b17d4add139ecb590781042f55c98331aced5b.zip
[ARM64_DYNAREC] Fix a regression, as 90 opcode is not always NOP depending on REX (should help #2064)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index eed47b7a..3380911c 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1416,13 +1416,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             }
             break;
         case 0x90:
-            if (rep == 2) {
-                INST_NAME("PAUSE");
-                WFE;
-            } else {
-                INST_NAME("NOP");
-            }
-            break;
         case 0x91:
         case 0x92:
         case 0x93:
@@ -1430,11 +1423,20 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x95:
         case 0x96:
         case 0x97:
-            INST_NAME("XCHG EAX, Reg");
-            gd = xRAX + (opcode & 0x07) + (rex.b << 3);
-            MOVxw_REG(x2, xRAX);
-            MOVxw_REG(xRAX, gd);
-            MOVxw_REG(gd, x2);
+            gd = xRAX+(opcode&0x07)+(rex.b<<3);
+            if(gd==xRAX) {
+                if (rep == 2) {
+                    INST_NAME("PAUSE");
+                    WFE;
+                } else {
+                    INST_NAME("NOP");
+                }
+            } else {
+                INST_NAME("XCHG EAX, Reg");
+                MOVxw_REG(x2, xRAX);
+                MOVxw_REG(xRAX, gd);
+                MOVxw_REG(gd, x2);
+            }
             break;
 
         case 0x98: