summaryrefslogtreecommitdiffstats
path: root/target/arm/mve_helper.c
diff options
context:
space:
mode:
authorPeter Maydell2021-06-17 14:16:01 +0200
committerPeter Maydell2021-06-21 18:12:51 +0200
commitabc48e310cc95f616ae65ccb167019eebf7e705b (patch)
tree32c038f84ac1814b39d2c8b59010ec12377d8355 /target/arm/mve_helper.c
parenttarget/arm: Implement MVE VABD (diff)
downloadqemu-abc48e310cc95f616ae65ccb167019eebf7e705b.tar.gz
qemu-abc48e310cc95f616ae65ccb167019eebf7e705b.tar.xz
qemu-abc48e310cc95f616ae65ccb167019eebf7e705b.zip
target/arm: Implement MVE VHADD, VHSUB
Implement MVE VHADD and VHSUB insns, which perform an addition or subtraction and then halve the result. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210617121628.20116-18-peter.maydell@linaro.org
Diffstat (limited to 'target/arm/mve_helper.c')
-rw-r--r--target/arm/mve_helper.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/target/arm/mve_helper.c b/target/arm/mve_helper.c
index 63eacd7349..835832fdf6 100644
--- a/target/arm/mve_helper.c
+++ b/target/arm/mve_helper.c
@@ -429,3 +429,28 @@ DO_2OP_U(vminu, DO_MIN)
DO_2OP_S(vabds, DO_ABD)
DO_2OP_U(vabdu, DO_ABD)
+
+static inline uint32_t do_vhadd_u(uint32_t n, uint32_t m)
+{
+ return ((uint64_t)n + m) >> 1;
+}
+
+static inline int32_t do_vhadd_s(int32_t n, int32_t m)
+{
+ return ((int64_t)n + m) >> 1;
+}
+
+static inline uint32_t do_vhsub_u(uint32_t n, uint32_t m)
+{
+ return ((uint64_t)n - m) >> 1;
+}
+
+static inline int32_t do_vhsub_s(int32_t n, int32_t m)
+{
+ return ((int64_t)n - m) >> 1;
+}
+
+DO_2OP_S(vhadds, do_vhadd_s)
+DO_2OP_U(vhaddu, do_vhadd_u)
+DO_2OP_S(vhsubs, do_vhsub_s)
+DO_2OP_U(vhsubu, do_vhsub_u)