Port the `vsub` family of NEON intrinsics to the pragma-based framework,
and add assembly tests for every variant.
gcc/ChangeLog:
* config/aarch64/aarch64-neon-builtins-base.cc (vsubh, vsubd,
vsub, vsubq): New function bases.
* config/aarch64/aarch64-neon-builtins-base.def (vsubd, vsub,
vsubq, vsubh): New function declarations.
* config/aarch64/arm_neon.h (vsub_s8, vsub_s16, vsub_s32,
vsub_f32, vsub_f64, vsub_u8, vsub_u16, vsub_u32, vsub_s64,
vsub_u64, vsubq_s8, vsubq_s16, vsubq_s32, vsubq_s64,
vsubq_f32, vsubq_f64, vsubq_u8, vsubq_u16, vsubq_u32,
vsubq_u64, vsub_f16, vsubq_f16): Delete function definitions.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/neon/vsub.c: New test.
---
.../aarch64/aarch64-neon-builtins-base.cc | 5 +
.../aarch64/aarch64-neon-builtins-base.def | 9 +
gcc/config/aarch64/arm_neon.h | 154 ----------------
gcc/testsuite/gcc.target/aarch64/neon/vsub.c | 172 ++++++++++++++++++
4 files changed, 186 insertions(+), 154 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vsub.c
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
index 81511911f0c..9952a85f646 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -809,6 +809,11 @@ NEON_FUNCTION (vaddd, gimple_arith, (PLUS_EXPR))
NEON_FUNCTION (vadd, gimple_arith, (PLUS_EXPR, PLUS_EXPR, BIT_XOR_EXPR))
NEON_FUNCTION (vaddq, gimple_arith, (PLUS_EXPR, PLUS_EXPR, BIT_XOR_EXPR))
+// Subtraction
+NEON_FUNCTION (vsubd, gimple_arith, (MINUS_EXPR))
+NEON_FUNCTION (vsub, gimple_arith, (MINUS_EXPR))
+NEON_FUNCTION (vsubq, gimple_arith, (MINUS_EXPR))
+
// Bitwise operations
NEON_FUNCTION (vand, gimple_expr, (BIT_AND_EXPR))
NEON_FUNCTION (vandq, gimple_expr, (BIT_AND_EXPR))
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index e63b98b283b..6d55056ce4e 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -71,6 +71,11 @@ DEF_NEON_FUNCTION (vaddq, all_arith_no_fp16, ("Q0,Q0,Q0"))
// Polynomial "addition" (really xor)
DEF_NEON_FUNCTION (vadd, bhd_poly, ("D0,D0,D0"))
DEF_NEON_FUNCTION (vaddq, bhdq_poly, ("Q0,Q0,Q0"))
+
+// Subtraction
+DEF_NEON_FUNCTION (vsubd, d_integer, ("s0,s0,s0"))
+DEF_NEON_FUNCTION (vsub, all_arith_no_fp16, ("D0,D0,D0"))
+DEF_NEON_FUNCTION (vsubq, all_arith_no_fp16, ("Q0,Q0,Q0"))
#undef REQUIRED_EXTENSIONS
// Lanewise arithmetic (FP16)
@@ -78,6 +83,10 @@ DEF_NEON_FUNCTION (vaddq, bhdq_poly, ("Q0,Q0,Q0"))
// Addition
DEF_NEON_FUNCTION (vadd, h_float, ("D0,D0,D0"))
DEF_NEON_FUNCTION (vaddq, h_float, ("Q0,Q0,Q0"))
+
+// Subtraction
+DEF_NEON_FUNCTION (vsub, h_float, ("D0,D0,D0"))
+DEF_NEON_FUNCTION (vsubq, h_float, ("Q0,Q0,Q0"))
#undef REQUIRED_EXTENSIONS
// Bitwise operations
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 873a1195d3e..1051b24b5e0 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -763,146 +763,6 @@ vmulq_p8 (poly8x16_t __a, poly8x16_t __b)
return __builtin_aarch64_pmulv16qi_ppp (__a, __b);
}
-__extension__ extern __inline int8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_s8 (int8x8_t __a, int8x8_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_s16 (int16x4_t __a, int16x4_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_s32 (int32x2_t __a, int32x2_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_f32 (float32x2_t __a, float32x2_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_f64 (float64x1_t __a, float64x1_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_u8 (uint8x8_t __a, uint8x8_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_u16 (uint16x4_t __a, uint16x4_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_u32 (uint32x2_t __a, uint32x2_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline int64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_s64 (int64x1_t __a, int64x1_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_u64 (uint64x1_t __a, uint64x1_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline int8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_s8 (int8x16_t __a, int8x16_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_s16 (int16x8_t __a, int16x8_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_s32 (int32x4_t __a, int32x4_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_s64 (int64x2_t __a, int64x2_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_f32 (float32x4_t __a, float32x4_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_f64 (float64x2_t __a, float64x2_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_u8 (uint8x16_t __a, uint8x16_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_u16 (uint16x8_t __a, uint16x8_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_u32 (uint32x4_t __a, uint32x4_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_u64 (uint64x2_t __a, uint64x2_t __b)
-{
- return __a - __b;
-}
-
__extension__ extern __inline int16x8_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vsubl_s8 (int8x8_t __a, int8x8_t __b)
@@ -20541,20 +20401,6 @@ vrsqrtsq_f16 (float16x8_t __a, float16x8_t __b)
return __builtin_aarch64_rsqrtsv8hf (__a, __b);
}
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsub_f16 (float16x4_t __a, float16x4_t __b)
-{
- return __a - __b;
-}
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsubq_f16 (float16x8_t __a, float16x8_t __b)
-{
- return __a - __b;
-}
-
/* ARMv8.2-A FP16 three operands vector intrinsics. */
__extension__ extern __inline float16x4_t
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vsub.c
b/gcc/testsuite/gcc.target/aarch64/neon/vsub.c
new file mode 100644
index 00000000000..2a0306f6aa7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vsub.c
@@ -0,0 +1,172 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vsub_u8:
+** sub v0\.8b, v0\.8b, v1\.8b
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_u8, uint8x8_t)
+
+/*
+** test_vsub_s8:
+** sub v0\.8b, v0\.8b, v1\.8b
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_s8, int8x8_t)
+
+/*
+** test_vsub_u16:
+** sub v0\.4h, v0\.4h, v1\.4h
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_u16, uint16x4_t)
+
+/*
+** test_vsub_s16:
+** sub v0\.4h, v0\.4h, v1\.4h
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_s16, int16x4_t)
+
+/*
+** test_vsub_f16:
+** fsub v0\.4h, v0\.4h, v1\.4h
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_f16, float16x4_t)
+
+/*
+** test_vsub_u32:
+** sub v0\.2s, v0\.2s, v1\.2s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_u32, uint32x2_t)
+
+/*
+** test_vsub_s32:
+** sub v0\.2s, v0\.2s, v1\.2s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_s32, int32x2_t)
+
+/*
+** test_vsub_f32:
+** fsub v0\.2s, v0\.2s, v1\.2s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_f32, float32x2_t)
+
+/*
+** test_vsub_u64:
+** sub d0, d0, d1
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_u64, uint64x1_t)
+
+/*
+** test_vsub_s64:
+** sub d0, d0, d1
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_s64, int64x1_t)
+
+/*
+** test_vsub_f64:
+** fsub d0, d0, d1
+** ret
+*/
+TEST_UNIFORM_BINARY (vsub_f64, float64x1_t)
+
+/*
+** test_vsubq_u8:
+** sub v0\.16b, v0\.16b, v1\.16b
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_u8, uint8x16_t)
+
+/*
+** test_vsubq_s8:
+** sub v0\.16b, v0\.16b, v1\.16b
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_s8, int8x16_t)
+
+/*
+** test_vsubq_u16:
+** sub v0\.8h, v0\.8h, v1\.8h
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_u16, uint16x8_t)
+
+/*
+** test_vsubq_s16:
+** sub v0\.8h, v0\.8h, v1\.8h
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_s16, int16x8_t)
+
+/*
+** test_vsubq_f16:
+** fsub v0\.8h, v0\.8h, v1\.8h
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_f16, float16x8_t)
+
+/*
+** test_vsubq_u32:
+** sub v0\.4s, v0\.4s, v1\.4s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_u32, uint32x4_t)
+
+/*
+** test_vsubq_s32:
+** sub v0\.4s, v0\.4s, v1\.4s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_s32, int32x4_t)
+
+/*
+** test_vsubq_f32:
+** fsub v0\.4s, v0\.4s, v1\.4s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_f32, float32x4_t)
+
+/*
+** test_vsubq_u64:
+** sub v0\.2d, v0\.2d, v1\.2d
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_u64, uint64x2_t)
+
+/*
+** test_vsubq_s64:
+** sub v0\.2d, v0\.2d, v1\.2d
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_s64, int64x2_t)
+
+/*
+** test_vsubq_f64:
+** fsub v0\.2d, v0\.2d, v1\.2d
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubq_f64, float64x2_t)
+
+/*
+** test_vsubd_u64:
+** sub x0, x0, x1
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubd_u64, uint64_t)
+
+/*
+** test_vsubd_s64:
+** sub x0, x0, x1
+** ret
+*/
+TEST_UNIFORM_BINARY (vsubd_s64, int64_t)
--
2.51.0