target/arm: Implement MVE VNEG
Implement the MVE VNEG insn (both integer and floating point forms). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210617121628.20116-9-peter.maydell@linaro.org
This commit is contained in:
		@@ -55,3 +55,9 @@ DEF_HELPER_FLAGS_3(mve_vabsh, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vabsw, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vfabsh, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vfabss, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vnegb, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vnegh, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vnegw, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vfnegh, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
DEF_HELPER_FLAGS_3(mve_vfnegs, TCG_CALL_NO_WG, void, env, ptr, ptr)
 | 
			
		||||
 
 | 
			
		||||
@@ -80,3 +80,5 @@ VMVN             1111 1111 1 . 11 00 00 ... 0 0101 11 . 0 ... 0 @1op_nosz
 | 
			
		||||
 | 
			
		||||
VABS             1111 1111 1 . 11 .. 01 ... 0 0011 01 . 0 ... 0 @1op
 | 
			
		||||
VABS_fp          1111 1111 1 . 11 .. 01 ... 0 0111 01 . 0 ... 0 @1op
 | 
			
		||||
VNEG             1111 1111 1 . 11 .. 01 ... 0 0011 11 . 0 ... 0 @1op
 | 
			
		||||
VNEG_fp          1111 1111 1 . 11 .. 01 ... 0 0111 11 . 0 ... 0 @1op
 | 
			
		||||
 
 | 
			
		||||
@@ -294,3 +294,15 @@ DO_1OP(vabsw, 4, int32_t, DO_ABS)
 | 
			
		||||
/* We can do these 64 bits at a time */
 | 
			
		||||
DO_1OP(vfabsh, 8, uint64_t, DO_FABSH)
 | 
			
		||||
DO_1OP(vfabss, 8, uint64_t, DO_FABSS)
 | 
			
		||||
 | 
			
		||||
#define DO_NEG(N)    (-(N))
 | 
			
		||||
#define DO_FNEGH(N) ((N) ^ dup_const(MO_16, 0x8000))
 | 
			
		||||
#define DO_FNEGS(N) ((N) ^ dup_const(MO_32, 0x80000000))
 | 
			
		||||
 | 
			
		||||
DO_1OP(vnegb, 1, int8_t, DO_NEG)
 | 
			
		||||
DO_1OP(vnegh, 2, int16_t, DO_NEG)
 | 
			
		||||
DO_1OP(vnegw, 4, int32_t, DO_NEG)
 | 
			
		||||
 | 
			
		||||
/* We can do these 64 bits at a time */
 | 
			
		||||
DO_1OP(vfnegh, 8, uint64_t, DO_FNEGH)
 | 
			
		||||
DO_1OP(vfnegs, 8, uint64_t, DO_FNEGS)
 | 
			
		||||
 
 | 
			
		||||
@@ -200,6 +200,7 @@ static bool do_1op(DisasContext *s, arg_1op *a, MVEGenOneOpFn fn)
 | 
			
		||||
DO_1OP(VCLZ, vclz)
 | 
			
		||||
DO_1OP(VCLS, vcls)
 | 
			
		||||
DO_1OP(VABS, vabs)
 | 
			
		||||
DO_1OP(VNEG, vneg)
 | 
			
		||||
 | 
			
		||||
static bool trans_VREV16(DisasContext *s, arg_1op *a)
 | 
			
		||||
{
 | 
			
		||||
@@ -252,3 +253,17 @@ static bool trans_VABS_fp(DisasContext *s, arg_1op *a)
 | 
			
		||||
    }
 | 
			
		||||
    return do_1op(s, a, fns[a->size]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool trans_VNEG_fp(DisasContext *s, arg_1op *a)
 | 
			
		||||
{
 | 
			
		||||
    static MVEGenOneOpFn * const fns[] = {
 | 
			
		||||
        NULL,
 | 
			
		||||
        gen_helper_mve_vfnegh,
 | 
			
		||||
        gen_helper_mve_vfnegs,
 | 
			
		||||
        NULL,
 | 
			
		||||
    };
 | 
			
		||||
    if (!dc_isar_feature(aa32_mve_fp, s)) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    return do_1op(s, a, fns[a->size]);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user