diff options
author | Alex Velenko <Alex.Velenko@arm.com> | 2014-04-22 15:55:53 +0000 |
---|---|---|
committer | Marcus Shawcroft <mshawcroft@gcc.gnu.org> | 2014-04-22 15:55:53 +0000 |
commit | 9551c7ec222937e23a96c415de1ca5b55dc4d922 (patch) | |
tree | 4b27d2d9458997c1bd0383d0b7ddd78f6be17458 /gcc | |
parent | f2a2c4b5730db5d407688a732210b4c933515c0c (diff) | |
download | gcc-9551c7ec222937e23a96c415de1ca5b55dc4d922.zip gcc-9551c7ec222937e23a96c415de1ca5b55dc4d922.tar.gz gcc-9551c7ec222937e23a96c415de1ca5b55dc4d922.tar.bz2 |
[AArch64] vqneg and vqabs intrinsics implementation.
This patch implements vqneg_s64, vqnegd_s64, vqabs_s64 and vqabsd_s64
AArch64 intrinsics.
From-SVN: r209640
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-simd-builtins.def | 4 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-simd.md | 6 | ||||
-rw-r--r-- | gcc/config/aarch64/arm_neon.h | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c | 54 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c | 47 |
7 files changed, 147 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eeaa5e4..23d05ee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2014-04-22 Alex Velenko <Alex.Velenko@arm.com> + + * gcc/config/aarch64/aarch64-simd.md (aarch64_s<optab><mode>): + Pattern extended. + * config/aarch64/aarch64-simd-builtins.def (sqneg): Iterator + extended. + (sqabs): Likewise. + * config/aarch64/arm_neon.h (vqneg_s64): New intrinsic. + (vqnegd_s64): Likewise. + (vqabs_s64): Likewise. + (vqabsd_s64): Likewise. + 2014-04-22 Richard Henderson <rth@redhat.com> * config/sparc/sparc.c (sparc_init_modes): Hoist GET_MODE_SIZE diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index c5e3b3e..d4c7403 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -142,8 +142,8 @@ BUILTIN_VSQN_HSDI (UNOP, sqmovn, 0) BUILTIN_VSQN_HSDI (UNOP, uqmovn, 0) /* Implemented by aarch64_s<optab><mode>. */ - BUILTIN_VSDQ_I_BHSI (UNOP, sqabs, 0) - BUILTIN_VSDQ_I_BHSI (UNOP, sqneg, 0) + BUILTIN_VSDQ_I (UNOP, sqabs, 0) + BUILTIN_VSDQ_I (UNOP, sqneg, 0) BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane, 0) BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane, 0) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 995b4a8..753ca1c 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -2610,9 +2610,9 @@ ;; <su>q<absneg> (define_insn "aarch64_s<optab><mode>" - [(set (match_operand:VSDQ_I_BHSI 0 "register_operand" "=w") - (UNQOPS:VSDQ_I_BHSI - (match_operand:VSDQ_I_BHSI 1 "register_operand" "w")))] + [(set (match_operand:VSDQ_I 0 "register_operand" "=w") + (UNQOPS:VSDQ_I + (match_operand:VSDQ_I 1 "register_operand" "w")))] "TARGET_SIMD" "s<optab>\\t%<v>0<Vmtype>, %<v>1<Vmtype>" [(set_attr "type" "neon_<optab><q>")] diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index a3c15ac..75a62e5 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -2318,6 +2318,12 @@ vqneg_s32 (int32x2_t __a) return (int32x2_t) __builtin_aarch64_sqnegv2si (__a); } +__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +vqneg_s64 (int64x1_t __a) +{ + return __builtin_aarch64_sqnegdi (__a); +} + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) vqnegq_s8 (int8x16_t __a) { @@ -2354,6 +2360,12 @@ vqabs_s32 (int32x2_t __a) return (int32x2_t) __builtin_aarch64_sqabsv2si (__a); } +__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) +vqabs_s64 (int64x1_t __a) +{ + return __builtin_aarch64_sqabsdi (__a); +} + __extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) vqabsq_s8 (int8x16_t __a) { @@ -20943,6 +20955,12 @@ vqabss_s32 (int32x1_t __a) return (int32x1_t) __builtin_aarch64_sqabssi (__a); } +__extension__ static __inline int64_t __attribute__ ((__always_inline__)) +vqabsd_s64 (int64_t __a) +{ + return __builtin_aarch64_sqabsdi (__a); +} + /* vqadd */ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__)) @@ -21561,6 +21579,12 @@ vqnegs_s32 (int32x1_t __a) return (int32x1_t) __builtin_aarch64_sqnegsi (__a); } +__extension__ static __inline int64_t __attribute__ ((__always_inline__)) +vqnegd_s64 (int64_t __a) +{ + return __builtin_aarch64_sqnegdi (__a); +} + /* vqrdmulh */ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 53f5e27..908646d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-22 Alex Velenko <Alex.Velenko@arm.com> + + * gcc.target/aarch64/vqneg_s64_1.c: New testcase. + * gcc.target/aarch64/vqabs_s64_1.c: New testcase. + 2014-04-22 Richard Sandiford <rdsandiford@googlemail.com> * gcc.dg/memcpy-5.c: New test. diff --git a/gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c b/gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c new file mode 100644 index 0000000..3ea5322 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c @@ -0,0 +1,54 @@ +/* Test vqabs_s64 intrinsics work correctly. */ +/* { dg-do run } */ +/* { dg-options "--save-temps" } */ + +#include <arm_neon.h> + +extern void abort (void); + +int __attribute__ ((noinline)) +test_vqabs_s64 (int64x1_t passed, int64_t expected) +{ + return vget_lane_s64 (vqabs_s64 (passed), 0) != expected; +} + +int __attribute__ ((noinline)) +test_vqabsd_s64 (int64_t passed, int64_t expected) +{ + return vqabsd_s64 (passed) != expected; +} + +/* { dg-final { scan-assembler-times "sqabs\\td\[0-9\]+, d\[0-9\]+" 2 } } */ + +int +main (int argc, char **argv) +{ + /* Basic test. */ + if (test_vqabs_s64 (vcreate_s64 (-1), 1)) + abort (); + if (test_vqabsd_s64 (-1, 1)) + abort (); + + /* Getting absolute value of min int64_t. + Note, exact result cannot be represented in int64_t, + so max int64_t is expected. */ + if (test_vqabs_s64 (vcreate_s64 (0x8000000000000000), 0x7fffffffffffffff)) + abort (); + if (test_vqabsd_s64 (0x8000000000000000, 0x7fffffffffffffff)) + abort (); + + /* Another input that gets max int64_t. */ + if (test_vqabs_s64 (vcreate_s64 (0x8000000000000001), 0x7fffffffffffffff)) + abort (); + if (test_vqabsd_s64 (0x8000000000000001, 0x7fffffffffffffff)) + abort (); + + /* Checking that large positive numbers stay the same. */ + if (test_vqabs_s64 (vcreate_s64 (0x7fffffffffffffff), 0x7fffffffffffffff)) + abort (); + if (test_vqabsd_s64 (0x7fffffffffffffff, 0x7fffffffffffffff)) + abort (); + + return 0; +} +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c b/gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c new file mode 100644 index 0000000..a555b65 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c @@ -0,0 +1,47 @@ +/* Test vqneg_s64 intrinsics work correctly. */ +/* { dg-do run } */ +/* { dg-options "--save-temps" } */ + +#include <arm_neon.h> + +extern void abort (void); + +int __attribute__ ((noinline)) +test_vqneg_s64 (int64x1_t passed, int64_t expected) +{ + return vget_lane_s64 (vqneg_s64 (passed), 0) != expected; +} + +int __attribute__ ((noinline)) +test_vqnegd_s64 (int64_t passed, int64_t expected) +{ + return vqnegd_s64 (passed) != expected; +} + +/* { dg-final { scan-assembler-times "sqneg\\td\[0-9\]+, d\[0-9\]+" 2 } } */ + +int +main (int argc, char **argv) +{ + /* Basic test. */ + if (test_vqneg_s64 (vcreate_s64 (-1), 1)) + abort (); + if (test_vqnegd_s64 (-1, 1)) + abort (); + + /* Negating max int64_t. */ + if (test_vqneg_s64 (vcreate_s64 (0x7fffffffffffffff), 0x8000000000000001)) + abort (); + if (test_vqnegd_s64 (0x7fffffffffffffff, 0x8000000000000001)) + abort (); + + /* Negating min int64_t. + Note, exact negation cannot be represented as int64_t. */ + if (test_vqneg_s64 (vcreate_s64 (0x8000000000000000), 0x7fffffffffffffff)) + abort (); + if (test_vqnegd_s64 (0x8000000000000000, 0x7fffffffffffffff)) + abort (); + + return 0; +} +/* { dg-final { cleanup-saved-temps } } */ |