Commit a8105959 by Alan Lawrence Committed by Alan Lawrence

[AArch64] Idiomatic 64x1 comparisons in arm_neon.h

gcc/:
 
	* config/aarch64/arm_neon.h (vceq_s64, vceq_u64, vceqz_s64, vceqz_u64,
	vcge_s64, vcge_u64, vcgez_s64, vcgt_s64, vcgt_u64, vcgtz_s64, vcle_s64,
	vcle_u64, vclez_s64, vclt_s64, vclt_u64, vcltz_s64, vtst_s64,
	vtst_u64): Rewrite using gcc vector extensions.

gcc/testsuite/:

	* gcc.target/aarch64/singleton_intrinsics_1.c: Generalize regex to
	allow cmlt or sshr.

From-SVN: r222909
parent 8b5190ab
2015-05-08 Alan Lawrence <alan.lawrence@arm.com> 2015-05-08 Alan Lawrence <alan.lawrence@arm.com>
* config/aarch64/arm_neon.h (vceq_s64, vceq_u64, vceqz_s64, vceqz_u64,
vcge_s64, vcge_u64, vcgez_s64, vcgt_s64, vcgt_u64, vcgtz_s64, vcle_s64,
vcle_u64, vclez_s64, vclt_s64, vclt_u64, vcltz_s64, vtst_s64,
vtst_u64): Rewrite using gcc vector extensions.
2015-05-08 Alan Lawrence <alan.lawrence@arm.com>
* config/aarch64/aarch64-simd.md (aarch64_vcond_internal<mode><mode>, * config/aarch64/aarch64-simd.md (aarch64_vcond_internal<mode><mode>,
vcond<mode><mode>, vcondu<mode><mode>): Add DImode variant. vcond<mode><mode>, vcondu<mode><mode>): Add DImode variant.
......
...@@ -11619,7 +11619,7 @@ vceq_s32 (int32x2_t __a, int32x2_t __b) ...@@ -11619,7 +11619,7 @@ vceq_s32 (int32x2_t __a, int32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vceq_s64 (int64x1_t __a, int64x1_t __b) vceq_s64 (int64x1_t __a, int64x1_t __b)
{ {
return (uint64x1_t) {__a[0] == __b[0] ? -1ll : 0ll}; return (uint64x1_t) (__a == __b);
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
...@@ -11643,7 +11643,7 @@ vceq_u32 (uint32x2_t __a, uint32x2_t __b) ...@@ -11643,7 +11643,7 @@ vceq_u32 (uint32x2_t __a, uint32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vceq_u64 (uint64x1_t __a, uint64x1_t __b) vceq_u64 (uint64x1_t __a, uint64x1_t __b)
{ {
return (uint64x1_t) {__a[0] == __b[0] ? -1ll : 0ll}; return (__a == __b);
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -11779,7 +11779,7 @@ vceqz_s32 (int32x2_t __a) ...@@ -11779,7 +11779,7 @@ vceqz_s32 (int32x2_t __a)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vceqz_s64 (int64x1_t __a) vceqz_s64 (int64x1_t __a)
{ {
return (uint64x1_t) {__a[0] == 0ll ? -1ll : 0ll}; return (uint64x1_t) (__a == __AARCH64_INT64_C (0));
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
...@@ -11803,7 +11803,7 @@ vceqz_u32 (uint32x2_t __a) ...@@ -11803,7 +11803,7 @@ vceqz_u32 (uint32x2_t __a)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vceqz_u64 (uint64x1_t __a) vceqz_u64 (uint64x1_t __a)
{ {
return (uint64x1_t) {__a[0] == 0ll ? -1ll : 0ll}; return (__a == __AARCH64_UINT64_C (0));
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -11933,7 +11933,7 @@ vcge_s32 (int32x2_t __a, int32x2_t __b) ...@@ -11933,7 +11933,7 @@ vcge_s32 (int32x2_t __a, int32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcge_s64 (int64x1_t __a, int64x1_t __b) vcge_s64 (int64x1_t __a, int64x1_t __b)
{ {
return (uint64x1_t) {__a[0] >= __b[0] ? -1ll : 0ll}; return (uint64x1_t) (__a >= __b);
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
...@@ -11957,7 +11957,7 @@ vcge_u32 (uint32x2_t __a, uint32x2_t __b) ...@@ -11957,7 +11957,7 @@ vcge_u32 (uint32x2_t __a, uint32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcge_u64 (uint64x1_t __a, uint64x1_t __b) vcge_u64 (uint64x1_t __a, uint64x1_t __b)
{ {
return (uint64x1_t) {__a[0] >= __b[0] ? -1ll : 0ll}; return (__a >= __b);
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -12081,7 +12081,7 @@ vcgez_s32 (int32x2_t __a) ...@@ -12081,7 +12081,7 @@ vcgez_s32 (int32x2_t __a)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcgez_s64 (int64x1_t __a) vcgez_s64 (int64x1_t __a)
{ {
return (uint64x1_t) {__a[0] >= 0ll ? -1ll : 0ll}; return (uint64x1_t) (__a >= __AARCH64_INT64_C (0));
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -12175,7 +12175,7 @@ vcgt_s32 (int32x2_t __a, int32x2_t __b) ...@@ -12175,7 +12175,7 @@ vcgt_s32 (int32x2_t __a, int32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcgt_s64 (int64x1_t __a, int64x1_t __b) vcgt_s64 (int64x1_t __a, int64x1_t __b)
{ {
return (uint64x1_t) (__a[0] > __b[0] ? -1ll : 0ll); return (uint64x1_t) (__a > __b);
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
...@@ -12199,7 +12199,7 @@ vcgt_u32 (uint32x2_t __a, uint32x2_t __b) ...@@ -12199,7 +12199,7 @@ vcgt_u32 (uint32x2_t __a, uint32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcgt_u64 (uint64x1_t __a, uint64x1_t __b) vcgt_u64 (uint64x1_t __a, uint64x1_t __b)
{ {
return (uint64x1_t) (__a[0] > __b[0] ? -1ll : 0ll); return (__a > __b);
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -12323,7 +12323,7 @@ vcgtz_s32 (int32x2_t __a) ...@@ -12323,7 +12323,7 @@ vcgtz_s32 (int32x2_t __a)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcgtz_s64 (int64x1_t __a) vcgtz_s64 (int64x1_t __a)
{ {
return (uint64x1_t) {__a[0] > 0ll ? -1ll : 0ll}; return (uint64x1_t) (__a > __AARCH64_INT64_C (0));
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -12417,7 +12417,7 @@ vcle_s32 (int32x2_t __a, int32x2_t __b) ...@@ -12417,7 +12417,7 @@ vcle_s32 (int32x2_t __a, int32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcle_s64 (int64x1_t __a, int64x1_t __b) vcle_s64 (int64x1_t __a, int64x1_t __b)
{ {
return (uint64x1_t) {__a[0] <= __b[0] ? -1ll : 0ll}; return (uint64x1_t) (__a <= __b);
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
...@@ -12441,7 +12441,7 @@ vcle_u32 (uint32x2_t __a, uint32x2_t __b) ...@@ -12441,7 +12441,7 @@ vcle_u32 (uint32x2_t __a, uint32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcle_u64 (uint64x1_t __a, uint64x1_t __b) vcle_u64 (uint64x1_t __a, uint64x1_t __b)
{ {
return (uint64x1_t) {__a[0] <= __b[0] ? -1ll : 0ll}; return (__a <= __b);
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -12565,7 +12565,7 @@ vclez_s32 (int32x2_t __a) ...@@ -12565,7 +12565,7 @@ vclez_s32 (int32x2_t __a)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vclez_s64 (int64x1_t __a) vclez_s64 (int64x1_t __a)
{ {
return (uint64x1_t) {__a[0] <= 0ll ? -1ll : 0ll}; return (uint64x1_t) (__a <= __AARCH64_INT64_C (0));
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -12659,7 +12659,7 @@ vclt_s32 (int32x2_t __a, int32x2_t __b) ...@@ -12659,7 +12659,7 @@ vclt_s32 (int32x2_t __a, int32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vclt_s64 (int64x1_t __a, int64x1_t __b) vclt_s64 (int64x1_t __a, int64x1_t __b)
{ {
return (uint64x1_t) {__a[0] < __b[0] ? -1ll : 0ll}; return (uint64x1_t) (__a < __b);
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
...@@ -12683,7 +12683,7 @@ vclt_u32 (uint32x2_t __a, uint32x2_t __b) ...@@ -12683,7 +12683,7 @@ vclt_u32 (uint32x2_t __a, uint32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vclt_u64 (uint64x1_t __a, uint64x1_t __b) vclt_u64 (uint64x1_t __a, uint64x1_t __b)
{ {
return (uint64x1_t) {__a[0] < __b[0] ? -1ll : 0ll}; return (__a < __b);
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -12807,7 +12807,7 @@ vcltz_s32 (int32x2_t __a) ...@@ -12807,7 +12807,7 @@ vcltz_s32 (int32x2_t __a)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vcltz_s64 (int64x1_t __a) vcltz_s64 (int64x1_t __a)
{ {
return (uint64x1_t) {__a[0] < 0ll ? -1ll : 0ll}; return (uint64x1_t) (__a < __AARCH64_INT64_C (0));
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
...@@ -23767,7 +23767,7 @@ vtst_s32 (int32x2_t __a, int32x2_t __b) ...@@ -23767,7 +23767,7 @@ vtst_s32 (int32x2_t __a, int32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vtst_s64 (int64x1_t __a, int64x1_t __b) vtst_s64 (int64x1_t __a, int64x1_t __b)
{ {
return (uint64x1_t) {(__a[0] & __b[0]) ? -1ll : 0ll}; return (uint64x1_t) ((__a & __b) != __AARCH64_INT64_C (0));
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
...@@ -23791,7 +23791,7 @@ vtst_u32 (uint32x2_t __a, uint32x2_t __b) ...@@ -23791,7 +23791,7 @@ vtst_u32 (uint32x2_t __a, uint32x2_t __b)
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vtst_u64 (uint64x1_t __a, uint64x1_t __b) vtst_u64 (uint64x1_t __a, uint64x1_t __b)
{ {
return (uint64x1_t) {(__a[0] & __b[0]) ? -1ll : 0ll}; return ((__a & __b) != __AARCH64_UINT64_C (0));
} }
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
......
2015-05-08 Alan Lawrence <alan.lawrence@arm.com>
* gcc.target/aarch64/singleton_intrinsics_1.c: Generalize regex to
allow cmlt or sshr.
2015-05-08 Marek Polacek <polacek@redhat.com> 2015-05-08 Marek Polacek <polacek@redhat.com>
PR c/64918 PR c/64918
......
...@@ -235,8 +235,8 @@ test_vrshl_u64 (uint64x1_t a, int64x1_t b) ...@@ -235,8 +235,8 @@ test_vrshl_u64 (uint64x1_t a, int64x1_t b)
return vrshl_u64 (a, b); return vrshl_u64 (a, b);
} }
/* For int64x1_t, sshr...#63 is output instead of the equivalent cmlt...#0. */ /* For int64x1_t, sshr...#63 is equivalent to cmlt...#0. */
/* { dg-final { scan-assembler-times "\\tsshr\\td\[0-9\]+" 2 } } */ /* { dg-final { scan-assembler-times "\\t(?:sshr|cmlt)\\td\[0-9\]+" 2 } } */
int64x1_t int64x1_t
test_vshr_n_s64 (int64x1_t a) test_vshr_n_s64 (int64x1_t a)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment