target/arm: Implement MVE VMLSLDAV
Implement the MVE insn VMLSLDAV, which multiplies source elements, alternately adding and subtracting them, and accumulates into a 64-bit result in a pair of general purpose registers. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210617121628.20116-21-peter.maydell@linaro.org
This commit is contained in:
parent
1d2386f70a
commit
181cd97143
@ -152,3 +152,8 @@ DEF_HELPER_FLAGS_4(mve_vmlaldavxsw, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
|||||||
|
|
||||||
DEF_HELPER_FLAGS_4(mve_vmlaldavuh, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
DEF_HELPER_FLAGS_4(mve_vmlaldavuh, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
||||||
DEF_HELPER_FLAGS_4(mve_vmlaldavuw, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
DEF_HELPER_FLAGS_4(mve_vmlaldavuw, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
||||||
|
|
||||||
|
DEF_HELPER_FLAGS_4(mve_vmlsldavsh, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
||||||
|
DEF_HELPER_FLAGS_4(mve_vmlsldavsw, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
||||||
|
DEF_HELPER_FLAGS_4(mve_vmlsldavxsh, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
||||||
|
DEF_HELPER_FLAGS_4(mve_vmlsldavxsw, TCG_CALL_NO_WG, i64, env, ptr, ptr, i64)
|
||||||
|
@ -145,3 +145,5 @@ VDUP 1110 1110 1 0 10 ... 0 .... 1011 . 0 0 1 0000 @vdup size=2
|
|||||||
qn=%qn rdahi=%rdahi rdalo=%rdalo size=%size_16 &vmlaldav
|
qn=%qn rdahi=%rdahi rdalo=%rdalo size=%size_16 &vmlaldav
|
||||||
VMLALDAV_S 1110 1110 1 ... ... . ... x:1 1110 . 0 a:1 0 ... 0 @vmlaldav
|
VMLALDAV_S 1110 1110 1 ... ... . ... x:1 1110 . 0 a:1 0 ... 0 @vmlaldav
|
||||||
VMLALDAV_U 1111 1110 1 ... ... . ... x:1 1110 . 0 a:1 0 ... 0 @vmlaldav
|
VMLALDAV_U 1111 1110 1 ... ... . ... x:1 1110 . 0 a:1 0 ... 0 @vmlaldav
|
||||||
|
|
||||||
|
VMLSLDAV 1110 1110 1 ... ... . ... x:1 1110 . 0 a:1 0 ... 1 @vmlaldav
|
||||||
|
@ -522,3 +522,8 @@ DO_LDAV(vmlaldavxsw, 4, int32_t, true, +=, +=)
|
|||||||
|
|
||||||
DO_LDAV(vmlaldavuh, 2, uint16_t, false, +=, +=)
|
DO_LDAV(vmlaldavuh, 2, uint16_t, false, +=, +=)
|
||||||
DO_LDAV(vmlaldavuw, 4, uint32_t, false, +=, +=)
|
DO_LDAV(vmlaldavuw, 4, uint32_t, false, +=, +=)
|
||||||
|
|
||||||
|
DO_LDAV(vmlsldavsh, 2, int16_t, false, +=, -=)
|
||||||
|
DO_LDAV(vmlsldavxsh, 2, int16_t, true, +=, -=)
|
||||||
|
DO_LDAV(vmlsldavsw, 4, int32_t, false, +=, -=)
|
||||||
|
DO_LDAV(vmlsldavxsw, 4, int32_t, true, +=, -=)
|
||||||
|
@ -461,3 +461,14 @@ static bool trans_VMLALDAV_U(DisasContext *s, arg_vmlaldav *a)
|
|||||||
};
|
};
|
||||||
return do_long_dual_acc(s, a, fns[a->size][a->x]);
|
return do_long_dual_acc(s, a, fns[a->size][a->x]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool trans_VMLSLDAV(DisasContext *s, arg_vmlaldav *a)
|
||||||
|
{
|
||||||
|
static MVEGenDualAccOpFn * const fns[4][2] = {
|
||||||
|
{ NULL, NULL },
|
||||||
|
{ gen_helper_mve_vmlsldavsh, gen_helper_mve_vmlsldavxsh },
|
||||||
|
{ gen_helper_mve_vmlsldavsw, gen_helper_mve_vmlsldavxsw },
|
||||||
|
{ NULL, NULL },
|
||||||
|
};
|
||||||
|
return do_long_dual_acc(s, a, fns[a->size][a->x]);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user