diff options
| author | wannacu <wannacu2049@gmail.com> | 2023-09-04 11:32:45 +0800 |
|---|---|---|
| committer | wannacu <wannacu2049@gmail.com> | 2023-09-04 16:43:28 +0800 |
| commit | 90a7602e5ad469b0a83f933614cd1c6871f5622a (patch) | |
| tree | 0b3ce1c71ff85a23eb22d62331a6436b2351c7e3 /src | |
| parent | 1e0b8e443bd466ce668181dbfbca97cfe553a5a8 (diff) | |
| download | box64-90a7602e5ad469b0a83f933614cd1c6871f5622a.tar.gz box64-90a7602e5ad469b0a83f933614cd1c6871f5622a.zip | |
[ARM64_DYNAREC] Added 66 0F 7D/D0 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_660f.c | 21 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f20f.c | 17 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 85699ba6..20d71349 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -1836,7 +1836,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VORRQ(q1, q1, v1); // NAN -> -NAN } break; - + case 0x7D: + INST_NAME("HSUBPD Gx, Ex"); // SSE4 opcode! + nextop = F8; + GETEX(q1, 0, 0); + GETGX(q0, 1); + v0 = fpu_get_scratch(dyn); + VUZP1Q_64(v0, q0, q1); + VUZP2Q_64(q0, q0, q1); + VFSUBQD(q0, v0, q0); + break; case 0x7E: INST_NAME("MOVD Ed,Gx"); nextop = F8; @@ -2306,6 +2315,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VDUPQ_16(v0, v0, 0); // only the low 8bits will be used anyway USHLQ_16(q0, q0, v0); // SHR x8 break; + case 0xD0: + INST_NAME("ADDSUBPD Gx,Ex"); + nextop = F8; + GETGX(q0, 1); + GETEX(q1, 0, 0); + v0 = fpu_get_scratch(dyn); + VFSUBQD(v0, q0, q1); + VFADDQD(q0, q0, q1); + VMOVeD(q0, 0, v0, 0); + break; case 0xD2: INST_NAME("PSRLD Gx,Ex"); nextop = F8; diff --git a/src/dynarec/arm64/dynarec_arm64_f20f.c b/src/dynarec/arm64/dynarec_arm64_f20f.c index c2d8a46e..99edd187 100644 --- a/src/dynarec/arm64/dynarec_arm64_f20f.c +++ b/src/dynarec/arm64/dynarec_arm64_f20f.c @@ -376,7 +376,22 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n } VFADDPQS(v0, v0, v1); break; - + case 0x7D: + INST_NAME("HSUBPS Gx, Ex"); + nextop = F8; + GETGX(v0, 1); + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); + v1 = fpu_get_scratch(dyn); + VLD128(v1, ed, fixedaddress); + } + d0 = fpu_get_scratch(dyn); + VUZP1Q_32(d0, v0, v1); + VUZP2Q_32(v0, v0, v1); + VFSUBQS(v0, d0, v0); + break; case 0xC2: INST_NAME("CMPSD Gx, Ex, Ib"); nextop = F8; |