diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-18 18:48:42 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-18 18:48:42 +0100 |
| commit | f5a7e639360032fa6958fd405635eb84aa937f5b (patch) | |
| tree | 27f53c828dc9b350929f655976ff760bde7138d0 /src | |
| parent | 13da8f0d758c9f784a6e19887e7d1b7cf7537633 (diff) | |
| download | box64-f5a7e639360032fa6958fd405635eb84aa937f5b.tar.gz box64-f5a7e639360032fa6958fd405635eb84aa937f5b.zip | |
[DYNAREC] Added 0F BB BTC opcode
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64_emitter.h | 7 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 30 |
2 files changed, 34 insertions, 3 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h index 89b32c0c..746135fc 100755 --- a/src/dynarec/arm64_emitter.h +++ b/src/dynarec/arm64_emitter.h @@ -341,11 +341,12 @@ #define UBFMw(Rd, Rn, immr, imms) EMIT(UBFM_gen(0, 0, immr, imms, Rn, Rd)) #define UBFMxw(Rd, Rn, immr, imms) EMIT(UBFM_gen(rex.w, rex.w, immr, imms, Rn, Rd)) #define UBFXx(Rd, Rn, lsb, width) EMIT(UBFM_gen(1, 1, (lsb), (lsb)+(width)-1, Rn, Rd)) -#define UBFXw(Rd, Rn, lsb, width) EMIT(UBFM_gen(0, 1, (lsb), (lsb)+(width)-1, Rn, Rd)) +#define UBFXw(Rd, Rn, lsb, width) EMIT(UBFM_gen(0, 0, (lsb), (lsb)+(width)-1, Rn, Rd)) +#define UBFXxw(Rd, Rn, lsb, width) EMIT(UBFM_gen(rex.w, rex.w, (lsb), (lsb)+(width)-1, Rn, Rd)) #define UXTBx(Rd, Rn) EMIT(UBFM_gen(1, 1, 0, 7, Rn, Rd)) -#define UXTBw(Rd, Rn) EMIT(UBFM_gen(0, 1, 0, 7, Rn, Rd)) +#define UXTBw(Rd, Rn) EMIT(UBFM_gen(0, 0, 0, 7, Rn, Rd)) #define UXTHx(Rd, Rn) EMIT(UBFM_gen(1, 1, 0, 15, Rn, Rd)) -#define UXTHw(Rd, Rn) EMIT(UBFM_gen(0, 1, 0, 15, Rn, Rd)) +#define UXTHw(Rd, Rn) EMIT(UBFM_gen(0, 0, 0, 15, Rn, Rd)) #define LSRx(Rd, Rn, shift) EMIT(UBFM_gen(1, 1, shift, 63, Rn, Rd)) #define LSRw(Rd, Rn, shift) EMIT(UBFM_gen(0, 0, shift, 31, Rn, Rd)) #define LSRxw(Rd, Rn, shift) EMIT(UBFM_gen(rex.w, rex.w, shift, (rex.w)?63:31, Rn, Rd)) diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c index 62226161..98969880 100755 --- a/src/dynarec/dynarec_arm64_0f.c +++ b/src/dynarec/dynarec_arm64_0f.c @@ -89,6 +89,36 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FAKEED; break; + case 0xBB: + INST_NAME("BTC Ed, Gd"); + SETFLAGS(X_CF, SF_SET); + nextop = F8; + GETGD; + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + wback = 0; + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, 0, 0); + UBFXw(x1, gd, 5+rex.w, 3-rex.w); // r1 = (gd>>5); + ADDx_REG_LSL(x3, wback, x1, 2); //(&ed)+=r1*4; + LDRxw_U12(x1, x3, fixedaddress); + ed = x1; + wback = x3; + } + if(rex.w) { + ANDx_mask(x2, gd, 1, 0, 0b00101); //mask=0x000000000000003f + } else { + ANDw_mask(x2, gd, 0, 0b00100); //mask=0x00000001f + } + LSRxw_REG(x4, ed, x2); + BFIw(xFlags, x4, F_CF, 1); + MOV32w(x4, 1); + LSLxw_REG(x4, x4, x2); + EORxw_REG(ed, ed, x4); + if(wback) { + STRxw_U12(ed, wback, fixedaddress); + } + break; default: DEFAULT; |