diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2021-06-07 17:31:04 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2021-06-07 17:31:24 +0100 |
commit | cbb27125fc328ebeacb6fe3df82e6e6ea1c2fa81 (patch) | |
tree | 554b7ad339d4f52923a7d9a028cc3548ce15523b | |
parent | 6b198404cca1d617b271f5d86025343905ebbf3a (diff) |
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>
-rw-r--r-- | target/arm/helper-mve.h | 5 | ||||
-rw-r--r-- | target/arm/mve.decode | 2 | ||||
-rw-r--r-- | target/arm/mve_helper.c | 5 | ||||
-rw-r--r-- | target/arm/translate-mve.c | 11 |
4 files changed, 23 insertions, 0 deletions
diff --git a/target/arm/helper-mve.h b/target/arm/helper-mve.h index 1013f6912d..7789da1986 100644 --- a/target/arm/helper-mve.h +++ b/target/arm/helper-mve.h @@ -154,3 +154,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_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) diff --git a/target/arm/mve.decode b/target/arm/mve.decode index bde54d05bb..1be2d6b270 100644 --- a/target/arm/mve.decode +++ b/target/arm/mve.decode @@ -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 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 + +VMLSLDAV 1110 1110 1 ... ... . ... x:1 1110 . 0 a:1 0 ... 1 @vmlaldav diff --git a/target/arm/mve_helper.c b/target/arm/mve_helper.c index 3c7a0bac3c..1c22e2777d 100644 --- a/target/arm/mve_helper.c +++ b/target/arm/mve_helper.c @@ -507,3 +507,8 @@ DO_LDAV(vmlaldavxsw, 4, int32_t, H4, true, +=, +=) DO_LDAV(vmlaldavuh, 2, uint16_t, H2, false, +=, +=) DO_LDAV(vmlaldavuw, 4, uint32_t, H4, false, +=, +=) + +DO_LDAV(vmlsldavsh, 2, int16_t, H2, false, +=, -=) +DO_LDAV(vmlsldavxsh, 2, int16_t, H2, true, +=, -=) +DO_LDAV(vmlsldavsw, 4, int32_t, H4, false, +=, -=) +DO_LDAV(vmlsldavxsw, 4, int32_t, H4, true, +=, -=) diff --git a/target/arm/translate-mve.c b/target/arm/translate-mve.c index 03d9496f17..66d713a24e 100644 --- a/target/arm/translate-mve.c +++ b/target/arm/translate-mve.c @@ -497,3 +497,14 @@ static bool trans_VMLALDAV_U(DisasContext *s, arg_vmlaldav *a) }; return do_long_dual_acc(s, a, fns[a->size][a->x]); } + +static bool trans_VMLSLDAV(DisasContext *s, arg_vmlaldav *a) +{ + MVEGenDualAccOpFn *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]); +} |