diff options
| -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: |