[PATCH, i386]: Vectorize conversions for i386
Dorit Nuzman
DORIT@il.ibm.com
Fri Feb 9 19:11:00 GMT 2007
Uros Bizjak <ubizjak@gmail.com> wrote on 08/02/2007 16:50:23:
> Hello!
>
> This patch implements conversions for i386 and x86_64 targets. Patch
Cool, thanks!
> builds on (yet uncommitted) patch that implements vectorized conversions
> infrastructure by Tehila Meyzels
> (http://gcc.gnu.org/ml/gcc-patches/2007-02/msg00494.html).
>
I plan to commit it soonish. The vectorization-of-induction patch that I
committed a couple of days ago actually exposed a couple of problems in
this patch - I'm fixing it now - will commit the fixed version (and submit
the fixes to the list) this weekend.
dorit
> Patch was bootstrapped on x86_64-pc-linux-gnu and regression tested for
> c,c++ and gfortran.
>
> This patch also includes two testcases from original patch, changed to
> account for i386 and x86_64 targets and a testcase that checks float-int
> conversions.
>
> 2007-02-08 Uros Bizjak <ubizjak@gmail.com>
>
> * config/i386/i386.c (TARGET_VECTORIZE_BUILTIN_CONVERSION):
Define.
> (ix86_builtin_conversion): New function.
>
> testsuite/ChangeLog:
>
> * gcc.dg/vect/vect-intfloat-conversion-1.c: Scan for vectorized
loop
> also for i?86-*-* and x86_64-*-* targets.
> * gcc.dg/vect/vect-intfloat-conversion-2.c: Ditto.
> * gcc.dg/vect/vect-floatint-conversion-1.c: New.
>
> Uros.
>
> Index: config/i386/i386.c
> ===================================================================
> --- config/i386/i386.c (revision 121711)
> +++ config/i386/i386.c (working copy)
> @@ -1516,6 +1516,7 @@
> static void ix86_init_builtins (void);
> static rtx ix86_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
> static tree ix86_builtin_vectorized_function (enum
> built_in_function, tree, tree);
> +static tree ix86_builtin_conversion (enum tree_code, tree);
> static const char *ix86_mangle_fundamental_type (tree);
> static tree ix86_stack_protect_fail (void);
> static rtx ix86_internal_arg_pointer (void);
> @@ -1580,8 +1581,11 @@
> #define TARGET_INIT_BUILTINS ix86_init_builtins
> #undef TARGET_EXPAND_BUILTIN
> #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
> +
> #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
> #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
> ix86_builtin_vectorized_function
> +#undef TARGET_VECTORIZE_BUILTIN_CONVERSION
> +#define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_builtin_conversion
>
> #undef TARGET_ASM_FUNCTION_EPILOGUE
> #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
> @@ -18056,6 +18060,40 @@
> return NULL_TREE;
> }
>
> +/* Returns a decl of a function that implements conversion of the
> + input vector of type TYPE, or NULL_TREE if it is not available. */
> +
> +static tree
> +ix86_builtin_conversion (enum tree_code code, tree type)
> +{
> + if (TREE_CODE (type) != VECTOR_TYPE)
> + return NULL_TREE;
> +
> + switch (code)
> + {
> + case FLOAT_EXPR:
> + switch (TYPE_MODE (type))
> + {
> + case V4SImode:
> + return ix86_builtins[IX86_BUILTIN_CVTDQ2PS];
> + default:
> + return NULL_TREE;
> + }
> +
> + case FIX_TRUNC_EXPR:
> + switch (TYPE_MODE (type))
> + {
> + case V4SFmode:
> + return ix86_builtins[IX86_BUILTIN_CVTTPS2DQ];
> + default:
> + return NULL_TREE;
> + }
> + default:
> + return NULL_TREE;
> +
> + }
> +}
> +
> /* Store OPERAND to the memory after reload is completed. This means
> that we can't easily use assign_stack_local. */
> rtx
> Index: testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c
> ===================================================================
> --- testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c (revision 0)
> +++ testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c (revision 0)
> @@ -0,0 +1,38 @@
> +/* { dg-require-effective-target vect_int } */
> +
> +#include <stdarg.h>
> +#include "tree-vect.h"
> +
> +#define N 32
> +
> +int main1 ()
> +{
> + int i;
> + int ib[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,0,3,6,9,
> 12,15,18,21,24,27,30,33,36,39,42,45};
> + float fa[N];
> +
> + /* int -> float */
> + for (i = 0; i < N; i++)
> + {
> + fa[i] = (float) ib[i];
> + }
> +
> + /* check results: */
> + for (i = 0; i < N; i++)
> + {
> + if (fa[i] != (float) ib[i])
> + abort ();
> + }
> +
> + return 0;
> +}
> +
> +int main (void)
> +{
> + check_vect ();
> +
> + return main1 ();
> +}
> +
> +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect"
> { target powerpc*-*-* i?86-*-* x86_64-*-* } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> Index: testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c
> ===================================================================
> --- testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c (revision 0)
> +++ testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c (revision 0)
> @@ -0,0 +1,40 @@
> +/* { dg-require-effective-target vect_int } */
> +
> +#include <stdarg.h>
> +#include "tree-vect.h"
> +
> +#define N 32
> +
> +int main1 ()
> +{
> + int i;
> + int int_arr[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,0,
> 3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
> + float float_arr[N];
> + char char_arr[N];
> +
> + for (i = 0; i < N; i++){
> + float_arr[i] = (float) int_arr[i];
> + char_arr[i] = 0;
> + }
> +
> + /* check results: */
> + for (i = 0; i < N; i++)
> + {
> + if (float_arr[i] != (float) int_arr[i])
> + abort ();
> + if (char_arr[i] != 0)
> + abort ();
> + }
> +
> + return 0;
> +}
> +
> +int main (void)
> +{
> + check_vect ();
> +
> + return main1 ();
> +}
> +
> +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect"
> { target powerpc*-*-* i?86-*-* x86_64-*-* } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> Index: testsuite/gcc.dg/vect/vect-floatint-conversion-1.c
> ===================================================================
> --- testsuite/gcc.dg/vect/vect-floatint-conversion-1.c (revision 0)
> +++ testsuite/gcc.dg/vect/vect-floatint-conversion-1.c (revision 0)
> @@ -0,0 +1,40 @@
> +/* { dg-require-effective-target vect_float } */
> +
> +#include <stdarg.h>
> +#include "tree-vect.h"
> +
> +#define N 32
> +
> +int
> +main1 ()
> +{
> + int i;
> + float fb[N] = {0.4,3.5,6.6,9.4,12.5,15.6,18.4,21.5,24.6,27.4,30.
> 5,33.6,36.4,39.5,42.6,45.4,0.5,3.6,6.4,9.5,12.6,15.4,18.5,21.6,24.4,
> 27.5,30.6,33.4,36.5,39.6,42.4,45.5};
> + int ia[N];
> +
> + /* float -> int */
> + for (i = 0; i < N; i++)
> + {
> + ia[i] = (int) fb[i];
> + }
> +
> + /* check results: */
> + for (i = 0; i < N; i++)
> + {
> + if (ia[i] != (int) fb[i])
> + abort ();
> + }
> +
> + return 0;
> +}
> +
> +int
> +main (void)
> +{
> + check_vect ();
> +
> + return main1 ();
> +}
> +
> +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect"
> { target i?86-*-* x86_64-*-* } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
More information about the Gcc-patches
mailing list