diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-11-24 18:19:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-24 11:19:36 +0100 |
| commit | 93fa5323c56f00a99388fbdbba273b58aa1923fe (patch) | |
| tree | 4cbb080aed5d37800ed6f26e47bc63424a4ae62a | |
| parent | b0c10c9ae5938302b2bb9c941ba2a15e15d61be0 (diff) | |
| download | box64-93fa5323c56f00a99388fbdbba273b58aa1923fe.tar.gz box64-93fa5323c56f00a99388fbdbba273b58aa1923fe.zip | |
[ARM64_DYNAREC] Generate corresponding hint instruction for PAUSE (#2063)
| -rw-r--r-- | src/dynarec/arm64/arm64_emitter.h | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 21 |
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: |