Re: [PATCH][AArch64] Vectorise bswap[16,32,64]
On 16 April 2014 09:12, Kyrill Tkachov kyrylo.tkac...@arm.com wrote: On 15/04/14 18:45, Eric Christopher wrote: Testcase weirdness? for (i 0; i N; ++i) { arr[i] = i; expect[i] = __builtin_bswap64 (i); if (y) /* Avoid vectorisation. */ abort (); } i 0 :) duplicated in all 3 testcases btw. Oops, here it is fixed. Thanks for catching this. Kyrill Fixed version OK /Marcus
Re: [PATCH][AArch64] Vectorise bswap[16,32,64]
On 15/04/14 18:45, Eric Christopher wrote: Testcase weirdness? for (i 0; i N; ++i) { arr[i] = i; expect[i] = __builtin_bswap64 (i); if (y) /* Avoid vectorisation. */ abort (); } i 0 :) duplicated in all 3 testcases btw. Oops, here it is fixed. Thanks for catching this. Kyrill -eric On Tue, Apr 15, 2014 at 4:25 AM, Kyrill Tkachov kyrylo.tkac...@arm.com wrote: Hi all, This patch enables aarch64 to vectorise bswap[16,32,64] operations by using the AdvancedSIMD forms of the rev[16,32,64] instructions. The TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION hook is extended to return the vectorised forms of __builtin_bswap* where possible and vector bswap patterns are added. I've added the tests in vect.exp and a new effective target check (vect_bswap) that can be extended for other targets in the future if they can also vectorise these operations. Is that ok? Bootstrapped and tested aarch64-none-linux-gnu. Ok for trunk? Thanks, Kyrill 2014-04-15 Kyrylo Tkachov kyrylo.tkac...@arm.com * config/aarch64/aarch64-builtins.c (aarch64_builtin_vectorized_function): Handle BUILT_IN_BSWAP16, BUILT_IN_BSWAP32, BUILT_IN_BSWAP64. * config/aarch64/aarch64-simd.md (bswapmode): New pattern. * config/aarch64/aarch64-simd-builtins.def: Define vector bswap builtins. * config/aarch64/iterator.md (VDQHSD): New mode iterator. (Vrevsuff): New mode attribute. 2014-04-15 Kyrylo Tkachov kyrylo.tkac...@arm.com * lib/target-supports.exp (check_effective_target_vect_bswap): New. * gcc.dg/vect/vect-bswap16: New test. * gcc.dg/vect/vect-bswap32: Likewise. * gcc.dg/vect/vect-bswap64: Likewise. commit 0d6d820881443a7ce7f9bd51f35aff04866c5e57 Author: Kyrylo Tkachov kyrylo.tkac...@arm.com Date: Thu Apr 3 09:22:14 2014 +0100 [AArch64] vectorise bswap diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index 55cfe0a..d839a40 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -1086,7 +1086,29 @@ aarch64_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in) return aarch64_builtin_decls[builtin]; } - + case BUILT_IN_BSWAP16: +#undef AARCH64_CHECK_BUILTIN_MODE +#define AARCH64_CHECK_BUILTIN_MODE(C, N) \ + (out_mode == N##Imode out_n == C \ +in_mode == N##Imode in_n == C) + if (AARCH64_CHECK_BUILTIN_MODE (4, H)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv4hi]; + else if (AARCH64_CHECK_BUILTIN_MODE (8, H)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv8hi]; + else + return NULL_TREE; + case BUILT_IN_BSWAP32: + if (AARCH64_CHECK_BUILTIN_MODE (2, S)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv2si]; + else if (AARCH64_CHECK_BUILTIN_MODE (4, S)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv4si]; + else + return NULL_TREE; + case BUILT_IN_BSWAP64: + if (AARCH64_CHECK_BUILTIN_MODE (2, D)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv2di]; + else + return NULL_TREE; default: return NULL_TREE; } diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index c9b7570..e9736da 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -330,6 +330,8 @@ VAR1 (UNOP, floatunsv4si, 2, v4sf) VAR1 (UNOP, floatunsv2di, 2, v2df) + VAR5 (UNOPU, bswap, 10, v4hi, v8hi, v2si, v4si, v2di) + /* Implemented by aarch64_PERMUTE:perm_insnPERMUTE:perm_hilomode. */ BUILTIN_VALL (BINOP, zip1, 0) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 73aee2c..75db3e8 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -286,6 +286,14 @@ [(set_attr type neon_mul_Vetypeq)] ) +(define_insn bswapmode + [(set (match_operand:VDQHSD 0 register_operand =w) +(bswap:VDQHSD (match_operand:VDQHSD 1 register_operand w)))] + TARGET_SIMD + revVrevsuff\\t%0.Vbtype, %1.Vbtype + [(set_attr type neon_revq)] +) + (define_insn *aarch64_mul3_eltmode [(set (match_operand:VMUL 0 register_operand =w) (mult:VMUL diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index f1339b8..2b5ebd1 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -150,6 +150,9 @@ ;; Vector modes for H and S types. (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI]) +;; Vector modes for H, S and D types. +(define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI]) + ;; Vector modes for Q, H and S types. (define_mode_iterator VDQQHS [V8QI V16QI V4HI V8HI V2SI V4SI]) @@ -352,6 +355,9 @@ (V2DI 2d) (V2SF 2s) (V4SF 4s) (V2DF 2d)]) +(define_mode_attr Vrevsuff [(V4HI 16) (V8HI 16) (V2SI 32) +(V4SI 32)
[PATCH][AArch64] Vectorise bswap[16,32,64]
Hi all, This patch enables aarch64 to vectorise bswap[16,32,64] operations by using the AdvancedSIMD forms of the rev[16,32,64] instructions. The TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION hook is extended to return the vectorised forms of __builtin_bswap* where possible and vector bswap patterns are added. I've added the tests in vect.exp and a new effective target check (vect_bswap) that can be extended for other targets in the future if they can also vectorise these operations. Is that ok? Bootstrapped and tested aarch64-none-linux-gnu. Ok for trunk? Thanks, Kyrill 2014-04-15 Kyrylo Tkachov kyrylo.tkac...@arm.com * config/aarch64/aarch64-builtins.c (aarch64_builtin_vectorized_function): Handle BUILT_IN_BSWAP16, BUILT_IN_BSWAP32, BUILT_IN_BSWAP64. * config/aarch64/aarch64-simd.md (bswapmode): New pattern. * config/aarch64/aarch64-simd-builtins.def: Define vector bswap builtins. * config/aarch64/iterator.md (VDQHSD): New mode iterator. (Vrevsuff): New mode attribute. 2014-04-15 Kyrylo Tkachov kyrylo.tkac...@arm.com * lib/target-supports.exp (check_effective_target_vect_bswap): New. * gcc.dg/vect/vect-bswap16: New test. * gcc.dg/vect/vect-bswap32: Likewise. * gcc.dg/vect/vect-bswap64: Likewise.commit 0d6d820881443a7ce7f9bd51f35aff04866c5e57 Author: Kyrylo Tkachov kyrylo.tkac...@arm.com Date: Thu Apr 3 09:22:14 2014 +0100 [AArch64] vectorise bswap diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index 55cfe0a..d839a40 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -1086,7 +1086,29 @@ aarch64_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in) return aarch64_builtin_decls[builtin]; } - + case BUILT_IN_BSWAP16: +#undef AARCH64_CHECK_BUILTIN_MODE +#define AARCH64_CHECK_BUILTIN_MODE(C, N) \ + (out_mode == N##Imode out_n == C \ +in_mode == N##Imode in_n == C) + if (AARCH64_CHECK_BUILTIN_MODE (4, H)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv4hi]; + else if (AARCH64_CHECK_BUILTIN_MODE (8, H)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv8hi]; + else + return NULL_TREE; + case BUILT_IN_BSWAP32: + if (AARCH64_CHECK_BUILTIN_MODE (2, S)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv2si]; + else if (AARCH64_CHECK_BUILTIN_MODE (4, S)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv4si]; + else + return NULL_TREE; + case BUILT_IN_BSWAP64: + if (AARCH64_CHECK_BUILTIN_MODE (2, D)) + return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_UNOPU_bswapv2di]; + else + return NULL_TREE; default: return NULL_TREE; } diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index c9b7570..e9736da 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -330,6 +330,8 @@ VAR1 (UNOP, floatunsv4si, 2, v4sf) VAR1 (UNOP, floatunsv2di, 2, v2df) + VAR5 (UNOPU, bswap, 10, v4hi, v8hi, v2si, v4si, v2di) + /* Implemented by aarch64_PERMUTE:perm_insnPERMUTE:perm_hilomode. */ BUILTIN_VALL (BINOP, zip1, 0) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 73aee2c..75db3e8 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -286,6 +286,14 @@ [(set_attr type neon_mul_Vetypeq)] ) +(define_insn bswapmode + [(set (match_operand:VDQHSD 0 register_operand =w) +(bswap:VDQHSD (match_operand:VDQHSD 1 register_operand w)))] + TARGET_SIMD + revVrevsuff\\t%0.Vbtype, %1.Vbtype + [(set_attr type neon_revq)] +) + (define_insn *aarch64_mul3_eltmode [(set (match_operand:VMUL 0 register_operand =w) (mult:VMUL diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index f1339b8..2b5ebd1 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -150,6 +150,9 @@ ;; Vector modes for H and S types. (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI]) +;; Vector modes for H, S and D types. +(define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI]) + ;; Vector modes for Q, H and S types. (define_mode_iterator VDQQHS [V8QI V16QI V4HI V8HI V2SI V4SI]) @@ -352,6 +355,9 @@ (V2DI 2d) (V2SF 2s) (V4SF 4s) (V2DF 2d)]) +(define_mode_attr Vrevsuff [(V4HI 16) (V8HI 16) (V2SI 32) +(V4SI 32) (V2DI 64)]) + (define_mode_attr Vmtype [(V8QI .8b) (V16QI .16b) (V4HI .4h) (V8HI .8h) (V2SI .2s) (V4SI .4s) diff --git a/gcc/testsuite/gcc.dg/vect/vect-bswap16.c b/gcc/testsuite/gcc.dg/vect/vect-bswap16.c new file mode 100644 index 000..b452a29 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-bswap16.c @@ -0,0 +1,44 @@ +/* { dg-require-effective-target vect_bswap } */ + +#include tree-vect.h +
Re: [PATCH][AArch64] Vectorise bswap[16,32,64]
Testcase weirdness? for (i 0; i N; ++i) { arr[i] = i; expect[i] = __builtin_bswap64 (i); if (y) /* Avoid vectorisation. */ abort (); } i 0 :) duplicated in all 3 testcases btw. -eric On Tue, Apr 15, 2014 at 4:25 AM, Kyrill Tkachov kyrylo.tkac...@arm.com wrote: Hi all, This patch enables aarch64 to vectorise bswap[16,32,64] operations by using the AdvancedSIMD forms of the rev[16,32,64] instructions. The TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION hook is extended to return the vectorised forms of __builtin_bswap* where possible and vector bswap patterns are added. I've added the tests in vect.exp and a new effective target check (vect_bswap) that can be extended for other targets in the future if they can also vectorise these operations. Is that ok? Bootstrapped and tested aarch64-none-linux-gnu. Ok for trunk? Thanks, Kyrill 2014-04-15 Kyrylo Tkachov kyrylo.tkac...@arm.com * config/aarch64/aarch64-builtins.c (aarch64_builtin_vectorized_function): Handle BUILT_IN_BSWAP16, BUILT_IN_BSWAP32, BUILT_IN_BSWAP64. * config/aarch64/aarch64-simd.md (bswapmode): New pattern. * config/aarch64/aarch64-simd-builtins.def: Define vector bswap builtins. * config/aarch64/iterator.md (VDQHSD): New mode iterator. (Vrevsuff): New mode attribute. 2014-04-15 Kyrylo Tkachov kyrylo.tkac...@arm.com * lib/target-supports.exp (check_effective_target_vect_bswap): New. * gcc.dg/vect/vect-bswap16: New test. * gcc.dg/vect/vect-bswap32: Likewise. * gcc.dg/vect/vect-bswap64: Likewise.