diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-07 21:59:33 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-07 21:59:33 +0200 |
| commit | b74a1b5a3287907d123d05d7ddef1fa2dd7592e2 (patch) | |
| tree | 0607681f41c8b079ca85a4c194488679fa69f0c1 /src | |
| parent | 9f38e81735b10668d64974033b4bb5097219ee34 (diff) | |
| download | box64-b74a1b5a3287907d123d05d7ddef1fa2dd7592e2.tar.gz box64-b74a1b5a3287907d123d05d7ddef1fa2dd7592e2.zip | |
[ARM64_DYNAREC] Added 66 0F BA opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_660f.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 8e6ebe28..243bd288 100755 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -1917,6 +1917,63 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n break; + case 0xBA: + nextop = F8; + switch((nextop>>3)&7) { + case 4: + INST_NAME("BT Ew, Ib"); + SETFLAGS(X_CF, SF_SUBSET); + SET_DFNONE(x1); + gd = x2; + GETEW(x1, 1); + u8 = F8; + u8&=rex.w?0x3f:0x0f; + BFXILxw(xFlags, ed, u8, 1); // inject 1 bit from u8 to F_CF (i.e. pos 0) + break; + case 5: + INST_NAME("BTS Ew, Ib"); + SETFLAGS(X_CF, SF_SUBSET); + SET_DFNONE(x1); + GETEW(x1, 1); + u8 = F8; + u8&=(rex.w?0x3f:0x0f); + BFXILxw(xFlags, ed, u8, 1); // inject 1 bit from u8 to F_CF (i.e. pos 0) + TBNZ_MARK3(xFlags, 0); // bit already set, jump to next instruction + MOV32w(x4, 1); + EORxw_REG_LSL(ed, ed, x4, u8); + EWBACK(x1); + MARK3; + break; + case 6: + INST_NAME("BTR Ew, Ib"); + SETFLAGS(X_CF, SF_SUBSET); + SET_DFNONE(x1); + GETEW(x1, 1); + u8 = F8; + u8&=(rex.w?0x3f:0x0f); + BFXILxw(xFlags, ed, u8, 1); // inject 1 bit from u8 to F_CF (i.e. pos 0) + TBZ_MARK3(xFlags, 0); // bit already clear, jump to next instruction + MOV32w(x4, 1); + EORxw_REG_LSL(ed, ed, x4, u8); + EWBACK(x1); + MARK3; + break; + case 7: + INST_NAME("BTC Ew, Ib"); + SETFLAGS(X_CF, SF_SUBSET); + SET_DFNONE(x1); + GETEW(x1, 1); + u8 = F8; + u8&=(rex.w?0x3f:0x0f); + BFXILxw(xFlags, ed, u8, 1); // inject 1 bit from u8 to F_CF (i.e. pos 0) + MOV32w(x4, 1); + EORxw_REG_LSL(ed, ed, x4, u8); + EWBACK(x1); + break; + default: + DEFAULT; + } + break; case 0xBB: INST_NAME("BTC Ew, Gw"); SETFLAGS(X_CF, SF_SUBSET); |