diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 12 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66.c | 12 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 3 |
3 files changed, 21 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 07b724e1..8f452ca9 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -3383,9 +3383,15 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: INST_NAME("NOT Eb"); - GETEB(x1, 0); - MVNw_REG(x1, x1); - EBBACK; + if(MODREG) { + CALCEB(); + int mask = convert_bitmask_x(0xff<<wb2); + EORx_mask(wback, wback, (mask>>12)&1, mask&0x3F, (mask>>6)&0x3F); + } else { + GETEB(x1, 0); + MVNw_REG(x1, x1); + EBBACK; + } break; case 3: INST_NAME("NEG Eb"); diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c index b1d66f1c..288691a3 100644 --- a/src/dynarec/arm64/dynarec_arm64_66.c +++ b/src/dynarec/arm64/dynarec_arm64_66.c @@ -1347,9 +1347,15 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: INST_NAME("NOT Ew"); - GETEW(x1, 0); - MVNw_REG(ed, ed); - EWBACK; + if(MODREG) { + CALCEW(); + int mask = convert_bitmask_x(0xffff); + EORx_mask(wback, wback, (mask>>12)&1, mask&0x3F, (mask>>6)&0x3F); + } else { + GETEW(x1, 0); + MVNw_REG(ed, ed); + EWBACK; + } break; case 3: INST_NAME("NEG Ew"); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index 403f1535..2da90d59 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -258,6 +258,9 @@ ed = i; \ wb1 = 1; \ } +//Compute wback for MDREG only, no fetching +#define CALCEW() \ + wback = TO_NAT((nextop & 7) + (rex.b << 3)); \ //GETEW will use i for ed, and can use r3 for wback. #define GETEW(i, D) \ if (MODREG) { \ |