target/arm: Implement MVE VPNOT

Implement the MVE VPNOT insn, which inverts the bits in VPR.P0
(subject to both predication and to beatwise execution).

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
master
Peter Maydell 2021-08-13 17:11:56 +01:00
parent 1241f148d5
commit fea3958fa1
4 changed files with 38 additions and 0 deletions

View File

@ -119,6 +119,7 @@ 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_vpsel, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr)
DEF_HELPER_FLAGS_1(mve_vpnot, TCG_CALL_NO_WG, void, env)
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)

View File

@ -571,6 +571,7 @@ VCMPGT 1111 1110 0 . .. ... 1 ... 1 1111 0 0 . 0 ... 1 @vcmp
VCMPLE 1111 1110 0 . .. ... 1 ... 1 1111 1 0 . 0 ... 1 @vcmp
{
VPNOT 1111 1110 0 0 11 000 1 000 0 1111 0100 1101
VPST 1111 1110 0 . 11 000 1 ... 0 1111 0100 1101 mask=%mask_22_13
VCMPEQ_scalar 1111 1110 0 . .. ... 1 ... 0 1111 0 1 0 0 .... @vcmp_scalar
}

View File

@ -2201,6 +2201,23 @@ void HELPER(mve_vpsel)(CPUARMState *env, void *vd, void *vn, void *vm)
mve_advance_vpt(env);
}
void HELPER(mve_vpnot)(CPUARMState *env)
{
/*
* P0 bits for unexecuted beats (where eci_mask is 0) are unchanged.
* P0 bits for predicated lanes in executed bits (where mask is 0) are 0.
* P0 bits otherwise are inverted.
* (This is the same logic as VCMP.)
* This insn is itself subject to predication and to beat-wise execution,
* and after it executes VPT state advances in the usual way.
*/
uint16_t mask = mve_element_mask(env);
uint16_t eci_mask = mve_eci_mask(env);
uint16_t beatpred = ~env->v7m.vpr & mask;
env->v7m.vpr = (env->v7m.vpr & ~(uint32_t)eci_mask) | (beatpred & eci_mask);
mve_advance_vpt(env);
}
#define DO_1OP_SAT(OP, ESIZE, TYPE, FN) \
void HELPER(mve_##OP)(CPUARMState *env, void *vd, void *vm) \
{ \

View File

@ -887,6 +887,25 @@ static bool trans_VPST(DisasContext *s, arg_VPST *a)
return true;
}
static bool trans_VPNOT(DisasContext *s, arg_VPNOT *a)
{
/*
* Invert the predicate in VPR.P0. We have call out to
* a helper because this insn itself is beatwise and can
* be predicated.
*/
if (!dc_isar_feature(aa32_mve, s)) {
return false;
}
if (!mve_eci_check(s) || !vfp_access_check(s)) {
return true;
}
gen_helper_mve_vpnot(cpu_env);
mve_update_eci(s);
return true;
}
static bool trans_VADDV(DisasContext *s, arg_VADDV *a)
{
/* VADDV: vector add across vector */