diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-11-25 03:04:01 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-24 20:04:01 +0100 |
| commit | 2d04cbe97c8dca2805cf7e2c204dcbf2010450dd (patch) | |
| tree | 19a9027759a52940a916a63bbbc96bac5d4803aa | |
| parent | ab654220349a7f3a8e7e69d5f4bcec173aceb85b (diff) | |
| download | box64-2d04cbe97c8dca2805cf7e2c204dcbf2010450dd.tar.gz box64-2d04cbe97c8dca2805cf7e2c204dcbf2010450dd.zip | |
[ARM64_DYNAREC] Use YIELD instead of WFE (#2066)
| -rw-r--r-- | src/dynarec/arm64/arm64_emitter.h | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/arm64_printer.c | 12 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 2 |
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"); } |