diff options
| author | wannacu <wannacu2049@gmail.com> | 2023-08-21 11:31:41 +0800 |
|---|---|---|
| committer | wannacu <wannacu2049@gmail.com> | 2023-08-21 11:47:09 +0800 |
| commit | cd0aad731adede316ea036692ef92669474c1256 (patch) | |
| tree | 0d63281601227510e012a9ec2cf5de86144acdf7 /src | |
| parent | 8e7afcc5fb6c320126c06bc46f7691fb2199634d (diff) | |
| download | box64-cd0aad731adede316ea036692ef92669474c1256.tar.gz box64-cd0aad731adede316ea036692ef92669474c1256.zip | |
[ARM64_DYNAREC] Added 0F F1/F3/F7 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 55 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 11 |
2 files changed, 56 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index e4aa3657..a3ef9ef7 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -1975,7 +1975,16 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin VEOR(q0, q0, q1); } break; - + case 0xF1: + INST_NAME("PSLLW Gm,Em"); + nextop = F8; + GETGM(d0); + GETEM(d1, 0); + v0 = fpu_get_scratch(dyn); + VMOVHto(x1, d1, 0); + VDUPH(v0, x1); + USHL_16(d0, d0, v0); + break; case 0xF2: INST_NAME("PSLLD Gm,Em"); nextop = F8; @@ -1987,6 +1996,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQXTN_32(v0, v0); // 2*q1 in 32bits now SSHL_32(d0, d0, v0); break; + case 0xF3: + INST_NAME("PSLLQ Gm,Em"); + nextop = F8; + GETGM(d0); + GETEM(d1, 0); + USHL_R_64(d0, d0, d1); + break; case 0xF4: INST_NAME("PMULUDQ Gx,Ex"); nextop = F8; @@ -2016,7 +2032,29 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin UADDLVQ_16(d1, d0); VMOVeD(q0, 0, d1, 0); break; - + case 0xF7: + INST_NAME("MASKMOVQ Gm, Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + d0 = fpu_get_scratch(dyn); + d1 = fpu_get_scratch(dyn); + USHR_64(d1, q1, 7); + MOV32w(x1, 1); + VDUPB(d0, x1); + VAND(d1, d1, d0); + MOV32w(x1, 0xff); + VDUPB(d0, x1); + VMUL_8(d0, d0, d1); // d0 = byte selection bitmask + VAND(d1, q0, d0); // d1 = masked Gm + LDx(x1, xRDI, 0); // x1 = [rdi] + VMOVQDto(x2, d0, 0); + MVNx_REG(x2, x2); + ANDx_REG(x1, x1, x2); // x1 = clear selected bytes + VMOVQDto(x2, d1, 0); + ORRx_REG(x1, x1, x2); + STx(x1, xRDI, 0); + break; case 0xF8: INST_NAME("PSUBB Gm, Em"); nextop = F8; @@ -2038,20 +2076,19 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETEM(v1, 0); VSUB_32(v0, v0, v1); break; - - case 0xFC: - INST_NAME("PADDB Gm, Em"); + case 0xFB: + INST_NAME("PSUBQ Gm, Em"); nextop = F8; GETGM(v0); GETEM(v1, 0); - VADD_8(v0, v0, v1); + SUB_64(v0, v0, v1); break; - case 0xFB: - INST_NAME("PSUBQ Gm, Em"); + case 0xFC: + INST_NAME("PADDB Gm, Em"); nextop = F8; GETGM(v0); GETEM(v1, 0); - SUB_64(v0, v0, v1); + VADD_8(v0, v0, v1); break; case 0xFD: INST_NAME("PADDW Gm, Em"); diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index 466220bc..a05b3596 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -1734,7 +1734,16 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) tmp32u += (GM->ub[i]>EM->ub[i])?(GM->ub[i] - EM->ub[i]):(EM->ub[i] - GM->ub[i]); GM->q = tmp32u; break; - + case 0xF7: /* MASKMOVQ Gm, Em */ + nextop = F8; + GETEM(0); + GETGM; + for (int i = 0; i < 8; i++) { + if (EM->ub[i] & 0x80) { + ((reg64_t*)(emu->regs[_DI].q[0]))->byte[i] = GM->ub[i]; + } + } + break; case 0xF8: /* PSUBB Gm,Em */ nextop = F8; GETEM(0); |