aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs-query.h
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-10-25 18:26:12 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-10-25 18:26:12 +0200
commit96592eeda1f5cb381d91ef78dea3e2666bbdb7b5 (patch)
tree9f9b788664b48c4b29fde366326af8ab3961d90f /gcc/optabs-query.h
parent8c78afcec88be17030623a4290f214928c143b29 (diff)
downloadgcc-96592eeda1f5cb381d91ef78dea3e2666bbdb7b5.zip
gcc-96592eeda1f5cb381d91ef78dea3e2666bbdb7b5.tar.gz
gcc-96592eeda1f5cb381d91ef78dea3e2666bbdb7b5.tar.bz2
re PR target/78102 (GCC refuses to generate PCMPEQQ instruction for SSE4.1)
PR target/78102 * optabs.def (vcondeq_optab, vec_cmpeq_optab): New optabs. * optabs.c (expand_vec_cond_expr): For comparison codes EQ_EXPR and NE_EXPR, attempt vcondeq_optab as fallback. (expand_vec_cmp_expr): For comparison codes EQ_EXPR and NE_EXPR, attempt vec_cmpeq_optab as fallback. * optabs-tree.h (expand_vec_cmp_expr_p, expand_vec_cond_expr_p): Add enum tree_code argument. * optabs-query.h (get_vec_cmp_eq_icode, get_vcond_eq_icode): New inline functions. * optabs-tree.c (expand_vec_cmp_expr_p): Add CODE argument. For CODE EQ_EXPR or NE_EXPR, attempt to use vec_cmpeq_optab as fallback. (expand_vec_cond_expr_p): Add CODE argument. For CODE EQ_EXPR or NE_EXPR, attempt to use vcondeq_optab as fallback. * tree-vect-generic.c (expand_vector_comparison, expand_vector_divmod, expand_vector_condition): Adjust expand_vec_cmp_expr_p and expand_vec_cond_expr_p callers. * tree-vect-stmts.c (vectorizable_condition, vectorizable_comparison): Likewise. * tree-vect-patterns.c (vect_recog_mixed_size_cond_pattern, check_bool_pattern, search_type_for_mask_1): Likewise. * expr.c (do_store_flag): Likewise. * doc/md.texi (@code{vec_cmpeq@var{m}@var{n}}, @code{vcondeq@var{m}@var{n}}): Document. * config/i386/sse.md (vec_cmpeqv2div2di, vcondeq<VI8F_128:mode>v2di): New expanders. testsuite/ * gcc.target/i386/pr78102.c: New test. From-SVN: r241525
Diffstat (limited to 'gcc/optabs-query.h')
-rw-r--r--gcc/optabs-query.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/optabs-query.h b/gcc/optabs-query.h
index 81bdb3b..840dc79 100644
--- a/gcc/optabs-query.h
+++ b/gcc/optabs-query.h
@@ -90,6 +90,15 @@ get_vec_cmp_icode (machine_mode vmode, machine_mode mask_mode, bool uns)
return convert_optab_handler (tab, vmode, mask_mode);
}
+/* Return insn code for a comparison operator with VMODE
+ resultin MASK_MODE (only for EQ/NE). */
+
+static inline enum insn_code
+get_vec_cmp_eq_icode (machine_mode vmode, machine_mode mask_mode)
+{
+ return convert_optab_handler (vec_cmpeq_optab, vmode, mask_mode);
+}
+
/* Return insn code for a conditional operator with a comparison in
mode CMODE, unsigned if UNS is true, resulting in a value of mode VMODE. */
@@ -113,6 +122,15 @@ get_vcond_mask_icode (machine_mode vmode, machine_mode mmode)
return convert_optab_handler (vcond_mask_optab, vmode, mmode);
}
+/* Return insn code for a conditional operator with a comparison in
+ mode CMODE (only EQ/NE), resulting in a value of mode VMODE. */
+
+static inline enum insn_code
+get_vcond_eq_icode (machine_mode vmode, machine_mode cmode)
+{
+ return convert_optab_handler (vcondeq_optab, vmode, cmode);
+}
+
/* Enumerates the possible extraction_insn operations. */
enum extraction_pattern { EP_insv, EP_extv, EP_extzv };