about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-28 21:43:01 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-03-28 21:43:01 +0200
commit70b9bed51068603ccbef2788950f0ee26cb22bb9 (patch)
tree98b26ded11cb1714fc7f3fb37d3a708a471773c2 /src
parent37795375b6ded5559725f93a531851bc0ad5965b (diff)
downloadbox64-70b9bed51068603ccbef2788950f0ee26cb22bb9.tar.gz
box64-70b9bed51068603ccbef2788950f0ee26cb22bb9.zip
[DYNAREC] Added 0F 18 opcodes
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64_emitter.h18
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c31
2 files changed, 49 insertions, 0 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h
index 5ff959e9..041dbe5d 100755
--- a/src/dynarec/arm64_emitter.h
+++ b/src/dynarec/arm64_emitter.h
@@ -327,6 +327,24 @@
 #define LDXRxw(Rt, Rn)                  EMIT(MEMX_gen(2+rex.w, 1, 31, Rn, Rt))
 #define STXRxw(Rs, Rt, Rn)              EMIT(MEMX_gen(2+rex.w, 0, Rs, Rn, Rt))
 
+// Prefetch
+#define PRFM_register(Rm, option, S, Rn, Rt)    (0b11<<30 | 0b111<<27 | 0b10<<22 | 1<<21 | (Rm)<<16 | (option)<<13 | (S)<<12 | 0b10<<10 | (Rn)<<5 | (Rt))
+#define PLD_L1_KEEP(Rn, Rm)             EMIT(PRFM_register(Rm, 0b011, 0, Rn, 0b00000))
+#define PLD_L2_KEEP(Rn, Rm)             EMIT(PRFM_register(Rm, 0b011, 0, Rn, 0b00010))
+#define PLD_L3_KEEP(Rn, Rm)             EMIT(PRFM_register(Rm, 0b011, 0, Rn, 0b00100))
+#define PLD_L1_STREAM(Rn, Rm)           EMIT(PRFM_register(Rm, 0b011, 0, Rn, 0b00001))
+#define PLD_L2_STREAM(Rn, Rm)           EMIT(PRFM_register(Rm, 0b011, 0, Rn, 0b00011))
+#define PLD_L3_STREAM(Rn, Rm)           EMIT(PRFM_register(Rm, 0b011, 0, Rn, 0b00101))
+
+#define PRFM_imm(imm12, Rn, Rt)         (0b11<<30 | 0b111<<27 | 0b01<<24 | 0b10<<2 | (imm12)<<10 | (Rn)<<5 | (Rt))
+#define PLD_L1_KEEP_U12(Rn, imm12)      EMIT(PRFM_register(((imm12)>>3)&0xfff, Rn, 0b00000))
+#define PLD_L2_KEEP_U12(Rn, imm12)      EMIT(PRFM_register(((imm12)>>3)&0xfff, Rn, 0b00010))
+#define PLD_L3_KEEP_U12(Rn, imm12)      EMIT(PRFM_register(((imm12)>>3)&0xfff, Rn, 0b00100))
+#define PLD_L1_KEEP_STREAM(Rn, imm12)   EMIT(PRFM_register(((imm12)>>3)&0xfff, Rn, 0b00001))
+#define PLD_L2_KEEP_STREAM(Rn, imm12)   EMIT(PRFM_register(((imm12)>>3)&0xfff, Rn, 0b00011))
+#define PLD_L3_KEEP_STREAM(Rn, imm12)   EMIT(PRFM_register(((imm12)>>3)&0xfff, Rn, 0b00101))
+
+
 // BR and Branches
 #define BR_gen(Z, op, A, M, Rn, Rm)       (0b1101011<<25 | (Z)<<24 | (op)<<21 | 0b11111<<16 | (A)<<11 | (M)<<10 | (Rn)<<5 | (Rm))
 #define BR(Rn)                            EMIT(BR_gen(0, 0b00, 0, 0, Rn, 0))
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index d9857d42..ac79c047 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -192,6 +192,37 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 VST1_64(v0, 1, ed);

             }

             break;

+        case 0x18:

+            nextop = F8;

+            if((nextop&0xC0)==0xC0) {

+                INST_NAME("NOP (multibyte)");

+            } else

+            switch((nextop>>3)&7) {

+                case 0:

+                    INST_NAME("PREFETCHh Ed");

+                    addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff, 7, rex, 0, 0);

+                    PLD_L1_STREAM(ed, fixedaddress);

+                    break;

+                case 1:

+                    INST_NAME("PREFETCHh Ed");

+                    addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff, 7, rex, 0, 0);

+                    PLD_L1_KEEP(ed, fixedaddress);

+                    break;

+                case 2:

+                    INST_NAME("PREFETCHh Ed");

+                    addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff, 7, rex, 0, 0);

+                    PLD_L2_KEEP(ed, fixedaddress);

+                    break;

+                case 3:

+                    INST_NAME("PREFETCHh Ed");

+                    addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff, 7, rex, 0, 0);

+                    PLD_L3_KEEP(ed, fixedaddress);

+                    break;

+                default:

+                    INST_NAME("NOP (multibyte)");

+                    FAKEED;

+                }

+            break;

 

         case 0x1F:

             INST_NAME("NOP (multibyte)");