target/arm: Implement SME2 SMOPS, UMOPS (2-way)
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20250704142112.1018902-29-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
24b5220f4c
commit
e129ceae82
4 changed files with 35 additions and 10 deletions
|
|
@ -156,3 +156,7 @@ DEF_HELPER_FLAGS_6(sme_usmopa_d, TCG_CALL_NO_RWG,
|
|||
|
||||
DEF_HELPER_FLAGS_6(sme2_bmopa_s, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_6(sme2_smopa2_s, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, ptr, i32)
|
||||
DEF_HELPER_FLAGS_6(sme2_umopa2_s, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, ptr, ptr, i32)
|
||||
|
|
|
|||
|
|
@ -167,3 +167,5 @@ USMOPA_d 1010000 1 11 0 ..... ... ... ..... . 0 ... @op_64
|
|||
UMOPA_d 1010000 1 11 1 ..... ... ... ..... . 0 ... @op_64
|
||||
|
||||
BMOPA 1000000 0 10 0 ..... ... ... ..... . 10 .. @op_32
|
||||
SMOPA2_s 1010000 0 10 0 ..... ... ... ..... . 10 .. @op_32
|
||||
UMOPA2_s 1010000 1 10 0 ..... ... ... ..... . 10 .. @op_32
|
||||
|
|
|
|||
|
|
@ -1261,7 +1261,7 @@ static inline void do_imopa_d(uint64_t *za, uint64_t *zn, uint64_t *zm,
|
|||
}
|
||||
}
|
||||
|
||||
#define DEF_IMOP_32(NAME, NTYPE, MTYPE) \
|
||||
#define DEF_IMOP_8x4_32(NAME, NTYPE, MTYPE) \
|
||||
static uint32_t NAME(uint32_t n, uint32_t m, uint32_t a, uint8_t p, bool neg) \
|
||||
{ \
|
||||
uint32_t sum = 0; \
|
||||
|
|
@ -1274,7 +1274,7 @@ static uint32_t NAME(uint32_t n, uint32_t m, uint32_t a, uint8_t p, bool neg) \
|
|||
return neg ? a - sum : a + sum; \
|
||||
}
|
||||
|
||||
#define DEF_IMOP_64(NAME, NTYPE, MTYPE) \
|
||||
#define DEF_IMOP_16x4_64(NAME, NTYPE, MTYPE) \
|
||||
static uint64_t NAME(uint64_t n, uint64_t m, uint64_t a, uint8_t p, bool neg) \
|
||||
{ \
|
||||
uint64_t sum = 0; \
|
||||
|
|
@ -1287,15 +1287,15 @@ static uint64_t NAME(uint64_t n, uint64_t m, uint64_t a, uint8_t p, bool neg) \
|
|||
return neg ? a - sum : a + sum; \
|
||||
}
|
||||
|
||||
DEF_IMOP_32(smopa_s, int8_t, int8_t)
|
||||
DEF_IMOP_32(umopa_s, uint8_t, uint8_t)
|
||||
DEF_IMOP_32(sumopa_s, int8_t, uint8_t)
|
||||
DEF_IMOP_32(usmopa_s, uint8_t, int8_t)
|
||||
DEF_IMOP_8x4_32(smopa_s, int8_t, int8_t)
|
||||
DEF_IMOP_8x4_32(umopa_s, uint8_t, uint8_t)
|
||||
DEF_IMOP_8x4_32(sumopa_s, int8_t, uint8_t)
|
||||
DEF_IMOP_8x4_32(usmopa_s, uint8_t, int8_t)
|
||||
|
||||
DEF_IMOP_64(smopa_d, int16_t, int16_t)
|
||||
DEF_IMOP_64(umopa_d, uint16_t, uint16_t)
|
||||
DEF_IMOP_64(sumopa_d, int16_t, uint16_t)
|
||||
DEF_IMOP_64(usmopa_d, uint16_t, int16_t)
|
||||
DEF_IMOP_16x4_64(smopa_d, int16_t, int16_t)
|
||||
DEF_IMOP_16x4_64(umopa_d, uint16_t, uint16_t)
|
||||
DEF_IMOP_16x4_64(sumopa_d, int16_t, uint16_t)
|
||||
DEF_IMOP_16x4_64(usmopa_d, uint16_t, int16_t)
|
||||
|
||||
#define DEF_IMOPH(P, NAME, S) \
|
||||
void HELPER(P##_##NAME##_##S)(void *vza, void *vzn, void *vzm, \
|
||||
|
|
@ -1325,3 +1325,20 @@ static uint32_t bmopa_s(uint32_t n, uint32_t m, uint32_t a, uint8_t p, bool neg)
|
|||
}
|
||||
|
||||
DEF_IMOPH(sme2, bmopa, s)
|
||||
|
||||
#define DEF_IMOP_16x2_32(NAME, NTYPE, MTYPE) \
|
||||
static uint32_t NAME(uint32_t n, uint32_t m, uint32_t a, uint8_t p, bool neg) \
|
||||
{ \
|
||||
uint32_t sum = 0; \
|
||||
/* Apply P to N as a mask, making the inactive elements 0. */ \
|
||||
n &= expand_pred_h(p); \
|
||||
sum += (NTYPE)(n >> 0) * (MTYPE)(m >> 0); \
|
||||
sum += (NTYPE)(n >> 16) * (MTYPE)(m >> 16); \
|
||||
return neg ? a - sum : a + sum; \
|
||||
}
|
||||
|
||||
DEF_IMOP_16x2_32(smopa2_s, int16_t, int16_t)
|
||||
DEF_IMOP_16x2_32(umopa2_s, uint16_t, uint16_t)
|
||||
|
||||
DEF_IMOPH(sme2, smopa2, s)
|
||||
DEF_IMOPH(sme2, umopa2, s)
|
||||
|
|
|
|||
|
|
@ -541,3 +541,5 @@ TRANS_FEAT(SUMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_sumop
|
|||
TRANS_FEAT(USMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_usmopa_d)
|
||||
|
||||
TRANS_FEAT(BMOPA, aa64_sme2, do_outprod, a, MO_32, gen_helper_sme2_bmopa_s)
|
||||
TRANS_FEAT(SMOPA2_s, aa64_sme2, do_outprod, a, MO_32, gen_helper_sme2_smopa2_s)
|
||||
TRANS_FEAT(UMOPA2_s, aa64_sme2, do_outprod, a, MO_32, gen_helper_sme2_umopa2_s)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue