This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, vectorizer]: Update-1: Vectorize int->double and double->int conversions
- From: Richard Guenther <rguenther at suse dot de>
- To: Uros Bizjak <ubizjak at gmail dot com>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>, Dorit Nuzman <DORIT at il dot ibm dot com>, Ian Lance Taylor <iant at google dot com>
- Date: Wed, 16 May 2007 17:31:32 +0200 (CEST)
- Subject: Re: [PATCH, vectorizer]: Update-1: Vectorize int->double and double->int conversions
- References: <5787cf470705150657p5552d31fl59fae00cc1a3db74@mail.gmail.com>
On Tue, 15 May 2007, Uros Bizjak wrote:
> Hello!
>
> This patch is an update of int->double and double->int conversions
> vectorization patch. It fixes handling of signed/unsigned "unpack with
> float" by handling the expansion of VEC_UNPACK_FLOAT_HI_EXPR and
> VEC_UNPACK_FLOAT_LO_EXPR in the same way as FLOAT_EXPR is expanded via
> expand_float(). I have checked that expand_widen_pattern_expr() worker
> funciton expands these expressions to correct optabs.
>
> As a proof, this patch also implements signed short -> float and
> unsigned short -> float conversions. As confirmed by added testcases,
> conversion works correctly for all these types. (FWIW, this conversion
> can also be implemented on powerpc by adding relevant named patterns
> to its .md file).
>
> The conversions are limited by the vectorizer infrastructure, as
> explained in [1], where the rationale for this implementation was also
> described.
>
> The patch was bootstrapped on i686-pc-linux-gnu (with backed-out
> r124715 commit) and regression tested on all default languages. OK for
> mainline?
This is ok if Dorit is fine with the vectorizer parts.
Thanks,
Richard.
>
> 2007-05-15 Uros Bizjak <ubizjak@gmail.com>
>
> PR tree-optimization/24659
> * optabs.h (enum optab_index): Add OTI_vec_unpacks_float_hi,
> OTI_vec_unpacks_float_lo, OTI_vec_unpacku_float_hi,
> OTI_vec_unpacku_float_lo, OTI_vec_pack_sfix_trunc and
> OTI_vec_pack_ufix_trunc.
> (vec_unpacks_float_hi_optab): Define new macro.
> (vec_unpacks_float_lo_optab): Ditto.
> (vec_unpacku_float_hi_optab): Ditto.
> (vec_unpacku_float_lo_optab): Ditto.
> (vec_pack_sfix_trunc_optab): Ditto.
> (vec_pack_ufix_trunc_optab): Ditto.
> * genopinit.c (optabs): Implement vec_unpack[s|u]_[hi|lo]_optab
> and vec_pack_[s|u]fix_trunc_optab using
> vec_unpack[s|u]_[hi\lo]_* and vec_pack_[u|s]fix_trunc_* patterns
> * tree-vectorizer.c (supportable_widening_operation): Handle
> FLOAT_EXPR and CONVERT_EXPR. Update comment.
> (supportable_narrowing_operation): New function.
> * tree-vectorizer.h (supportable_narrowing_operation): Prototype.
> * tree-vect-transform.c (vectorizable_conversion): Handle
> (nunits_in == nunits_out / 2) and (nunits_out == nunits_in / 2) cases.
> (vect_gen_widened_results_half): Move before vectorizable_conversion.
> (vectorizable_type_demotion): Call supportable_narrowing_operation()
> to check for target support.
> * optabs.c (optab_for_tree_code) Return vec_unpack[s|u]_float_hi_optab
> for VEC_UNPACK_FLOAT_HI_EXPR, vec_unpack[s|u]_float_lo_optab
> for VEC_UNPACK_FLOAT_LO_EXPR and vec_pack_[u|s]fix_trunc_optab
> for VEC_PACK_FIX_TRUNC_EXPR.
> (expand_binop): Special case mode of the result for
> vec_pack_[u|s]fix_trunc_optab.
> (init_optabs): Initialize vec_unpack[s|u]_[hi|lo]_optab and
> vec_pack_[u|s]fix_trunc_optab.
>
> * tree.def (VEC_UNPACK_FLOAT_HI_EXPR, VEC_UNPACK_FLOAT_LO_EXPR,
> VEC_PACK_FIX_TRUNC_EXPR): New tree codes.
> * tree-pretty-print.c (dump_generic_node): Handle
> VEC_UNPACK_FLOAT_HI_EXPR, VEC_UNPACK_FLOAT_LO_EXPR and
> VEC_PACK_FIX_TRUNC_EXPR.
> (op_prio): Ditto.
> * expr.c (expand_expr_real_1): Ditto.
> * tree-inline.c (estimate_num_insns_1): Ditto.
> * tree-vect-generic.c (expand_vector_operations_1): Ditto.
>
> * config/i386/sse.md (vec_unpacks_float_hi_v8hi): New expander.
> (vec_unpacks_float_lo_v8hi): Ditto.
> (vec_unpacku_float_hi_v8hi): Ditto.
> (vec_unpacku_float_lo_v8hi): Ditto.
> (vec_unpacks_float_hi_v4si): Ditto.
> (vec_unpacks_float_lo_v4si): Ditto.
> (vec_pack_sfix_trunc_v2df): Ditto.
>
> * doc/c-tree.texi (Expression trees) [VEC_UNPACK_FLOAT_HI_EXPR]:
> Document.
> [VEC_UNPACK_FLOAT_LO_EXPR]: Ditto.
> [VEC_PACK_FIX_TRUNC_EXPR]: Ditto.
> * doc/md.texi (Standard Names) [vec_pack_sfix_trunc]: Document.
> [vec_pack_ufix_trunc]: Ditto.
> [vec_unpacks_float_hi]: Ditto.
> [vec_unpacks_float_lo]: Ditto.
> [vec_unpacku_float_hi]: Ditto.
> [vec_unpacku_float_lo]: Ditto.
>
> testsuite/ChangeLog:
>
> 2007-05-15 Uros Bizjak <ubizjak@gmail.com>
>
> PR tree-optimization/24659
> * gcc.dg/vect/vect-floatint-conversion-2.c: New test.
> * gcc.dg/vect/vect-intfloat-conversion-1.c: Require vect_float,
> not vect_int target.
> * gcc.dg/vect/vect-intfloat-conversion-2.c: Require vect_float,
> not vect_int target. Loop is vectorized for vect_intfloat_cvt
> targets.
> * gcc.dg/vect/vect-intfloat-conversion-3.c: New test.
> * gcc.dg/vect/vect-intfloat-conversion-4a.c: New test.
> * gcc.dg/vect/vect-intfloat-conversion-4b.c: New test.
>
>
> [1] http://gcc.gnu.org/ml/gcc-patches/2007-05/msg00701.html
>
> Uros.
>
--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex