mirror of
https://github.com/qemu/qemu.git
synced 2024-11-28 22:33:36 +08:00
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:
parent
59c9177338
commit
399a8c766c
@ -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]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user