target/arm: Implement MVE VPSEL
Implement the MVE VPSEL insn, which sets each byte of the destination vector Qd to the byte from either Qn or Qm depending on the value of the corresponding bit in VPR.P0. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
cce81873bc
commit
c386443b16
@ -82,6 +82,8 @@ DEF_HELPER_FLAGS_4(mve_vorr, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
|||||||
DEF_HELPER_FLAGS_4(mve_vorn, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(mve_vorn, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
||||||
DEF_HELPER_FLAGS_4(mve_veor, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(mve_veor, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
||||||
|
|
||||||
|
DEF_HELPER_FLAGS_4(mve_vpsel, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_4(mve_vaddb, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(mve_vaddb, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
||||||
DEF_HELPER_FLAGS_4(mve_vaddh, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(mve_vaddh, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
||||||
DEF_HELPER_FLAGS_4(mve_vaddw, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(mve_vaddw, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
|
||||||
|
@ -468,8 +468,11 @@ VSHLC 111 0 1110 1 . 1 imm:5 ... 0 1111 1100 rdm:4 qd=%qd
|
|||||||
# effectively "VCMP then VPST". A plain "VCMP" has a mask field of zero.
|
# effectively "VCMP then VPST". A plain "VCMP" has a mask field of zero.
|
||||||
VCMPEQ 1111 1110 0 . .. ... 1 ... 0 1111 0 0 . 0 ... 0 @vcmp
|
VCMPEQ 1111 1110 0 . .. ... 1 ... 0 1111 0 0 . 0 ... 0 @vcmp
|
||||||
VCMPNE 1111 1110 0 . .. ... 1 ... 0 1111 1 0 . 0 ... 0 @vcmp
|
VCMPNE 1111 1110 0 . .. ... 1 ... 0 1111 1 0 . 0 ... 0 @vcmp
|
||||||
|
{
|
||||||
|
VPSEL 1111 1110 0 . 11 ... 1 ... 0 1111 . 0 . 0 ... 1 @2op_nosz
|
||||||
VCMPCS 1111 1110 0 . .. ... 1 ... 0 1111 0 0 . 0 ... 1 @vcmp
|
VCMPCS 1111 1110 0 . .. ... 1 ... 0 1111 0 0 . 0 ... 1 @vcmp
|
||||||
VCMPHI 1111 1110 0 . .. ... 1 ... 0 1111 1 0 . 0 ... 1 @vcmp
|
VCMPHI 1111 1110 0 . .. ... 1 ... 0 1111 1 0 . 0 ... 1 @vcmp
|
||||||
|
}
|
||||||
VCMPGE 1111 1110 0 . .. ... 1 ... 1 1111 0 0 . 0 ... 0 @vcmp
|
VCMPGE 1111 1110 0 . .. ... 1 ... 1 1111 0 0 . 0 ... 0 @vcmp
|
||||||
VCMPLT 1111 1110 0 . .. ... 1 ... 1 1111 1 0 . 0 ... 0 @vcmp
|
VCMPLT 1111 1110 0 . .. ... 1 ... 1 1111 1 0 . 0 ... 0 @vcmp
|
||||||
VCMPGT 1111 1110 0 . .. ... 1 ... 1 1111 0 0 . 0 ... 1 @vcmp
|
VCMPGT 1111 1110 0 . .. ... 1 ... 1 1111 0 0 . 0 ... 1 @vcmp
|
||||||
|
@ -1842,3 +1842,22 @@ DO_VCMP_S(vcmpge, DO_GE)
|
|||||||
DO_VCMP_S(vcmplt, DO_LT)
|
DO_VCMP_S(vcmplt, DO_LT)
|
||||||
DO_VCMP_S(vcmpgt, DO_GT)
|
DO_VCMP_S(vcmpgt, DO_GT)
|
||||||
DO_VCMP_S(vcmple, DO_LE)
|
DO_VCMP_S(vcmple, DO_LE)
|
||||||
|
|
||||||
|
void HELPER(mve_vpsel)(CPUARMState *env, void *vd, void *vn, void *vm)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Qd[n] = VPR.P0[n] ? Qn[n] : Qm[n]
|
||||||
|
* but note that whether bytes are written to Qd is still subject
|
||||||
|
* to (all forms of) predication in the usual way.
|
||||||
|
*/
|
||||||
|
uint64_t *d = vd, *n = vn, *m = vm;
|
||||||
|
uint16_t mask = mve_element_mask(env);
|
||||||
|
uint16_t p0 = FIELD_EX32(env->v7m.vpr, V7M_VPR, P0);
|
||||||
|
unsigned e;
|
||||||
|
for (e = 0; e < 16 / 8; e++, mask >>= 8, p0 >>= 8) {
|
||||||
|
uint64_t r = m[H8(e)];
|
||||||
|
mergemask(&r, n[H8(e)], p0);
|
||||||
|
mergemask(&d[H8(e)], r, mask);
|
||||||
|
}
|
||||||
|
mve_advance_vpt(env);
|
||||||
|
}
|
||||||
|
@ -376,6 +376,8 @@ DO_LOGIC(VORR, gen_helper_mve_vorr)
|
|||||||
DO_LOGIC(VORN, gen_helper_mve_vorn)
|
DO_LOGIC(VORN, gen_helper_mve_vorn)
|
||||||
DO_LOGIC(VEOR, gen_helper_mve_veor)
|
DO_LOGIC(VEOR, gen_helper_mve_veor)
|
||||||
|
|
||||||
|
DO_LOGIC(VPSEL, gen_helper_mve_vpsel)
|
||||||
|
|
||||||
#define DO_2OP(INSN, FN) \
|
#define DO_2OP(INSN, FN) \
|
||||||
static bool trans_##INSN(DisasContext *s, arg_2op *a) \
|
static bool trans_##INSN(DisasContext *s, arg_2op *a) \
|
||||||
{ \
|
{ \
|
||||||
|
Loading…
Reference in New Issue
Block a user