mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
target/arm: Implement 128-bit ZIP, UZP, TRN
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210525010358.152808-80-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
12c563f683
commit
74b64b2562
4 changed files with 90 additions and 8 deletions
|
@ -3492,36 +3492,45 @@ void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
|
|||
*(TYPE *)(vd + H(2 * i + 0)) = *(TYPE *)(vn + H(i)); \
|
||||
*(TYPE *)(vd + H(2 * i + sizeof(TYPE))) = *(TYPE *)(vm + H(i)); \
|
||||
} \
|
||||
if (sizeof(TYPE) == 16 && unlikely(oprsz & 16)) { \
|
||||
memset(vd + oprsz - 16, 0, 16); \
|
||||
} \
|
||||
}
|
||||
|
||||
DO_ZIP(sve_zip_b, uint8_t, H1)
|
||||
DO_ZIP(sve_zip_h, uint16_t, H1_2)
|
||||
DO_ZIP(sve_zip_s, uint32_t, H1_4)
|
||||
DO_ZIP(sve_zip_d, uint64_t, )
|
||||
DO_ZIP(sve2_zip_q, Int128, )
|
||||
|
||||
#define DO_UZP(NAME, TYPE, H) \
|
||||
void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
|
||||
{ \
|
||||
intptr_t oprsz = simd_oprsz(desc); \
|
||||
intptr_t oprsz_2 = oprsz / 2; \
|
||||
intptr_t odd_ofs = simd_data(desc); \
|
||||
intptr_t i; \
|
||||
intptr_t i, p; \
|
||||
ARMVectorReg tmp_m; \
|
||||
if (unlikely((vm - vd) < (uintptr_t)oprsz)) { \
|
||||
vm = memcpy(&tmp_m, vm, oprsz); \
|
||||
} \
|
||||
for (i = 0; i < oprsz_2; i += sizeof(TYPE)) { \
|
||||
*(TYPE *)(vd + H(i)) = *(TYPE *)(vn + H(2 * i + odd_ofs)); \
|
||||
} \
|
||||
for (i = 0; i < oprsz_2; i += sizeof(TYPE)) { \
|
||||
*(TYPE *)(vd + H(oprsz_2 + i)) = *(TYPE *)(vm + H(2 * i + odd_ofs)); \
|
||||
} \
|
||||
i = 0, p = odd_ofs; \
|
||||
do { \
|
||||
*(TYPE *)(vd + H(i)) = *(TYPE *)(vn + H(p)); \
|
||||
i += sizeof(TYPE), p += 2 * sizeof(TYPE); \
|
||||
} while (p < oprsz); \
|
||||
p -= oprsz; \
|
||||
do { \
|
||||
*(TYPE *)(vd + H(i)) = *(TYPE *)(vm + H(p)); \
|
||||
i += sizeof(TYPE), p += 2 * sizeof(TYPE); \
|
||||
} while (p < oprsz); \
|
||||
tcg_debug_assert(i == oprsz); \
|
||||
}
|
||||
|
||||
DO_UZP(sve_uzp_b, uint8_t, H1)
|
||||
DO_UZP(sve_uzp_h, uint16_t, H1_2)
|
||||
DO_UZP(sve_uzp_s, uint32_t, H1_4)
|
||||
DO_UZP(sve_uzp_d, uint64_t, )
|
||||
DO_UZP(sve2_uzp_q, Int128, )
|
||||
|
||||
#define DO_TRN(NAME, TYPE, H) \
|
||||
void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
|
||||
|
@ -3535,12 +3544,16 @@ void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
|
|||
*(TYPE *)(vd + H(i + 0)) = ae; \
|
||||
*(TYPE *)(vd + H(i + sizeof(TYPE))) = be; \
|
||||
} \
|
||||
if (sizeof(TYPE) == 16 && unlikely(oprsz & 16)) { \
|
||||
memset(vd + oprsz - 16, 0, 16); \
|
||||
} \
|
||||
}
|
||||
|
||||
DO_TRN(sve_trn_b, uint8_t, H1)
|
||||
DO_TRN(sve_trn_h, uint16_t, H1_2)
|
||||
DO_TRN(sve_trn_s, uint32_t, H1_4)
|
||||
DO_TRN(sve_trn_d, uint64_t, )
|
||||
DO_TRN(sve2_trn_q, Int128, )
|
||||
|
||||
#undef DO_ZIP
|
||||
#undef DO_UZP
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue