about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-11-25 03:04:01 +0800
committerGitHub <noreply@github.com>2024-11-24 20:04:01 +0100
commit2d04cbe97c8dca2805cf7e2c204dcbf2010450dd (patch)
tree19a9027759a52940a916a63bbbc96bac5d4803aa
parentab654220349a7f3a8e7e69d5f4bcec173aceb85b (diff)
downloadbox64-2d04cbe97c8dca2805cf7e2c204dcbf2010450dd.tar.gz
box64-2d04cbe97c8dca2805cf7e2c204dcbf2010450dd.zip
[ARM64_DYNAREC] Use YIELD instead of WFE (#2066)
-rw-r--r--src/dynarec/arm64/arm64_emitter.h2
-rw-r--r--src/dynarec/arm64/arm64_printer.c12
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c2
3 files changed, 15 insertions, 1 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h
index 562f3f0b..168f26e0 100644
--- a/src/dynarec/arm64/arm64_emitter.h
+++ b/src/dynarec/arm64/arm64_emitter.h
@@ -541,6 +541,8 @@ int convert_bitmask(uint64_t bitmask);
 
 #define NOP                             EMIT(0b11010101000000110010000000011111)
 #define WFE                             EMIT(0b11010101000000110010000001011111)
+#define WFI                             EMIT(0b11010101000000110010000001111111)
+#define YIELD                           EMIT(0b11010101000000110010000000111111)
 
 #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/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c
index 48b67e0c..4b797a3c 100644
--- a/src/dynarec/arm64/arm64_printer.c
+++ b/src/dynarec/arm64/arm64_printer.c
@@ -124,6 +124,18 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
         snprintf(buff, sizeof(buff), "NOP");

         return buff;

     }

+    if(isMask(opcode, "11010101000000110010000001011111", &a)) {

+        snprintf(buff, sizeof(buff), "WFE");

+        return buff;

+    }

+    if(isMask(opcode, "11010101000000110010000001111111", &a)) {

+        snprintf(buff, sizeof(buff), "WFI");

+        return buff;

+    }

+    if(isMask(opcode, "11010101000000110010000000111111", &a)) {

+        snprintf(buff, sizeof(buff), "YIELD");

+        return buff;

+    }

     // --- LDR / STR

     if(isMask(opcode, "f010100011iiiiiii22222nnnnnttttt", &a)) {

         int offset = signExtend(imm, 7)<<(2+sf);

diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 3380911c..5141a598 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1427,7 +1427,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             if(gd==xRAX) {
                 if (rep == 2) {
                     INST_NAME("PAUSE");
-                    WFE;
+                    YIELD;
                 } else {
                     INST_NAME("NOP");
                 }