about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-07 21:59:33 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-05-07 21:59:33 +0200
commitb74a1b5a3287907d123d05d7ddef1fa2dd7592e2 (patch)
tree0607681f41c8b079ca85a4c194488679fa69f0c1 /src
parent9f38e81735b10668d64974033b4bb5097219ee34 (diff)
downloadbox64-b74a1b5a3287907d123d05d7ddef1fa2dd7592e2.tar.gz
box64-b74a1b5a3287907d123d05d7ddef1fa2dd7592e2.zip
[ARM64_DYNAREC] Added 66 0F BA opcodes
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_660f.c57
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);