about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-18 18:48:42 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-18 18:48:42 +0100
commitf5a7e639360032fa6958fd405635eb84aa937f5b (patch)
tree27f53c828dc9b350929f655976ff760bde7138d0 /src
parent13da8f0d758c9f784a6e19887e7d1b7cf7537633 (diff)
downloadbox64-f5a7e639360032fa6958fd405635eb84aa937f5b.tar.gz
box64-f5a7e639360032fa6958fd405635eb84aa937f5b.zip
[DYNAREC] Added 0F BB BTC opcode
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64_emitter.h7
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c30
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;