mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
target/riscv: Refactor some of the generic vector functionality
Move some macros out of `vector_helper` and into `vector_internals`. This ensures they can be used by both vector and vector-crypto helpers (latter implemented in proceeding commits). Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Signed-off-by: Max Chou <max.chou@sifive.com> Message-ID: <20230711165917.2629866-8-max.chou@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
62cb3e8e88
commit
2152e48b50
2 changed files with 46 additions and 42 deletions
|
@ -121,12 +121,52 @@ void vext_set_elems_1s(void *base, uint32_t is_agnostic, uint32_t cnt,
|
|||
/* expand macro args before macro */
|
||||
#define RVVCALL(macro, ...) macro(__VA_ARGS__)
|
||||
|
||||
/* (TD, T2, TX2) */
|
||||
#define OP_UU_B uint8_t, uint8_t, uint8_t
|
||||
#define OP_UU_H uint16_t, uint16_t, uint16_t
|
||||
#define OP_UU_W uint32_t, uint32_t, uint32_t
|
||||
#define OP_UU_D uint64_t, uint64_t, uint64_t
|
||||
|
||||
/* (TD, T1, T2, TX1, TX2) */
|
||||
#define OP_UUU_B uint8_t, uint8_t, uint8_t, uint8_t, uint8_t
|
||||
#define OP_UUU_H uint16_t, uint16_t, uint16_t, uint16_t, uint16_t
|
||||
#define OP_UUU_W uint32_t, uint32_t, uint32_t, uint32_t, uint32_t
|
||||
#define OP_UUU_D uint64_t, uint64_t, uint64_t, uint64_t, uint64_t
|
||||
|
||||
#define OPIVV1(NAME, TD, T2, TX2, HD, HS2, OP) \
|
||||
static void do_##NAME(void *vd, void *vs2, int i) \
|
||||
{ \
|
||||
TX2 s2 = *((T2 *)vs2 + HS2(i)); \
|
||||
*((TD *)vd + HD(i)) = OP(s2); \
|
||||
}
|
||||
|
||||
#define GEN_VEXT_V(NAME, ESZ) \
|
||||
void HELPER(NAME)(void *vd, void *v0, void *vs2, \
|
||||
CPURISCVState *env, uint32_t desc) \
|
||||
{ \
|
||||
uint32_t vm = vext_vm(desc); \
|
||||
uint32_t vl = env->vl; \
|
||||
uint32_t total_elems = \
|
||||
vext_get_total_elems(env, desc, ESZ); \
|
||||
uint32_t vta = vext_vta(desc); \
|
||||
uint32_t vma = vext_vma(desc); \
|
||||
uint32_t i; \
|
||||
\
|
||||
for (i = env->vstart; i < vl; i++) { \
|
||||
if (!vm && !vext_elem_mask(v0, i)) { \
|
||||
/* set masked-off elements to 1s */ \
|
||||
vext_set_elems_1s(vd, vma, i * ESZ, \
|
||||
(i + 1) * ESZ); \
|
||||
continue; \
|
||||
} \
|
||||
do_##NAME(vd, vs2, i); \
|
||||
} \
|
||||
env->vstart = 0; \
|
||||
/* set tail elements to 1s */ \
|
||||
vext_set_elems_1s(vd, vta, vl * ESZ, \
|
||||
total_elems * ESZ); \
|
||||
}
|
||||
|
||||
/* operation of two vector elements */
|
||||
typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
|
||||
|
||||
|
@ -179,4 +219,10 @@ void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
|
|||
do_##NAME, ESZ); \
|
||||
}
|
||||
|
||||
/* Three of the widening shortening macros: */
|
||||
/* (TD, T1, T2, TX1, TX2) */
|
||||
#define WOP_UUU_B uint16_t, uint8_t, uint8_t, uint16_t, uint16_t
|
||||
#define WOP_UUU_H uint32_t, uint16_t, uint16_t, uint32_t, uint32_t
|
||||
#define WOP_UUU_W uint64_t, uint32_t, uint32_t, uint64_t, uint64_t
|
||||
|
||||
#endif /* TARGET_RISCV_VECTOR_INTERNALS_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue