diff options
| author | ptitSeb <seebastien.chev@gmail.com> | 2023-08-15 14:43:32 +0200 |
|---|---|---|
| committer | ptitSeb <seebastien.chev@gmail.com> | 2023-08-15 14:43:32 +0200 |
| commit | 53a59f593eef9e1bfe84582ad0a589b5e9aec1c2 (patch) | |
| tree | 4473c1284553fe37fefca2e4117517cdba0c9e0e /src | |
| parent | d6216707351353bb74a6d323da27e7351151243c (diff) | |
| download | box64-53a59f593eef9e1bfe84582ad0a589b5e9aec1c2.tar.gz box64-53a59f593eef9e1bfe84582ad0a589b5e9aec1c2.zip | |
Fixed AD opcode (for #924, probably other too)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/arm64_emitter.h | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 18 |
2 files changed, 11 insertions, 13 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h index 8d1c28a6..02ba2097 100644 --- a/src/dynarec/arm64/arm64_emitter.h +++ b/src/dynarec/arm64/arm64_emitter.h @@ -490,9 +490,9 @@ #define CSNEGx(Rd, Rn, Rm, cond) EMIT(CSNEG_gen(1, Rm, cond, Rn, Rd)) #define CSNEGw(Rd, Rn, Rm, cond) EMIT(CSNEG_gen(0, Rm, cond, Rn, Rd)) #define CSNEGxw(Rd, Rn, Rm, cond) EMIT(CSNEG_gen(rex.w, Rm, cond, Rn, Rd)) -#define CNEGx(Rd, Rn, cond) CSNEGx(Rn, Rn, Rn, invCond(cond)) -#define CNEGw(Rd, Rn, cond) CSNEGw(Rn, Rn, Rn, invCond(cond)) -#define CNEGxw(Rd, Rn, cond) CSNEGxw(Rn, Rn, Rn, invCond(cond)) +#define CNEGx(Rd, Rn, cond) CSNEGx(Rn, Rn, Rd, invCond(cond)) +#define CNEGw(Rd, Rn, cond) CSNEGw(Rn, Rn, Rd, invCond(cond)) +#define CNEGxw(Rd, Rn, cond) CSNEGxw(Rn, Rn, Rd, invCond(cond)) // AND / ORR #define LOGIC_gen(sf, opc, N, immr, imms, Rn, Rd) ((sf)<<31 | (opc)<<29 | 0b100100<<23 | (N)<<22 | (immr)<<16 | (imms)<<10 | (Rn)<<5 | Rd) diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 79683a30..5c718b8d 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1552,19 +1552,17 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { INST_NAME("LODSD"); } - LDRxw_U12(xRAX, xRSI, 0); - BFIw(x2, xFlags, F_DF, 1); - if(rex.w) { - MOV32w(x1, 8); - } else { - MOV32w(x1, 4); - } - EORxw_REG_LSL(x1, x1, x2, rex.w?63:31); + GETDIR(x1, rex.w?8:4); if(rep) { - MULxw(x1, x1, xRCX); - EORw_REG(xRCX, xRCX, xRCX); + CBZx_NEXT(xRCX); + MARK; } + LDRxw_U12(xRAX, xRSI, 0); ADDx_REG(xRSI, xRSI, x1); + if(rep) { + ADDx_U12(xRCX, xRCX, 1); + CBNZx_MARK(xRCX); + } break; case 0xAE: switch(rep) { |