[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 06/16] tcg: Expand vector minmax using cmp+cmpsel
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PULL 06/16] tcg: Expand vector minmax using cmp+cmpsel |
Date: |
Wed, 22 May 2019 18:28:11 -0400 |
Provide a generic fallback for the min/max operations.
Signed-off-by: Richard Henderson <address@hidden>
---
tcg/tcg-op-vec.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/tcg/tcg-op-vec.c b/tcg/tcg-op-vec.c
index 004a34935b..501d9630a2 100644
--- a/tcg/tcg-op-vec.c
+++ b/tcg/tcg-op-vec.c
@@ -120,6 +120,10 @@ bool tcg_can_emit_vecop_list(const TCGOpcode *list,
}
break;
case INDEX_op_cmpsel_vec:
+ case INDEX_op_smin_vec:
+ case INDEX_op_smax_vec:
+ case INDEX_op_umin_vec:
+ case INDEX_op_umax_vec:
if (tcg_can_emit_vec_op(INDEX_op_cmp_vec, type, vece)) {
continue;
}
@@ -632,24 +636,32 @@ void tcg_gen_ussub_vec(unsigned vece, TCGv_vec r,
TCGv_vec a, TCGv_vec b)
do_op3_nofail(vece, r, a, b, INDEX_op_ussub_vec);
}
+static void do_minmax(unsigned vece, TCGv_vec r, TCGv_vec a,
+ TCGv_vec b, TCGOpcode opc, TCGCond cond)
+{
+ if (!do_op3(vece, r, a, b, opc)) {
+ tcg_gen_cmpsel_vec(cond, vece, r, a, b, a, b);
+ }
+}
+
void tcg_gen_smin_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b)
{
- do_op3_nofail(vece, r, a, b, INDEX_op_smin_vec);
+ do_minmax(vece, r, a, b, INDEX_op_smin_vec, TCG_COND_LT);
}
void tcg_gen_umin_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b)
{
- do_op3_nofail(vece, r, a, b, INDEX_op_umin_vec);
+ do_minmax(vece, r, a, b, INDEX_op_umin_vec, TCG_COND_LTU);
}
void tcg_gen_smax_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b)
{
- do_op3_nofail(vece, r, a, b, INDEX_op_smax_vec);
+ do_minmax(vece, r, a, b, INDEX_op_smax_vec, TCG_COND_GT);
}
void tcg_gen_umax_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b)
{
- do_op3_nofail(vece, r, a, b, INDEX_op_umax_vec);
+ do_minmax(vece, r, a, b, INDEX_op_umax_vec, TCG_COND_GTU);
}
void tcg_gen_shlv_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b)
--
2.17.1
- [Qemu-devel] [PULL 00/16] tcg queued patches, Richard Henderson, 2019/05/22
- [Qemu-devel] [PULL 01/16] tcg/i386: Fix dupi/dupm for avx1 and 32-bit hosts, Richard Henderson, 2019/05/22
- [Qemu-devel] [PULL 02/16] tcg: Fix missing checks and clears in tcg_gen_gvec_dup_mem, Richard Henderson, 2019/05/22
- [Qemu-devel] [PULL 04/16] tcg: Add support for vector compare select, Richard Henderson, 2019/05/22
- [Qemu-devel] [PULL 03/16] tcg: Add support for vector bitwise select, Richard Henderson, 2019/05/22
- [Qemu-devel] [PULL 06/16] tcg: Expand vector minmax using cmp+cmpsel,
Richard Henderson <=
- [Qemu-devel] [PULL 08/16] tcg/i386: Support vector comparison select value, Richard Henderson, 2019/05/22
[Qemu-devel] [PULL 05/16] tcg: Introduce do_op3_nofail for vector expansion, Richard Henderson, 2019/05/22
[Qemu-devel] [PULL 07/16] tcg: Add TCG_OPF_NOT_PRESENT if TCG_TARGET_HAS_foo is negative, Richard Henderson, 2019/05/22
[Qemu-devel] [PULL 14/16] tcg/aarch64: Build vector immediates with two insns, Richard Henderson, 2019/05/22
[Qemu-devel] [PULL 09/16] tcg/i386: Remove expansion for missing minmax, Richard Henderson, 2019/05/22