diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2007-02-11 20:48:07 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2007-02-11 20:48:07 +0100 |
commit | 4c38b6d9425a007d8e27511703f9660c48962e6e (patch) | |
tree | 2cd086f29296f4cd361e8861e6a69e1c418171e9 /gcc | |
parent | 56fd65c7d9a3fd9ab80a627eb6caf24483801ff5 (diff) | |
download | gcc-4c38b6d9425a007d8e27511703f9660c48962e6e.zip gcc-4c38b6d9425a007d8e27511703f9660c48962e6e.tar.gz gcc-4c38b6d9425a007d8e27511703f9660c48962e6e.tar.bz2 |
i386.c (TARGET_VECTORIZE_BUILTIN_CONVERSION): Define.
* config/i386/i386.c (TARGET_VECTORIZE_BUILTIN_CONVERSION): Define.
(ix86_builtin_conversion): New function.
testsuite/ChangeLog:
* gcc.dg/vect/vect-intfloat-conversion-1.c: Loop gets vectorized
on i?86 and x86_64.
* gcc.dg/vect/vect-intfloat-conversion-2.c: Ditto.
* gcc.dg/vect/vect-floatint-conversion-1.c: New.
* gcc.dg/vect/vect-93.c: Another loop gets vectorized
on i?86 and x86_64.
* gcc.dg/vect/vect-113.c: Ditto.
From-SVN: r121820
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 38 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-113.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-93.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-floatint-conversion-1.c | 40 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c | 38 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c | 40 |
8 files changed, 178 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ce0f2ae..bd05c7f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-02-11 Uros Bizjak <ubizjak@gmail.com> + + * config/i386/i386.c (TARGET_VECTORIZE_BUILTIN_CONVERSION): Define. + (ix86_builtin_conversion): New function. + 2007-02-06 Mark Mitchell <mark@codesourcery.com> PR target/29487 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 2dbfe47..a052ea2 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -1514,6 +1514,7 @@ static bool ix86_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode, 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); @@ -1581,8 +1582,11 @@ static section *x86_64_elf_select_section (tree decl, int reloc, #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 @@ -18268,6 +18272,40 @@ ix86_builtin_vectorized_function (enum built_in_function fn, tree type_out, 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f38b0c..b03e9c0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2007-02-11 Uros Bizjak <ubizjak@gmail.com> + + * gcc.dg/vect/vect-intfloat-conversion-1.c: Loop gets vectorized + on i?86 and x86_64. + * gcc.dg/vect/vect-intfloat-conversion-2.c: Ditto. + * gcc.dg/vect/vect-floatint-conversion-1.c: New. + * gcc.dg/vect/vect-93.c: Another loop gets vectorized + on i?86 and x86_64. + * gcc.dg/vect/vect-113.c: Ditto. + 2007-02-06 Mark Mitchell <mark@codesourcery.com> PR c++/29487 @@ -8,9 +18,9 @@ 2007-02-11 Tehila Meyzels <tehila@il.ibm.com> Dorit Nuzman <dorit@il.ibm.com> - * gcc.dg/vect/vect-intfloat-conversion.c-1: New test. - * gcc.dg/vect/vect-intfloat-conversion.c-2: New test. - * gcc.dg/vect/vect-93.c: Another loop gets vectorized on powerpc. + * gcc.dg/vect/vect-intfloat-conversion-1.c: New test. + * gcc.dg/vect/vect-intfloat-conversion-1.c: New test. + * gcc.dg/vect/vect-93.c: Another loop gets vectorized on powerpc. * gcc.dg/vect/vect-113.c: Likewise. * gcc.dg/vect/vect-iv-11.c: A loop gets vectorized. diff --git a/gcc/testsuite/gcc.dg/vect/vect-113.c b/gcc/testsuite/gcc.dg/vect/vect-113.c index 3b3d1db..f5d6b4a 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-113.c +++ b/gcc/testsuite/gcc.dg/vect/vect-113.c @@ -32,5 +32,5 @@ int main (void) return main1 (); } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target powerpc*-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target powerpc*-*-* i?86-*-* x86_64-*-* } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-93.c b/gcc/testsuite/gcc.dg/vect/vect-93.c index a084922..5c8b0d0 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-93.c +++ b/gcc/testsuite/gcc.dg/vect/vect-93.c @@ -67,15 +67,15 @@ int main (void) /* 2 loops vectorized in main1, 2 loops vectorized in main: the first loop in main requires vectorization of conversions, - the second loop in main requires vectorization of misaliged load: */ + the second loop in main requires vectorization of misaliged load. */ /* main && main1 together: */ -/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { target powerpc*-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { target powerpc*-*-* i?86-*-* x86_64-*-* } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { target vect_no_align } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" { xfail vect_no_align } } } */ /* in main1: */ -/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target {! powerpc*-*-* } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target !powerpc*-*-* !i?86-*-* !x86_64-*-* } } } */ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect_no_align } } } */ /* in main: */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-floatint-conversion-1.c b/gcc/testsuite/gcc.dg/vect/vect-floatint-conversion-1.c new file mode 100644 index 0000000..95ffc68 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-floatint-conversion-1.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c b/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c new file mode 100644 index 0000000..1369f2b --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c b/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c new file mode 100644 index 0000000..c189e54 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c @@ -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" } } */ |