https://gcc.gnu.org/g:770ff476d06fcc57689475248caa9d01c0d37fdf
commit r17-2019-g770ff476d06fcc57689475248caa9d01c0d37fdf Author: Karl Meakin <[email protected]> Date: Thu Jun 25 13:45:09 2026 +0000 aarch64: Port NEON vector creation intrinsics to pragma-based framework Port the following intrinsics to the pragma-based framework: * vcreate * vcombine * vdup_n * vmov_n gcc/ChangeLog: * config/aarch64/aarch64-simd-builtins.def (combine): Delete function declarations. * config/aarch64/aarch64-simd-pragma-builtins.def (vcombine_mf8, vcreate_mf8, vdup_n_mf8, vdupq_n_mf8, vmov_n_mf8, vmovq_n_mf8,): Delete entries. (aarch64_expand_pragma_builtin): Delete cases for `UNSPEC_COMBINE` and `UNSPEC_VCREATE`. (aarch64_fold_combine): Delete function. (aarch64_gimple_fold_pragma_builtin): Delete cases for `UNSPEC_COMBINE` and `UNSPEC_VCREATE`. (aarch64_general_gimple_fold_builtin): Delete cases for `vcombine`. * config/aarch64/aarch64.md (UNSPEC_COMBINE): Delete unspec. * config/aarch64/aarch64-builtins.cc (aarch64_expand_pragma_builtin): Delete cases for `UNSPEC_COMBINE` and `UNSPEC_VCREATE`. (aarch64_fold_combine): Delete function. (aarch64_gimple_fold_pragma_builtin): Delete cases for `UNSPEC_COMBINE` and `UNSPEC_VCREATE`. (aarch64_general_gimple_fold_builtin): Delete cases for `combine`. * config/aarch64/aarch64-acle-builtins.cc (gimple_folder::force_val, gimple_folder::assign): New functions. * config/aarch64/aarch64-acle-builtins.h (TYPES_all_neon, TYPES_bhsd_neon): New type lists. * config/aarch64/aarch64-neon-builtins-base.def (vcreate, vcombine, vdup_n, vdupq_n, vmov_n, vmovq_n): New function groups. * config/aarch64/aarch64-neon-builtins-base.cc (build_vec_dup): New function. (struct gimple_create, struct gimple_combine, struct struct gimple_dup): New structs. (vcreate, vcombine, vdup_n, vdupq_n, vmov_n, vmovq_n): New function bases. * config/aarch64/arm_neon.h (vcreate_s8, vcreate_s16, vcreate_s32, vcreate_s64, vcreate_f16, vcreate_f32, vcreate_u8, vcreate_u16, vcreate_u32, vcreate_u64, vcreate_f64, vcreate_p8, vcreate_p16, vcreate_p64, vcombine_s8, vcombine_s16, vcombine_s32, vcombine_s64, vcombine_f16, vcombine_f32, vcombine_u8, vcombine_u16, vcombine_u32, vcombine_u64, vcombine_f64, vcombine_p8, vcombine_p16, vcombine_p64, vdup_n_f16, vdup_n_f32, vdup_n_f64, vdup_n_p8, vdup_n_p16, vdup_n_p64, vdup_n_s8, vdup_n_s16, vdup_n_s32, vdup_n_s64, vdup_n_u8, vdup_n_u16, vdup_n_u32, vdup_n_u64, vdupq_n_f16, vdupq_n_f32, vdupq_n_f64, vdupq_n_p8, vdupq_n_p16, vdupq_n_p64, vdupq_n_s8, vdupq_n_s16, vdupq_n_s32, vdupq_n_s64, vdupq_n_u8, vdupq_n_u16, vdupq_n_u32, vdupq_n_u64, vmov_n_f16, vmov_n_f32, vmov_n_f64, vmov_n_p8, vmov_n_p16, vmov_n_p64, vmov_n_s8, vmov_n_s16, vmov_n_s32, vmov_n_s64, vmov_n_u8, vmov_n_u16, vmov_n_u32, vmov_n_u64, vmovq_n_f16, vmovq_n_f32, vmovq_n_f64, vmovq_n_p8, vmovq_n_p16, vmovq_n_p64, vmovq_n_s8, vmovq_n_s16, vmovq_n_s32, vmovq_n_s64, vmovq_n_u8, vmovq_n_u16, vmovq_n_u32, vmovq_n_u64, vcreate_bf16, vcombine_bf16, vdup_n_bf16, vdupq_n_bf16): Delete functions. gcc/testsuite/ChangeLog: * gcc.target/aarch64/advsimd-intrinsics/bf16_dup.c: Fix test. * gcc.target/aarch64/vmov_n_1.c: Fix test. * gcc.target/aarch64/neon/vcombine.c: New test. * gcc.target/aarch64/neon/vcreate.c: New test. * gcc.target/aarch64/neon/vdup.c: New test. * gcc.target/aarch64/neon/vmov_n.c: New test. Diff: --- gcc/config/aarch64/aarch64-acle-builtins.cc | 15 + gcc/config/aarch64/aarch64-acle-builtins.h | 24 + gcc/config/aarch64/aarch64-builtins.cc | 43 -- gcc/config/aarch64/aarch64-neon-builtins-base.cc | 63 +++ gcc/config/aarch64/aarch64-neon-builtins-base.def | 10 + gcc/config/aarch64/aarch64-simd-builtins.def | 3 - .../aarch64/aarch64-simd-pragma-builtins.def | 27 - gcc/config/aarch64/aarch64.md | 2 - gcc/config/aarch64/arm_neon.h | 628 --------------------- .../aarch64/advsimd-intrinsics/bf16_dup.c | 7 +- gcc/testsuite/gcc.target/aarch64/neon/vcombine.c | 122 ++++ gcc/testsuite/gcc.target/aarch64/neon/vcreate.c | 119 ++++ gcc/testsuite/gcc.target/aarch64/neon/vdup.c | 226 ++++++++ gcc/testsuite/gcc.target/aarch64/neon/vmov_n.c | 212 +++++++ gcc/testsuite/gcc.target/aarch64/vmov_n_1.c | 2 +- 15 files changed, 796 insertions(+), 707 deletions(-) diff --git a/gcc/config/aarch64/aarch64-acle-builtins.cc b/gcc/config/aarch64/aarch64-acle-builtins.cc index d065457c0118..f441509ea0e6 100644 --- a/gcc/config/aarch64/aarch64-acle-builtins.cc +++ b/gcc/config/aarch64/aarch64-acle-builtins.cc @@ -3091,6 +3091,21 @@ gimple_folder::fold () return base->fold (*this); } +/* Force EXPR to be a GIMPLE value, putting it into a new variable if + necessary. */ +tree +gimple_folder::force_val (tree expr) +{ + if (is_gimple_val (expr)) + return expr; + + auto type = TREE_TYPE (expr); + auto var = create_tmp_var (type); + auto stmt = gimple_build_assign (var, expr); + gsi_insert_before (this->gsi, stmt, GSI_SAME_STMT); + return var; +} + function_expander::function_expander (const function_instance &instance, tree fndecl, tree call_expr_in, rtx possible_target_in) diff --git a/gcc/config/aarch64/aarch64-acle-builtins.h b/gcc/config/aarch64/aarch64-acle-builtins.h index 5e90ba21bf39..150f73d21b7f 100644 --- a/gcc/config/aarch64/aarch64-acle-builtins.h +++ b/gcc/config/aarch64/aarch64-acle-builtins.h @@ -659,6 +659,11 @@ public: gimple *convert_and_fold (tree, gimple *(*) (gimple_folder &, tree, vec<tree> &)); + tree force_val (tree expr); + gassign *assign (tree lhs, tree rhs); + gassign *assign (tree lhs, tree_code code, tree rhs1, tree rhs2 = NULL_TREE, + tree rhs3 = NULL_TREE); + gimple *fold_to_cstu (poly_uint64); gimple *fold_to_pfalse (); gimple *fold_to_ptrue (); @@ -1762,6 +1767,14 @@ function_expander::result_mode () const #define TYPES_za(S, D, T) \ S (za) +/* _p8 _s8 _u8 _mf8 + _p16 _s16 _u16 _f16 _bf16 + _s32 _u32 _f32 + _p64 _s64 _u64 _f64. */ +#define TYPES_all_neon(S, D, T) \ + TYPES_bhsd_neon (S, D, T), \ + TYPES_h_bfloat (S, D, T) + /* _p8 _p16 _p64. */ #define TYPES_bhd_poly(S, D, T) \ S (p8), S (p16), S (p64) @@ -1770,6 +1783,15 @@ function_expander::result_mode () const #define TYPES_bhdq_poly(S, D, T) \ S (p8), S (p16), S (p64), S (p128) +/* _p8 _s8 _u8 _mf8 + _p16 _s16 _u16 _f16 + _s32 _u32 _f32 + _p64 _s64 _u64 _f64. */ +#define TYPES_bhsd_neon(S, D, T) \ + TYPES_bhd_poly (S, D, T), S (mf8), \ + TYPES_all_integer (S, D, T), \ + TYPES_all_float (S, D, T) + /* Describe a tuple of type suffixes in which only the first is used. */ #define DEF_VECTOR_TYPE(X) \ { TYPE_SUFFIX_ ## X, NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES } @@ -1904,8 +1926,10 @@ DEF_SVE_TYPES_ARRAY (mop_i16i64_signed); DEF_SVE_TYPES_ARRAY (mop_i16i64_unsigned); DEF_SVE_TYPES_ARRAY (za); +DEF_SVE_TYPES_ARRAY (all_neon); DEF_SVE_TYPES_ARRAY (bhd_poly); DEF_SVE_TYPES_ARRAY (bhdq_poly); +DEF_SVE_TYPES_ARRAY (bhsd_neon); static const group_suffix_index groups_none[] = { GROUP_none, NUM_GROUP_SUFFIXES diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc index e34fa4a59d8e..6497db6f1b06 100644 --- a/gcc/config/aarch64/aarch64-builtins.cc +++ b/gcc/config/aarch64/aarch64-builtins.cc @@ -4289,10 +4289,6 @@ aarch64_expand_pragma_builtin (tree exp, rtx target, icode = code_for_aarch64_simd_bsl (ops[0].mode); break; - case UNSPEC_COMBINE: - icode = code_for_aarch64_combine (ops[1].mode); - break; - case UNSPEC_DUP: if (builtin_data.signature == aarch64_builtin_signatures::load) aarch64_dereference_pointer (&ops[1], GET_MODE_INNER (ops[0].mode)); @@ -4497,9 +4493,6 @@ aarch64_expand_pragma_builtin (tree exp, rtx target, case UNSPEC_UZP: return aarch64_expand_permute_pair (ops, UNSPEC_UZP1, UNSPEC_UZP2); - case UNSPEC_VCREATE: - return force_lowpart_subreg (ops[0].mode, ops[1].value, ops[1].mode); - case UNSPEC_VEC_COPY: { aarch64_convert_to_lane_mask (&ops[2], ops[1].mode); @@ -5055,27 +5048,6 @@ aarch64_set_lane (tree lhs, tree elt, tree vec, tree lane) return gimple_build_assign (lhs, BIT_INSERT_EXPR, vec, elt, bit); } -/* Fold a call to vcombine. */ -static gimple * -aarch64_fold_combine (gcall *stmt) -{ - tree first_part, second_part; - if (BYTES_BIG_ENDIAN) - { - second_part = gimple_call_arg (stmt, 0); - first_part = gimple_call_arg (stmt, 1); - } - else - { - first_part = gimple_call_arg (stmt, 0); - second_part = gimple_call_arg (stmt, 1); - } - tree ret_type = gimple_call_return_type (stmt); - tree ctor = build_constructor_va (ret_type, 2, NULL_TREE, first_part, - NULL_TREE, second_part); - return gimple_build_assign (gimple_call_lhs (stmt), ctor); -} - /* Fold a call to vaeseq_u8 and vaesdq_u8. That is `vaeseq_u8 (x ^ y, 0)` gets folded into `vaeseq_u8 (x, y)`.*/ @@ -5219,9 +5191,6 @@ aarch64_gimple_fold_pragma_builtin switch (builtin_data.unspec) { - case UNSPEC_COMBINE: - return aarch64_fold_combine (stmt); - case UNSPEC_DUP: case UNSPEC_DUP_LANE: { @@ -5309,12 +5278,6 @@ aarch64_gimple_fold_pragma_builtin case UNSPEC_UZP2: return aarch64_fold_permute (stmt, 2, aarch64_uzp_index, 1); - case UNSPEC_VCREATE: - return gimple_build_assign (gimple_call_lhs (stmt), - fold_build1 (VIEW_CONVERT_EXPR, - types[0].type (), - gimple_call_arg (stmt, 0))); - case UNSPEC_VEC_COPY: { tree elt = aarch64_get_lane (gimple_call_arg (stmt, 2), @@ -5534,12 +5497,6 @@ aarch64_general_gimple_fold_builtin (unsigned int fcode, gcall *stmt, gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt)); break; - BUILTIN_VDC (BINOP, combine, 0, QUIET) - BUILTIN_VD_I (BINOPU, combine, 0, DEFAULT) - BUILTIN_VDC_P (BINOPP, combine, 0, DEFAULT) - new_stmt = aarch64_fold_combine (stmt); - break; - /*lower store and load neon builtins to gimple. */ BUILTIN_VALL_F16 (LOAD1, ld1, 0, LOAD) BUILTIN_VDQ_I (LOAD1_U, ld1, 0, LOAD) diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc b/gcc/config/aarch64/aarch64-neon-builtins-base.cc index 379c89e714d6..d69b65d5ca60 100644 --- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc +++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc @@ -45,6 +45,16 @@ #include "gimple-fold.h" namespace aarch64_acle { + +/* Build an expression for a vector with all lanes set to `ELEM`. */ +tree +build_vec_dup (tree type, tree elem) +{ + return known_eq (TYPE_VECTOR_SUBPARTS (type), 1U) + ? fold_build1 (VIEW_CONVERT_EXPR, type, elem) + : fold_build1 (VEC_DUPLICATE_EXPR, type, elem); +} + /* Base class for all function expanders. At least one of `expand` or `fold` must be overriden by derived classes. */ class gimple_function_base : public function_base @@ -53,6 +63,41 @@ class gimple_function_base : public function_base gimple *fold (gimple_folder &) const override { gcc_unreachable (); } }; +struct gimple_create : public gimple_function_base +{ + gimple *fold (gimple_folder &f) const override + { + auto arg = gimple_call_arg (f.call, 0); + return gimple_build_assign (f.lhs, fold_build1 (VIEW_CONVERT_EXPR, + TREE_TYPE (f.lhs), arg)); + } +}; + +struct gimple_combine : public gimple_function_base +{ + gimple *fold (gimple_folder &f) const override + { + auto arg1 = gimple_call_arg (f.call, 0); + auto arg2 = gimple_call_arg (f.call, 1); + auto arg_type = TREE_TYPE (arg1); + auto elem_type = TREE_TYPE (arg_type); + auto ret_type = TREE_TYPE (f.lhs); + + if (known_eq (TYPE_VECTOR_SUBPARTS (arg_type), 1U)) + { + arg1 = f.force_val (fold_build1 (VIEW_CONVERT_EXPR, elem_type, arg1)); + arg2 = f.force_val (fold_build1 (VIEW_CONVERT_EXPR, elem_type, arg2)); + } + + if (BYTES_BIG_ENDIAN) + std::swap (arg1, arg2); + + return gimple_build_assign (f.lhs, + build_constructor_va (ret_type, 2, NULL_TREE, + arg1, NULL_TREE, arg2)); + } +}; + /* For intrinsics that map to a single GIMPLE expression with no argument preparation necessary. */ class gimple_expr : public gimple_function_base @@ -99,6 +144,24 @@ public: } }; +struct gimple_dup : public gimple_function_base +{ + gimple *fold (gimple_folder &f) const override + { + auto elem = gimple_call_arg (f.call, 0); + auto ret_type = TREE_TYPE (f.lhs); + return gimple_build_assign (f.lhs, build_vec_dup (ret_type, elem)); + } +}; + +// Vector creation +NEON_FUNCTION (vcreate, gimple_create,) +NEON_FUNCTION (vcombine, gimple_combine,) +NEON_FUNCTION (vdup_n, gimple_dup,) +NEON_FUNCTION (vdupq_n, gimple_dup,) +NEON_FUNCTION (vmov_n, gimple_dup,) +NEON_FUNCTION (vmovq_n, gimple_dup,) + // Lanewise arithmetic NEON_FUNCTION (vaddd, gimple_expr, (PLUS_EXPR)) NEON_FUNCTION (vadd, gimple_expr, (PLUS_EXPR, PLUS_EXPR, BIT_XOR_EXPR)) diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def b/gcc/config/aarch64/aarch64-neon-builtins-base.def index 1291e2164535..3ea0432da0e9 100644 --- a/gcc/config/aarch64/aarch64-neon-builtins-base.def +++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def @@ -17,6 +17,16 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ +// Lane manipulation +#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) +DEF_NEON_FUNCTION (vcreate, all_neon, ("D0,su64")) +DEF_NEON_FUNCTION (vcombine, all_neon, ("Q0,D0,D0")) +DEF_NEON_FUNCTION (vdup_n, all_neon, ("D0,s0")) +DEF_NEON_FUNCTION (vdupq_n, all_neon, ("Q0,s0")) +DEF_NEON_FUNCTION (vmov_n, bhsd_neon, ("D0,s0")) +DEF_NEON_FUNCTION (vmovq_n, bhsd_neon, ("Q0,s0")) +#undef REQUIRED_EXTENSIONS + // Lanewise arithmetic #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) DEF_NEON_FUNCTION (vaddd, d_integer, ("s0,s0,s0")) diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index 1b09191a0c01..8cea47f6b67d 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -50,9 +50,6 @@ BUILTIN_V12DI (STORESTRUCT_LANE_U, vec_stl1_lane, 0, ALL) BUILTIN_V12DI (STORESTRUCT_LANE_P, vec_stl1_lane, 0, ALL) - BUILTIN_VDC (BINOP, combine, 0, QUIET) - BUILTIN_VD_I (BINOPU, combine, 0, DEFAULT) - BUILTIN_VDC_P (BINOPP, combine, 0, DEFAULT) BUILTIN_VB (BINOPP, pmul, 0, DEFAULT) VAR1 (BINOPP, pmull, 0, DEFAULT, v8qi) VAR1 (BINOPP, pmull_hi, 0, DEFAULT, v16qi) diff --git a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def index 41bafb2a96ef..c17a0a1c600e 100644 --- a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def @@ -202,11 +202,6 @@ ENTRY_TERNARY (vbsl_mf8, mf8, u8, mf8, mf8, UNSPEC_BSL, QUIET) ENTRY_TERNARY (vbslq_mf8, mf8q, u8q, mf8q, mf8q, UNSPEC_BSL, QUIET) #undef REQUIRED_EXTENSIONS -// combine -#define REQUIRED_EXTENSIONS nonstreaming_only (0) -ENTRY_BINARY (vcombine_mf8, mf8q, mf8, mf8, UNSPEC_COMBINE, QUIET) -#undef REQUIRED_EXTENSIONS - // copy_lane #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) ENTRY_BINARY_TWO_LANES (vcopy_lane_mf8, mf8, mf8, mf8, @@ -219,22 +214,6 @@ ENTRY_BINARY_TWO_LANES (vcopyq_laneq_mf8, mf8q, mf8q, mf8q, UNSPEC_VEC_COPY, QUIET) #undef REQUIRED_EXTENSIONS -// create -#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) -ENTRY_UNARY (vcreate_mf8, mf8, u64_scalar, UNSPEC_VCREATE, QUIET) -#undef REQUIRED_EXTENSIONS - -// dup -#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) -ENTRY_UNARY (vdup_n_mf8, mf8, mf8_scalar, UNSPEC_DUP, QUIET) -ENTRY_UNARY (vdupq_n_mf8, mf8q, mf8_scalar, UNSPEC_DUP, QUIET) - -ENTRY_UNARY_LANE (vdup_lane_mf8, mf8, mf8, UNSPEC_DUP_LANE, QUIET) -ENTRY_UNARY_LANE (vdupq_lane_mf8, mf8q, mf8, UNSPEC_DUP_LANE, QUIET) -ENTRY_UNARY_LANE (vdup_laneq_mf8, mf8, mf8q, UNSPEC_DUP_LANE, QUIET) -ENTRY_UNARY_LANE (vdupq_laneq_mf8, mf8q, mf8q, UNSPEC_DUP_LANE, QUIET) -#undef REQUIRED_EXTENSIONS - // dupb_lane #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) ENTRY_UNARY_LANE (vdupb_lane_mf8, mf8_scalar, mf8, UNSPEC_GET_LANE, QUIET) @@ -306,12 +285,6 @@ ENTRY_TERNARY (vmmlaq_f16_mf8, f16q, f16q, mf8q, mf8q, UNSPEC_FMMLA, FP8) ENTRY_TERNARY (vmmlaq_f32_mf8, f32q, f32q, mf8q, mf8q, UNSPEC_FMMLA, FP8) #undef REQUIRED_EXTENSIONS -// mov -#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) -ENTRY_UNARY (vmov_n_mf8, mf8, mf8_scalar, UNSPEC_DUP, QUIET) -ENTRY_UNARY (vmovq_n_mf8, mf8q, mf8_scalar, UNSPEC_DUP, QUIET) -#undef REQUIRED_EXTENSIONS - // rev #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) ENTRY_UNARY (vrev64_mf8, mf8, mf8, UNSPEC_REV64, QUIET) diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index d8c8c73a6321..6f1ec6bf3616 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -230,7 +230,6 @@ UNSPEC_BSL UNSPEC_CALLEE_ABI UNSPEC_CASESI - UNSPEC_COMBINE UNSPEC_CPYMEM UNSPEC_CRC32B UNSPEC_CRC32CB @@ -358,7 +357,6 @@ UNSPEC_UNPACKSLO UNSPEC_UNPACKULO UNSPEC_PACK - UNSPEC_VCREATE UNSPEC_VEC_COPY UNSPEC_WHILEGE UNSPEC_WHILEGT diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index b45f53663ba8..6146acf8e819 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -2349,104 +2349,6 @@ vqrdmulhq_s32 (int32x4_t __a, int32x4_t __b) return (int32x4_t) __builtin_aarch64_sqrdmulhv4si (__a, __b); } -__extension__ extern __inline int8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_s8 (uint64_t __a) -{ - return (int8x8_t) __a; -} - -__extension__ extern __inline int16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_s16 (uint64_t __a) -{ - return (int16x4_t) __a; -} - -__extension__ extern __inline int32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_s32 (uint64_t __a) -{ - return (int32x2_t) __a; -} - -__extension__ extern __inline int64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_s64 (uint64_t __a) -{ - return (int64x1_t) {__a}; -} - -__extension__ extern __inline float16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_f16 (uint64_t __a) -{ - return (float16x4_t) __a; -} - -__extension__ extern __inline float32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_f32 (uint64_t __a) -{ - return (float32x2_t) __a; -} - -__extension__ extern __inline uint8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_u8 (uint64_t __a) -{ - return (uint8x8_t) __a; -} - -__extension__ extern __inline uint16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_u16 (uint64_t __a) -{ - return (uint16x4_t) __a; -} - -__extension__ extern __inline uint32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_u32 (uint64_t __a) -{ - return (uint32x2_t) __a; -} - -__extension__ extern __inline uint64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_u64 (uint64_t __a) -{ - return (uint64x1_t) {__a}; -} - -__extension__ extern __inline float64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_f64 (uint64_t __a) -{ - return (float64x1_t) __a; -} - -__extension__ extern __inline poly8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_p8 (uint64_t __a) -{ - return (poly8x8_t) __a; -} - -__extension__ extern __inline poly16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_p16 (uint64_t __a) -{ - return (poly16x4_t) __a; -} - -__extension__ extern __inline poly64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_p64 (uint64_t __a) -{ - return (poly64x1_t) __a; -} - /* vget_lane */ __extension__ extern __inline float16_t @@ -2847,105 +2749,6 @@ vsetq_lane_u64 (uint64_t __elem, uint64x2_t __vec, const int __index) return __aarch64_vset_lane_any (__elem, __vec, __index); } - -__extension__ extern __inline int8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_s8 (int8x8_t __a, int8x8_t __b) -{ - return __builtin_aarch64_combinev8qi (__a, __b); -} - -__extension__ extern __inline int16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_s16 (int16x4_t __a, int16x4_t __b) -{ - return __builtin_aarch64_combinev4hi (__a, __b); -} - -__extension__ extern __inline int32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_s32 (int32x2_t __a, int32x2_t __b) -{ - return __builtin_aarch64_combinev2si (__a, __b); -} - -__extension__ extern __inline int64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_s64 (int64x1_t __a, int64x1_t __b) -{ - return __builtin_aarch64_combinedi (__a[0], __b[0]); -} - -__extension__ extern __inline float16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_f16 (float16x4_t __a, float16x4_t __b) -{ - return __builtin_aarch64_combinev4hf (__a, __b); -} - -__extension__ extern __inline float32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_f32 (float32x2_t __a, float32x2_t __b) -{ - return __builtin_aarch64_combinev2sf (__a, __b); -} - -__extension__ extern __inline uint8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_u8 (uint8x8_t __a, uint8x8_t __b) -{ - return __builtin_aarch64_combinev8qi_uuu (__a, __b); -} - -__extension__ extern __inline uint16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_u16 (uint16x4_t __a, uint16x4_t __b) -{ - return __builtin_aarch64_combinev4hi_uuu (__a, __b); -} - -__extension__ extern __inline uint32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_u32 (uint32x2_t __a, uint32x2_t __b) -{ - return __builtin_aarch64_combinev2si_uuu (__a, __b); -} - -__extension__ extern __inline uint64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_u64 (uint64x1_t __a, uint64x1_t __b) -{ - return __builtin_aarch64_combinedi_uuu (__a[0], __b[0]); -} - -__extension__ extern __inline float64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_f64 (float64x1_t __a, float64x1_t __b) -{ - return __builtin_aarch64_combinedf (__a[0], __b[0]); -} - -__extension__ extern __inline poly8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_p8 (poly8x8_t __a, poly8x8_t __b) -{ - return __builtin_aarch64_combinev8qi_ppp (__a, __b); -} - -__extension__ extern __inline poly16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_p16 (poly16x4_t __a, poly16x4_t __b) -{ - return __builtin_aarch64_combinev4hi_ppp (__a, __b); -} - -__extension__ extern __inline poly64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_p64 (poly64x1_t __a, poly64x1_t __b) -{ - return __builtin_aarch64_combinedi_ppp (__a[0], __b[0]); -} - /* Start of temporary inline asm implementations. */ __extension__ extern __inline int8x8_t @@ -10452,209 +10255,6 @@ vcvtpq_u64_f64 (float64x2_t __a) return __builtin_aarch64_lceiluv2dfv2di_us (__a); } -/* vdup_n */ - -__extension__ extern __inline float16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_f16 (float16_t __a) -{ - return (float16x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline float32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_f32 (float32_t __a) -{ - return (float32x2_t) {__a, __a}; -} - -__extension__ extern __inline float64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_f64 (float64_t __a) -{ - return (float64x1_t) {__a}; -} - -__extension__ extern __inline poly8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_p8 (poly8_t __a) -{ - return (poly8x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline poly16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_p16 (poly16_t __a) -{ - return (poly16x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline poly64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_p64 (poly64_t __a) -{ - return (poly64x1_t) {__a}; -} - -__extension__ extern __inline int8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_s8 (int8_t __a) -{ - return (int8x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline int16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_s16 (int16_t __a) -{ - return (int16x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline int32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_s32 (int32_t __a) -{ - return (int32x2_t) {__a, __a}; -} - -__extension__ extern __inline int64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_s64 (int64_t __a) -{ - return (int64x1_t) {__a}; -} - -__extension__ extern __inline uint8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_u8 (uint8_t __a) -{ - return (uint8x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline uint16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_u16 (uint16_t __a) -{ - return (uint16x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline uint32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_u32 (uint32_t __a) -{ - return (uint32x2_t) {__a, __a}; -} - -__extension__ extern __inline uint64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_u64 (uint64_t __a) -{ - return (uint64x1_t) {__a}; -} - -/* vdupq_n */ - -__extension__ extern __inline float16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_f16 (float16_t __a) -{ - return (float16x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline float32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_f32 (float32_t __a) -{ - return (float32x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline float64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_f64 (float64_t __a) -{ - return (float64x2_t) {__a, __a}; -} - -__extension__ extern __inline poly8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_p8 (poly8_t __a) -{ - return (poly8x16_t) {__a, __a, __a, __a, __a, __a, __a, __a, - __a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline poly16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_p16 (poly16_t __a) -{ - return (poly16x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline poly64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_p64 (poly64_t __a) -{ - return (poly64x2_t) {__a, __a}; -} - -__extension__ extern __inline int8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_s8 (int8_t __a) -{ - return (int8x16_t) {__a, __a, __a, __a, __a, __a, __a, __a, - __a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline int16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_s16 (int16_t __a) -{ - return (int16x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline int32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_s32 (int32_t __a) -{ - return (int32x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline int64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_s64 (int64_t __a) -{ - return (int64x2_t) {__a, __a}; -} - -__extension__ extern __inline uint8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_u8 (uint8_t __a) -{ - return (uint8x16_t) {__a, __a, __a, __a, __a, __a, __a, __a, - __a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline uint16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_u16 (uint16_t __a) -{ - return (uint16x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - -__extension__ extern __inline uint32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_u32 (uint32_t __a) -{ - return (uint32x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline uint64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_u64 (uint64_t __a) -{ - return (uint64x2_t) {__a, __a}; -} - /* vdup_lane */ __extension__ extern __inline float16x4_t @@ -16705,204 +16305,6 @@ vmlsq_laneq_u32 (uint32x4_t __a, uint32x4_t __b, return (__a - (__b * __aarch64_vget_lane_any (__c, __lane))); } -/* vmov_n_ */ - -__extension__ extern __inline float16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_f16 (float16_t __a) -{ - return vdup_n_f16 (__a); -} - -__extension__ extern __inline float32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_f32 (float32_t __a) -{ - return vdup_n_f32 (__a); -} - -__extension__ extern __inline float64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_f64 (float64_t __a) -{ - return (float64x1_t) {__a}; -} - -__extension__ extern __inline poly8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_p8 (poly8_t __a) -{ - return vdup_n_p8 (__a); -} - -__extension__ extern __inline poly16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_p16 (poly16_t __a) -{ - return vdup_n_p16 (__a); -} - -__extension__ extern __inline poly64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_p64 (poly64_t __a) -{ - return vdup_n_p64 (__a); -} - -__extension__ extern __inline int8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_s8 (int8_t __a) -{ - return vdup_n_s8 (__a); -} - -__extension__ extern __inline int16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_s16 (int16_t __a) -{ - return vdup_n_s16 (__a); -} - -__extension__ extern __inline int32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_s32 (int32_t __a) -{ - return vdup_n_s32 (__a); -} - -__extension__ extern __inline int64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_s64 (int64_t __a) -{ - return (int64x1_t) {__a}; -} - -__extension__ extern __inline uint8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_u8 (uint8_t __a) -{ - return vdup_n_u8 (__a); -} - -__extension__ extern __inline uint16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_u16 (uint16_t __a) -{ - return vdup_n_u16 (__a); -} - -__extension__ extern __inline uint32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_u32 (uint32_t __a) -{ - return vdup_n_u32 (__a); -} - -__extension__ extern __inline uint64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmov_n_u64 (uint64_t __a) -{ - return (uint64x1_t) {__a}; -} - -__extension__ extern __inline float16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_f16 (float16_t __a) -{ - return vdupq_n_f16 (__a); -} - -__extension__ extern __inline float32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_f32 (float32_t __a) -{ - return vdupq_n_f32 (__a); -} - -__extension__ extern __inline float64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_f64 (float64_t __a) -{ - return vdupq_n_f64 (__a); -} - -__extension__ extern __inline poly8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_p8 (poly8_t __a) -{ - return vdupq_n_p8 (__a); -} - -__extension__ extern __inline poly16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_p16 (poly16_t __a) -{ - return vdupq_n_p16 (__a); -} - -__extension__ extern __inline poly64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_p64 (poly64_t __a) -{ - return vdupq_n_p64 (__a); -} - -__extension__ extern __inline int8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_s8 (int8_t __a) -{ - return vdupq_n_s8 (__a); -} - -__extension__ extern __inline int16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_s16 (int16_t __a) -{ - return vdupq_n_s16 (__a); -} - -__extension__ extern __inline int32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_s32 (int32_t __a) -{ - return vdupq_n_s32 (__a); -} - -__extension__ extern __inline int64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_s64 (int64_t __a) -{ - return vdupq_n_s64 (__a); -} - -__extension__ extern __inline uint8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_u8 (uint8_t __a) -{ - return vdupq_n_u8 (__a); -} - -__extension__ extern __inline uint16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_u16 (uint16_t __a) -{ - return vdupq_n_u16 (__a); -} - -__extension__ extern __inline uint32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_u32 (uint32_t __a) -{ - return vdupq_n_u32 (__a); -} - -__extension__ extern __inline uint64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vmovq_n_u64 (uint64_t __a) -{ - return vdupq_n_u64 (__a); -} - /* vmul_lane */ __extension__ extern __inline float32x2_t @@ -27772,36 +27174,6 @@ vgetq_lane_bf16 (bfloat16x8_t __a, const int __b) return __aarch64_vget_lane_any (__a, __b); } -__extension__ extern __inline bfloat16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcreate_bf16 (uint64_t __a) -{ - return (bfloat16x4_t) __a; -} - -__extension__ extern __inline bfloat16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vcombine_bf16 (bfloat16x4_t __a, bfloat16x4_t __b) -{ - return __builtin_aarch64_combinev4bf (__a, __b); -} - -/* vdup */ - -__extension__ extern __inline bfloat16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdup_n_bf16 (bfloat16_t __a) -{ - return (bfloat16x4_t) {__a, __a, __a, __a}; -} - -__extension__ extern __inline bfloat16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vdupq_n_bf16 (bfloat16_t __a) -{ - return (bfloat16x8_t) {__a, __a, __a, __a, __a, __a, __a, __a}; -} - __extension__ extern __inline bfloat16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vdup_lane_bf16 (bfloat16x4_t __a, const int __b) diff --git a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_dup.c b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_dup.c index da9370ba52bb..b85625234ab9 100644 --- a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_dup.c +++ b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_dup.c @@ -36,18 +36,19 @@ bfloat16x8_t vdupq_test (bfloat16_t a) { return vdupq_n_bf16 (a); } +/* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.8h, v\[0-9\]+.h\\\[0\\\]" 1 } } */ bfloat16x8_t test_vdupq_lane_bf16 (bfloat16x4_t a) { return vdupq_lane_bf16 (a, 1); } -/* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.8h, v\[0-9\]+.h\\\[0\\\]" 2 } } */ +/* { dg-final { scan-assembler-times "dup\\tv\[0-9\]+\.8h, v\[0-9\]+.h\\\[1\\\]" 1 } } */ bfloat16_t test_vget_lane_bf16 (bfloat16x4_t a) { return vget_lane_bf16 (a, 1); } -/* { dg-final { scan-assembler-times "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[1\\\]" 2 } } */ +/* { dg-final { scan-assembler-times "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[1\\\]" 1 } } */ bfloat16x4_t test_vdup_lane_bf16 (bfloat16x4_t a) { @@ -59,7 +60,7 @@ bfloat16x4_t test_vdup_laneq_bf16 (bfloat16x8_t a) { return vdup_laneq_bf16 (a, 7); } -/* { dg-final { scan-assembler "dup\\tv\[0-9\]+\.8h, v\[0-9\]+\.h\\\[7\\\]" } } */ +/* { dg-final { scan-assembler "dup\\tv\[0-9\]+\.4h, v\[0-9\]+\.h\\\[7\\\]" } } */ bfloat16x8_t test_vdupq_laneq_bf16 (bfloat16x8_t a) { diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcombine.c b/gcc/testsuite/gcc.target/aarch64/neon/vcombine.c new file mode 100644 index 000000000000..0ba10cde0a48 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/neon/vcombine.c @@ -0,0 +1,122 @@ +/* { dg-do compile } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include "arm_neon_test.h" + +#define TEST_COMBINE(NAME, RET_TYPE, ARG_TYPE) \ + RET_TYPE test_##NAME (ARG_TYPE arg1, ARG_TYPE arg2) \ + { \ + return NAME (arg1, arg2); \ + } + +/* +** test_vcombine_u8: +** (zip1|uzp1) v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_u8, uint8x16_t, uint8x8_t) + +/* +** test_vcombine_s8: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_s8, int8x16_t, int8x8_t) + +/* +** test_vcombine_p8: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_p8, poly8x16_t, poly8x8_t) + +/* +** test_vcombine_mf8: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_mf8, mfloat8x16_t, mfloat8x8_t) + +/* +** test_vcombine_u16: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_u16, uint16x8_t, uint16x4_t) + +/* +** test_vcombine_s16: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_s16, int16x8_t, int16x4_t) + +/* +** test_vcombine_p16: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_p16, poly16x8_t, poly16x4_t) + +/* +** test_vcombine_f16: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_f16, float16x8_t, float16x4_t) + +/* +** test_vcombine_bf16: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_bf16, bfloat16x8_t, bfloat16x4_t) + +/* +** test_vcombine_u32: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_u32, uint32x4_t, uint32x2_t) + +/* +** test_vcombine_s32: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_s32, int32x4_t, int32x2_t) + +/* +** test_vcombine_f32: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_f32, float32x4_t, float32x2_t) + +/* +** test_vcombine_u64: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_u64, uint64x2_t, uint64x1_t) + +/* +** test_vcombine_s64: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_s64, int64x2_t, int64x1_t) + +/* +** test_vcombine_p64: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_p64, poly64x2_t, poly64x1_t) + +/* +** test_vcombine_f64: +** zip1 v0\.2d, v0\.2d, v1\.2d +** ret +*/ +TEST_COMBINE (vcombine_f64, float64x2_t, float64x1_t) diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcreate.c b/gcc/testsuite/gcc.target/aarch64/neon/vcreate.c new file mode 100644 index 000000000000..f553ea703934 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/neon/vcreate.c @@ -0,0 +1,119 @@ +/* { dg-do compile } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include "arm_neon_test.h" + +#define TEST_CREATE(NAME, RET_TYPE) \ + RET_TYPE test_##NAME (uint64_t arg1) { return NAME (arg1); } + +/* +** test_vcreate_u8: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_u8, uint8x8_t) + +/* +** test_vcreate_s8: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_s8, int8x8_t) + +/* +** test_vcreate_p8: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_p8, poly8x8_t) + +/* +** test_vcreate_mf8: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_mf8, mfloat8x8_t) + +/* +** test_vcreate_u16: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_u16, uint16x4_t) + +/* +** test_vcreate_s16: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_s16, int16x4_t) + +/* +** test_vcreate_p16: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_p16, poly16x4_t) + +/* +** test_vcreate_f16: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_f16, float16x4_t) + +/* +** test_vcreate_bf16: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_bf16, bfloat16x4_t) + +/* +** test_vcreate_u32: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_u32, uint32x2_t) + +/* +** test_vcreate_s32: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_s32, int32x2_t) + +/* +** test_vcreate_f32: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_f32, float32x2_t) + +/* +** test_vcreate_u64: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_u64, uint64x1_t) + +/* +** test_vcreate_s64: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_s64, int64x1_t) + +/* +** test_vcreate_p64: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_p64, poly64x1_t) + +/* +** test_vcreate_f64: +** fmov d0, x0 +** ret +*/ +TEST_CREATE (vcreate_f64, float64x1_t) diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vdup.c b/gcc/testsuite/gcc.target/aarch64/neon/vdup.c new file mode 100644 index 000000000000..c1b2c166e624 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/neon/vdup.c @@ -0,0 +1,226 @@ +/* { dg-do compile } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include "arm_neon_test.h" + +/* +** test_vdup_n_p8: +** dup v0\.8b, w0 +** ret +*/ +TEST_UNARY (vdup_n_p8, poly8x8_t, poly8_t) + +/* +** test_vdup_n_mf8: +** dup v0\.8b, v0\.b\[0\] +** ret +*/ +TEST_UNARY (vdup_n_mf8, mfloat8x8_t, mfloat8_t) + +/* +** test_vdup_n_u8: +** dup v0\.8b, w0 +** ret +*/ +TEST_UNARY (vdup_n_u8, uint8x8_t, uint8_t) + +/* +** test_vdup_n_s8: +** dup v0\.8b, w0 +** ret +*/ +TEST_UNARY (vdup_n_s8, int8x8_t, int8_t) + +/* +** test_vdupq_n_p8: +** dup v0\.16b, w0 +** ret +*/ +TEST_UNARY (vdupq_n_p8, poly8x16_t, poly8_t) + +/* +** test_vdupq_n_mf8: +** dup v0\.16b, v0\.b\[0\] +** ret +*/ +TEST_UNARY (vdupq_n_mf8, mfloat8x16_t, mfloat8_t) + +/* +** test_vdupq_n_u8: +** dup v0\.16b, w0 +** ret +*/ +TEST_UNARY (vdupq_n_u8, uint8x16_t, uint8_t) + +/* +** test_vdupq_n_s8: +** dup v0\.16b, w0 +** ret +*/ +TEST_UNARY (vdupq_n_s8, int8x16_t, int8_t) + +/* +** test_vdup_n_p16: +** dup v0\.4h, w0 +** ret +*/ +TEST_UNARY (vdup_n_p16, poly16x4_t, poly16_t) + +/* +** test_vdup_n_f16: +** dup v0\.4h, v0\.h\[0\] +** ret +*/ +TEST_UNARY (vdup_n_f16, float16x4_t, float16_t) + +/* +** test_vdup_n_bf16: +** dup v0\.4h, v0\.h\[0\] +** ret +*/ +TEST_UNARY (vdup_n_bf16, bfloat16x4_t, bfloat16_t) + +/* +** test_vdup_n_u16: +** dup v0\.4h, w0 +** ret +*/ +TEST_UNARY (vdup_n_u16, uint16x4_t, uint16_t) + +/* +** test_vdup_n_s16: +** dup v0\.4h, w0 +** ret +*/ +TEST_UNARY (vdup_n_s16, int16x4_t, int16_t) + +/* +** test_vdupq_n_p16: +** dup v0\.8h, w0 +** ret +*/ +TEST_UNARY (vdupq_n_p16, poly16x8_t, poly16_t) + +/* +** test_vdupq_n_f16: +** dup v0\.8h, v0\.h\[0\] +** ret +*/ +TEST_UNARY (vdupq_n_f16, float16x8_t, float16_t) + +/* +** test_vdupq_n_bf16: +** dup v0\.8h, v0\.h\[0\] +** ret +*/ +TEST_UNARY (vdupq_n_bf16, bfloat16x8_t, bfloat16_t) + +/* +** test_vdupq_n_u16: +** dup v0\.8h, w0 +** ret +*/ +TEST_UNARY (vdupq_n_u16, uint16x8_t, uint16_t) + +/* +** test_vdupq_n_s16: +** dup v0\.8h, w0 +** ret +*/ +TEST_UNARY (vdupq_n_s16, int16x8_t, int16_t) + +/* +** test_vdup_n_f32: +** dup v0\.2s, v0\.s\[0\] +** ret +*/ +TEST_UNARY (vdup_n_f32, float32x2_t, float32_t) + +/* +** test_vdup_n_u32: +** dup v0\.2s, w0 +** ret +*/ +TEST_UNARY (vdup_n_u32, uint32x2_t, uint32_t) + +/* +** test_vdup_n_s32: +** dup v0\.2s, w0 +** ret +*/ +TEST_UNARY (vdup_n_s32, int32x2_t, int32_t) + +/* +** test_vdupq_n_f32: +** dup v0\.4s, v0\.s\[0\] +** ret +*/ +TEST_UNARY (vdupq_n_f32, float32x4_t, float32_t) + +/* +** test_vdupq_n_u32: +** dup v0\.4s, w0 +** ret +*/ +TEST_UNARY (vdupq_n_u32, uint32x4_t, uint32_t) + +/* +** test_vdupq_n_s32: +** dup v0\.4s, w0 +** ret +*/ +TEST_UNARY (vdupq_n_s32, int32x4_t, int32_t) + +/* +** test_vdup_n_p64: +** fmov d0, x0 +** ret +*/ +TEST_UNARY (vdup_n_p64, poly64x1_t, poly64_t) + +/* +** test_vdup_n_f64: +** ret +*/ +TEST_UNARY (vdup_n_f64, float64x1_t, float64_t) + +/* +** test_vdup_n_u64: +** fmov d0, x0 +** ret +*/ +TEST_UNARY (vdup_n_u64, uint64x1_t, uint64_t) +/* +** test_vdup_n_s64: +** fmov d0, x0 +** ret +*/ +TEST_UNARY (vdup_n_s64, int64x1_t, int64_t) + +/* +** test_vdupq_n_p64: +** dup v0\.2d, x0 +** ret +*/ +TEST_UNARY (vdupq_n_p64, poly64x2_t, poly64_t) + +/* +** test_vdupq_n_f64: +** dup v0\.2d, v0\.d\[0\] +** ret +*/ +TEST_UNARY (vdupq_n_f64, float64x2_t, float64_t) + +/* +** test_vdupq_n_u64: +** dup v0\.2d, x0 +** ret +*/ +TEST_UNARY (vdupq_n_u64, uint64x2_t, uint64_t) + +/* +** test_vdupq_n_s64: +** dup v0\.2d, x0 +** ret +*/ +TEST_UNARY (vdupq_n_s64, int64x2_t, int64_t) diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vmov_n.c b/gcc/testsuite/gcc.target/aarch64/neon/vmov_n.c new file mode 100644 index 000000000000..072d2466b29f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/neon/vmov_n.c @@ -0,0 +1,212 @@ +/* { dg-do compile } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include "arm_neon_test.h" + +/* +** test_vmov_n_p8: +** dup v0\.8b, w0 +** ret +*/ +TEST_UNARY (vmov_n_p8, poly8x8_t, poly8_t) + +/* +** test_vmov_n_mf8: +** dup v0\.8b, v0\.b\[0\] +** ret +*/ +TEST_UNARY (vmov_n_mf8, mfloat8x8_t, mfloat8_t) + +/* +** test_vmov_n_u8: +** dup v0\.8b, w0 +** ret +*/ +TEST_UNARY (vmov_n_u8, uint8x8_t, uint8_t) + +/* +** test_vmov_n_s8: +** dup v0\.8b, w0 +** ret +*/ +TEST_UNARY (vmov_n_s8, int8x8_t, int8_t) + +/* +** test_vmovq_n_p8: +** dup v0\.16b, w0 +** ret +*/ +TEST_UNARY (vmovq_n_p8, poly8x16_t, poly8_t) + +/* +** test_vmovq_n_mf8: +** dup v0\.16b, v0\.b\[0\] +** ret +*/ +TEST_UNARY (vmovq_n_mf8, mfloat8x16_t, mfloat8_t) + +/* +** test_vmovq_n_u8: +** dup v0\.16b, w0 +** ret +*/ +TEST_UNARY (vmovq_n_u8, uint8x16_t, uint8_t) + +/* +** test_vmovq_n_s8: +** dup v0\.16b, w0 +** ret +*/ +TEST_UNARY (vmovq_n_s8, int8x16_t, int8_t) + +/* +** test_vmov_n_p16: +** dup v0\.4h, w0 +** ret +*/ +TEST_UNARY (vmov_n_p16, poly16x4_t, poly16_t) + +/* +** test_vmov_n_f16: +** dup v0\.4h, v0\.h\[0\] +** ret +*/ +TEST_UNARY (vmov_n_f16, float16x4_t, float16_t) + +/* +** test_vmov_n_u16: +** dup v0\.4h, w0 +** ret +*/ +TEST_UNARY (vmov_n_u16, uint16x4_t, uint16_t) + +/* +** test_vmov_n_s16: +** dup v0\.4h, w0 +** ret +*/ +TEST_UNARY (vmov_n_s16, int16x4_t, int16_t) + +/* +** test_vmovq_n_p16: +** dup v0\.8h, w0 +** ret +*/ +TEST_UNARY (vmovq_n_p16, poly16x8_t, poly16_t) + +/* +** test_vmovq_n_f16: +** dup v0\.8h, v0\.h\[0\] +** ret +*/ +TEST_UNARY (vmovq_n_f16, float16x8_t, float16_t) + +/* +** test_vmovq_n_u16: +** dup v0\.8h, w0 +** ret +*/ +TEST_UNARY (vmovq_n_u16, uint16x8_t, uint16_t) + +/* +** test_vmovq_n_s16: +** dup v0\.8h, w0 +** ret +*/ +TEST_UNARY (vmovq_n_s16, int16x8_t, int16_t) + +/* +** test_vmov_n_f32: +** dup v0\.2s, v0\.s\[0\] +** ret +*/ +TEST_UNARY (vmov_n_f32, float32x2_t, float32_t) + +/* +** test_vmov_n_u32: +** dup v0\.2s, w0 +** ret +*/ +TEST_UNARY (vmov_n_u32, uint32x2_t, uint32_t) + +/* +** test_vmov_n_s32: +** dup v0\.2s, w0 +** ret +*/ +TEST_UNARY (vmov_n_s32, int32x2_t, int32_t) + +/* +** test_vmovq_n_f32: +** dup v0\.4s, v0\.s\[0\] +** ret +*/ +TEST_UNARY (vmovq_n_f32, float32x4_t, float32_t) + +/* +** test_vmovq_n_u32: +** dup v0\.4s, w0 +** ret +*/ +TEST_UNARY (vmovq_n_u32, uint32x4_t, uint32_t) + +/* +** test_vmovq_n_s32: +** dup v0\.4s, w0 +** ret +*/ +TEST_UNARY (vmovq_n_s32, int32x4_t, int32_t) + +/* +** test_vmov_n_p64: +** fmov d0, x0 +** ret +*/ +TEST_UNARY (vmov_n_p64, poly64x1_t, poly64_t) + +/* +** test_vmov_n_f64: +** ret +*/ +TEST_UNARY (vmov_n_f64, float64x1_t, float64_t) + +/* +** test_vmov_n_u64: +** fmov d0, x0 +** ret +*/ +TEST_UNARY (vmov_n_u64, uint64x1_t, uint64_t) +/* +** test_vmov_n_s64: +** fmov d0, x0 +** ret +*/ +TEST_UNARY (vmov_n_s64, int64x1_t, int64_t) + +/* +** test_vmovq_n_p64: +** dup v0\.2d, x0 +** ret +*/ +TEST_UNARY (vmovq_n_p64, poly64x2_t, poly64_t) + +/* +** test_vmovq_n_f64: +** dup v0\.2d, v0\.d\[0\] +** ret +*/ +TEST_UNARY (vmovq_n_f64, float64x2_t, float64_t) + +/* +** test_vmovq_n_u64: +** dup v0\.2d, x0 +** ret +*/ +TEST_UNARY (vmovq_n_u64, uint64x2_t, uint64_t) + +/* +** test_vmovq_n_s64: +** dup v0\.2d, x0 +** ret +*/ +TEST_UNARY (vmovq_n_s64, int64x2_t, int64_t) diff --git a/gcc/testsuite/gcc.target/aarch64/vmov_n_1.c b/gcc/testsuite/gcc.target/aarch64/vmov_n_1.c index 528cb84402f8..fde2ab3f4978 100644 --- a/gcc/testsuite/gcc.target/aarch64/vmov_n_1.c +++ b/gcc/testsuite/gcc.target/aarch64/vmov_n_1.c @@ -65,7 +65,7 @@ extern void abort (void); for (i = 0; i < n; i++) \ { \ INHIB_OPTIMIZATION; \ - a = GET_ELEMENT (reg_len, data_len, data_type) (b, i); \ + a = b[i]; \ if ((a) != (c)) \ return 1; \ } \
