From ff03930a11f3a996e512ed3613eedc1b50ac5b30 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 1 Aug 2017 10:26:14 +0200 Subject: re PR target/80846 (auto-vectorized AVX2 horizontal sum should narrow to 128b right away, to be more efficient for Ryzen and Intel) PR target/80846 * optabs.def (vec_extract_optab, vec_init_optab): Change from a direct optab to conversion optab. * optabs.c (expand_vector_broadcast): Use convert_optab_handler with GET_MODE_INNER as last argument instead of optab_handler. * expmed.c (extract_bit_field_1): Likewise. Use vector from vector extraction if possible and optab is available. * expr.c (store_constructor): Use convert_optab_handler instead of optab_handler. Use vector initialization from smaller vectors if possible and optab is available. * tree-vect-stmts.c (vectorizable_load): Likewise. * doc/md.texi (vec_extract, vec_init): Document that the optabs now have two modes. * config/i386/i386.c (ix86_expand_vector_init): Handle expansion of vec_init from half-sized vectors with the same element mode. * config/i386/sse.md (ssehalfvecmode): Add V4TI case. (ssehalfvecmodelower, ssescalarmodelower): New mode attributes. (reduc_plus_scal_v8df, reduc_plus_scal_v4df, reduc_plus_scal_v2df, reduc_plus_scal_v16sf, reduc_plus_scal_v8sf, reduc_plus_scal_v4sf, reduc__scal_, reduc_umin_scal_v8hi): Add element mode after mode in gen_vec_extract* calls. (vec_extract): Renamed to ... (vec_extract): ... this. (vec_extract): New expander. (rotl3, rotr3, 3, ashrv2di3): Add element mode after mode in gen_vec_init* calls. (VEC_INIT_HALF_MODE): New mode iterator. (vec_init): Renamed to ... (vec_init): ... this. (vec_init): New expander. * config/i386/mmx.md (vec_extractv2sf): Renamed to ... (vec_extractv2sfsf): ... this. (vec_initv2sf): Renamed to ... (vec_initv2sfsf): ... this. (vec_extractv2si): Renamed to ... (vec_extractv2sisi): ... this. (vec_initv2si): Renamed to ... (vec_initv2sisi): ... this. (vec_extractv4hi): Renamed to ... (vec_extractv4hihi): ... this. (vec_initv4hi): Renamed to ... (vec_initv4hihi): ... this. (vec_extractv8qi): Renamed to ... (vec_extractv8qiqi): ... this. (vec_initv8qi): Renamed to ... (vec_initv8qiqi): ... this. * config/rs6000/vector.md (VEC_base_l): New mode attribute. (vec_init): Renamed to ... (vec_init): ... this. (vec_extract): Renamed to ... (vec_extract): ... this. * config/rs6000/paired.md (vec_initv2sf): Renamed to ... (vec_initv2sfsf): ... this. * config/rs6000/altivec.md (splitter, altivec_copysign_v4sf3, vec_unpacku_hi_v16qi, vec_unpacku_hi_v8hi, vec_unpacku_lo_v16qi, vec_unpacku_lo_v8hi, mulv16qi3, altivec_vreve2): Add element mode after mode in gen_vec_init* calls. * config/aarch64/aarch64-simd.md (vec_init): Renamed to ... (vec_init): ... this. (vec_extract): Renamed to ... (vec_extract): ... this. * config/aarch64/iterators.md (Vel): New mode attribute. * config/s390/s390.c (s390_expand_vec_strlen, s390_expand_vec_movstr): Add element mode after mode in gen_vec_extract* calls. * config/s390/vector.md (non_vec_l): New mode attribute. (vec_extract): Renamed to ... (vec_extract): ... this. (vec_init): Renamed to ... (vec_init): ... this. * config/s390/s390-builtins.def (s390_vlgvb, s390_vlgvh, s390_vlgvf, s390_vlgvf_flt, s390_vlgvg, s390_vlgvg_dbl): Add element mode after vec_extract mode. * config/arm/iterators.md (V_elem_l): New mode attribute. * config/arm/neon.md (vec_extract): Renamed to ... (vec_extract): ... this. (vec_extractv2di): Renamed to ... (vec_extractv2didi): ... this. (vec_init): Renamed to ... (vec_init): ... this. (reduc_plus_scal_, reduc_plus_scal_v2di, reduc_smin_scal_, reduc_smax_scal_, reduc_umin_scal_, reduc_umax_scal_, neon_vget_lane, neon_vget_laneu): Add element mode after gen_vec_extract* calls. * config/mips/mips-msa.md (vec_init): Renamed to ... (vec_init): ... this. (vec_extract): Renamed to ... (vec_extract): ... this. * config/mips/loongson.md (vec_init): Renamed to ... (vec_init): ... this. * config/mips/mips-ps-3d.md (vec_initv2sf): Renamed to ... (vec_initv2sfsf): ... this. (vec_extractv2sf): Renamed to ... (vec_extractv2sfsf): ... this. (reduc_plus_scal_v2sf, reduc_smin_scal_v2sf, reduc_smax_scal_v2sf): Add element mode after gen_vec_extract* calls. * config/mips/mips.md (unitmode): New mode iterator. * config/spu/spu.c (spu_expand_prologue, spu_allocate_stack, spu_builtin_extract): Add element mode after gen_vec_extract* calls. * config/spu/spu.md (inner_l): New mode attribute. (vec_init): Renamed to ... (vec_init): ... this. (vec_extract): Renamed to ... (vec_extract): ... this. * config/sparc/sparc.md (veltmode): New mode iterator. (vec_init): Renamed to ... (vec_init): ... this. * config/ia64/vect.md (vec_initv2si): Renamed to ... (vec_initv2sisi): ... this. (vec_initv2sf): Renamed to ... (vec_initv2sfsf): ... this. (vec_extractv2sf): Renamed to ... (vec_extractv2sfsf): ... this. * config/powerpcspe/vector.md (VEC_base_l): New mode attribute. (vec_init): Renamed to ... (vec_init): ... this. (vec_extract): Renamed to ... (vec_extract): ... this. * config/powerpcspe/paired.md (vec_initv2sf): Renamed to ... (vec_initv2sfsf): ... this. * config/powerpcspe/altivec.md (splitter, altivec_copysign_v4sf3, vec_unpacku_hi_v16qi, vec_unpacku_hi_v8hi, vec_unpacku_lo_v16qi, vec_unpacku_lo_v8hi, mulv16qi3): Add element mode after mode in gen_vec_init* calls. From-SVN: r250759 --- gcc/optabs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'gcc/optabs.c') diff --git a/gcc/optabs.c b/gcc/optabs.c index 9258e5f..a990065 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -386,7 +386,8 @@ expand_vector_broadcast (machine_mode vmode, rtx op) /* ??? If the target doesn't have a vec_init, then we have no easy way of performing this operation. Most of this sort of generic support is hidden away in the vector lowering support in gimple. */ - icode = optab_handler (vec_init_optab, vmode); + icode = convert_optab_handler (vec_init_optab, vmode, + GET_MODE_INNER (vmode)); if (icode == CODE_FOR_nothing) return NULL; -- cgit v1.1