diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 14:43:21 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-03 14:43:21 +0200 |
| commit | 0a8f049ceda923be41e6c527d15c80e6f2201148 (patch) | |
| tree | b232388eede8742e31f03dd9836273e24b97e3ef /src | |
| parent | 890809069ef083a8541f22d8b20cb137a111ccd7 (diff) | |
| download | box64-0a8f049ceda923be41e6c527d15c80e6f2201148.tar.gz box64-0a8f049ceda923be41e6c527d15c80e6f2201148.zip | |
[ARM64_DYNAREC] Added AVX.66.0F38 19/1A and AVX.66.0F3A 22 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c | 31 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c | 13 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c index 12c6e3da..781fbfbc 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c @@ -140,6 +140,37 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip VDUPQ_32(v0, v1, 0); } else YMM0(gd); break; + case 0x19: + INST_NAME("VBROADCASTSD Gx, Ex"); + nextop = F8; + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0); + v1 = fpu_get_scratch(dyn, ninst); + VLD64(v1, ed, fixedaddress); + } + GETGX_empty(v0); + VDUPQ_64(v0, v1, 0); + if(vex.l) { + GETGY_empty(v0, -1, -1, -1); + VDUPQ_64(v0, v1, 0); + } else YMM0(gd); + break; + case 0x1A: + INST_NAME("VBROADCASTF128 Gx, Ex"); + nextop = F8; + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + GETGX_empty(v0); + VMOVQ(v0, v1); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); + VLD128(v0, ed, fixedaddress); + } + GETGY_empty(v1, -1, -1, -1); + VMOVQ(v1, v0); + break; case 0x1C: INST_NAME("VPABSB Gx, Ex"); diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c index cacffe2f..73c40848 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c @@ -343,6 +343,19 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } YMM0(gd); break; + case 0x22: + INST_NAME("VINSERTD Gx, Vx, Ex, Ib"); + nextop = F8; + GETGX_empty_VX(v0, v2); + GETED(1); + u8 = F8; + if(v0!=v2) VMOVQ(v0, v2); + if(rex.w) + VMOVQDfrom(v0, u8&1, ed); + else + VMOVQSfrom(v0, u8&3, ed); + YMM0(gd); + break; case 0x44: INST_NAME("PCLMULQDQ Gx, Vx, Ex, Ib"); |