FWIW, the series is on forgejo too: https://forge.sourceware.org/gcc/gcc-TEST/pulls/68
On Wed, 27 Aug 2025 at 16:45, Christophe Lyon <christophe.l...@linaro.org> wrote: > > Implement vgetq_lane and vsetq_lane using the new MVE builtins > framework. > > Although MVE intrinsics are not supported in big-endian mode, we keep > the code to convert lane indices into GCC's vector indices, so that > it's already in place in case we want to support big-endian in the > future. > > The patch adds new tests, to check that we emit an error when the lane > number is not in the expected range. > > gcc/ChangeLog: > > * config/arm/arm-mve-builtins-base.cc (class > mve_function_vset_vget_lane): New. > (vgetq_lane, vsetq_lane): New. > * config/arm/arm-mve-builtins-base.def (vgetq_lane, vsetq_lane): > New. > * config/arm/arm-mve-builtins-base.h (vgetq_lane, vsetq_lane): > New. > > * config/arm/arm-mve-builtins-shapes.cc (struct getq_lane) > (setq_lane): New. > * config/arm/arm-mve-builtins-shapes.h (getq_lane, setq_lane): > New. > * config/arm/arm_mve.h (vsetq_lane): Delete. > (vgetq_lane): Delete. > (vsetq_lane_f16): Delete. > (vsetq_lane_f32): Delete. > (vsetq_lane_s16): Delete. > (vsetq_lane_s32): Delete. > (vsetq_lane_s8): Delete. > (vsetq_lane_s64): Delete. > (vsetq_lane_u8): Delete. > (vsetq_lane_u16): Delete. > (vsetq_lane_u32): Delete. > (vsetq_lane_u64): Delete. > (vgetq_lane_f16): Delete. > (vgetq_lane_f32): Delete. > (vgetq_lane_s16): Delete. > (vgetq_lane_s32): Delete. > (vgetq_lane_s8): Delete. > (vgetq_lane_s64): Delete. > (vgetq_lane_u8): Delete. > (vgetq_lane_u16): Delete. > (vgetq_lane_u32): Delete. > (vgetq_lane_u64): Delete. > (__ARM_NUM_LANES): Delete. > (__ARM_LANEQ): Delete. > (__ARM_CHECK_LANEQ): Delete. > (__arm_vsetq_lane_s16): Delete. > (__arm_vsetq_lane_s32): Delete. > (__arm_vsetq_lane_s8): Delete. > (__arm_vsetq_lane_s64): Delete. > (__arm_vsetq_lane_u8): Delete. > (__arm_vsetq_lane_u16): Delete. > (__arm_vsetq_lane_u32): Delete. > (__arm_vsetq_lane_u64): Delete. > (__arm_vgetq_lane_s16): Delete. > (__arm_vgetq_lane_s32): Delete. > (__arm_vgetq_lane_s8): Delete. > (__arm_vgetq_lane_s64): Delete. > (__arm_vgetq_lane_u8): Delete. > (__arm_vgetq_lane_u16): Delete. > (__arm_vgetq_lane_u32): Delete. > (__arm_vgetq_lane_u64): Delete. > (__arm_vsetq_lane_f16): Delete. > (__arm_vsetq_lane_f32): Delete. > (__arm_vgetq_lane_f16): Delete. > (__arm_vgetq_lane_f32): Delete. > (__arm_vsetq_lane): Delete. > (__arm_vgetq_lane): Delete. > * config/arm/mve.md (mve_vec_extract<mode><V_elem_l>): Add '@' > prefix. > (mve_vec_set<mode>_internal): Likewise. > > gcc/testsuite/ChangeLog: > > * gcc.target/arm/mve/intrinsics/vsetq_lane_f16_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_f32_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_s16_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_s32_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_s64_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_s8_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_u16_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_u32_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_u64_bounds.c: New test. > * gcc.target/arm/mve/intrinsics/vsetq_lane_u8_bounds.c: New test. > --- > gcc/config/arm/arm-mve-builtins-base.cc | 59 +++ > gcc/config/arm/arm-mve-builtins-base.def | 4 + > gcc/config/arm/arm-mve-builtins-base.h | 2 + > gcc/config/arm/arm-mve-builtins-shapes.cc | 82 ++++ > gcc/config/arm/arm-mve-builtins-shapes.h | 2 + > gcc/config/arm/arm_mve.h | 401 ------------------ > gcc/config/arm/mve.md | 5 +- > .../mve/intrinsics/vsetq_lane_f16_bounds.c | 19 + > .../mve/intrinsics/vsetq_lane_f32_bounds.c | 19 + > .../mve/intrinsics/vsetq_lane_s16_bounds.c | 19 + > .../mve/intrinsics/vsetq_lane_s32_bounds.c | 19 + > .../mve/intrinsics/vsetq_lane_s64_bounds.c | 19 + > .../arm/mve/intrinsics/vsetq_lane_s8_bounds.c | 19 + > .../mve/intrinsics/vsetq_lane_u16_bounds.c | 19 + > .../mve/intrinsics/vsetq_lane_u32_bounds.c | 19 + > .../mve/intrinsics/vsetq_lane_u64_bounds.c | 19 + > .../arm/mve/intrinsics/vsetq_lane_u8_bounds.c | 19 + > 17 files changed, 342 insertions(+), 403 deletions(-) > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f16_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f32_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s16_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s32_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s64_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s8_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u16_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u32_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u64_bounds.c > create mode 100644 > gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u8_bounds.c > > diff --git a/gcc/config/arm/arm-mve-builtins-base.cc > b/gcc/config/arm/arm-mve-builtins-base.cc > index fd0be2cbcd8..f894f163d2e 100644 > --- a/gcc/config/arm/arm-mve-builtins-base.cc > +++ b/gcc/config/arm/arm-mve-builtins-base.cc > @@ -1167,6 +1167,63 @@ public: > } > }; > > + /* Map the function directly to mve_vec_set_internal (M) or mve_vec_extract > + (M, M) where M is the vector mode associated with type suffix 0, except > when > + mode is V2DI where the builtin name is hardcoded. */ > +class mve_function_vsetq_vgetq_lane : public function_base > +{ > +public: > + CONSTEXPR mve_function_vsetq_vgetq_lane (bool is_get) > + : m_is_get (is_get) > + {} > + > + /* True for vgetq_lane, false for vsetq_lane. */ > + bool m_is_get; > + > + rtx > + expand (function_expander &e) const override > + { > + machine_mode mode = e.vector_mode (0); > + insn_code code; > + HOST_WIDE_INT elem; > + > + code = (mode == V2DImode) > + ? (m_is_get > + ? CODE_FOR_mve_vec_extractv2didi > + : CODE_FOR_mve_vec_setv2di_internal) > + : (m_is_get > + ? code_for_mve_vec_extract (mode, mode) > + : code_for_mve_vec_set_internal (mode)); > + > + if (!m_is_get) > + { > + /* mve_vec_set has vector and lane number arguments in opposite order > + compared to the intrinsic: swap them now... */ > + std::swap (e.args[1], e.args[2]); > + } > + > + elem = INTVAL (e.args[1]); > + > + /* For big-endian, GCC's vector indices are reversed within each 64 bits > + compared to the architectural lane indices used by MVE intrinsics. */ > + if (BYTES_BIG_ENDIAN) > + { > + unsigned int num_lanes = 128 / e.type_suffix (0).element_bits; > + elem ^= (num_lanes / 2) - 1; > + } > + > + if (!m_is_get) > + { > + /* ... and convert the lane number into a mask as expected by the > + builtin. */ > + elem = HOST_WIDE_INT_1 << elem; > + } > + e.args[1] = GEN_INT (elem); > + > + return e.use_unpred_insn (code); > + } > +}; > + > } /* end anonymous namespace */ > > namespace arm_mve { > @@ -1390,6 +1447,7 @@ FUNCTION_WITH_RTX_M (veorq, XOR, VEORQ) > FUNCTION (vfmaq, unspec_mve_function_exact_insn, (-1, -1, VFMAQ_F, -1, -1, > VFMAQ_N_F, -1, -1, VFMAQ_M_F, -1, -1, VFMAQ_M_N_F)) > FUNCTION (vfmasq, unspec_mve_function_exact_insn, (-1, -1, -1, -1, -1, > VFMASQ_N_F, -1, -1, -1, -1, -1, VFMASQ_M_N_F)) > FUNCTION (vfmsq, unspec_mve_function_exact_insn, (-1, -1, VFMSQ_F, -1, -1, > -1, -1, -1, VFMSQ_M_F, -1, -1, -1)) > +FUNCTION (vgetq_lane, mve_function_vsetq_vgetq_lane, (true)) > FUNCTION_WITH_M_N_NO_F (vhaddq, VHADDQ) > FUNCTION_WITH_M_N_NO_F (vhsubq, VHSUBQ) > FUNCTION (vld1q, vld1_impl,) > @@ -1517,6 +1575,7 @@ FUNCTION_ONLY_N_NO_F (vrshrntq, VRSHRNTQ) > FUNCTION_ONLY_N_NO_F (vrshrq, VRSHRQ) > FUNCTION (vsbciq, vadc_vsbc_impl, (true, false)) > FUNCTION (vsbcq, vadc_vsbc_impl, (false, false)) > +FUNCTION (vsetq_lane, mve_function_vsetq_vgetq_lane, (false)) > FUNCTION (vshlcq, vshlc_impl,) > FUNCTION_ONLY_N_NO_F (vshllbq, VSHLLBQ) > FUNCTION_ONLY_N_NO_F (vshlltq, VSHLLTQ) > diff --git a/gcc/config/arm/arm-mve-builtins-base.def > b/gcc/config/arm/arm-mve-builtins-base.def > index 0400c3c540e..51a708957e5 100644 > --- a/gcc/config/arm/arm-mve-builtins-base.def > +++ b/gcc/config/arm/arm-mve-builtins-base.def > @@ -52,6 +52,7 @@ DEF_MVE_FUNCTION (vddupq, viddup, all_unsigned, mx_or_none) > DEF_MVE_FUNCTION (vdupq, unary_n, all_integer, mx_or_none) > DEF_MVE_FUNCTION (vdwdupq, vidwdup, all_unsigned, mx_or_none) > DEF_MVE_FUNCTION (veorq, binary, all_integer, mx_or_none) > +DEF_MVE_FUNCTION (vgetq_lane, getq_lane, all_integer_with_64, none) > DEF_MVE_FUNCTION (vhaddq, binary_opt_n, all_integer, mx_or_none) > DEF_MVE_FUNCTION (vhcaddq_rot270, binary, all_signed, mx_or_none) > DEF_MVE_FUNCTION (vhcaddq_rot90, binary, all_signed, mx_or_none) > @@ -171,6 +172,7 @@ DEF_MVE_FUNCTION (vrshrq, binary_rshift, all_integer, > mx_or_none) > DEF_MVE_FUNCTION (vsbciq, vadc_vsbc, integer_32, m_or_none) > DEF_MVE_FUNCTION (vsbcq, vadc_vsbc, integer_32, m_or_none) > DEF_MVE_FUNCTION (vshlcq, vshlc, all_integer, m_or_none) > +DEF_MVE_FUNCTION (vsetq_lane, setq_lane, all_integer_with_64, none) > DEF_MVE_FUNCTION (vshllbq, binary_widen_n, integer_8_16, mx_or_none) > DEF_MVE_FUNCTION (vshlltq, binary_widen_n, integer_8_16, mx_or_none) > DEF_MVE_FUNCTION (vshlq, binary_lshift, all_integer, mx_or_none) > @@ -237,6 +239,7 @@ DEF_MVE_FUNCTION (veorq, binary, all_float, mx_or_none) > DEF_MVE_FUNCTION (vfmaq, ternary_opt_n, all_float, m_or_none) > DEF_MVE_FUNCTION (vfmasq, ternary_n, all_float, m_or_none) > DEF_MVE_FUNCTION (vfmsq, ternary, all_float, m_or_none) > +DEF_MVE_FUNCTION (vgetq_lane, getq_lane, all_float, none) > DEF_MVE_FUNCTION (vld1q, load, all_float, z_or_none) > DEF_MVE_FUNCTION (vld2q, load, all_float, none) > DEF_MVE_FUNCTION (vld4q, load, all_float, none) > @@ -269,6 +272,7 @@ DEF_MVE_FUNCTION (vrndnq, unary, all_float, mx_or_none) > DEF_MVE_FUNCTION (vrndpq, unary, all_float, mx_or_none) > DEF_MVE_FUNCTION (vrndq, unary, all_float, mx_or_none) > DEF_MVE_FUNCTION (vrndxq, unary, all_float, mx_or_none) > +DEF_MVE_FUNCTION (vsetq_lane, setq_lane, all_float, none) > DEF_MVE_FUNCTION (vst1q, store, all_float, p_or_none) > DEF_MVE_FUNCTION (vst2q, store, all_float, none) > DEF_MVE_FUNCTION (vst4q, store, all_float, none) > diff --git a/gcc/config/arm/arm-mve-builtins-base.h > b/gcc/config/arm/arm-mve-builtins-base.h > index 6ff3195e888..da5ad0c8aaa 100644 > --- a/gcc/config/arm/arm-mve-builtins-base.h > +++ b/gcc/config/arm/arm-mve-builtins-base.h > @@ -75,6 +75,7 @@ extern const function_base *const veorq; > extern const function_base *const vfmaq; > extern const function_base *const vfmasq; > extern const function_base *const vfmsq; > +extern const function_base *const vgetq_lane; > extern const function_base *const vhaddq; > extern const function_base *const vhcaddq_rot270; > extern const function_base *const vhcaddq_rot90; > @@ -206,6 +207,7 @@ extern const function_base *const vrshrntq; > extern const function_base *const vrshrq; > extern const function_base *const vsbciq; > extern const function_base *const vsbcq; > +extern const function_base *const vsetq_lane; > extern const function_base *const vshlcq; > extern const function_base *const vshllbq; > extern const function_base *const vshlltq; > diff --git a/gcc/config/arm/arm-mve-builtins-shapes.cc > b/gcc/config/arm/arm-mve-builtins-shapes.cc > index aeb14530a08..4b8cc244448 100644 > --- a/gcc/config/arm/arm-mve-builtins-shapes.cc > +++ b/gcc/config/arm/arm-mve-builtins-shapes.cc > @@ -1467,6 +1467,47 @@ struct create_def : public nonoverloaded_base > }; > SHAPE (create) > > +/* <S0>_t vfoo[_t0](<T0>_t, const int) > + > + Check that 'idx' is in the [0..#num_lanes - 1] range. > + > + Example: vgetq_lane. > + int8_t [__arm_]vgetq_lane[_s8](int8x16_t a, const int idx) */ > + > +struct getq_lane_def : public overloaded_base<0> > +{ > + void > + build (function_builder &b, const function_group_info &group, > + bool preserve_user_namespace) const override > + { > + b.add_overloaded_functions (group, MODE_none, preserve_user_namespace); > + build_all (b, "s0,v0,su64", group, MODE_none, preserve_user_namespace); > + } > + > + tree > + resolve (function_resolver &r) const override > + { > + unsigned int i, nargs; > + type_suffix_index type; > + if (!r.check_gp_argument (2, i, nargs) > + || (type = r.infer_vector_type (i-1)) == NUM_TYPE_SUFFIXES > + || !r.require_integer_immediate (i)) > + return error_mark_node; > + > + return r.resolve_to (r.mode_suffix_id, type); > + } > + > + bool > + check (function_checker &c) const override > + { > + unsigned int num_lanes = 128 / c.type_suffix (0).element_bits; > + > + return c.require_immediate_range (1, 0, num_lanes - 1); > + } > + > +}; > +SHAPE (getq_lane) > + > /* <T0>[xN]_t vfoo_t0(). > > Example: vuninitializedq. > @@ -1682,6 +1723,47 @@ struct mvn_def : public overloaded_base<0> > }; > SHAPE (mvn) > > +/* <T0>_t vfoo[_t0](<S0>_t, <T0>_t, const_int) > + > + Check that 'idx' is in the [0..#num_lanes - 1] range. > + > + Example: vsetq_lane. > + int8x16_t [__arm_]vsetq_lane[_s8](int8_t a, int8x16_t b, const int idx) > */ > +struct setq_lane_def : public overloaded_base<0> > +{ > + void > + build (function_builder &b, const function_group_info &group, > + bool preserve_user_namespace) const override > + { > + b.add_overloaded_functions (group, MODE_none, preserve_user_namespace); > + build_all (b, "v0,s0,v0,su64", group, MODE_none, > preserve_user_namespace); > + } > + > + tree > + resolve (function_resolver &r) const override > + { > + unsigned int i, nargs; > + type_suffix_index type; > + if (!r.check_gp_argument (3, i, nargs) > + || (type = r.infer_vector_type (i-1)) == NUM_TYPE_SUFFIXES > + || !r.require_derived_scalar_type (i - 2, r.SAME_TYPE_CLASS) > + || !r.require_integer_immediate (i)) > + return error_mark_node; > + > + return r.resolve_to (r.mode_suffix_id, type); > + } > + > + bool > + check (function_checker &c) const override > + { > + unsigned int num_lanes = 128 / c.type_suffix (0).element_bits; > + > + return c.require_immediate_range (2, 0, num_lanes - 1); > + } > + > +}; > +SHAPE (setq_lane) > + > /* void vfoo[_t0](<X>_t *, <T0>[xN]_t) > > where <X> might be tied to <t0> (for non-truncating stores) or might > diff --git a/gcc/config/arm/arm-mve-builtins-shapes.h > b/gcc/config/arm/arm-mve-builtins-shapes.h > index 6b839c577c6..9b1d32a0056 100644 > --- a/gcc/config/arm/arm-mve-builtins-shapes.h > +++ b/gcc/config/arm/arm-mve-builtins-shapes.h > @@ -60,12 +60,14 @@ namespace arm_mve > extern const function_shape *const binary_widen_poly; > extern const function_shape *const cmp; > extern const function_shape *const create; > + extern const function_shape *const getq_lane; > extern const function_shape *const inherent; > extern const function_shape *const load; > extern const function_shape *const load_ext; > extern const function_shape *const load_ext_gather_offset; > extern const function_shape *const load_gather_base; > extern const function_shape *const mvn; > + extern const function_shape *const setq_lane; > extern const function_shape *const store; > extern const function_shape *const store_scatter_base; > extern const function_shape *const store_scatter_offset; > diff --git a/gcc/config/arm/arm_mve.h b/gcc/config/arm/arm_mve.h > index ee18a4714fb..7fc1cc3173f 100644 > --- a/gcc/config/arm/arm_mve.h > +++ b/gcc/config/arm/arm_mve.h > @@ -46,8 +46,6 @@ > > #ifndef __ARM_MVE_PRESERVE_USER_NAMESPACE > #define vuninitializedq(__v) __arm_vuninitializedq(__v) > -#define vsetq_lane(__a, __b, __idx) __arm_vsetq_lane(__a, __b, __idx) > -#define vgetq_lane(__a, __idx) __arm_vgetq_lane(__a, __idx) > > > #define vpnot(__a) __arm_vpnot(__a) > @@ -61,26 +59,6 @@ > #define vuninitializedq_s64(void) __arm_vuninitializedq_s64(void) > #define vuninitializedq_f16(void) __arm_vuninitializedq_f16(void) > #define vuninitializedq_f32(void) __arm_vuninitializedq_f32(void) > -#define vsetq_lane_f16(__a, __b, __idx) __arm_vsetq_lane_f16(__a, __b, > __idx) > -#define vsetq_lane_f32(__a, __b, __idx) __arm_vsetq_lane_f32(__a, __b, > __idx) > -#define vsetq_lane_s16(__a, __b, __idx) __arm_vsetq_lane_s16(__a, __b, > __idx) > -#define vsetq_lane_s32(__a, __b, __idx) __arm_vsetq_lane_s32(__a, __b, > __idx) > -#define vsetq_lane_s8(__a, __b, __idx) __arm_vsetq_lane_s8(__a, __b, __idx) > -#define vsetq_lane_s64(__a, __b, __idx) __arm_vsetq_lane_s64(__a, __b, > __idx) > -#define vsetq_lane_u8(__a, __b, __idx) __arm_vsetq_lane_u8(__a, __b, __idx) > -#define vsetq_lane_u16(__a, __b, __idx) __arm_vsetq_lane_u16(__a, __b, > __idx) > -#define vsetq_lane_u32(__a, __b, __idx) __arm_vsetq_lane_u32(__a, __b, > __idx) > -#define vsetq_lane_u64(__a, __b, __idx) __arm_vsetq_lane_u64(__a, __b, > __idx) > -#define vgetq_lane_f16(__a, __idx) __arm_vgetq_lane_f16(__a, __idx) > -#define vgetq_lane_f32(__a, __idx) __arm_vgetq_lane_f32(__a, __idx) > -#define vgetq_lane_s16(__a, __idx) __arm_vgetq_lane_s16(__a, __idx) > -#define vgetq_lane_s32(__a, __idx) __arm_vgetq_lane_s32(__a, __idx) > -#define vgetq_lane_s8(__a, __idx) __arm_vgetq_lane_s8(__a, __idx) > -#define vgetq_lane_s64(__a, __idx) __arm_vgetq_lane_s64(__a, __idx) > -#define vgetq_lane_u8(__a, __idx) __arm_vgetq_lane_u8(__a, __idx) > -#define vgetq_lane_u16(__a, __idx) __arm_vgetq_lane_u16(__a, __idx) > -#define vgetq_lane_u32(__a, __idx) __arm_vgetq_lane_u32(__a, __idx) > -#define vgetq_lane_u64(__a, __idx) __arm_vgetq_lane_u64(__a, __idx) > #define sqrshr(__p0, __p1) __arm_sqrshr(__p0, __p1) > #define sqrshrl(__p0, __p1) __arm_sqrshrl(__p0, __p1) > #define sqrshrl_sat48(__p0, __p1) __arm_sqrshrl_sat48(__p0, __p1) > @@ -99,18 +77,6 @@ > #define asrl(__p0, __p1) __arm_asrl(__p0, __p1) > #endif > > -/* For big-endian, GCC's vector indices are reversed within each 64 bits > - compared to the architectural lane indices used by MVE intrinsics. */ > -#define __ARM_NUM_LANES(__v) (sizeof (__v) / sizeof (__v[0])) > -#ifdef __ARM_BIG_ENDIAN > -#define __ARM_LANEQ(__vec, __idx) (__idx ^ (__ARM_NUM_LANES(__vec)/2 - 1)) > -#else > -#define __ARM_LANEQ(__vec, __idx) __idx > -#endif > -#define __ARM_CHECK_LANEQ(__vec, __idx) \ > - __builtin_arm_lane_check (__ARM_NUM_LANES(__vec), \ > - __ARM_LANEQ(__vec, __idx)) > - > __extension__ extern __inline mve_pred16_t > __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > __arm_vpnot (mve_pred16_t __a) > @@ -118,142 +84,6 @@ __arm_vpnot (mve_pred16_t __a) > return __builtin_mve_vpnotv16bi (__a); > } > > -__extension__ extern __inline int16x8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_s16 (int16_t __a, int16x8_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline int32x4_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_s32 (int32_t __a, int32x4_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline int8x16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_s8 (int8_t __a, int8x16_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline int64x2_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_s64 (int64_t __a, int64x2_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline uint8x16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_u8 (uint8_t __a, uint8x16_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline uint16x8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_u16 (uint16_t __a, uint16x8_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline uint32x4_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_u32 (uint32_t __a, uint32x4_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline uint64x2_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_u64 (uint64_t __a, uint64x2_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline int16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_s16 (int16x8_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline int32_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_s32 (int32x4_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline int8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_s8 (int8x16_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline int64_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_s64 (int64x2_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline uint8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_u8 (uint8x16_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline uint16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_u16 (uint16x8_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline uint32_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_u32 (uint32x4_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline uint64_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_u64 (uint64x2_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > __extension__ extern __inline uint64_t > __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > __arm_lsll (uint64_t value, int32_t shift) > @@ -366,189 +196,8 @@ __arm_srshr (int32_t value, const int shift) > return __builtin_mve_srshr_si (value, shift); > } > > -#if (__ARM_FEATURE_MVE & 2) /* MVE Floating point. */ > - > -__extension__ extern __inline float16x8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_f16 (float16_t __a, float16x8_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline float32x4_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane_f32 (float32_t __a, float32x4_t __b, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__b, __idx); > - __b[__ARM_LANEQ(__b,__idx)] = __a; > - return __b; > -} > - > -__extension__ extern __inline float16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_f16 (float16x8_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > - > -__extension__ extern __inline float32_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane_f32 (float32x4_t __a, const int __idx) > -{ > - __ARM_CHECK_LANEQ (__a, __idx); > - return __a[__ARM_LANEQ(__a,__idx)]; > -} > -#endif > - > #ifdef __cplusplus > > -__extension__ extern __inline int16x8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (int16_t __a, int16x8_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_s16 (__a, __b, __idx); > -} > - > -__extension__ extern __inline int32x4_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (int32_t __a, int32x4_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_s32 (__a, __b, __idx); > -} > - > -__extension__ extern __inline int8x16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (int8_t __a, int8x16_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_s8 (__a, __b, __idx); > -} > - > -__extension__ extern __inline int64x2_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (int64_t __a, int64x2_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_s64 (__a, __b, __idx); > -} > - > -__extension__ extern __inline uint8x16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (uint8_t __a, uint8x16_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_u8 (__a, __b, __idx); > -} > - > -__extension__ extern __inline uint16x8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (uint16_t __a, uint16x8_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_u16 (__a, __b, __idx); > -} > - > -__extension__ extern __inline uint32x4_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (uint32_t __a, uint32x4_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_u32 (__a, __b, __idx); > -} > - > -__extension__ extern __inline uint64x2_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (uint64_t __a, uint64x2_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_u64 (__a, __b, __idx); > -} > - > -__extension__ extern __inline int16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (int16x8_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_s16 (__a, __idx); > -} > - > -__extension__ extern __inline int32_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (int32x4_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_s32 (__a, __idx); > -} > - > -__extension__ extern __inline int8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (int8x16_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_s8 (__a, __idx); > -} > - > -__extension__ extern __inline int64_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (int64x2_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_s64 (__a, __idx); > -} > - > -__extension__ extern __inline uint8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (uint8x16_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_u8 (__a, __idx); > -} > - > -__extension__ extern __inline uint16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (uint16x8_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_u16 (__a, __idx); > -} > - > -__extension__ extern __inline uint32_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (uint32x4_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_u32 (__a, __idx); > -} > - > -__extension__ extern __inline uint64_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (uint64x2_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_u64 (__a, __idx); > -} > - > -#if (__ARM_FEATURE_MVE & 2) /* MVE Floating point. */ > - > -__extension__ extern __inline float16x8_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (float16_t __a, float16x8_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_f16 (__a, __b, __idx); > -} > - > -__extension__ extern __inline float32x4_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vsetq_lane (float32_t __a, float32x4_t __b, const int __idx) > -{ > - return __arm_vsetq_lane_f32 (__a, __b, __idx); > -} > - > -__extension__ extern __inline float16_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (float16x8_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_f16 (__a, __idx); > -} > - > -__extension__ extern __inline float32_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__arm_vgetq_lane (float32x4_t __a, const int __idx) > -{ > - return __arm_vgetq_lane_f32 (__a, __idx); > -} > -#endif /* MVE Floating point. */ > - > - > __extension__ extern __inline uint8x16_t > __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > __arm_vuninitializedq (uint8x16_t /* __v ATTRIBUTE UNUSED */) > @@ -871,33 +520,6 @@ extern void *__ARM_undef; > int (*)[__ARM_mve_type_float16x8_t]: __arm_vuninitializedq_f16 (), \ > int (*)[__ARM_mve_type_float32x4_t]: __arm_vuninitializedq_f32 ());}) > > -#define __arm_vgetq_lane(p0,p1) ({ __typeof(p0) __p0 = (p0); \ > - _Generic( (int (*)[__ARM_mve_typeid(__p0)])0, \ > - int (*)[__ARM_mve_type_int8x16_t]: __arm_vgetq_lane_s8 > (__ARM_mve_coerce(__p0, int8x16_t), p1), \ > - int (*)[__ARM_mve_type_int16x8_t]: __arm_vgetq_lane_s16 > (__ARM_mve_coerce(__p0, int16x8_t), p1), \ > - int (*)[__ARM_mve_type_int32x4_t]: __arm_vgetq_lane_s32 > (__ARM_mve_coerce(__p0, int32x4_t), p1), \ > - int (*)[__ARM_mve_type_int64x2_t]: __arm_vgetq_lane_s64 > (__ARM_mve_coerce(__p0, int64x2_t), p1), \ > - int (*)[__ARM_mve_type_uint8x16_t]: __arm_vgetq_lane_u8 > (__ARM_mve_coerce(__p0, uint8x16_t), p1), \ > - int (*)[__ARM_mve_type_uint16x8_t]: __arm_vgetq_lane_u16 > (__ARM_mve_coerce(__p0, uint16x8_t), p1), \ > - int (*)[__ARM_mve_type_uint32x4_t]: __arm_vgetq_lane_u32 > (__ARM_mve_coerce(__p0, uint32x4_t), p1), \ > - int (*)[__ARM_mve_type_uint64x2_t]: __arm_vgetq_lane_u64 > (__ARM_mve_coerce(__p0, uint64x2_t), p1), \ > - int (*)[__ARM_mve_type_float16x8_t]: __arm_vgetq_lane_f16 > (__ARM_mve_coerce(__p0, float16x8_t), p1), \ > - int (*)[__ARM_mve_type_float32x4_t]: __arm_vgetq_lane_f32 > (__ARM_mve_coerce(__p0, float32x4_t), p1));}) > - > -#define __arm_vsetq_lane(p0,p1,p2) ({ __typeof(p0) __p0 = (p0); \ > - __typeof(p1) __p1 = (p1); \ > - _Generic( (int (*)[__ARM_mve_typeid(__p0)][__ARM_mve_typeid(__p1)])0, \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int8x16_t]: > __arm_vsetq_lane_s8 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int8x16_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int16x8_t]: > __arm_vsetq_lane_s16 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int16x8_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int32x4_t]: > __arm_vsetq_lane_s32 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int32x4_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int64x2_t]: > __arm_vsetq_lane_s64 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int64x2_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint8x16_t]: > __arm_vsetq_lane_u8 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint8x16_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint16x8_t]: > __arm_vsetq_lane_u16 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint16x8_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint32x4_t]: > __arm_vsetq_lane_u32 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint32x4_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint64x2_t]: > __arm_vsetq_lane_u64 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint64x2_t), p2), \ > - int (*)[__ARM_mve_type_fp_n][__ARM_mve_type_float16x8_t]: > __arm_vsetq_lane_f16 (__ARM_mve_coerce_f_scalar(__p0, double), > __ARM_mve_coerce(__p1, float16x8_t), p2), \ > - int (*)[__ARM_mve_type_fp_n][__ARM_mve_type_float32x4_t]: > __arm_vsetq_lane_f32 (__ARM_mve_coerce_f_scalar(__p0, double), > __ARM_mve_coerce(__p1, float32x4_t), p2));}) > - > #else /* MVE Integer. */ > > #define __arm_vuninitializedq(p0) ({ __typeof(p0) __p0 = (p0); \ > @@ -911,29 +533,6 @@ extern void *__ARM_undef; > int (*)[__ARM_mve_type_uint32x4_t]: __arm_vuninitializedq_u32 (), \ > int (*)[__ARM_mve_type_uint64x2_t]: __arm_vuninitializedq_u64 ());}) > > -#define __arm_vgetq_lane(p0,p1) ({ __typeof(p0) __p0 = (p0); \ > - _Generic( (int (*)[__ARM_mve_typeid(__p0)])0, \ > - int (*)[__ARM_mve_type_int8x16_t]: __arm_vgetq_lane_s8 > (__ARM_mve_coerce(__p0, int8x16_t), p1), \ > - int (*)[__ARM_mve_type_int16x8_t]: __arm_vgetq_lane_s16 > (__ARM_mve_coerce(__p0, int16x8_t), p1), \ > - int (*)[__ARM_mve_type_int32x4_t]: __arm_vgetq_lane_s32 > (__ARM_mve_coerce(__p0, int32x4_t), p1), \ > - int (*)[__ARM_mve_type_int64x2_t]: __arm_vgetq_lane_s64 > (__ARM_mve_coerce(__p0, int64x2_t), p1), \ > - int (*)[__ARM_mve_type_uint8x16_t]: __arm_vgetq_lane_u8 > (__ARM_mve_coerce(__p0, uint8x16_t), p1), \ > - int (*)[__ARM_mve_type_uint16x8_t]: __arm_vgetq_lane_u16 > (__ARM_mve_coerce(__p0, uint16x8_t), p1), \ > - int (*)[__ARM_mve_type_uint32x4_t]: __arm_vgetq_lane_u32 > (__ARM_mve_coerce(__p0, uint32x4_t), p1), \ > - int (*)[__ARM_mve_type_uint64x2_t]: __arm_vgetq_lane_u64 > (__ARM_mve_coerce(__p0, uint64x2_t), p1));}) > - > -#define __arm_vsetq_lane(p0,p1,p2) ({ __typeof(p0) __p0 = (p0); \ > - __typeof(p1) __p1 = (p1); \ > - _Generic( (int (*)[__ARM_mve_typeid(__p0)][__ARM_mve_typeid(__p1)])0, \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int8x16_t]: > __arm_vsetq_lane_s8 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int8x16_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int16x8_t]: > __arm_vsetq_lane_s16 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int16x8_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int32x4_t]: > __arm_vsetq_lane_s32 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int32x4_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_int64x2_t]: > __arm_vsetq_lane_s64 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, int64x2_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint8x16_t]: > __arm_vsetq_lane_u8 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint8x16_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint16x8_t]: > __arm_vsetq_lane_u16 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint16x8_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint32x4_t]: > __arm_vsetq_lane_u32 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint32x4_t), p2), \ > - int (*)[__ARM_mve_type_int_n][__ARM_mve_type_uint64x2_t]: > __arm_vsetq_lane_u64 (__ARM_mve_coerce_i_scalar(__p0, int), > __ARM_mve_coerce(__p1, uint64x2_t), p2));}) > - > #endif /* MVE Integer. */ > > #endif /* __cplusplus */ > diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md > index 8527bd753e3..70b1c77fdce 100644 > --- a/gcc/config/arm/mve.md > +++ b/gcc/config/arm/mve.md > @@ -4146,10 +4146,11 @@ (define_insn "@mve_vld4q<mode>" > return ""; > } > [(set_attr "length" "16")]) > + > ;; > ;; [vgetq_lane_u, vgetq_lane_s, vgetq_lane_f]) > ;; > -(define_insn "mve_vec_extract<mode><V_elem_l>" > +(define_insn "@mve_vec_extract<mode><V_elem_l>" > [(set (match_operand:<V_elem> 0 "nonimmediate_operand" "=r") > (vec_select:<V_elem> > (match_operand:MVE_VLD_ST 1 "s_register_operand" "w") > @@ -4224,7 +4225,7 @@ (define_insn "*mve_vec_extract_zext_internal<mode>" > ;; > ;; [vsetq_lane_u, vsetq_lane_s, vsetq_lane_f]) > ;; > -(define_insn "mve_vec_set<mode>_internal" > +(define_insn "@mve_vec_set<mode>_internal" > [(set (match_operand:VQ2 0 "s_register_operand" "=w") > (vec_merge:VQ2 > (vec_duplicate:VQ2 > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f16_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f16_bounds.c > new file mode 100644 > index 00000000000..0aec13fdf4e > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f16_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */ > +/* { dg-add-options arm_v8_1m_mve_fp } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +float16x8_t > +foo (float16_t a, float16x8_t b) > +{ > + return vsetq_lane_f16 (a, b, 9); /* { dg-error {passing 9 to argument 3 of > 'vsetq_lane_f16', which expects a value in the range \[0, 7\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f32_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f32_bounds.c > new file mode 100644 > index 00000000000..5627e0a17c1 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_f32_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */ > +/* { dg-add-options arm_v8_1m_mve_fp } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +float32x4_t > +foo (float32_t a, float32x4_t b) > +{ > + return vsetq_lane_f32 (a, b, 4); /* { dg-error {passing 4 to argument 3 of > 'vsetq_lane_f32', which expects a value in the range \[0, 3\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s16_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s16_bounds.c > new file mode 100644 > index 00000000000..af255f8dba9 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s16_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +int16x8_t > +foo (int16_t a, int16x8_t b) > +{ > + return vsetq_lane_s16 (a, b, 9); /* { dg-error {passing 9 to argument 3 of > 'vsetq_lane_s16', which expects a value in the range \[0, 7\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s32_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s32_bounds.c > new file mode 100644 > index 00000000000..968910cf0a3 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s32_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +int32x4_t > +foo (int32_t a, int32x4_t b) > +{ > + return vsetq_lane_s32 (a, b, 4); /* { dg-error {passing 4 to argument 3 of > 'vsetq_lane_s32', which expects a value in the range \[0, 3\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s64_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s64_bounds.c > new file mode 100644 > index 00000000000..f3bf3ac3886 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s64_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +int64x2_t > +foo (int64_t a, int64x2_t b) > +{ > + return vsetq_lane_s64 (a, b, 2); /* { dg-error {passing 2 to argument 3 of > 'vsetq_lane_s64', which expects a value in the range \[0, 1\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s8_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s8_bounds.c > new file mode 100644 > index 00000000000..0f4f2380555 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_s8_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +int8x16_t > +foo (int8_t a, int8x16_t b) > +{ > + return vsetq_lane_s8 (a, b, 17); /* { dg-error {passing 17 to argument 3 > of 'vsetq_lane_s8', which expects a value in the range \[0, 15\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u16_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u16_bounds.c > new file mode 100644 > index 00000000000..62a03c0dc50 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u16_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +uint16x8_t > +foo (uint16_t a, uint16x8_t b) > +{ > + return vsetq_lane_u16 (a, b, 8); /* { dg-error {passing 8 to argument 3 of > 'vsetq_lane_u16', which expects a value in the range \[0, 7\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u32_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u32_bounds.c > new file mode 100644 > index 00000000000..5836eeb994f > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u32_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +uint32x4_t > +foo (uint32_t a, uint32x4_t b) > +{ > + return vsetq_lane_u32 (a, b, 4); /* { dg-error {passing 4 to argument 3 of > 'vsetq_lane_u32', which expects a value in the range \[0, 3\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u64_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u64_bounds.c > new file mode 100644 > index 00000000000..8be2b80e537 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u64_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +uint64x2_t > +foo (uint64_t a, uint64x2_t b) > +{ > + return vsetq_lane_u64 (a, b, 2); /* { dg-error {passing 2 to argument 3 of > 'vsetq_lane_u64', which expects a value in the range \[0, 1\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > diff --git > a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u8_bounds.c > b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u8_bounds.c > new file mode 100644 > index 00000000000..987dc98b5e8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vsetq_lane_u8_bounds.c > @@ -0,0 +1,19 @@ > +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ > +/* { dg-add-options arm_v8_1m_mve } */ > +/* { dg-additional-options "-O2" } */ > + > +#include "arm_mve.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +uint8x16_t > +foo (uint8_t a, uint8x16_t b) > +{ > + return vsetq_lane_u8 (a, b, 17); /* { dg-error {passing 17 to argument 3 > of 'vsetq_lane_u8', which expects a value in the range \[0, 15\]} } */ > +} > + > +#ifdef __cplusplus > +} > +#endif > -- > 2.34.1 >