about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/dynarec/arm64/arm64_emitter.h1
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c21
2 files changed, 13 insertions, 9 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h
index 51bcaced..562f3f0b 100644
--- a/src/dynarec/arm64/arm64_emitter.h
+++ b/src/dynarec/arm64/arm64_emitter.h
@@ -540,6 +540,7 @@ int convert_bitmask(uint64_t bitmask);
 #define BL(imm26)                       EMIT(BL_gen(((imm26)>>2)&0x3ffffff))
 
 #define NOP                             EMIT(0b11010101000000110010000000011111)
+#define WFE                             EMIT(0b11010101000000110010000001011111)
 
 #define CSINC_gen(sf, Rm, cond, Rn, Rd)     ((sf)<<31 | 0b11010100<<21 | (Rm)<<16 | (cond)<<12 | 1<<10 | (Rn)<<5 | (Rd))
 #define CSINCx(Rd, Rn, Rm, cond)            EMIT(CSINC_gen(1, Rm, cond, Rn, Rd))
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 2e7dec88..eed47b7a 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1416,6 +1416,13 @@ 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:
@@ -1423,15 +1430,11 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x95:
         case 0x96:
         case 0x97:
-            gd = xRAX+(opcode&0x07)+(rex.b<<3);
-            if(gd==xRAX) {
-                INST_NAME("NOP");
-            } else {
-                INST_NAME("XCHG EAX, Reg");
-                MOVxw_REG(x2, xRAX);
-                MOVxw_REG(xRAX, gd);
-                MOVxw_REG(gd, x2);
-            }
+            INST_NAME("XCHG EAX, Reg");
+            gd = xRAX + (opcode & 0x07) + (rex.b << 3);
+            MOVxw_REG(x2, xRAX);
+            MOVxw_REG(xRAX, gd);
+            MOVxw_REG(gd, x2);
             break;
 
         case 0x98: