diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-28 21:43:01 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-28 21:43:01 +0200 |
| commit | 70b9bed51068603ccbef2788950f0ee26cb22bb9 (patch) | |
| tree | 98b26ded11cb1714fc7f3fb37d3a708a471773c2 /src | |
| parent | 37795375b6ded5559725f93a531851bc0ad5965b (diff) | |
| download | box64-70b9bed51068603ccbef2788950f0ee26cb22bb9.tar.gz box64-70b9bed51068603ccbef2788950f0ee26cb22bb9.zip | |
[DYNAREC] Added 0F 18 opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64_emitter.h | 18 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 31 |
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)"); |